From c6b35eff2537f0b07ceb9aca499e8f76b3d33710 Mon Sep 17 00:00:00 2001
From: Adam Lopez <alopez@cs.jhu.edu>
Date: Wed, 5 Sep 2012 11:49:33 -0400
Subject: Fix bug in initialization of FeatureContext.input_span

---
 python/src/sa/_sa.c           | 24817 ++++++++++++++++++----------------------
 python/src/sa/rulefactory.pxi |     2 +-
 2 files changed, 10862 insertions(+), 13957 deletions(-)

(limited to 'python/src/sa')

diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index a1530dda..7753341b 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,16 +1,16 @@
-/* Generated by Cython 0.17 on Wed Sep  5 12:38:10 2012 */
+/* Generated by Cython 0.15.1 on Wed Sep  5 11:46:33 2012 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
-#elif PY_VERSION_HEX < 0x02040000
-    #error Cython requires Python 2.4+.
 #else
+
 #include <stddef.h> /* For offsetof */
 #ifndef offsetof
 #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
 #endif
+
 #if !defined(WIN32) && !defined(MS_WINDOWS)
   #ifndef __stdcall
     #define __stdcall
@@ -22,44 +22,36 @@
     #define __fastcall
   #endif
 #endif
+
 #ifndef DL_IMPORT
   #define DL_IMPORT(t) t
 #endif
 #ifndef DL_EXPORT
   #define DL_EXPORT(t) t
 #endif
+
 #ifndef PY_LONG_LONG
   #define PY_LONG_LONG LONG_LONG
 #endif
-#ifndef Py_HUGE_VAL
-  #define Py_HUGE_VAL HUGE_VAL
-#endif
-#ifdef PYPY_VERSION
-#define CYTHON_COMPILING_IN_PYPY 1
-#define CYTHON_COMPILING_IN_CPYTHON 0
-#else
-#define CYTHON_COMPILING_IN_PYPY 0
-#define CYTHON_COMPILING_IN_CPYTHON 1
+
+#if PY_VERSION_HEX < 0x02040000
+  #define METH_COEXIST 0
+  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
+  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)
 #endif
+
 #if PY_VERSION_HEX < 0x02050000
   typedef int Py_ssize_t;
   #define PY_SSIZE_T_MAX INT_MAX
   #define PY_SSIZE_T_MIN INT_MIN
   #define PY_FORMAT_SIZE_T ""
-  #define CYTHON_FORMAT_SSIZE_T ""
   #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
   #define PyInt_AsSsize_t(o)   __Pyx_PyInt_AsInt(o)
-  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \
-                                (PyErr_Format(PyExc_TypeError, \
-                                              "expected index value, got %.200s", Py_TYPE(o)->tp_name), \
-                                 (PyObject*)0))
-  #define PyIndex_Check(o)     (PyNumber_Check(o) && !PyFloat_Check(o) && !PyComplex_Check(o))
+  #define PyNumber_Index(o)    PyNumber_Int(o)
+  #define PyIndex_Check(o)     PyNumber_Check(o)
   #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
-  #define __PYX_BUILD_PY_SSIZE_T "i"
-#else
-  #define __PYX_BUILD_PY_SSIZE_T "n"
-  #define CYTHON_FORMAT_SSIZE_T "z"
 #endif
+
 #if PY_VERSION_HEX < 0x02060000
   #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
   #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
@@ -67,6 +59,7 @@
   #define PyVarObject_HEAD_INIT(type, size) \
           PyObject_HEAD_INIT(type) size,
   #define PyType_Modified(t)
+
   typedef struct {
      void *buf;
      PyObject *obj;
@@ -80,6 +73,7 @@
      Py_ssize_t *suboffsets;
      void *internal;
   } Py_buffer;
+
   #define PyBUF_SIMPLE 0
   #define PyBUF_WRITABLE 0x0001
   #define PyBUF_FORMAT 0x0004
@@ -89,44 +83,24 @@
   #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
   #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
   #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
-  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)
-  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)
-  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
-  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
+
 #endif
+
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
-          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
-          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
-#endif
-#if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6
-  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict")
 #endif
+
 #if PY_MAJOR_VERSION >= 3
   #define Py_TPFLAGS_CHECKTYPES 0
   #define Py_TPFLAGS_HAVE_INDEX 0
 #endif
+
 #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
-#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
-  #define CYTHON_PEP393_ENABLED 1
-  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \
-                                              0 : _PyUnicode_Ready((PyObject *)(op)))
-  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
-  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
-  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
-#else
-  #define CYTHON_PEP393_ENABLED 0
-  #define __Pyx_PyUnicode_READY(op)       (0)
-  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
-  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
-  #define __Pyx_PyUnicode_READ(k, d, i)   ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
-#endif
+
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
   #define PyStringObject               PyUnicodeObject
@@ -134,6 +108,7 @@
   #define PyString_Check               PyUnicode_Check
   #define PyString_CheckExact          PyUnicode_CheckExact
 #endif
+
 #if PY_VERSION_HEX < 0x02060000
   #define PyBytesObject                PyStringObject
   #define PyBytes_Type                 PyString_Type
@@ -152,6 +127,7 @@
   #define PyBytes_Concat               PyString_Concat
   #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
 #endif
+
 #if PY_VERSION_HEX < 0x02060000
   #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
   #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
@@ -159,7 +135,9 @@
 #ifndef PySet_CheckExact
   #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
 #endif
+
 #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
+
 #if PY_MAJOR_VERSION >= 3
   #define PyIntObject                  PyLongObject
   #define PyInt_Type                   PyLong_Type
@@ -176,9 +154,11 @@
   #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
   #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
 #endif
+
 #if PY_MAJOR_VERSION >= 3
   #define PyBoolObject                 PyLongObject
 #endif
+
 #if PY_VERSION_HEX < 0x03020000
   typedef long Py_hash_t;
   #define __Pyx_PyInt_FromHash_t PyInt_FromLong
@@ -187,6 +167,16 @@
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
   #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
 #endif
+
+
+#if PY_MAJOR_VERSION >= 3
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
+#else
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
+#endif
+
 #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)
   #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)
   #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)
@@ -205,9 +195,11 @@
         (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \
             (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1)))
 #endif
+
 #if PY_MAJOR_VERSION >= 3
   #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
 #endif
+
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
@@ -217,6 +209,7 @@
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
   #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
 #endif
+
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_NAMESTR(n) ((char *)(n))
   #define __Pyx_DOCSTR(n)  ((char *)(n))
@@ -225,15 +218,6 @@
   #define __Pyx_DOCSTR(n)  (n)
 #endif
 
-
-#if PY_MAJOR_VERSION >= 3
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
-#else
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
-#endif
-
 #ifndef __PYX_EXTERN_C
   #ifdef __cplusplus
     #define __PYX_EXTERN_C extern "C"
@@ -283,7 +267,7 @@
 #   else
 #     define CYTHON_UNUSED
 #   endif
-# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
+# elif defined(__ICC) || defined(__INTEL_COMPILER)
 #   define CYTHON_UNUSED __attribute__ ((__unused__))
 # else
 #   define CYTHON_UNUSED
@@ -307,12 +291,8 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
 static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 
-#if CYTHON_COMPILING_IN_CPYTHON
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
-#else
-#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
-#endif
-#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
+
 
 #ifdef __GNUC__
   /* Test for GCC > 2.95 */
@@ -356,8 +336,16 @@ static const char *__pyx_f[] = {
   "str_map.pxi",
 };
 
+static PyObject *__Pyx_Generator_Next(PyObject *self);
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
+static PyObject *__Pyx_Generator_Close(PyObject *self);
+static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args, CYTHON_UNUSED PyObject *kwds);
+
+typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
+
 /*--- Type declarations ---*/
 struct __pyx_obj_3_sa_HieroCachingRuleFactory;
+struct __pyx_Generator_object;
 struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__;
 struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats;
 struct __pyx_obj_3_sa_IntList;
@@ -402,7 +390,7 @@ struct __pyx_t_3_sa__Trie_Node;
 struct __pyx_t_3_sa_match_node;
 struct __pyx_t_3_sa_Matching;
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef struct _node:             # <<<<<<<<<<<<<<
@@ -416,7 +404,7 @@ struct __pyx_t_3_sa__node {
   int val;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":30
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":30
  * _init_lower_mask()
  * 
  * cdef struct _BitSet:             # <<<<<<<<<<<<<<
@@ -430,7 +418,7 @@ struct __pyx_t_3_sa__BitSet {
   int size;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":168
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":168
  *     return result
  * 
  * cdef struct _VEB:             # <<<<<<<<<<<<<<
@@ -447,7 +435,7 @@ struct __pyx_t_3_sa__VEB {
   void **bottom;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":10
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":10
  * cdef struct _Trie_Node    # forward decl
  * 
  * cdef struct _Trie_Edge:             # <<<<<<<<<<<<<<
@@ -461,7 +449,7 @@ struct __pyx_t_3_sa__Trie_Edge {
   struct __pyx_t_3_sa__Trie_Edge *smaller;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":8
  * from libc.string cimport memset, memcpy
  * 
  * cdef struct _Trie_Node    # forward decl             # <<<<<<<<<<<<<<
@@ -474,7 +462,7 @@ struct __pyx_t_3_sa__Trie_Node {
   int arr_len;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":62
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":62
  * 
  * # linked list structure for storing matches in BaselineRuleFactory
  * cdef struct match_node:             # <<<<<<<<<<<<<<
@@ -486,7 +474,7 @@ struct __pyx_t_3_sa_match_node {
   struct __pyx_t_3_sa_match_node *next;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":158
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":158
  * 
  * # struct used to encapsulate a single matching
  * cdef struct Matching:             # <<<<<<<<<<<<<<
@@ -501,7 +489,7 @@ struct __pyx_t_3_sa_Matching {
   int size;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":214
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":214
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -550,7 +538,25 @@ struct __pyx_obj_3_sa_HieroCachingRuleFactory {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":141
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
+ *         free(self.arr)
+ * 
+ *     def __iter__(self):             # <<<<<<<<<<<<<<
+ *         cdef int i
+ *         for i in range(self.len):
+ */
+struct __pyx_Generator_object {
+  PyObject_HEAD
+  __pyx_generator_body_t body;
+  int is_running;
+  int resume_label;
+  PyObject *exc_type;
+  PyObject *exc_value;
+  PyObject *exc_traceback;
+};
+
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -558,14 +564,14 @@ struct __pyx_obj_3_sa_HieroCachingRuleFactory {
  *         for i from 0 <= i < self.n:
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   int __pyx_v_i;
-  struct __pyx_obj_3_sa_Phrase *__pyx_v_self;
+  PyObject *__pyx_v_self;
   int __pyx_t_0;
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":36
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
  * 
  *     def compute_stats(self, int max_n):             # <<<<<<<<<<<<<<
@@ -573,7 +579,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ {
  *         particular, the frequency associated with each word is
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   int __pyx_v_N;
   int __pyx_v_freq;
   int __pyx_v_h;
@@ -589,7 +595,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
   PyObject *__pyx_v_ngram_starts;
   int __pyx_v_rs;
   struct __pyx_obj_3_sa_IntList *__pyx_v_run_start;
-  struct __pyx_obj_3_sa_LCP *__pyx_v_self;
+  PyObject *__pyx_v_self;
   int __pyx_v_valid;
   struct __pyx_obj_3_sa_VEB *__pyx_v_veb;
   int __pyx_t_0;
@@ -613,7 +619,7 @@ struct __pyx_obj_3_sa_IntList {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":340
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":340
  * 
  * 
  * cdef class VEBIterator:             # <<<<<<<<<<<<<<
@@ -627,7 +633,7 @@ struct __pyx_obj_3_sa_VEBIterator {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":47
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":47
  * 
  * 
  * cdef class BiLex:             # <<<<<<<<<<<<<<
@@ -648,7 +654,7 @@ struct __pyx_obj_3_sa_BiLex {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":354
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":354
  * 
  * 
  * cdef class VEB:             # <<<<<<<<<<<<<<
@@ -662,7 +668,7 @@ struct __pyx_obj_3_sa_VEB {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":5
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":5
  * as k most frequent n-grams"""
  * 
  * cdef class LCP:             # <<<<<<<<<<<<<<
@@ -676,7 +682,7 @@ struct __pyx_obj_3_sa_LCP {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
@@ -695,7 +701,7 @@ struct __pyx_obj_3_sa_DataArray {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":100
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":100
  * 
  * 
  * cdef class BitSetIterator:             # <<<<<<<<<<<<<<
@@ -709,7 +715,7 @@ struct __pyx_obj_3_sa_BitSetIterator {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":188
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":188
  * 
  * 
  * cdef class Precomputation:             # <<<<<<<<<<<<<<
@@ -730,7 +736,7 @@ struct __pyx_obj_3_sa_Precomputation {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":935
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":935
  *         return sorted(result);
  * 
  *     def input(self, fwords):             # <<<<<<<<<<<<<<
@@ -738,7 +744,7 @@ struct __pyx_obj_3_sa_Precomputation {
  *         it looks up all of the rules that can be used to translate
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   PyObject *__pyx_v_alignment;
   PyObject *__pyx_v_als;
   PyObject *__pyx_v_alslist;
@@ -787,7 +793,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
   PyObject *__pyx_v_sa_range;
   struct __pyx_obj_3_sa_IntList *__pyx_v_sample;
   struct __pyx_obj_3_sa_FeatureVector *__pyx_v_scores;
-  struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self;
+  PyObject *__pyx_v_self;
   PyObject *__pyx_v_spanlen;
   float __pyx_v_start_time;
   PyObject *__pyx_v_stop_time;
@@ -801,19 +807,17 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
   PyObject *__pyx_v_xnode;
   PyObject *__pyx_v_xroot;
   Py_ssize_t __pyx_t_0;
-  PyObject *__pyx_t_1;
-  Py_ssize_t __pyx_t_2;
-  int __pyx_t_3;
+  Py_ssize_t __pyx_t_1;
+  PyObject *__pyx_t_2;
+  PyObject *__pyx_t_3;
   PyObject *__pyx_t_4;
-  PyObject *__pyx_t_5;
-  int __pyx_t_6;
-  Py_ssize_t __pyx_t_7;
-  Py_ssize_t __pyx_t_8;
-  Py_ssize_t __pyx_t_9;
+  PyObject *(*__pyx_t_5)(PyObject *);
+  Py_ssize_t __pyx_t_6;
+  PyObject *(*__pyx_t_7)(PyObject *);
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":6
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":6
  * from libc.stdio cimport FILE, fclose, fopen
  * 
  * cdef class SuffixArray:             # <<<<<<<<<<<<<<
@@ -829,7 +833,7 @@ struct __pyx_obj_3_sa_SuffixArray {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":7
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":7
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1
  * 
  * cdef class Alphabet:             # <<<<<<<<<<<<<<
@@ -865,7 +869,7 @@ struct __pyx_obj_3_sa_Rule {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
@@ -873,7 +877,7 @@ struct __pyx_obj_3_sa_Rule {
  * 
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *__pyx_outer_scope;
   PyObject *__pyx_v_a;
   PyObject *__pyx_t_0;
@@ -882,7 +886,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -890,7 +894,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
  * 
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_outer_scope;
   PyObject *__pyx_v_line;
   PyObject *__pyx_t_0;
@@ -899,7 +903,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":70
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":70
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -918,7 +922,7 @@ struct __pyx_obj_3_sa_PhraseLocation {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -926,7 +930,7 @@ struct __pyx_obj_3_sa_PhraseLocation {
  * cdef class Scorer:
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *__pyx_outer_scope;
   PyObject *__pyx_v_feat;
   PyObject *__pyx_t_0;
@@ -935,7 +939,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":20
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -944,11 +948,11 @@ struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ {
   PyObject_HEAD
-  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self;
+  PyObject *__pyx_v_self;
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -976,7 +980,7 @@ struct __pyx_obj_3_sa_FeatureVector {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":190
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
  * 
  *     def alignments(self):             # <<<<<<<<<<<<<<
@@ -984,16 +988,16 @@ struct __pyx_obj_3_sa_FeatureVector {
  *             yield point/65536, point%65536
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   PyObject *__pyx_v_point;
-  struct __pyx_obj_3_sa_Rule *__pyx_v_self;
+  PyObject *__pyx_v_self;
   PyObject *__pyx_t_0;
   Py_ssize_t __pyx_t_1;
   PyObject *(*__pyx_t_2)(PyObject *);
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":23
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":23
  *         return ' '.join('%s=%s' % feat for feat in self)
  * 
  * cdef class Scorer:             # <<<<<<<<<<<<<<
@@ -1007,7 +1011,7 @@ struct __pyx_obj_3_sa_Scorer {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":8
  * # May need to revisit if things get really tight, though.
  * 
  * cdef class Alignment:             # <<<<<<<<<<<<<<
@@ -1022,7 +1026,7 @@ struct __pyx_obj_3_sa_Alignment {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":15
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -1030,15 +1034,15 @@ struct __pyx_obj_3_sa_Alignment {
  *         for i in range(self.names.len):
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   unsigned int __pyx_v_i;
-  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self;
+  PyObject *__pyx_v_self;
   int __pyx_t_0;
   unsigned int __pyx_t_1;
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":118
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":118
  * # (entirely C-implemented) _BitSet struct.
  * # Very slow; use only for debugging
  * cdef class BitSet:             # <<<<<<<<<<<<<<
@@ -1051,7 +1055,7 @@ struct __pyx_obj_3_sa_BitSet {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":92
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":92
  * 
  * 
  * cdef class Sampler:             # <<<<<<<<<<<<<<
@@ -1065,7 +1069,7 @@ struct __pyx_obj_3_sa_Sampler {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":8
  *     char* stringmap_word(StrMap *vocab, int i)
  * 
  * cdef class StringMap:             # <<<<<<<<<<<<<<
@@ -1079,7 +1083,7 @@ struct __pyx_obj_3_sa_StringMap {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":32
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":32
  * cdef int EPSILON = sym_fromstring('*EPS*', True)
  * 
  * cdef class TrieNode:             # <<<<<<<<<<<<<<
@@ -1092,7 +1096,7 @@ struct __pyx_obj_3_sa_TrieNode {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":38
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":38
  *         self.children = {}
  * 
  * cdef class ExtendedTrieNode(TrieNode):             # <<<<<<<<<<<<<<
@@ -1107,7 +1111,7 @@ struct __pyx_obj_3_sa_ExtendedTrieNode {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":109
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":109
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)
  * 
  * cdef class TrieMap:             # <<<<<<<<<<<<<<
@@ -1139,7 +1143,7 @@ struct __pyx_obj_3_sa_Phrase {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":81
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -1147,15 +1151,15 @@ struct __pyx_obj_3_sa_Phrase {
  *         for i in range(self.len):
  */
 struct __pyx_obj_3_sa___pyx_scope_struct____iter__ {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   int __pyx_v_i;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_self;
+  PyObject *__pyx_v_self;
   int __pyx_t_0;
   int __pyx_t_1;
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":49
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":49
  * 
  * 
  * cdef class TrieTable:             # <<<<<<<<<<<<<<
@@ -1170,7 +1174,7 @@ struct __pyx_obj_3_sa_TrieTable {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":183
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":183
  *         return self.f.arity()
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -1179,7 +1183,7 @@ struct __pyx_obj_3_sa_TrieTable {
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ {
   PyObject_HEAD
-  struct __pyx_obj_3_sa_Rule *__pyx_v_self;
+  PyObject *__pyx_v_self;
 };
 
 
@@ -1201,7 +1205,7 @@ struct __pyx_obj_3_sa_FloatList {
 
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":8
  *     char* stringmap_word(StrMap *vocab, int i)
  * 
  * cdef class StringMap:             # <<<<<<<<<<<<<<
@@ -1216,7 +1220,7 @@ struct __pyx_vtabstruct_3_sa_StringMap {
 static struct __pyx_vtabstruct_3_sa_StringMap *__pyx_vtabptr_3_sa_StringMap;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
@@ -1231,7 +1235,7 @@ struct __pyx_vtabstruct_3_sa_DataArray {
 static struct __pyx_vtabstruct_3_sa_DataArray *__pyx_vtabptr_3_sa_DataArray;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":109
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":109
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)
  * 
  * cdef class TrieMap:             # <<<<<<<<<<<<<<
@@ -1246,7 +1250,7 @@ struct __pyx_vtabstruct_3_sa_TrieMap {
 static struct __pyx_vtabstruct_3_sa_TrieMap *__pyx_vtabptr_3_sa_TrieMap;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":8
  * # May need to revisit if things get really tight, though.
  * 
  * cdef class Alignment:             # <<<<<<<<<<<<<<
@@ -1262,7 +1266,7 @@ struct __pyx_vtabstruct_3_sa_Alignment {
 static struct __pyx_vtabstruct_3_sa_Alignment *__pyx_vtabptr_3_sa_Alignment;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":47
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":47
  * 
  * 
  * cdef class BiLex:             # <<<<<<<<<<<<<<
@@ -1281,7 +1285,7 @@ struct __pyx_vtabstruct_3_sa_BiLex {
 static struct __pyx_vtabstruct_3_sa_BiLex *__pyx_vtabptr_3_sa_BiLex;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":9
  * from libc.string cimport memset, memcpy
  * 
  * cdef class IntList:             # <<<<<<<<<<<<<<
@@ -1301,7 +1305,7 @@ struct __pyx_vtabstruct_3_sa_IntList {
 static struct __pyx_vtabstruct_3_sa_IntList *__pyx_vtabptr_3_sa_IntList;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":4
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":4
  * from libc.string cimport strsep, strcpy, strlen
  * 
  * cdef class Phrase:             # <<<<<<<<<<<<<<
@@ -1316,7 +1320,7 @@ struct __pyx_vtabstruct_3_sa_Phrase {
 static struct __pyx_vtabstruct_3_sa_Phrase *__pyx_vtabptr_3_sa_Phrase;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":70
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":70
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -1330,7 +1334,7 @@ struct __pyx_vtabstruct_3_sa_PhraseLocation {
 static struct __pyx_vtabstruct_3_sa_PhraseLocation *__pyx_vtabptr_3_sa_PhraseLocation;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":188
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":188
  * 
  * 
  * cdef class Precomputation:             # <<<<<<<<<<<<<<
@@ -1345,7 +1349,7 @@ struct __pyx_vtabstruct_3_sa_Precomputation {
 static struct __pyx_vtabstruct_3_sa_Precomputation *__pyx_vtabptr_3_sa_Precomputation;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":23
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":23
  *         return ' '.join('%s=%s' % feat for feat in self)
  * 
  * cdef class Scorer:             # <<<<<<<<<<<<<<
@@ -1359,7 +1363,7 @@ struct __pyx_vtabstruct_3_sa_Scorer {
 static struct __pyx_vtabstruct_3_sa_Scorer *__pyx_vtabptr_3_sa_Scorer;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":9
  * from libc.string cimport memset, strcpy, strlen
  * 
  * cdef class FloatList:             # <<<<<<<<<<<<<<
@@ -1375,7 +1379,7 @@ struct __pyx_vtabstruct_3_sa_FloatList {
 static struct __pyx_vtabstruct_3_sa_FloatList *__pyx_vtabptr_3_sa_FloatList;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":354
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":354
  * 
  * 
  * cdef class VEB:             # <<<<<<<<<<<<<<
@@ -1391,7 +1395,7 @@ struct __pyx_vtabstruct_3_sa_VEB {
 static struct __pyx_vtabstruct_3_sa_VEB *__pyx_vtabptr_3_sa_VEB;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":7
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":7
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1
  * 
  * cdef class Alphabet:             # <<<<<<<<<<<<<<
@@ -1414,7 +1418,7 @@ struct __pyx_vtabstruct_3_sa_Alphabet {
 static struct __pyx_vtabstruct_3_sa_Alphabet *__pyx_vtabptr_3_sa_Alphabet;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":214
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":214
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -1442,7 +1446,7 @@ struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory {
 static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *__pyx_vtabptr_3_sa_HieroCachingRuleFactory;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":6
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":6
  * from libc.stdio cimport FILE, fclose, fopen
  * 
  * cdef class SuffixArray:             # <<<<<<<<<<<<<<
@@ -1451,15 +1455,17 @@ static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *__pyx_vtabptr_3_sa_
  */
 
 struct __pyx_vtabstruct_3_sa_SuffixArray {
-  int (*__pyx___search_high)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
-  int (*__pyx___search_low)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
-  PyObject *(*__pyx___get_range)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int);
-  PyObject *(*__pyx___lookup_helper)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  int (*__search_high)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  int (*__search_low)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  PyObject *(*__get_range)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int);
+  PyObject *(*__lookup_helper)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
 };
 static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
+
 #ifndef CYTHON_REFNANNY
   #define CYTHON_REFNANNY 0
 #endif
+
 #if CYTHON_REFNANNY
   typedef struct {
     void (*INCREF)(void*, PyObject*, int);
@@ -1472,21 +1478,8 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/
   #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
-#ifdef WITH_THREAD
-  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
-          if (acquire_gil) { \
-              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \
-              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
-              PyGILState_Release(__pyx_gilstate_save); \
-          } else { \
-              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
-          }
-#else
-  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
-          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
-#endif
-  #define __Pyx_RefNannyFinishContext() \
-          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
+  #define __Pyx_RefNannySetupContext(name)           __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
+  #define __Pyx_RefNannyFinishContext()           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
   #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
@@ -1497,7 +1490,7 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
 #else
   #define __Pyx_RefNannyDeclarations
-  #define __Pyx_RefNannySetupContext(name, acquire_gil)
+  #define __Pyx_RefNannySetupContext(name)
   #define __Pyx_RefNannyFinishContext()
   #define __Pyx_INCREF(r) Py_INCREF(r)
   #define __Pyx_DECREF(r) Py_DECREF(r)
@@ -1508,97 +1501,16 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   #define __Pyx_XGOTREF(r)
   #define __Pyx_XGIVEREF(r)
 #endif /* CYTHON_REFNANNY */
-#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
-#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
 
 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
 
-static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
-                                         Py_ssize_t end, int direction)
-{
-    const char* self_ptr = PyBytes_AS_STRING(self);
-    Py_ssize_t self_len = PyBytes_GET_SIZE(self);
-    const char* sub_ptr;
-    Py_ssize_t sub_len;
-    int retval;
-#if PY_VERSION_HEX >= 0x02060000
-    Py_buffer view;
-    view.obj = NULL;
-#endif
-    if ( PyBytes_Check(arg) ) {
-        sub_ptr = PyBytes_AS_STRING(arg);
-        sub_len = PyBytes_GET_SIZE(arg);
-    }
-#if PY_MAJOR_VERSION < 3
-    else if ( PyUnicode_Check(arg) ) {
-        return PyUnicode_Tailmatch(self, arg, start, end, direction);
-    }
-#endif
-    else {
-#if PY_VERSION_HEX < 0x02060000
-        if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
-            return -1;
-#else
-        if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
-            return -1;
-        sub_ptr = (const char*) view.buf;
-        sub_len = view.len;
-#endif
-    }
-    if (end > self_len)
-        end = self_len;
-    else if (end < 0)
-        end += self_len;
-    if (end < 0)
-        end = 0;
-    if (start < 0)
-        start += self_len;
-    if (start < 0)
-        start = 0;
-    if (direction > 0) {
-        if (end-sub_len > start)
-            start = end - sub_len;
-    }
-    if (start + sub_len <= end)
-        retval = !memcmp(self_ptr+start, sub_ptr, sub_len);
-    else
-        retval = 0;
-#if PY_VERSION_HEX >= 0x02060000
-    if (view.obj)
-        PyBuffer_Release(&view);
-#endif
-    return retval;
-}
-static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
-                                   Py_ssize_t end, int direction)
-{
-    if (unlikely(PyTuple_Check(substr))) {
-        Py_ssize_t i, count = PyTuple_GET_SIZE(substr);
-        for (i = 0; i < count; i++) {
-            int result;
-#if CYTHON_COMPILING_IN_CPYTHON
-            result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
-                                                   start, end, direction);
-#else
-            PyObject* sub = PySequence_GetItem(substr, i);
-            if (unlikely(!sub)) return -1;
-            result = __Pyx_PyBytes_SingleTailmatch(self, sub, start, end, direction);
-            Py_DECREF(sub);
-#endif
-            if (result) {
-                return result;
-            }
-        }
-        return 0;
-    }
-    return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
-}
+static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
+                                   Py_ssize_t end, int direction);
 
-static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/
+static void __Pyx_RaiseDoubleKeywordsError(
+    const char* func_name, PyObject* kw_name); /*proto*/
 
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
-    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
-    const char* function_name); /*proto*/
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
 
 static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
     Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
@@ -1610,7 +1522,9 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
 
 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
 
-static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /*proto*/
+static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict,
+    const char* function_name, int kw_allowed); /*proto*/
+
 
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
     PyObject *r;
@@ -1619,96 +1533,86 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j
     Py_DECREF(j);
     return r;
 }
+
+
 #define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_List_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-        PyObject *r = PyList_GET_ITEM(o, i);
-        Py_INCREF(r);
-        return r;
-    }
-    else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
-        PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
-        Py_INCREF(r);
-        return r;
+    if (likely(o != Py_None)) {
+        if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+            PyObject *r = PyList_GET_ITEM(o, i);
+            Py_INCREF(r);
+            return r;
+        }
+        else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
+            PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
+            Py_INCREF(r);
+            return r;
+        }
     }
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
-#else
-    return PySequence_GetItem(o, i);
-#endif
 }
+
 #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_Tuple_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-        PyObject *r = PyTuple_GET_ITEM(o, i);
-        Py_INCREF(r);
-        return r;
-    }
-    else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
-        PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
-        Py_INCREF(r);
-        return r;
+    if (likely(o != Py_None)) {
+        if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+            PyObject *r = PyTuple_GET_ITEM(o, i);
+            Py_INCREF(r);
+            return r;
+        }
+        else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
+            PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
+            Py_INCREF(r);
+            return r;
+        }
     }
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
-#else
-    return PySequence_GetItem(o, i);
-#endif
 }
+
+
 #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (PyList_CheckExact(o)) {
-        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
-        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
-            PyObject *r = PyList_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
-        }
+    PyObject *r;
+    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        r = PyList_GET_ITEM(o, i);
+        Py_INCREF(r);
     }
-    else if (PyTuple_CheckExact(o)) {
-        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
-        if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
-        }
-    } else {  /* inlined PySequence_GetItem() */
-        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
-        if (likely(m && m->sq_item)) {
-            if (unlikely(i < 0) && likely(m->sq_length)) {
-                Py_ssize_t l = m->sq_length(o);
-                if (unlikely(l < 0)) return NULL;
-                i += l;
-            }
-            return m->sq_item(o, i);
-        }
+    else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
     }
-#else
-    if (PySequence_Check(o)) {
-        return PySequence_GetItem(o, i);
+    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
+        r = PySequence_GetItem(o, i);
     }
-#endif
-    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+    else {
+        r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+    }
+    return r;
 }
 
-static CYTHON_INLINE int __Pyx_PySequence_Contains(PyObject* item, PyObject* seq, int eq) {
-    int result = PySequence_Contains(seq, item);
-    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
+static CYTHON_INLINE int __Pyx_NegateNonNeg(int b) { 
+    return unlikely(b < 0) ? b : !b; 
+}
+static CYTHON_INLINE PyObject* __Pyx_PyBoolOrNull_FromLong(long b) {
+    return unlikely(b < 0) ? NULL : __Pyx_PyBool_FromLong(b);
 }
 
 static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
     if (likely(PyList_CheckExact(L))) {
-        if (unlikely(PyList_Append(L, x) < 0)) return NULL;
+        if (PyList_Append(L, x) < 0) return NULL;
         Py_INCREF(Py_None);
         return Py_None; /* this is just to have an accurate signature */
-    } else {
+    }
+    else {
         PyObject *r, *m;
         m = __Pyx_GetAttrString(L, "append");
         if (!m) return NULL;
@@ -1726,17 +1630,16 @@ static CYTHON_INLINE long __Pyx_div_long(long, long); /* proto */
 
 static CYTHON_INLINE long __Pyx_mod_long(long, long); /* proto */
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
-
 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
 
-static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
 
 static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/
 
 #define __Pyx_SetItemInt(o, i, v, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_SetItemInt_Fast(o, i, v) : \
                                                     __Pyx_SetItemInt_Generic(o, to_py_func(i), v))
+
 static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
     int r;
     if (!j) return -1;
@@ -1744,126 +1647,130 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyOb
     Py_DECREF(j);
     return r;
 }
+
 static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (PyList_CheckExact(o)) {
-        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
-        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
-            PyObject* old = PyList_GET_ITEM(o, n);
-            Py_INCREF(v);
-            PyList_SET_ITEM(o, n, v);
-            Py_DECREF(old);
-            return 1;
-        }
-    } else {  /* inlined PySequence_SetItem() */
-        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
-        if (likely(m && m->sq_ass_item)) {
-            if (unlikely(i < 0) && likely(m->sq_length)) {
-                Py_ssize_t l = m->sq_length(o);
-                if (unlikely(l < 0)) return -1;
-                i += l;
-            }
-            return m->sq_ass_item(o, i, v);
-        }
+    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        Py_INCREF(v);
+        Py_DECREF(PyList_GET_ITEM(o, i));
+        PyList_SET_ITEM(o, i, v);
+        return 1;
     }
-#else
-#if CYTHON_COMPILING_IN_PYPY
-    if (PySequence_Check(o) && !PyDict_Check(o)) {
-#else
-    if (PySequence_Check(o)) {
-#endif
+    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0)))
         return PySequence_SetItem(o, i, v);
+    else {
+        PyObject *j = PyInt_FromSsize_t(i);
+        return __Pyx_SetItemInt_Generic(o, j, v);
     }
-#endif
-    return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v);
 }
 
 static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */
-#if CYTHON_COMPILING_IN_PYPY
-#define __Pyx_PyObject_AsDouble(obj) \
-(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \
- likely(PyInt_CheckExact(obj)) ? \
- PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
-#else
+
 #define __Pyx_PyObject_AsDouble(obj) \
-((likely(PyFloat_CheckExact(obj))) ? \
- PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
-#endif
+    ((likely(PyFloat_CheckExact(obj))) ? \
+     PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
 
 static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);
 
 static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact); /*proto*/
 
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
-    PyListObject* L = (PyListObject*) list;
-    Py_ssize_t len = Py_SIZE(list);
-    if (likely(L->allocated > len)) {
-        Py_INCREF(x);
-        PyList_SET_ITEM(list, len, x);
-        Py_SIZE(list) = len+1;
-        return 0;
-    }
-    return PyList_Append(list, x);
-}
-#else
-#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
-#endif
-
-static CYTHON_INLINE int __Pyx_PyDict_Contains(PyObject* item, PyObject* dict, int eq) {
-    int result = PyDict_Contains(dict, item);
-    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
-}
-
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
-
-static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
-
-static CYTHON_INLINE int __Pyx_unpack_tuple2(PyObject* tuple, PyObject** value1, PyObject** value2,
-                                             int is_tuple, int has_known_size, int decref_tuple);
-
-static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name,
-                                                   Py_ssize_t* p_orig_length, int* p_is_dict);
-static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos,
-                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict);
-
 #if PY_VERSION_HEX < 0x02050000
 #ifndef PyAnySet_CheckExact
+
 #define PyAnySet_CheckExact(ob) \
     ((ob)->ob_type == &PySet_Type || \
      (ob)->ob_type == &PyFrozenSet_Type)
+
 #define PySet_New(iterable) \
     PyObject_CallFunctionObjArgs((PyObject *)&PySet_Type, (iterable), NULL)
+
 #define Pyx_PyFrozenSet_New(iterable) \
     PyObject_CallFunctionObjArgs((PyObject *)&PyFrozenSet_Type, (iterable), NULL)
+
 #define PySet_Size(anyset) \
     PyObject_Size((anyset))
+
 #define PySet_Contains(anyset, key) \
     PySequence_Contains((anyset), (key))
+
 #define PySet_Pop(set) \
     PyObject_CallMethod(set, (char *)"pop", NULL)
+
 static CYTHON_INLINE int PySet_Clear(PyObject *set) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"clear", NULL);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
+
 static CYTHON_INLINE int PySet_Discard(PyObject *set, PyObject *key) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"discard", (char *)"O", key);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
+
 static CYTHON_INLINE int PySet_Add(PyObject *set, PyObject *key) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"add", (char *)"O", key);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
+
 #endif /* PyAnySet_CheckExact (<= Py2.4) */
+
+#if PY_VERSION_HEX < 0x02040000
+#ifndef Py_SETOBJECT_H
+#define Py_SETOBJECT_H
+
+static PyTypeObject *__Pyx_PySet_Type = NULL;
+static PyTypeObject *__Pyx_PyFrozenSet_Type = NULL;
+
+#define PySet_Type (*__Pyx_PySet_Type)
+#define PyFrozenSet_Type (*__Pyx_PyFrozenSet_Type)
+
+#define PyAnySet_Check(ob) \
+    (PyAnySet_CheckExact(ob) || \
+     PyType_IsSubtype((ob)->ob_type, &PySet_Type) || \
+     PyType_IsSubtype((ob)->ob_type, &PyFrozenSet_Type))
+
+#define PyFrozenSet_CheckExact(ob) ((ob)->ob_type == &PyFrozenSet_Type)
+
+static int __Pyx_Py23SetsImport(void) {
+    PyObject *sets=0, *Set=0, *ImmutableSet=0;
+
+    sets = PyImport_ImportModule((char *)"sets");
+    if (!sets) goto bad;
+    Set = PyObject_GetAttrString(sets, (char *)"Set");
+    if (!Set) goto bad;
+    ImmutableSet = PyObject_GetAttrString(sets, (char *)"ImmutableSet");
+    if (!ImmutableSet) goto bad;
+    Py_DECREF(sets);
+
+    __Pyx_PySet_Type       = (PyTypeObject*) Set;
+    __Pyx_PyFrozenSet_Type = (PyTypeObject*) ImmutableSet;
+
+    return 0;
+
+ bad:
+    Py_XDECREF(sets);
+    Py_XDECREF(Set);
+    Py_XDECREF(ImmutableSet);
+    return -1;
+}
+
+#else
+static int __Pyx_Py23SetsImport(void) { return 0; }
+#endif /* !Py_SETOBJECT_H */
+#endif /* < Py2.4  */
 #endif /* < Py2.5  */
 
+static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void);
+
 #if PY_MAJOR_VERSION >= 3
 static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
     PyObject *value;
+    if (unlikely(d == Py_None)) {
+        __Pyx_RaiseNoneIndexingError();
+        return NULL;
+    }
     value = PyDict_GetItemWithError(d, key);
     if (unlikely(!value)) {
         if (!PyErr_Occurred())
@@ -1882,9 +1789,10 @@ static CYTHON_INLINE int __Pyx_div_int(int, int); /* proto */
 #define UNARY_NEG_WOULD_OVERFLOW(x)            (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
 
 static CYTHON_INLINE PyObject* __Pyx_PyObject_Pop(PyObject* L) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02040000
+#if PY_VERSION_HEX >= 0x02040000
     if (likely(PyList_CheckExact(L))
-        && likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
+            /* Check that both the size is positive and no reallocation shrinking needs to be done. */
+            && likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
         Py_SIZE(L) -= 1;
         return PyList_GET_ITEM(L, PyList_GET_SIZE(L));
     }
@@ -1902,49 +1810,31 @@ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb);
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/
 
-static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name);
-
-#define __Pyx_CyFunction_USED 1
-#include <structmember.h>
-#define __Pyx_CYFUNCTION_STATICMETHOD  0x01
-#define __Pyx_CYFUNCTION_CLASSMETHOD   0x02
-#define __Pyx_CYFUNCTION_CCLASS        0x04
-#define __Pyx_CyFunction_GetClosure(f) \
-    (((__pyx_CyFunctionObject *) (f))->func_closure)
-#define __Pyx_CyFunction_GetClassObj(f) \
-    (((__pyx_CyFunctionObject *) (f))->func_classobj)
-#define __Pyx_CyFunction_Defaults(type, f) \
-    ((type *)(((__pyx_CyFunctionObject *) (f))->defaults))
-#define __Pyx_CyFunction_SetDefaultsGetter(f, g) \
-    ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g)
+#include <string.h>
+
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
+
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
+
+#if PY_MAJOR_VERSION >= 3
+#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
+#else
+#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
+#endif
+
+#define __pyx_binding_PyCFunctionType_USED 1
+
 typedef struct {
     PyCFunctionObject func;
-    int flags;
-    PyObject *func_dict;
-    PyObject *func_weakreflist;
-    PyObject *func_name;
-    PyObject *func_doc;
-    PyObject *func_code;
-    PyObject *func_closure;
-    PyObject *func_classobj; /* No-args super() class cell */
-    void *defaults;
-    int defaults_pyobjects;
-    PyObject *defaults_tuple; /* Const defaults tuple */
-    PyObject *(*defaults_getter)(PyObject *);
-} __pyx_CyFunctionObject;
-static PyTypeObject *__pyx_CyFunctionType = 0;
-#define __Pyx_CyFunction_NewEx(ml, flags, self, module, code) \
-    __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, self, module, code)
-static PyObject *__Pyx_CyFunction_New(PyTypeObject *,
-                                      PyMethodDef *ml, int flags,
-                                      PyObject *self, PyObject *module,
-                                      PyObject* code);
-static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m,
-                                                         size_t size,
-                                                         int pyobjects);
-static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m,
-                                                            PyObject *tuple);
-static int __Pyx_CyFunction_init(void);
+} __pyx_binding_PyCFunctionType_object;
+
+static PyTypeObject __pyx_binding_PyCFunctionType_type;
+static PyTypeObject *__pyx_binding_PyCFunctionType = NULL;
+
+static PyObject *__pyx_binding_PyCFunctionType_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module); /* proto */
+#define __pyx_binding_PyCFunctionType_New(ml, self) __pyx_binding_PyCFunctionType_NewEx(ml, self, NULL)
+
+static int __pyx_binding_PyCFunctionType_init(void); /* proto */
 
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
 
@@ -1983,59 +1873,17 @@ static void __Pyx_WriteUnraisable(const char *name, int clineno,
 
 static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
 
-#define __Pyx_Generator_USED
-#include <structmember.h>
-#include <frameobject.h>
-typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
-typedef struct {
-    PyObject_HEAD
-    __pyx_generator_body_t body;
-    PyObject *closure;
-    PyObject *exc_type;
-    PyObject *exc_value;
-    PyObject *exc_traceback;
-    PyObject *gi_weakreflist;
-    PyObject *classobj;
-    PyObject *yieldfrom;
-    int resume_label;
-    char is_running;  // using T_BOOL for property below requires char value
-} __pyx_GeneratorObject;
-static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
-                                                  PyObject *closure);
-static int __pyx_Generator_init(void);
-static int __Pyx_Generator_clear(PyObject* self);
-#if 1 || PY_VERSION_HEX < 0x030300B0
-static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
-#else
-#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
-#endif
-
 static int __Pyx_check_binary_version(void);
 
 static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/
 
 static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
 
-typedef struct {
-    int code_line;
-    PyCodeObject* code_object;
-} __Pyx_CodeObjectCacheEntry;
-struct __Pyx_CodeObjectCache {
-    int count;
-    int max_count;
-    __Pyx_CodeObjectCacheEntry* entries;
-};
-static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
-static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
-static PyCodeObject *__pyx_find_code_object(int code_line);
-static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
-
-static void __Pyx_AddTraceback(const char *funcname, int c_line,
-                               int py_line, const char *filename); /*proto*/
+static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
+                               int __pyx_lineno, const char *__pyx_filename); /*proto*/
 
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
 
-
 /* Module declarations from 'libc.stdio' */
 
 /* Module declarations from 'libc.stdlib' */
@@ -2070,6 +1918,7 @@ static PyTypeObject *__pyx_ptype_3_sa_PhraseLocation = 0;
 static PyTypeObject *__pyx_ptype_3_sa_Sampler = 0;
 static PyTypeObject *__pyx_ptype_3_sa_HieroCachingRuleFactory = 0;
 static PyTypeObject *__pyx_ptype_3_sa_Scorer = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_Generator = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct____iter__ = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = 0;
@@ -2094,6 +1943,7 @@ static int __pyx_v_3_sa_BAEZA_YATES;
 static int __pyx_v_3_sa_EPSILON;
 static struct __pyx_obj_3_sa_StringMap *__pyx_v_3_sa_FD = 0;
 static char *__pyx_f_3_sa_sym_tostring(int); /*proto*/
+static char *__pyx_f_3_sa_sym_tocat(int); /*proto*/
 static int __pyx_f_3_sa_sym_isvar(int); /*proto*/
 static int __pyx_f_3_sa_sym_getindex(int); /*proto*/
 static float __pyx_f_3_sa_monitor_cpu(void); /*proto*/
@@ -2118,6 +1968,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *);
 static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
+static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_Node *, int *, int); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *, PyObject *, PyObject *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *, PyObject *, PyObject *, int); /*proto*/
@@ -2142,192 +1993,6 @@ static PyObject *__pyx_builtin_StopIteration;
 static PyObject *__pyx_builtin_cmp;
 static PyObject *__pyx_builtin_sorted;
 static PyObject *__pyx_builtin_max;
-static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_filename); /* proto */
-static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len); /* proto */
-static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, float __pyx_v_val); /* proto */
-static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_val); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_16__iter__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_index); /* proto */
-static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_25getSize(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
-static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_4getSentId(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_8getSentPos(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id); /* proto */
-static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_from_text, PyObject *__pyx_v_from_data, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_earray, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_alignment); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_eword); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword, PyObject *__pyx_v_eword, PyObject *__pyx_v_col); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBIterator *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_size); /* proto */
-static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa); /* proto */
-static PyObject *__pyx_pf_3_sa_3LCP_2compute_stats(struct __pyx_obj_3_sa_LCP *__pyx_v_self, int __pyx_v_max_n); /* proto */
-static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
-static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_2sym_fromstring(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_string, int __pyx_v_terminal); /* proto */
-static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_words); /* proto */
-static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_k); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_ci); /* proto */
-#if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
-#endif
-static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_28__iter__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_children); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, int __pyx_v_lhs, struct __pyx_obj_3_sa_Phrase *__pyx_v_f, struct __pyx_obj_3_sa_Phrase *__pyx_v_e, PyObject *__pyx_v_scores, PyObject *__pyx_v_word_alignments); /* proto */
-static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-#if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Rule *__pyx_v_other); /* proto */
-#endif
-static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Phrase *__pyx_v_f); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_7__str___genexpr(PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_12alignments(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, int __pyx_v_alphabet_size); /* proto */
-static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
-static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
-static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_flag); /* proto */
-static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_from_stats, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_precompute_rank, PyObject *__pyx_v_precompute_secondary_rank, PyObject *__pyx_v_max_length, PyObject *__pyx_v_max_nonterminals, PyObject *__pyx_v_train_max_initial_size, PyObject *__pyx_v_train_min_gap_size); /* proto */
-static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray); /* proto */
-static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentId(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6getSent(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8getSentPos(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high); /* proto */
-static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_3_sa_8TrieNode_8children_4__del__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_phrase, PyObject *__pyx_v_phrase_location, PyObject *__pyx_v_suffix_link); /* proto */
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_extended); /* proto */
-static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_9TrieTable_4root_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sa_low, int __pyx_v_sa_high, int __pyx_v_arr_low, int __pyx_v_arr_high, PyObject *__pyx_v_arr, int __pyx_v_num_subpatterns); /* proto */
-static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, int __pyx_v_sample_size, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray); /* proto */
-static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location); /* proto */
-static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment, float __pyx_v_by_slack_factor, char *__pyx_v_category, PyObject *__pyx_v_max_chunks, unsigned int __pyx_v_max_initial_size, unsigned int __pyx_v_max_length, unsigned int __pyx_v_max_nonterminals, PyObject *__pyx_v_max_target_chunks, PyObject *__pyx_v_max_target_length, unsigned int __pyx_v_min_gap_size, PyObject *__pyx_v_precompute_file, unsigned int __pyx_v_precompute_secondary_rank, unsigned int __pyx_v_precompute_rank, int __pyx_v_require_aligned_terminal, int __pyx_v_require_aligned_chunks, unsigned int __pyx_v_train_max_initial_size, unsigned int __pyx_v_train_min_gap_size, int __pyx_v_tight_phrases, int __pyx_v_use_baeza_yates, int __pyx_v_use_collocations, int __pyx_v_use_index); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray, struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray, struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler, struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_phrase); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_frontier, PyObject *__pyx_v_res, PyObject *__pyx_v_fwords); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_skip, PyObject *__pyx_v_i, PyObject *__pyx_v_spanlen, PyObject *__pyx_v_pathlen, PyObject *__pyx_v_fwords, PyObject *__pyx_v_next_states, PyObject *__pyx_v_reachable_buffer); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_dist); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_ito); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v__columns, PyObject *__pyx_v_curr_idx, PyObject *__pyx_v_min_dist); /* proto */
-static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords); /* proto */
-static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value); /* proto */
-static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str___genexpr(PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_self, PyObject *__pyx_v_models); /* proto */
 static char __pyx_k_1[] = ".gz";
 static char __pyx_k_2[] = "Requested index %d of %d-length FloatList";
 static char __pyx_k_3[] = "IntList[";
@@ -2421,10 +2086,8 @@ static char __pyx_k_131[] = "Subphrase [%d, %d] failed integrity check";
 static char __pyx_k_132[] = "Didn't extract anything from [%d, %d] -> [%d, %d]";
 static char __pyx_k_133[] = "Unable to extract basic phrase";
 static char __pyx_k_134[] = "%s=%s";
-static char __pyx_k_137[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/_sa.pyx";
-static char __pyx_k_138[] = "cdec.sa";
-static char __pyx_k_142[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi";
-static char __pyx_k_143[] = "*EPS*";
+static char __pyx_k_135[] = "cdec.sa";
+static char __pyx_k_137[] = "*EPS*";
 static char __pyx_k__gc[] = "gc";
 static char __pyx_k__sa[] = "sa";
 static char __pyx_k___sa[] = "_sa";
@@ -2640,11 +2303,9 @@ static PyObject *__pyx_kp_s_131;
 static PyObject *__pyx_kp_s_132;
 static PyObject *__pyx_kp_s_133;
 static PyObject *__pyx_kp_s_134;
+static PyObject *__pyx_kp_s_135;
 static PyObject *__pyx_kp_s_137;
-static PyObject *__pyx_kp_s_138;
 static PyObject *__pyx_kp_s_14;
-static PyObject *__pyx_kp_s_142;
-static PyObject *__pyx_kp_s_143;
 static PyObject *__pyx_kp_s_18;
 static PyObject *__pyx_kp_s_2;
 static PyObject *__pyx_kp_s_21;
@@ -2943,11 +2604,7 @@ static PyObject *__pyx_k_tuple_98;
 static PyObject *__pyx_k_tuple_102;
 static PyObject *__pyx_k_tuple_107;
 static PyObject *__pyx_k_tuple_122;
-static PyObject *__pyx_k_tuple_135;
-static PyObject *__pyx_k_tuple_139;
-static PyObject *__pyx_k_tuple_140;
-static PyObject *__pyx_k_codeobj_136;
-static PyObject *__pyx_k_codeobj_141;
+static PyObject *__pyx_k_tuple_136;
 
 /* "_sa.pyx":5
  * import gzip
@@ -2968,7 +2625,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("monitor_cpu", 0);
+  __Pyx_RefNannySetupContext("monitor_cpu");
 
   /* "_sa.pyx":6
  * 
@@ -2988,7 +2645,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -3018,7 +2675,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   __pyx_t_4 = 0;
@@ -3033,7 +2690,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_r = __pyx_t_5;
   goto __pyx_L0;
@@ -3052,28 +2709,6 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_1gzip_or_text = {__Pyx_NAMESTR("gzip_or_text"), (PyCFunction)__pyx_pw_3_sa_1gzip_or_text, METH_O, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("gzip_or_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.gzip_or_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_gzip_or_text(__pyx_self, ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "_sa.pyx":9
  *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
  * 
@@ -3082,7 +2717,10 @@ static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__p
  *         return gzip.GzipFile(filename)
  */
 
-static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_gzip_or_text = {__Pyx_NAMESTR("gzip_or_text"), (PyCFunction)__pyx_pf_3_sa_gzip_or_text, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3092,7 +2730,17 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("gzip_or_text", 0);
+  __Pyx_RefNannySetupContext("gzip_or_text");
+  __pyx_self = __pyx_self;
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.gzip_or_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "_sa.pyx":10
  * 
@@ -3123,7 +2771,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -3134,7 +2782,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
   /*else*/ {
 
@@ -3149,7 +2797,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -3160,7 +2808,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
     __pyx_t_1 = 0;
     goto __pyx_L0;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -3176,22 +2824,32 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":11
+ * cdef class FloatList:
+ * 
+ *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
+ *         if initial_len > size:
+ *             size = initial_len
+ */
+
+static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -3199,7 +2857,7 @@ static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
@@ -3217,7 +2875,7 @@ static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3252,26 +2910,8 @@ static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9FloatList___cinit__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_size, __pyx_v_increment, __pyx_v_initial_len);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":11
- * cdef class FloatList:
- * 
- *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
- *         if initial_len > size:
- *             size = initial_len
- */
-
-static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":12
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":12
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:             # <<<<<<<<<<<<<<
@@ -3281,7 +2921,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
   __pyx_t_1 = (__pyx_v_initial_len > __pyx_v_size);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":13
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":13
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:
  *             size = initial_len             # <<<<<<<<<<<<<<
@@ -3289,70 +2929,61 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  *         self.increment = increment
  */
     __pyx_v_size = __pyx_v_initial_len;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":14
  *         if initial_len > size:
  *             size = initial_len
  *         self.size = size             # <<<<<<<<<<<<<<
  *         self.increment = increment
  *         self.len = initial_len
  */
-  __pyx_v_self->size = __pyx_v_size;
+  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size = __pyx_v_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":15
  *             size = initial_len
  *         self.size = size
  *         self.increment = increment             # <<<<<<<<<<<<<<
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))
  */
-  __pyx_v_self->increment = __pyx_v_increment;
+  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->increment = __pyx_v_increment;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":16
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":16
  *         self.size = size
  *         self.increment = increment
  *         self.len = initial_len             # <<<<<<<<<<<<<<
  *         self.arr = <float*> malloc(size*sizeof(float))
  *         memset(self.arr, 0, initial_len*sizeof(float))
  */
-  __pyx_v_self->len = __pyx_v_initial_len;
+  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len = __pyx_v_initial_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":17
  *         self.increment = increment
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))             # <<<<<<<<<<<<<<
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
  */
-  __pyx_v_self->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
+  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":18
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))
  *         memset(self.arr, 0, initial_len*sizeof(float))             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  memset(__pyx_v_self->arr, 0, (__pyx_v_initial_len * (sizeof(float))));
+  memset(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr, 0, (__pyx_v_initial_len * (sizeof(float))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_9FloatList_2__dealloc__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -3360,34 +2991,24 @@ static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self) {
+static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":21
  * 
  *     def __dealloc__(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, i):
  */
-  free(__pyx_v_self->arr);
+  free(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9FloatList_4__getitem__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":23
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":23
  *         free(self.arr)
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -3395,7 +3016,8 @@ static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, P
  *         if i<0:
  */
 
-static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_v_j = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -3408,9 +3030,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __Pyx_RefNannySetupContext("__getitem__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":24
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":24
  * 
  *     def __getitem__(self, i):
  *         j = i             # <<<<<<<<<<<<<<
@@ -3420,26 +3042,27 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   __Pyx_INCREF(__pyx_v_i);
   __pyx_v_j = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":25
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":25
  *     def __getitem__(self, i):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":26
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":26
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  */
-    __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
@@ -3447,24 +3070,26 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
     __Pyx_DECREF(__pyx_v_j);
     __pyx_v_j = __pyx_t_3;
     __pyx_t_3 = 0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":27
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         return self.arr[j]
  */
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (!__pyx_t_2) {
-    __pyx_t_3 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_j, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_j, __pyx_t_3, Py_GE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3474,17 +3099,17 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   }
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":28
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":28
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))             # <<<<<<<<<<<<<<
  *         return self.arr[j]
  * 
  */
-    __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_i);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_i);
     __Pyx_GIVEREF(__pyx_v_i);
@@ -3495,7 +3120,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -3505,11 +3130,11 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
     __Pyx_Raise(__pyx_t_1, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L4;
+    goto __pyx_L6;
   }
-  __pyx_L4:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":29
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":29
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         return self.arr[j]             # <<<<<<<<<<<<<<
@@ -3518,7 +3143,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_j); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->arr[__pyx_t_6])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr[__pyx_t_6])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3538,7 +3163,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":31
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":31
  *         return self.arr[j]
  * 
  *     cdef void set(self, int i, float v):             # <<<<<<<<<<<<<<
@@ -3558,9 +3183,9 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set", 0);
+  __Pyx_RefNannySetupContext("set");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":32
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":32
  * 
  *     cdef void set(self, int i, float v):
  *         j = i             # <<<<<<<<<<<<<<
@@ -3569,7 +3194,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
  */
   __pyx_v_j = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":33
  *     cdef void set(self, int i, float v):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -3579,7 +3204,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   __pyx_t_1 = (__pyx_v_i < 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":34
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":34
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -3591,7 +3216,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":35
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":35
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -3607,7 +3232,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":36
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":36
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))             # <<<<<<<<<<<<<<
@@ -3619,7 +3244,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
     __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -3630,7 +3255,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -3644,7 +3269,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":37
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":37
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         self.arr[j] = v             # <<<<<<<<<<<<<<
@@ -3663,18 +3288,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
-static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9FloatList_6__setitem__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((PyObject *)__pyx_v_i), ((PyObject *)__pyx_v_val));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":39
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":39
  *         self.arr[j] = v
  * 
  *     def __setitem__(self, i, val):             # <<<<<<<<<<<<<<
@@ -3682,7 +3296,8 @@ static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -3690,9 +3305,9 @@ static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setitem__", 0);
+  __Pyx_RefNannySetupContext("__setitem__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":40
  * 
  *     def __setitem__(self, i, val):
  *         self.set(i, val)             # <<<<<<<<<<<<<<
@@ -3700,8 +3315,8 @@ static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList
  *     def __len__(self):
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = __pyx_PyFloat_AsFloat(__pyx_v_val); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->set(__pyx_v_self, __pyx_t_1, __pyx_t_2);
+  __pyx_t_2 = __pyx_PyFloat_AsDouble(__pyx_v_val); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->set(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_t_1, __pyx_t_2);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -3713,18 +3328,7 @@ static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9FloatList_8__len__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":42
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":42
  *         self.set(i, val)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -3732,19 +3336,20 @@ static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":43
  * 
  *     def __len__(self):
  *         return self.len             # <<<<<<<<<<<<<<
  * 
  *     def append(self, float val):
  */
-  __pyx_r = __pyx_v_self->len;
+  __pyx_r = ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -3753,28 +3358,7 @@ static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatL
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
-static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
-  float __pyx_v_val;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("append (wrapper)", 0);
-  assert(__pyx_arg_val); {
-    __pyx_v_val = __pyx_PyFloat_AsFloat(__pyx_arg_val); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.FloatList.append", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9FloatList_10append(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((float)__pyx_v_val));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":45
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":45
  *         return self.len
  * 
  *     def append(self, float val):             # <<<<<<<<<<<<<<
@@ -3782,60 +3366,74 @@ static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObj
  *             self.size = self.size + self.increment
  */
 
-static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, float __pyx_v_val) {
+static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
+static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
+  float __pyx_v_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("append", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("append");
+  assert(__pyx_arg_val); {
+    __pyx_v_val = __pyx_PyFloat_AsDouble(__pyx_arg_val); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.FloatList.append", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":46
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":46
  * 
  *     def append(self, float val):
  *         if self.len == self.size:             # <<<<<<<<<<<<<<
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  */
-  __pyx_t_1 = (__pyx_v_self->len == __pyx_v_self->size);
+  __pyx_t_1 = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len == ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":47
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":47
  *     def append(self, float val):
  *         if self.len == self.size:
  *             self.size = self.size + self.increment             # <<<<<<<<<<<<<<
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val
  */
-    __pyx_v_self->size = (__pyx_v_self->size + __pyx_v_self->increment);
+    ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size + ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->increment);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":48
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":48
  *         if self.len == self.size:
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))             # <<<<<<<<<<<<<<
  *         self.arr[self.len] = val
  *         self.len = self.len + 1
  */
-    __pyx_v_self->arr = ((float *)realloc(__pyx_v_self->arr, (__pyx_v_self->size * (sizeof(float)))));
-    goto __pyx_L3;
+    ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr = ((float *)realloc(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr, (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size * (sizeof(float)))));
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":49
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":49
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val             # <<<<<<<<<<<<<<
  *         self.len = self.len + 1
  * 
  */
-  (__pyx_v_self->arr[__pyx_v_self->len]) = __pyx_v_val;
+  (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr[((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len]) = __pyx_v_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":50
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":50
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val
  *         self.len = self.len + 1             # <<<<<<<<<<<<<<
  * 
  *     cdef void write_handle(self, FILE* f):
  */
-  __pyx_v_self->len = (__pyx_v_self->len + 1);
+  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len + 1);
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -3843,7 +3441,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":52
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":52
  *         self.len = self.len + 1
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -3853,9 +3451,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
 
 static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_handle", 0);
+  __Pyx_RefNannySetupContext("write_handle");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":53
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":53
  * 
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(float), 1, f)             # <<<<<<<<<<<<<<
@@ -3864,7 +3462,7 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
  */
   fwrite((&__pyx_v_self->len), (sizeof(float)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":54
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(float), 1, f)
  *         fwrite(self.arr, sizeof(float), self.len, f)             # <<<<<<<<<<<<<<
@@ -3876,13 +3474,24 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":56
+ *         fwrite(self.arr, sizeof(float), self.len, f)
+ * 
+ *     def write(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write");
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -3892,26 +3501,8 @@ static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObje
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9FloatList_12write(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":56
- *         fwrite(self.arr, sizeof(float), self.len, f)
- * 
- *     def write(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename) {
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":58
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":58
  *     def write(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -3920,16 +3511,16 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":59
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":59
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":60
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -3944,7 +3535,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":62
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":62
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -3954,9 +3545,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
 
 static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_handle", 0);
+  __Pyx_RefNannySetupContext("read_handle");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":63
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":63
  * 
  *     cdef void read_handle(self, FILE* f):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -3965,7 +3556,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   free(__pyx_v_self->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":64
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":64
  *     cdef void read_handle(self, FILE* f):
  *         free(self.arr)
  *         fread(&(self.len), sizeof(float), 1, f)             # <<<<<<<<<<<<<<
@@ -3974,7 +3565,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   fread((&__pyx_v_self->len), (sizeof(float)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":65
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":65
  *         free(self.arr)
  *         fread(&(self.len), sizeof(float), 1, f)
  *         self.arr = <float*> malloc(self.len * sizeof(float))             # <<<<<<<<<<<<<<
@@ -3983,7 +3574,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   __pyx_v_self->arr = ((float *)malloc((__pyx_v_self->len * (sizeof(float)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":66
  *         fread(&(self.len), sizeof(float), 1, f)
  *         self.arr = <float*> malloc(self.len * sizeof(float))
  *         self.size = self.len             # <<<<<<<<<<<<<<
@@ -3992,7 +3583,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   __pyx_v_self->size = __pyx_v_self->len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":67
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":67
  *         self.arr = <float*> malloc(self.len * sizeof(float))
  *         self.size = self.len
  *         fread(self.arr, sizeof(float), self.len, f)             # <<<<<<<<<<<<<<
@@ -4004,13 +3595,24 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":69
+ *         fread(self.arr, sizeof(float), self.len, f)
+ * 
+ *     def read(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read");
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -4020,26 +3622,8 @@ static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9FloatList_14read(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":69
- *         fread(self.arr, sizeof(float), self.len, f)
- * 
- *     def read(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename) {
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":71
  *     def read(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -4048,15 +3632,15 @@ static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":72
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":73
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":73
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -4069,22 +3653,32 @@ static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":11
+ * cdef class IntList:
+ * 
+ *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
+ *         if initial_len > size:
+ *             size = initial_len
+ */
+
+static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -4092,7 +3686,7 @@ static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *_
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
@@ -4110,7 +3704,7 @@ static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *_
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -4145,26 +3739,8 @@ static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList___cinit__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_size, __pyx_v_increment, __pyx_v_initial_len);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":11
- * cdef class IntList:
- * 
- *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
- *         if initial_len > size:
- *             size = initial_len
- */
-
-static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":12
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":12
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:             # <<<<<<<<<<<<<<
@@ -4174,7 +3750,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
   __pyx_t_1 = (__pyx_v_initial_len > __pyx_v_size);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":13
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":13
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:
  *             size = initial_len             # <<<<<<<<<<<<<<
@@ -4182,72 +3758,61 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  *         self.increment = increment
  */
     __pyx_v_size = __pyx_v_initial_len;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":14
  *         if initial_len > size:
  *             size = initial_len
  *         self.size = size             # <<<<<<<<<<<<<<
  *         self.increment = increment
  *         self.len = initial_len
  */
-  __pyx_v_self->size = __pyx_v_size;
+  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size = __pyx_v_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":15
  *             size = initial_len
  *         self.size = size
  *         self.increment = increment             # <<<<<<<<<<<<<<
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))
  */
-  __pyx_v_self->increment = __pyx_v_increment;
+  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->increment = __pyx_v_increment;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":16
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":16
  *         self.size = size
  *         self.increment = increment
  *         self.len = initial_len             # <<<<<<<<<<<<<<
  *         self.arr = <int*> malloc(size*sizeof(int))
  *         memset(self.arr, 0, initial_len*sizeof(int))
  */
-  __pyx_v_self->len = __pyx_v_initial_len;
+  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len = __pyx_v_initial_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":17
  *         self.increment = increment
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))             # <<<<<<<<<<<<<<
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
  */
-  __pyx_v_self->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
+  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":18
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))
  *         memset(self.arr, 0, initial_len*sizeof(int))             # <<<<<<<<<<<<<<
  * 
  *     def __str__(self):
  */
-  memset(__pyx_v_self->arr, 0, (__pyx_v_initial_len * (sizeof(int))));
+  memset(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr, 0, (__pyx_v_initial_len * (sizeof(int))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_2__str__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -4255,7 +3820,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self) {
  *         ret = "IntList["
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   PyObject *__pyx_v_ret = NULL;
   int __pyx_v_idx;
   PyObject *__pyx_r = NULL;
@@ -4268,9 +3834,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__", 0);
+  __Pyx_RefNannySetupContext("__str__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":22
  *     def __str__(self):
  *         cdef unsigned i
  *         ret = "IntList["             # <<<<<<<<<<<<<<
@@ -4280,18 +3846,18 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_3));
   __pyx_v_ret = ((PyObject *)__pyx_kp_s_3);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":23
  *         cdef unsigned i
  *         ret = "IntList["
  *         for idx in range(self.size):             # <<<<<<<<<<<<<<
  *             if idx>0:
  *                 ret += ","
  */
-  __pyx_t_1 = __pyx_v_self->size;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_idx = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":24
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":24
  *         ret = "IntList["
  *         for idx in range(self.size):
  *             if idx>0:             # <<<<<<<<<<<<<<
@@ -4301,7 +3867,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
     __pyx_t_3 = (__pyx_v_idx > 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":25
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":25
  *         for idx in range(self.size):
  *             if idx>0:
  *                 ret += ","             # <<<<<<<<<<<<<<
@@ -4313,21 +3879,21 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
       __Pyx_DECREF(__pyx_v_ret);
       __pyx_v_ret = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":26
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":26
  *             if idx>0:
  *                 ret += ","
  *             ret += str(self.arr[idx])             # <<<<<<<<<<<<<<
  *         ret += "]"
  *         ret += "len="
  */
-    __pyx_t_4 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_idx])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_idx])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
@@ -4342,7 +3908,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
     __pyx_t_5 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":27
  *                 ret += ","
  *             ret += str(self.arr[idx])
  *         ret += "]"             # <<<<<<<<<<<<<<
@@ -4355,7 +3921,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   __pyx_v_ret = __pyx_t_5;
   __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":28
  *             ret += str(self.arr[idx])
  *         ret += "]"
  *         ret += "len="             # <<<<<<<<<<<<<<
@@ -4368,14 +3934,14 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   __pyx_v_ret = __pyx_t_5;
   __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":29
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":29
  *         ret += "]"
  *         ret += "len="
  *         ret += self.len             # <<<<<<<<<<<<<<
  *         return ret
  * 
  */
-  __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_ret, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
@@ -4384,7 +3950,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   __pyx_v_ret = __pyx_t_4;
   __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":30
  *         ret += "len="
  *         ret += self.len
  *         return ret             # <<<<<<<<<<<<<<
@@ -4410,18 +3976,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("index (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_4index(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_val));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":32
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":32
  *         return ret
  * 
  *     def index(self, val):             # <<<<<<<<<<<<<<
@@ -4429,7 +3984,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject
  *         for i in range(self.len):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_val) {
+static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
   unsigned int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -4441,35 +3997,36 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("index", 0);
+  __Pyx_RefNannySetupContext("index");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":34
  *     def index(self, val):
  *         cdef unsigned i
  *         for i in range(self.len):             # <<<<<<<<<<<<<<
  *             if self.arr[i] == val:
  *                 return i
  */
-  __pyx_t_1 = __pyx_v_self->len;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":35
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":35
  *         cdef unsigned i
  *         for i in range(self.len):
  *             if self.arr[i] == val:             # <<<<<<<<<<<<<<
  *                 return i
  *         return IndexError
  */
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_val, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_val, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":36
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":36
  *         for i in range(self.len):
  *             if self.arr[i] == val:
  *                 return i             # <<<<<<<<<<<<<<
@@ -4482,12 +4039,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
       __pyx_r = __pyx_t_4;
       __pyx_t_4 = 0;
       goto __pyx_L0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":37
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":37
  *             if self.arr[i] == val:
  *                 return i
  *         return IndexError             # <<<<<<<<<<<<<<
@@ -4512,39 +4069,60 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":39
+ *         return IndexError
+ * 
+ *     def partition(self,start,end):             # <<<<<<<<<<<<<<
+ *         pivot = self.arr[end]
+ *         bottom = start-1
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_end = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_pivot = NULL;
+  PyObject *__pyx_v_bottom = NULL;
+  PyObject *__pyx_v_top = NULL;
+  long __pyx_v_done;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("partition (wrapper)", 0);
+  Py_ssize_t __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  Py_ssize_t __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
+  __Pyx_RefNannySetupContext("partition");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("partition", 1, 2, 2, 1); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "partition") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "partition") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -4563,38 +4141,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObj
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList_6partition(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_start, __pyx_v_end);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":39
- *         return IndexError
- * 
- *     def partition(self,start,end):             # <<<<<<<<<<<<<<
- *         pivot = self.arr[end]
- *         bottom = start-1
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end) {
-  PyObject *__pyx_v_pivot = NULL;
-  PyObject *__pyx_v_bottom = NULL;
-  PyObject *__pyx_v_top = NULL;
-  long __pyx_v_done;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  Py_ssize_t __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("partition", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":40
  * 
  *     def partition(self,start,end):
  *         pivot = self.arr[end]             # <<<<<<<<<<<<<<
@@ -4602,12 +4150,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *         top = end
  */
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_end); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_pivot = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":41
  *     def partition(self,start,end):
  *         pivot = self.arr[end]
  *         bottom = start-1             # <<<<<<<<<<<<<<
@@ -4619,7 +4167,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
   __pyx_v_bottom = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":42
  *         pivot = self.arr[end]
  *         bottom = start-1
  *         top = end             # <<<<<<<<<<<<<<
@@ -4629,7 +4177,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
   __Pyx_INCREF(__pyx_v_end);
   __pyx_v_top = __pyx_v_end;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":43
  *         bottom = start-1
  *         top = end
  *         done = 0             # <<<<<<<<<<<<<<
@@ -4638,7 +4186,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
   __pyx_v_done = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":44
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":44
  *         top = end
  *         done = 0
  *         while not done:             # <<<<<<<<<<<<<<
@@ -4649,7 +4197,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
     __pyx_t_3 = (!__pyx_v_done);
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":45
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":45
  *         done = 0
  *         while not done:
  *             while not done:             # <<<<<<<<<<<<<<
@@ -4660,7 +4208,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __pyx_t_3 = (!__pyx_v_done);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":46
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":46
  *         while not done:
  *             while not done:
  *                 bottom += 1             # <<<<<<<<<<<<<<
@@ -4673,19 +4221,20 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __pyx_v_bottom = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":47
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":47
  *             while not done:
  *                 bottom += 1
  *                 if bottom == top:             # <<<<<<<<<<<<<<
  *                     done = 1
  *                     break
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_bottom, __pyx_v_top, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_bottom, __pyx_v_top, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":48
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":48
  *                 bottom += 1
  *                 if bottom == top:
  *                     done = 1             # <<<<<<<<<<<<<<
@@ -4694,19 +4243,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
         __pyx_v_done = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":49
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":49
  *                 if bottom == top:
  *                     done = 1
  *                     break             # <<<<<<<<<<<<<<
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]
  */
-        goto __pyx_L6_break;
-        goto __pyx_L7;
+        goto __pyx_L9_break;
+        goto __pyx_L10;
       }
-      __pyx_L7:;
+      __pyx_L10:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":50
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":50
  *                     done = 1
  *                     break
  *                 if self.arr[bottom] > pivot:             # <<<<<<<<<<<<<<
@@ -4714,15 +4263,16 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *                     break
  */
       __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_2 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_pivot, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_pivot, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":51
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":51
  *                     break
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]             # <<<<<<<<<<<<<<
@@ -4731,23 +4281,23 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
         __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
+        (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_5]) = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":52
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":52
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]
  *                     break             # <<<<<<<<<<<<<<
  *             while not done:
  *                 top -= 1
  */
-        goto __pyx_L6_break;
-        goto __pyx_L8;
+        goto __pyx_L9_break;
+        goto __pyx_L11;
       }
-      __pyx_L8:;
+      __pyx_L11:;
     }
-    __pyx_L6_break:;
+    __pyx_L9_break:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":53
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":53
  *                     self.arr[top] = self.arr[bottom]
  *                     break
  *             while not done:             # <<<<<<<<<<<<<<
@@ -4758,7 +4308,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __pyx_t_3 = (!__pyx_v_done);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":54
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":54
  *                     break
  *             while not done:
  *                 top -= 1             # <<<<<<<<<<<<<<
@@ -4771,19 +4321,20 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __pyx_v_top = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":55
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":55
  *             while not done:
  *                 top -= 1
  *                 if top == bottom:             # <<<<<<<<<<<<<<
  *                     done = 1
  *                     break
  */
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_top, __pyx_v_bottom, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_top, __pyx_v_bottom, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":56
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":56
  *                 top -= 1
  *                 if top == bottom:
  *                     done = 1             # <<<<<<<<<<<<<<
@@ -4792,19 +4343,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
         __pyx_v_done = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":57
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":57
  *                 if top == bottom:
  *                     done = 1
  *                     break             # <<<<<<<<<<<<<<
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]
  */
-        goto __pyx_L10_break;
-        goto __pyx_L11;
+        goto __pyx_L13_break;
+        goto __pyx_L14;
       }
-      __pyx_L11:;
+      __pyx_L14:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":58
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":58
  *                     done = 1
  *                     break
  *                 if self.arr[top] < pivot:             # <<<<<<<<<<<<<<
@@ -4812,15 +4363,16 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *                     break
  */
       __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pivot, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pivot, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":59
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":59
  *                     break
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]             # <<<<<<<<<<<<<<
@@ -4829,24 +4381,24 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
         __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
+        (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_5]) = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":60
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":60
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]
  *                     break             # <<<<<<<<<<<<<<
  *         self.arr[top] = pivot
  *         return top
  */
-        goto __pyx_L10_break;
-        goto __pyx_L12;
+        goto __pyx_L13_break;
+        goto __pyx_L15;
       }
-      __pyx_L12:;
+      __pyx_L15:;
     }
-    __pyx_L10_break:;
+    __pyx_L13_break:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":61
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":61
  *                     self.arr[bottom] = self.arr[top]
  *                     break
  *         self.arr[top] = pivot             # <<<<<<<<<<<<<<
@@ -4855,9 +4407,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
   __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_pivot); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  (__pyx_v_self->arr[__pyx_t_1]) = __pyx_t_6;
+  (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]) = __pyx_t_6;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":62
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":62
  *                     break
  *         self.arr[top] = pivot
  *         return top             # <<<<<<<<<<<<<<
@@ -4885,39 +4437,55 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":64
+ *         return top
+ * 
+ *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
+ *         if start < end:
+ *             split = self.partition(start,end)
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_end = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_split = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_doquicksort (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
+  __Pyx_RefNannySetupContext("_doquicksort");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("_doquicksort", 1, 2, 2, 1); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_doquicksort") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_doquicksort") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -4936,55 +4504,31 @@ static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList_8_doquicksort(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_start, __pyx_v_end);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":64
- *         return top
- * 
- *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
- *         if start < end:
- *             split = self.partition(start,end)
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end) {
-  PyObject *__pyx_v_split = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_doquicksort", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":65
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":65
  * 
  *     def _doquicksort(self,start,end):
  *         if start < end:             # <<<<<<<<<<<<<<
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_start, __pyx_v_end, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_start, __pyx_v_end, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":66
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":66
  *     def _doquicksort(self,start,end):
  *         if start < end:
  *             split = self.partition(start,end)             # <<<<<<<<<<<<<<
  *             self._doquicksort(start,split-1)
  *             self._doquicksort(split+1,end)
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__partition); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__partition); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_start);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_start);
     __Pyx_GIVEREF(__pyx_v_start);
@@ -4998,19 +4542,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
     __pyx_v_split = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":67
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":67
  *         if start < end:
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)             # <<<<<<<<<<<<<<
  *             self._doquicksort(split+1,end)
  *         else:
  */
-    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyNumber_Subtract(__pyx_v_split, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(__pyx_v_start);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_start);
     __Pyx_GIVEREF(__pyx_v_start);
@@ -5023,19 +4567,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":68
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":68
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)
  *             self._doquicksort(split+1,end)             # <<<<<<<<<<<<<<
  *         else:
  *             return
  */
-    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_1 = PyNumber_Add(__pyx_v_split, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_end);
@@ -5047,11 +4591,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":70
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":70
  *             self._doquicksort(split+1,end)
  *         else:
  *             return             # <<<<<<<<<<<<<<
@@ -5062,7 +4606,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -5079,18 +4623,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sort (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_10sort(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":72
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":72
  *             return
  * 
  *     def sort(self):             # <<<<<<<<<<<<<<
@@ -5098,7 +4631,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UN
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -5107,21 +4641,21 @@ static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sort", 0);
+  __Pyx_RefNannySetupContext("sort");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":73
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":73
  * 
  *     def sort(self):
  *         self._doquicksort(0,self.len-1)             # <<<<<<<<<<<<<<
  * 
  *     def reset(self):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->len - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   __Pyx_INCREF(__pyx_int_0);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
@@ -5148,18 +4682,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("reset (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_12reset(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":75
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":75
  *         self._doquicksort(0,self.len-1)
  * 
  *     def reset(self):             # <<<<<<<<<<<<<<
@@ -5167,19 +4690,20 @@ static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_U
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("reset", 0);
+  __Pyx_RefNannySetupContext("reset");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":76
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":76
  * 
  *     def reset(self):
  *         self.len = 0             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  __pyx_v_self->len = 0;
+  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -5187,16 +4711,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_7IntList_14__dealloc__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":78
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":78
  *         self.len = 0
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -5204,35 +4719,25 @@ static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":79
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":79
  * 
  *     def __dealloc__(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
  * 
  *     def __iter__(self):
  */
-  free(__pyx_v_self->arr);
-
-  __Pyx_RefNannyFinishContext();
-}
-static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+  free(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr);
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_16__iter__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
   __Pyx_RefNannyFinishContext();
-  return __pyx_r;
 }
+static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":81
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -5240,52 +4745,43 @@ static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self) {
  *         for i in range(self.len):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_16__iter__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_8__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_8__iter__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__", 0);
+  __Pyx_RefNannySetupContext("__iter__");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)__pyx_ptype_3_sa___pyx_scope_struct____iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct____iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_7IntList_18generator, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7IntList_9generator;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.IntList.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -5295,25 +4791,25 @@ static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":83
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":83
  *     def __iter__(self):
  *         cdef int i
  *         for i in range(self.len):             # <<<<<<<<<<<<<<
  *             yield self.arr[i]
  * 
  */
-  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->len;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_cur_scope->__pyx_v_self)->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":84
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":84
  *         cdef int i
  *         for i in range(self.len):
  *             yield self.arr[i]             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, index):
  */
-    __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->arr[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_cur_scope->__pyx_v_self)->arr[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
@@ -5322,38 +4818,26 @@ static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_19__getitem__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_index));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":86
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":86
  *             yield self.arr[i]
  * 
  *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
@@ -5361,7 +4845,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, Py
  *         if isinstance(index, int):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_index) {
+static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -5381,9 +4866,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __Pyx_RefNannySetupContext("__getitem__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":88
  *     def __getitem__(self, index):
  *         cdef int i, j, k
  *         if isinstance(index, int):             # <<<<<<<<<<<<<<
@@ -5396,7 +4881,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":89
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":89
  *         cdef int i, j, k
  *         if isinstance(index, int):
  *             j = index             # <<<<<<<<<<<<<<
@@ -5406,7 +4891,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_index); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_j = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":90
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":90
  *         if isinstance(index, int):
  *             j = index
  *             if j < 0:             # <<<<<<<<<<<<<<
@@ -5416,19 +4901,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_2 = (__pyx_v_j < 0);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":91
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":91
  *             j = index
  *             if j < 0:
  *                 j = self.len + j             # <<<<<<<<<<<<<<
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  */
-      __pyx_v_j = (__pyx_v_self->len + __pyx_v_j);
-      goto __pyx_L4;
+      __pyx_v_j = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_j);
+      goto __pyx_L6;
     }
-    __pyx_L4:;
+    __pyx_L6:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":92
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":92
  *             if j < 0:
  *                 j = self.len + j
  *             if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -5437,24 +4922,24 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  */
     __pyx_t_2 = (__pyx_v_j < 0);
     if (!__pyx_t_2) {
-      __pyx_t_4 = (__pyx_v_j >= __pyx_v_self->len);
+      __pyx_t_4 = (__pyx_v_j >= ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
       __pyx_t_5 = __pyx_t_4;
     } else {
       __pyx_t_5 = __pyx_t_2;
     }
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":93
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":93
  *                 j = self.len + j
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))             # <<<<<<<<<<<<<<
  *             return self.arr[j]
  *         elif isinstance(index, slice):
  */
-      __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       __Pyx_INCREF(__pyx_v_index);
       PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_index);
       __Pyx_GIVEREF(__pyx_v_index);
@@ -5465,7 +4950,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
       __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_1));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
       __pyx_t_1 = 0;
@@ -5475,11 +4960,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __Pyx_Raise(__pyx_t_1, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":94
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":94
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  *             return self.arr[j]             # <<<<<<<<<<<<<<
@@ -5487,15 +4972,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  *             i = index.start
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_j])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_j])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":95
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":95
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  *             return self.arr[j]
  *         elif isinstance(index, slice):             # <<<<<<<<<<<<<<
@@ -5508,7 +4993,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":96
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":96
  *             return self.arr[j]
  *         elif isinstance(index, slice):
  *             i = index.start             # <<<<<<<<<<<<<<
@@ -5521,7 +5006,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_v_i = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":97
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":97
  *         elif isinstance(index, slice):
  *             i = index.start
  *             j = index.stop             # <<<<<<<<<<<<<<
@@ -5534,7 +5019,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_v_j = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":98
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":98
  *             i = index.start
  *             j = index.stop
  *             if i < 0:             # <<<<<<<<<<<<<<
@@ -5544,19 +5029,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_5 = (__pyx_v_i < 0);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":99
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":99
  *             j = index.stop
  *             if i < 0:
  *                 i = self.len + i             # <<<<<<<<<<<<<<
  *             if j < 0:
  *                 j = self.len + j
  */
-      __pyx_v_i = (__pyx_v_self->len + __pyx_v_i);
-      goto __pyx_L6;
+      __pyx_v_i = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_i);
+      goto __pyx_L8;
     }
-    __pyx_L6:;
+    __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":100
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":100
  *             if i < 0:
  *                 i = self.len + i
  *             if j < 0:             # <<<<<<<<<<<<<<
@@ -5566,19 +5051,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_5 = (__pyx_v_j < 0);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":101
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":101
  *                 i = self.len + i
  *             if j < 0:
  *                 j = self.len + j             # <<<<<<<<<<<<<<
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  */
-      __pyx_v_j = (__pyx_v_self->len + __pyx_v_j);
-      goto __pyx_L7;
+      __pyx_v_j = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_j);
+      goto __pyx_L9;
     }
-    __pyx_L7:;
+    __pyx_L9:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":102
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":102
  *             if j < 0:
  *                 j = self.len + j
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:             # <<<<<<<<<<<<<<
@@ -5587,11 +5072,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  */
     __pyx_t_5 = (__pyx_v_i < 0);
     if (!__pyx_t_5) {
-      __pyx_t_2 = (__pyx_v_i >= __pyx_v_self->len);
+      __pyx_t_2 = (__pyx_v_i >= ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
       if (!__pyx_t_2) {
         __pyx_t_4 = (__pyx_v_j < 0);
         if (!__pyx_t_4) {
-          __pyx_t_7 = (__pyx_v_j > __pyx_v_self->len);
+          __pyx_t_7 = (__pyx_v_j > ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
           __pyx_t_8 = __pyx_t_7;
         } else {
           __pyx_t_8 = __pyx_t_4;
@@ -5606,7 +5091,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":103
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":103
  *                 j = self.len + j
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))             # <<<<<<<<<<<<<<
@@ -5617,10 +5102,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_6 = PyObject_GetAttr(__pyx_v_index, __pyx_n_s__stop); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
       PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_6);
@@ -5634,7 +5119,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
       __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
       PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
       __pyx_t_9 = 0;
@@ -5644,11 +5129,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __Pyx_Raise(__pyx_t_9, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L8;
+      goto __pyx_L10;
     }
-    __pyx_L8:;
+    __pyx_L10:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":104
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":104
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  *             result = ()             # <<<<<<<<<<<<<<
@@ -5658,7 +5143,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
     __pyx_v_result = __pyx_empty_tuple;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":105
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":105
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  *             result = ()
  *             for k from i <= k < j:             # <<<<<<<<<<<<<<
@@ -5668,17 +5153,17 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_3 = __pyx_v_j;
     for (__pyx_v_k = __pyx_v_i; __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":106
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":106
  *             result = ()
  *             for k from i <= k < j:
  *                 result = result + (self.arr[k],)             # <<<<<<<<<<<<<<
  *             return result
  *         else:
  */
-      __pyx_t_9 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_k])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_k])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
       PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_9);
       __Pyx_GIVEREF(__pyx_t_9);
       __pyx_t_9 = 0;
@@ -5690,7 +5175,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __pyx_t_9 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":107
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":107
  *             for k from i <= k < j:
  *                 result = result + (self.arr[k],)
  *             return result             # <<<<<<<<<<<<<<
@@ -5701,11 +5186,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __Pyx_INCREF(((PyObject *)__pyx_v_result));
     __pyx_r = ((PyObject *)__pyx_v_result);
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":109
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":109
  *             return result
  *         else:
  *             raise TypeError("Illegal key type %s for IntList" % type(index))             # <<<<<<<<<<<<<<
@@ -5715,7 +5200,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_9), ((PyObject *)Py_TYPE(__pyx_v_index))); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_9));
     __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_10);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
     PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
     __pyx_t_9 = 0;
@@ -5726,7 +5211,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -5744,7 +5229,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":111
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":111
  *             raise TypeError("Illegal key type %s for IntList" % type(index))
  * 
  *     cdef void set(self, int i, int val):             # <<<<<<<<<<<<<<
@@ -5764,9 +5249,9 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set", 0);
+  __Pyx_RefNannySetupContext("set");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":112
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":112
  * 
  *     cdef void set(self, int i, int val):
  *         j = i             # <<<<<<<<<<<<<<
@@ -5775,7 +5260,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
  */
   __pyx_v_j = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":113
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":113
  *     cdef void set(self, int i, int val):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -5785,7 +5270,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   __pyx_t_1 = (__pyx_v_i < 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":114
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":114
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -5797,7 +5282,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":115
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":115
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -5813,7 +5298,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":116
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":116
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length IntList" % (i, self.len))             # <<<<<<<<<<<<<<
@@ -5825,7 +5310,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
     __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -5836,7 +5321,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -5850,7 +5335,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":117
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":117
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length IntList" % (i, self.len))
  *         self.arr[j] = val             # <<<<<<<<<<<<<<
@@ -5869,18 +5354,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
-static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_21__setitem__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_i), ((PyObject *)__pyx_v_val));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":119
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":119
  *         self.arr[j] = val
  * 
  *     def __setitem__(self, i, val):             # <<<<<<<<<<<<<<
@@ -5888,7 +5362,8 @@ static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -5896,9 +5371,9 @@ static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setitem__", 0);
+  __Pyx_RefNannySetupContext("__setitem__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":120
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":120
  * 
  *     def __setitem__(self, i, val):
  *         self.set(i, val)             # <<<<<<<<<<<<<<
@@ -5907,7 +5382,7 @@ static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *_
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_v_val); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->set(__pyx_v_self, __pyx_t_1, __pyx_t_2);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->set(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_t_1, __pyx_t_2);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -5919,18 +5394,7 @@ static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_23__len__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":122
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":122
  *         self.set(i, val)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -5938,19 +5402,20 @@ static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":123
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":123
  * 
  *     def __len__(self):
  *         return self.len             # <<<<<<<<<<<<<<
  * 
  *     def getSize(self):
  */
-  __pyx_r = __pyx_v_self->len;
+  __pyx_r = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -5959,18 +5424,7 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_26getSize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_26getSize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getSize (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_25getSize(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":125
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":125
  *         return self.len
  * 
  *     def getSize(self):             # <<<<<<<<<<<<<<
@@ -5978,16 +5432,17 @@ static PyObject *__pyx_pw_3_sa_7IntList_26getSize(PyObject *__pyx_v_self, CYTHON
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_25getSize(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_13getSize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_13getSize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSize", 0);
+  __Pyx_RefNannySetupContext("getSize");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":126
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":126
  * 
  *     def getSize(self):
  *         return self.size             # <<<<<<<<<<<<<<
@@ -5995,7 +5450,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_25getSize(struct __pyx_obj_3_sa_IntList
  *     def append(self, int val):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -6013,13 +5468,23 @@ static PyObject *__pyx_pf_3_sa_7IntList_25getSize(struct __pyx_obj_3_sa_IntList
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":128
+ *         return self.size
+ * 
+ *     def append(self, int val):             # <<<<<<<<<<<<<<
+ *         self._append(val)
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
   int __pyx_v_val;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("append (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("append");
   assert(__pyx_arg_val); {
     __pyx_v_val = __Pyx_PyInt_AsInt(__pyx_arg_val); if (unlikely((__pyx_v_val == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -6029,32 +5494,15 @@ static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList_27append(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((int)__pyx_v_val));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":128
- *         return self.size
- * 
- *     def append(self, int val):             # <<<<<<<<<<<<<<
- *         self._append(val)
- * 
- */
 
-static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("append", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":129
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":129
  * 
  *     def append(self, int val):
  *         self._append(val)             # <<<<<<<<<<<<<<
  * 
  *     cdef void _append(self, int val):
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->_append(__pyx_v_self, __pyx_v_val);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->_append(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_val);
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -6062,7 +5510,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":131
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":131
  *         self._append(val)
  * 
  *     cdef void _append(self, int val):             # <<<<<<<<<<<<<<
@@ -6073,9 +5521,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *
 static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("_append", 0);
+  __Pyx_RefNannySetupContext("_append");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":132
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":132
  * 
  *     cdef void _append(self, int val):
  *         if self.len == self.size:             # <<<<<<<<<<<<<<
@@ -6085,7 +5533,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   __pyx_t_1 = (__pyx_v_self->len == __pyx_v_self->size);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":133
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":133
  *     cdef void _append(self, int val):
  *         if self.len == self.size:
  *             self.size = self.size + self.increment             # <<<<<<<<<<<<<<
@@ -6094,7 +5542,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  */
     __pyx_v_self->size = (__pyx_v_self->size + __pyx_v_self->increment);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":134
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":134
  *         if self.len == self.size:
  *             self.size = self.size + self.increment
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))             # <<<<<<<<<<<<<<
@@ -6106,7 +5554,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":135
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":135
  *             self.size = self.size + self.increment
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         self.arr[self.len] = val             # <<<<<<<<<<<<<<
@@ -6115,7 +5563,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  */
   (__pyx_v_self->arr[__pyx_v_self->len]) = __pyx_v_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":136
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         self.arr[self.len] = val
  *         self.len = self.len + 1             # <<<<<<<<<<<<<<
@@ -6127,18 +5575,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("extend (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_29extend(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_other));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":138
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":138
  *         self.len = self.len + 1
  * 
  *     def extend(self, other):             # <<<<<<<<<<<<<<
@@ -6146,16 +5583,17 @@ static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_other) {
+static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extend", 0);
+  __Pyx_RefNannySetupContext("extend");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":139
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":139
  * 
  *     def extend(self, other):
  *         self._extend(other)             # <<<<<<<<<<<<<<
@@ -6165,7 +5603,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *
   if (!(likely(((__pyx_v_other) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_other, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __pyx_v_other;
   __Pyx_INCREF(__pyx_t_1);
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->_extend(__pyx_v_self, ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1));
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->_extend(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1));
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -6180,7 +5618,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":141
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":141
  *         self._extend(other)
  * 
  *     cdef void _extend(self, IntList other):             # <<<<<<<<<<<<<<
@@ -6190,9 +5628,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *
 
 static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, struct __pyx_obj_3_sa_IntList *__pyx_v_other) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_extend", 0);
+  __Pyx_RefNannySetupContext("_extend");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":142
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":142
  * 
  *     cdef void _extend(self, IntList other):
  *         self._extend_arr(other.arr, other.len)             # <<<<<<<<<<<<<<
@@ -6204,7 +5642,7 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":144
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":144
  *         self._extend_arr(other.arr, other.len)
  * 
  *     cdef void _extend_arr(self, int* other, int other_len):             # <<<<<<<<<<<<<<
@@ -6215,9 +5653,9 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
 static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int *__pyx_v_other, int __pyx_v_other_len) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("_extend_arr", 0);
+  __Pyx_RefNannySetupContext("_extend_arr");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":145
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":145
  * 
  *     cdef void _extend_arr(self, int* other, int other_len):
  *         if self.size < self.len + other_len:             # <<<<<<<<<<<<<<
@@ -6227,7 +5665,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   __pyx_t_1 = (__pyx_v_self->size < (__pyx_v_self->len + __pyx_v_other_len));
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":146
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":146
  *     cdef void _extend_arr(self, int* other, int other_len):
  *         if self.size < self.len + other_len:
  *             self.size = self.len + other_len             # <<<<<<<<<<<<<<
@@ -6236,7 +5674,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
  */
     __pyx_v_self->size = (__pyx_v_self->len + __pyx_v_other_len);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":147
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":147
  *         if self.size < self.len + other_len:
  *             self.size = self.len + other_len
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))             # <<<<<<<<<<<<<<
@@ -6248,7 +5686,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":148
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":148
  *             self.size = self.len + other_len
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         memcpy(self.arr+self.len, other, other_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -6257,7 +5695,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
  */
   memcpy((__pyx_v_self->arr + __pyx_v_self->len), __pyx_v_other, (__pyx_v_other_len * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":149
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":149
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         memcpy(self.arr+self.len, other, other_len*sizeof(int))
  *         self.len = self.len + other_len             # <<<<<<<<<<<<<<
@@ -6269,7 +5707,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":151
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":151
  *         self.len = self.len + other_len
  * 
  *     cdef void _clear(self):             # <<<<<<<<<<<<<<
@@ -6279,9 +5717,9 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
 
 static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_clear", 0);
+  __Pyx_RefNannySetupContext("_clear");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":152
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":152
  * 
  *     cdef void _clear(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -6290,7 +5728,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   free(__pyx_v_self->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":153
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":153
  *     cdef void _clear(self):
  *         free(self.arr)
  *         self.len = 0             # <<<<<<<<<<<<<<
@@ -6299,7 +5737,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   __pyx_v_self->len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":154
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":154
  *         free(self.arr)
  *         self.len = 0
  *         self.size = 0             # <<<<<<<<<<<<<<
@@ -6308,7 +5746,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   __pyx_v_self->size = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":155
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":155
  *         self.len = 0
  *         self.size = 0
  *         self.arr = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -6320,7 +5758,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":157
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":157
  *         self.arr = <int*> malloc(0)
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -6330,9 +5768,9 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
 
 static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_handle", 0);
+  __Pyx_RefNannySetupContext("write_handle");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":158
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":158
  * 
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -6341,7 +5779,7 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
  */
   fwrite((&__pyx_v_self->len), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":159
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":159
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(int), 1, f)
  *         fwrite(self.arr, sizeof(int), self.len, f)             # <<<<<<<<<<<<<<
@@ -6353,13 +5791,24 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":161
+ *         fwrite(self.arr, sizeof(int), self.len, f)
+ * 
+ *     def write(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write");
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -6369,26 +5818,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList_31write(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":161
- *         fwrite(self.arr, sizeof(int), self.len, f)
- * 
- *     def write(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename) {
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":163
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":163
  *     def write(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -6397,16 +5828,16 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":164
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":164
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":165
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":165
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -6421,7 +5852,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":167
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":167
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -6431,9 +5862,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
 
 static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_handle", 0);
+  __Pyx_RefNannySetupContext("read_handle");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":168
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":168
  * 
  *     cdef void read_handle(self, FILE* f):
  *         (self.arr)             # <<<<<<<<<<<<<<
@@ -6442,7 +5873,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":169
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":169
  *     cdef void read_handle(self, FILE* f):
  *         (self.arr)
  *         fread(&(self.len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -6451,7 +5882,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   fread((&__pyx_v_self->len), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":170
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":170
  *         (self.arr)
  *         fread(&(self.len), sizeof(int), 1, f)
  *         self.arr = <int*> malloc(self.len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -6460,7 +5891,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->arr = ((int *)malloc((__pyx_v_self->len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":171
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":171
  *         fread(&(self.len), sizeof(int), 1, f)
  *         self.arr = <int*> malloc(self.len * sizeof(int))
  *         self.size = self.len             # <<<<<<<<<<<<<<
@@ -6469,7 +5900,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->size = __pyx_v_self->len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":172
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":172
  *         self.arr = <int*> malloc(self.len * sizeof(int))
  *         self.size = self.len
  *         fread(self.arr, sizeof(int), self.len, f)             # <<<<<<<<<<<<<<
@@ -6481,13 +5912,24 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":174
+ *         fread(self.arr, sizeof(int), self.len, f)
+ * 
+ *     def read(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read");
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -6497,26 +5939,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList_33read(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":174
- *         fread(self.arr, sizeof(int), self.len, f)
- * 
- *     def read(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename) {
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":176
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":176
  *     def read(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -6525,15 +5949,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":177
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":178
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":178
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -6546,21 +5970,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
-  __pyx_r = __pyx_pf_3_sa_9StringMap___cinit__(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":13
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":13
  *     cdef int index(self, char *s)
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -6568,35 +5978,30 @@ static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self) {
+static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_RefNannySetupContext("__cinit__");
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":14
  * 
  *     def __cinit__(self):
  *         self.vocab = stringmap_new()             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  __pyx_v_self->vocab = stringmap_new();
+  ((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self)->vocab = stringmap_new();
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_9StringMap_2__dealloc__(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":16
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":16
  *         self.vocab = stringmap_new()
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -6604,23 +6009,24 @@ static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self) {
+static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":17
  * 
  *     def __dealloc__(self):
  *         stringmap_delete(self.vocab)             # <<<<<<<<<<<<<<
  * 
  *     cdef char *word(self, int i):
  */
-  stringmap_delete(__pyx_v_self->vocab);
+  stringmap_delete(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self)->vocab);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":19
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":19
  *         stringmap_delete(self.vocab)
  * 
  *     cdef char *word(self, int i):             # <<<<<<<<<<<<<<
@@ -6631,9 +6037,9 @@ static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMa
 static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx_v_self, int __pyx_v_i) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("word", 0);
+  __Pyx_RefNannySetupContext("word");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":20
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":20
  * 
  *     cdef char *word(self, int i):
  *         return stringmap_word(self.vocab, i)             # <<<<<<<<<<<<<<
@@ -6649,7 +6055,7 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":22
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":22
  *         return stringmap_word(self.vocab, i)
  * 
  *     cdef int index(self, char *s):             # <<<<<<<<<<<<<<
@@ -6659,9 +6065,9 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
 static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_v_self, char *__pyx_v_s) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("index", 0);
+  __Pyx_RefNannySetupContext("index");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":23
  * 
  *     cdef int index(self, char *s):
  *         return stringmap_index(self.vocab, s)             # <<<<<<<<<<<<<<
@@ -6675,34 +6081,40 @@ static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":17
+ *     cdef bint use_sent_id
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
+ *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
+ *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
+ */
+
+static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_v_use_sent_id;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  long __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
     PyObject* values[4] = {0,0,0,0};
-
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":17
- *     cdef bint use_sent_id
- * 
- *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
- *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
- *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
- */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -6711,7 +6123,7 @@ static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -6734,7 +6146,7 @@ static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -6763,25 +6175,8 @@ static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray___cinit__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text, __pyx_v_side, __pyx_v_use_sent_id);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  long __pyx_t_5;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":18
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}             # <<<<<<<<<<<<<<
@@ -6793,12 +6188,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__END_OF_FILE), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__END_OF_LINE), __pyx_int_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->word2id);
-  __Pyx_DECREF(__pyx_v_self->word2id);
-  __pyx_v_self->word2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id);
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":19
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":19
  *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]             # <<<<<<<<<<<<<<
@@ -6806,7 +6201,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
  *         self.sent_id = IntList(1000,1000)
  */
   __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__END_OF_FILE));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__END_OF_FILE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__END_OF_FILE));
@@ -6814,12 +6209,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   PyList_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_n_s__END_OF_LINE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__END_OF_LINE));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->id2word);
-  __Pyx_DECREF(__pyx_v_self->id2word);
-  __pyx_v_self->id2word = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word);
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":20
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -6829,12 +6224,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->data);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->data));
-  __pyx_v_self->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data));
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":21
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -6844,12 +6239,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_11), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->sent_id);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_id));
-  __pyx_v_self->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id));
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":22
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -6859,21 +6254,21 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_12), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->sent_index);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
-  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index));
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":23
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  *         self.use_sent_id = use_sent_id             # <<<<<<<<<<<<<<
  *         if from_binary:
  *             self.read_binary(from_binary)
  */
-  __pyx_v_self->use_sent_id = __pyx_v_use_sent_id;
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id = __pyx_v_use_sent_id;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":24
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":24
  *         self.sent_index = IntList(1000,1000)
  *         self.use_sent_id = use_sent_id
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -6883,17 +6278,17 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":25
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":25
  *         self.use_sent_id = use_sent_id
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_text:
  *             if side:
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -6902,10 +6297,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":26
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -6915,7 +6310,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":27
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":27
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             if side:             # <<<<<<<<<<<<<<
@@ -6925,18 +6320,16 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_side); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":28
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":28
  *         elif from_text:
  *             if side:
  *                 self.read_bitext(from_text, (0 if side == 'source' else 1))             # <<<<<<<<<<<<<<
  *             else:
  *                 self.read_text(from_text)
  */
-      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_bitext); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_bitext); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_side, ((PyObject *)__pyx_n_s__source), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_2 = __Pyx_PyString_Equals(__pyx_v_side, ((PyObject *)__pyx_n_s__source), Py_EQ); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_2) {
         __pyx_t_5 = 0;
       } else {
@@ -6945,7 +6338,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
       __pyx_t_3 = PyInt_FromLong(__pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_INCREF(__pyx_v_from_text);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
       __Pyx_GIVEREF(__pyx_v_from_text);
@@ -6957,21 +6350,21 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L4;
+      goto __pyx_L7;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":30
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":30
  *                 self.read_bitext(from_text, (0 if side == 'source' else 1))
  *             else:
  *                 self.read_text(from_text)             # <<<<<<<<<<<<<<
  * 
  *     def __len__(self):
  */
-      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_INCREF(__pyx_v_from_text);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
       __Pyx_GIVEREF(__pyx_v_from_text);
@@ -6981,10 +6374,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     }
-    __pyx_L4:;
-    goto __pyx_L3;
+    __pyx_L7:;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -6999,18 +6392,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_2__len__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":32
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":32
  *                 self.read_text(from_text)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -7018,7 +6400,8 @@ static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -7026,16 +6409,16 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataAr
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":33
  * 
  *     def __len__(self):
  *         return len(self.data)             # <<<<<<<<<<<<<<
  * 
  *     def getSentId(self, i):
  */
-  __pyx_t_1 = ((PyObject *)__pyx_v_self->data);
+  __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
   __Pyx_INCREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -7053,18 +6436,7 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataAr
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_5getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_5getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getSentId (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_4getSentId(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":35
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":35
  *         return len(self.data)
  * 
  *     def getSentId(self, i):             # <<<<<<<<<<<<<<
@@ -7072,7 +6444,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_5getSentId(PyObject *__pyx_v_self, PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_4getSentId(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -7080,9 +6453,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentId(struct __pyx_obj_3_sa_DataA
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentId", 0);
+  __Pyx_RefNannySetupContext("getSentId");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":36
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":36
  * 
  *     def getSentId(self, i):
  *         return self.sent_id.arr[i]             # <<<<<<<<<<<<<<
@@ -7091,7 +6464,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentId(struct __pyx_obj_3_sa_DataA
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -7109,18 +6482,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentId(struct __pyx_obj_3_sa_DataA
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_7getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_7getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getSent (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_6getSent(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":38
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":38
  *         return self.sent_id.arr[i]
  * 
  *     def getSent(self, i):             # <<<<<<<<<<<<<<
@@ -7128,7 +6490,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_7getSent(PyObject *__pyx_v_self, PyObj
  *         sent = []
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_sent = NULL;
@@ -7142,10 +6505,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArr
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSent", 0);
+  __Pyx_RefNannySetupContext("getSent");
   __Pyx_INCREF(__pyx_v_i);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":40
  *     def getSent(self, i):
  *         cdef int j, start, stop
  *         sent = []             # <<<<<<<<<<<<<<
@@ -7153,11 +6516,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArr
  *         stop = self.sent_index.arr[i+1]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_sent = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":41
  *         cdef int j, start, stop
  *         sent = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
@@ -7165,9 +6528,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArr
  *         for i from start <= i < stop:
  */
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
+  __pyx_v_start = (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":42
  *         sent = []
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
@@ -7178,9 +6541,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArr
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_stop = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
+  __pyx_v_stop = (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -7195,22 +6558,25 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArr
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":44
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":44
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])             # <<<<<<<<<<<<<<
  *         return sent
  * 
  */
+    if (unlikely(((PyObject *)__pyx_v_sent) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_self->id2word, (__pyx_v_self->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyList_Append(__pyx_v_sent, __pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -7223,7 +6589,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArr
   __pyx_v_i = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":45
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":45
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])
  *         return sent             # <<<<<<<<<<<<<<
@@ -7249,18 +6615,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArr
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_9getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_9getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getSentPos (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_8getSentPos(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":47
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":47
  *         return sent
  * 
  *     def getSentPos(self, loc):             # <<<<<<<<<<<<<<
@@ -7268,7 +6623,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_9getSentPos(PyObject *__pyx_v_self, Py
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_8getSentPos(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -7277,9 +6633,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8getSentPos(struct __pyx_obj_3_sa_Data
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentPos", 0);
+  __Pyx_RefNannySetupContext("getSentPos");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":48
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":48
  * 
  *     def getSentPos(self, loc):
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]             # <<<<<<<<<<<<<<
@@ -7288,7 +6644,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8getSentPos(struct __pyx_obj_3_sa_Data
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_index->arr[(__pyx_v_self->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyNumber_Subtract(__pyx_v_loc, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
@@ -7310,18 +6666,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8getSentPos(struct __pyx_obj_3_sa_Data
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_10get_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_word));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":50
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":50
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]
  * 
  *     def get_id(self, word):             # <<<<<<<<<<<<<<
@@ -7329,7 +6674,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObj
  *             self.word2id[word] = len(self.id2word)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word) {
+static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -7339,50 +6685,50 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArr
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_id", 0);
+  __Pyx_RefNannySetupContext("get_id");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":51
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":51
  * 
  *     def get_id(self, word):
  *         if not word in self.word2id:             # <<<<<<<<<<<<<<
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (!__pyx_t_1);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":52
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":52
  *     def get_id(self, word):
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
  *             self.id2word.append(word)
  *         return self.word2id[word]
  */
-    __pyx_t_3 = __pyx_v_self->id2word;
+    __pyx_t_3 = ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word;
     __Pyx_INCREF(__pyx_t_3);
     __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (PyObject_SetItem(__pyx_v_self->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":53
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":53
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
  *         return self.word2id[word]
  * 
  */
-    __pyx_t_3 = __Pyx_PyObject_Append(__pyx_v_self->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":54
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *         return self.word2id[word]             # <<<<<<<<<<<<<<
@@ -7390,7 +6736,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArr
  *     def get_word(self, id):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_3 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -7408,18 +6754,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArr
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_word (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_12get_word(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_id));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":56
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":56
  *         return self.word2id[word]
  * 
  *     def get_word(self, id):             # <<<<<<<<<<<<<<
@@ -7427,16 +6762,17 @@ static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id) {
+static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_word", 0);
+  __Pyx_RefNannySetupContext("get_word");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":57
  * 
  *     def get_word(self, id):
  *         return self.id2word[id]             # <<<<<<<<<<<<<<
@@ -7444,7 +6780,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataA
  *     def write_text(self, char* filename):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetItem(__pyx_v_self->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -7462,28 +6798,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataA
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_14write_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":59
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":59
  *         return self.id2word[id]
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -7491,7 +6806,9 @@ static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, P
  *             for w_id in self.data:
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_w_id = NULL;
   PyObject *__pyx_r = NULL;
@@ -7502,10 +6819,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  Py_ssize_t __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
-  int __pyx_t_10;
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  int __pyx_t_9;
+  PyObject *__pyx_t_10 = NULL;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
   PyObject *__pyx_t_13 = NULL;
@@ -7513,9 +6830,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text", 0);
+  __Pyx_RefNannySetupContext("write_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7526,7 +6852,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -7538,160 +6864,153 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":61
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":61
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             for w_id in self.data:             # <<<<<<<<<<<<<<
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->data)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->data))) {
-            __pyx_t_4 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data))) {
+            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
             } else {
-              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_w_id);
-            __pyx_v_w_id = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_w_id = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":62
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":62
  *         with open(filename, "w") as f:
  *             for w_id in self.data:
  *                 if w_id > 1:             # <<<<<<<<<<<<<<
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  */
-            __pyx_t_1 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            if (__pyx_t_10) {
+            __pyx_t_2 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
  *             for w_id in self.data:
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))             # <<<<<<<<<<<<<<
  *                 if w_id == 1:
  *                     f.write("\n")
  */
-              __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_word); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_11);
+              __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_word); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_10);
+              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(((PyObject *)__pyx_t_11));
               __Pyx_INCREF(__pyx_v_w_id);
               PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_w_id);
               __Pyx_GIVEREF(__pyx_v_w_id);
-              __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(((PyObject *)__pyx_t_11));
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_12);
+              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(((PyObject *)__pyx_t_12));
               PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
               __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
               __pyx_t_11 = 0;
-              __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-              goto __pyx_L18;
+              goto __pyx_L19;
             }
-            __pyx_L18:;
+            __pyx_L19:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":64
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":64
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:             # <<<<<<<<<<<<<<
  *                     f.write("\n")
  * 
  */
-            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            if (__pyx_t_10) {
+            if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":65
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              goto __pyx_L19;
+              goto __pyx_L20;
             }
-            __pyx_L19:;
+            __pyx_L20:;
           }
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7700,75 +7019,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_4);
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_INCREF(__pyx_t_4);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
-          __Pyx_GIVEREF(__pyx_t_4);
+          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
+          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
-          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __pyx_t_14 = (!__pyx_t_10);
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __pyx_t_14 = (!__pyx_t_9);
           if (__pyx_t_14) {
-            __Pyx_GIVEREF(__pyx_t_4);
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_12);
             __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_ErrRestore(__pyx_t_4, __pyx_t_12, __pyx_t_11);
-            __pyx_t_4 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L22;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_12, __pyx_t_11);
+            __pyx_t_1 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L23;
           }
-          __pyx_L22:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_L23:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L23;
-    __pyx_L3_error:;
+    goto __pyx_L24;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L23:;
+    __pyx_L24:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7776,7 +7095,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
@@ -7789,28 +7108,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_16read_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":67
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":67
  *                     f.write("\n")
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -7818,7 +7116,9 @@ static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, Py
  *             self.read_text_data(fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_fp = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -7836,9 +7136,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text", 0);
+  __Pyx_RefNannySetupContext("read_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7851,7 +7160,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -7861,12 +7170,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -7874,40 +7183,39 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_v_fp = __pyx_t_1;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_v_fp = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":69
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":69
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:
  *             self.read_text_data(fp)             # <<<<<<<<<<<<<<
  * 
  *     def read_bitext(self, char* filename, int side):
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_INCREF(__pyx_v_fp);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fp);
+          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fp);
           __Pyx_GIVEREF(__pyx_v_fp);
-          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7916,57 +7224,57 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
-            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L18;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_3, __pyx_t_2);
+            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L19;
           }
-          __pyx_L18:;
+          __pyx_L19:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
@@ -7980,11 +7288,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L19;
-    __pyx_L3_error:;
+    goto __pyx_L20;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L19:;
+    __pyx_L20:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -8002,65 +7310,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
+static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  char *__pyx_v_filename;
-  int __pyx_v_side;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_bitext (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename)) != 0)) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-    }
-    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_18read_bitext(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -8068,45 +7320,37 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self) {
+static PyObject *__pyx_pf_3_sa_11read_bitext_genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_11read_bitext_genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("genexpr", 0);
+  __Pyx_RefNannySetupContext("genexpr");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *) __pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)__pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_9DataArray_11read_bitext_2generator6, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_self = __pyx_self;
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_11read_bitext_1generator6;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_bitext.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
@@ -8114,8 +7358,8 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -8124,8 +7368,7 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
     __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
@@ -8134,20 +7377,12 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -8181,7 +7416,7 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -8192,7 +7427,7 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -8201,13 +7436,12 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -8215,8 +7449,10 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
  *             data = (line.split(' ||| ')[side] for line in fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side) {
+static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_cur_scope;
+  char *__pyx_v_filename;
   PyObject *__pyx_v_data = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -8234,16 +7470,60 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_bitext", 0);
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
+  __Pyx_RefNannySetupContext("read_bitext");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_v_side = __pyx_v_side;
+  {
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  0:
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename);
+        if (likely(values[0])) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side);
+        if (likely(values[1])) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_cur_scope->__pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_cur_scope->__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8256,7 +7536,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -8266,12 +7546,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -8279,53 +7559,52 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
-          __pyx_cur_scope->__pyx_v_fp = __pyx_t_1;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_cur_scope->__pyx_v_fp = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
  *             self.read_text_data(data)
  * 
  */
-          __pyx_t_1 = __pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_v_data = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_t_2 = __pyx_pf_3_sa_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_v_data = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)
  *             self.read_text_data(data)             # <<<<<<<<<<<<<<
  * 
  *     def read_text_data(self, data):
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_INCREF(__pyx_v_data);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_data);
+          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_data);
           __Pyx_GIVEREF(__pyx_v_data);
-          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        goto __pyx_L17_try_end;
+        __pyx_L10_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8333,58 +7612,58 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
  *             self.read_text_data(data)
  */
         /*except:*/ {
-          __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_AddTraceback("_sa.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
-            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L18;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_3, __pyx_t_2);
+            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+            goto __pyx_L20;
           }
-          __pyx_L18:;
+          __pyx_L20:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L11_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L12_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L11_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __pyx_L17_try_end:;
       }
     }
     /*finally:*/ {
@@ -8398,11 +7677,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L19;
-    __pyx_L3_error:;
+    goto __pyx_L21;
+    __pyx_L6_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L19:;
+    __pyx_L21:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -8422,18 +7701,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_text_data (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_20read_text_data(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_data));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
  *             self.read_text_data(data)
  * 
  *     def read_text_data(self, data):             # <<<<<<<<<<<<<<
@@ -8441,7 +7709,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_sel
  *         for line_num, line in enumerate(data):
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data) {
+static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
   int __pyx_v_word_count;
   PyObject *__pyx_v_line_num = NULL;
   PyObject *__pyx_v_line = NULL;
@@ -8461,9 +7730,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text_data", 0);
+  __Pyx_RefNannySetupContext("read_text_data");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":77
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":77
  * 
  *     def read_text_data(self, data):
  *         cdef int word_count = 0             # <<<<<<<<<<<<<<
@@ -8472,7 +7741,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
   __pyx_v_word_count = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":78
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":78
  *     def read_text_data(self, data):
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):             # <<<<<<<<<<<<<<
@@ -8490,20 +7759,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
+    if (PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
+    } else if (PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
@@ -8527,7 +7788,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":79
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":79
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
@@ -8536,12 +7797,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
     __pyx_t_5 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":80
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":80
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)
  *             for word in line.split():             # <<<<<<<<<<<<<<
@@ -8563,20 +7824,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     }
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     for (;;) {
-      if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_6)) {
+      if (PyList_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
-      } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_6)) {
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
+      } else if (PyTuple_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
       } else {
         __pyx_t_5 = __pyx_t_8(__pyx_t_6);
         if (unlikely(!__pyx_t_5)) {
@@ -8592,17 +7845,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
       __pyx_v_word = __pyx_t_5;
       __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":81
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":81
  *             self.sent_index.append(word_count)
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))             # <<<<<<<<<<<<<<
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  */
-      __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       __Pyx_INCREF(__pyx_v_word);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_word);
       __Pyx_GIVEREF(__pyx_v_word);
@@ -8610,35 +7863,35 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":82
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":82
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:             # <<<<<<<<<<<<<<
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  */
-      if (__pyx_v_self->use_sent_id) {
+      if (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":83
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":83
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *                 word_count = word_count + 1
  *             self.data.append(1)
  */
-        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        goto __pyx_L7;
+        goto __pyx_L9;
       }
-      __pyx_L7:;
+      __pyx_L9:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":84
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":84
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -8649,41 +7902,41 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     }
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":85
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":85
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  *             self.data.append(1)             # <<<<<<<<<<<<<<
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  */
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":86
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":86
  *                 word_count = word_count + 1
  *             self.data.append(1)
  *             if self.use_sent_id:             # <<<<<<<<<<<<<<
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  */
-    if (__pyx_v_self->use_sent_id) {
+    if (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":87
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":87
  *             self.data.append(1)
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *             word_count = word_count + 1
  *         self.data.append(0)
  */
-      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L8;
+      goto __pyx_L10;
     }
-    __pyx_L8:;
+    __pyx_L10:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":88
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":88
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -8695,18 +7948,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":89
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":89
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  *         self.data.append(0)             # <<<<<<<<<<<<<<
  *         self.sent_index.append(word_count)
  * 
  */
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":90
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":90
  *             word_count = word_count + 1
  *         self.data.append(0)
  *         self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
@@ -8715,7 +7968,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
   __pyx_t_1 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -8740,13 +7993,24 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":93
+ * 
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_binary");
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -8756,26 +8020,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_22read_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":93
- * 
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":95
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":95
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -8784,16 +8030,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":96
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":96
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":97
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":97
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -8808,7 +8054,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":99
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":99
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -8819,7 +8065,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
 static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, FILE *__pyx_v_f) {
   int __pyx_v_num_words;
   int __pyx_v_word_len;
-  CYTHON_UNUSED unsigned int __pyx_v_i;
+  unsigned int __pyx_v_i;
   char *__pyx_v_word;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -8831,9 +8077,9 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_handle", 0);
+  __Pyx_RefNannySetupContext("read_handle");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":104
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":104
  *         cdef char* word
  * 
  *         self.data.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8842,7 +8088,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->read_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":105
  * 
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8851,7 +8097,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":106
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":106
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8860,7 +8106,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->read_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":107
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":107
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8869,7 +8115,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":108
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":108
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):             # <<<<<<<<<<<<<<
@@ -8880,7 +8126,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":109
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":109
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8889,7 +8135,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":110
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":110
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -8898,7 +8144,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":111
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":111
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -8907,7 +8153,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":112
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":112
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
@@ -8926,7 +8172,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":113
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":113
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
@@ -8940,7 +8186,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":114
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":114
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -8950,7 +8196,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     free(__pyx_v_word);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":115
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":115
  *             self.id2word.append(word)
  *             free(word)
  *         if len(self.sent_id) == 0:             # <<<<<<<<<<<<<<
@@ -8964,7 +8210,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __pyx_t_6 = (__pyx_t_4 == 0);
   if (__pyx_t_6) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":116
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":116
  *             free(word)
  *         if len(self.sent_id) == 0:
  *             self.use_sent_id = False             # <<<<<<<<<<<<<<
@@ -8976,7 +8222,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":118
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":118
  *             self.use_sent_id = False
  *         else:
  *             self.use_sent_id = True             # <<<<<<<<<<<<<<
@@ -8996,7 +8242,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":120
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":120
  *             self.use_sent_id = True
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -9018,9 +8264,9 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_handle", 0);
+  __Pyx_RefNannySetupContext("write_handle");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":124
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":124
  *         cdef int num_words
  * 
  *         self.data.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9029,7 +8275,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->write_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":125
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":125
  * 
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9038,7 +8284,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":126
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":126
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9047,7 +8293,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->write_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":127
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":127
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2             # <<<<<<<<<<<<<<
@@ -9060,7 +8306,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_num_words = (__pyx_t_2 - 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":128
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":128
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9069,7 +8315,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":129
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":129
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:             # <<<<<<<<<<<<<<
@@ -9088,20 +8334,12 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (;;) {
-    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
+    if (PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
     } else {
       __pyx_t_1 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_1)) {
@@ -9117,7 +8355,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_v_word = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":130
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":130
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
@@ -9127,7 +8365,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":131
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":131
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9136,7 +8374,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":132
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":132
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -9158,13 +8396,24 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":134
+ *             fwrite(<char *>word, sizeof(char), word_len, f)
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write_binary");
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -9174,26 +8423,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_24write_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":134
- *             fwrite(<char *>word, sizeof(char), word_len, f)
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":136
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -9202,16 +8433,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":137
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":137
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":138
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":138
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -9226,18 +8457,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_enhanced_handle (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_26write_enhanced_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_f));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":140
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":140
  *         fclose(f)
  * 
  *     def write_enhanced_handle(self, f):             # <<<<<<<<<<<<<<
@@ -9245,7 +8465,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__py
  *             f.write("%d " %i)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_word = NULL;
   PyObject *__pyx_r = NULL;
@@ -9259,38 +8480,30 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced_handle", 0);
+  __Pyx_RefNannySetupContext("write_enhanced_handle");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":141
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":141
  * 
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)__pyx_v_self->data)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->data))) {
-    __pyx_t_1 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data))) {
+    __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -9306,7 +8519,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":142
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":142
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -9318,7 +8531,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -9330,7 +8543,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":143
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -9344,36 +8557,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":144
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":144
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_index:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_index))) {
-    __pyx_t_5 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index))) {
+    __pyx_t_5 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_3 = Py_TYPE(__pyx_t_5)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_5)) {
+    if (PyList_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_5)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_5)) {
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
     } else {
       __pyx_t_1 = __pyx_t_3(__pyx_t_5);
       if (unlikely(!__pyx_t_1)) {
@@ -9389,7 +8594,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":145
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":145
  *         f.write("\n")
  *         for i in self.sent_index:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -9401,7 +8606,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_6));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
     __pyx_t_6 = 0;
@@ -9413,7 +8618,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -9427,36 +8632,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":147
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":147
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_id:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_id)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_id))) {
-    __pyx_t_6 = ((PyObject *)__pyx_v_self->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id))) {
+    __pyx_t_6 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_3 = Py_TYPE(__pyx_t_6)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_6)) {
+    if (PyList_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_6)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_6)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_6);
       if (unlikely(!__pyx_t_5)) {
@@ -9472,7 +8669,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":148
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":148
  *         f.write("\n")
  *         for i in self.sent_id:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -9484,7 +8681,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
     __pyx_t_4 = 0;
@@ -9496,7 +8693,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -9510,36 +8707,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":150
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":150
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for word in self.id2word:             # <<<<<<<<<<<<<<
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")
  */
-  if (PyList_CheckExact(__pyx_v_self->id2word) || PyTuple_CheckExact(__pyx_v_self->id2word)) {
-    __pyx_t_4 = __pyx_v_self->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word)) {
+    __pyx_t_4 = ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_self->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
+    if (PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
+      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
     } else {
       __pyx_t_6 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_6)) {
@@ -9555,7 +8744,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_word = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":151
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":151
  *         f.write("\n")
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))             # <<<<<<<<<<<<<<
@@ -9564,10 +8753,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
  */
     __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_1 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_INCREF(__pyx_v_word);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_word);
     __Pyx_GIVEREF(__pyx_v_word);
@@ -9578,7 +8767,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -9590,7 +8779,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -9621,28 +8810,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_28write_enhanced(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":154
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":154
  *         f.write("\n")
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9650,7 +8818,9 @@ static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_sel
  *             self.write_enhanced_handle(self, f)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -9668,9 +8838,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced", 0);
+  __Pyx_RefNannySetupContext("write_enhanced");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -9680,7 +8859,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -9692,54 +8871,53 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":156
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":156
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.write_enhanced_handle(self, f)             # <<<<<<<<<<<<<<
  */
-          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s_27); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_INCREF(((PyObject *)__pyx_v_self));
-          PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
-          __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+          __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+          __Pyx_INCREF(__pyx_v_self);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self);
+          __Pyx_GIVEREF(__pyx_v_self);
           __Pyx_INCREF(__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -9747,75 +8925,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_7);
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+          __Pyx_INCREF(__pyx_t_7);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7);
+          __Pyx_GIVEREF(__pyx_t_7);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
-          __Pyx_INCREF(__pyx_t_4);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_4);
-          __Pyx_GIVEREF(__pyx_t_4);
           __pyx_t_10 = PyObject_Call(__pyx_t_3, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
+            __Pyx_GIVEREF(__pyx_t_7);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_GIVEREF(__pyx_t_4);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_4);
-            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_4 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L18;
+            __Pyx_ErrRestore(__pyx_t_7, __pyx_t_2, __pyx_t_1);
+            __pyx_t_7 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L19;
           }
-          __pyx_L18:;
+          __pyx_L19:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L19;
-    __pyx_L3_error:;
+    goto __pyx_L20;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L19:;
+    __pyx_L20:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -9823,7 +9001,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -9834,7 +9012,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":12
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":12
  *     cdef IntList sent_index
  * 
  *     cdef int link(self, int i, int j):             # <<<<<<<<<<<<<<
@@ -9842,12 +9020,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
  *         return i*65536 + j
  */
 
-static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
+static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("link", 0);
+  __Pyx_RefNannySetupContext("link");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":14
  *     cdef int link(self, int i, int j):
  *         """Integerizes an alignment link pair"""
  *         return i*65536 + j             # <<<<<<<<<<<<<<
@@ -9863,19 +9041,7 @@ static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alig
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link); /*proto*/
-static char __pyx_doc_3_sa_9Alignment_unlink[] = "De-integerizes an alignment link pair";
-static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("unlink (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9Alignment_unlink(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((PyObject *)__pyx_v_link));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":16
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":16
  *         return i*65536 + j
  * 
  *     def unlink(self, link):             # <<<<<<<<<<<<<<
@@ -9883,7 +9049,9 @@ static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObje
  *         return (link/65536, link%65536)
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link) {
+static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link); /*proto*/
+static char __pyx_doc_3_sa_9Alignment_unlink[] = "De-integerizes an alignment link pair";
+static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -9892,9 +9060,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("unlink", 0);
+  __Pyx_RefNannySetupContext("unlink");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":18
  *     def unlink(self, link):
  *         """De-integerizes an alignment link pair"""
  *         return (link/65536, link%65536)             # <<<<<<<<<<<<<<
@@ -9907,7 +9075,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
   __pyx_t_2 = PyNumber_Remainder(__pyx_v_link, __pyx_int_65536); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -9932,7 +9100,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":20
  *         return (link/65536, link%65536)
  * 
  *     cdef _unlink(self, int link, int* f, int* e):             # <<<<<<<<<<<<<<
@@ -9940,12 +9108,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
  *         e[0] = link%65536
  */
 
-static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_link, int *__pyx_v_f, int *__pyx_v_e) {
+static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_link, int *__pyx_v_f, int *__pyx_v_e) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_unlink", 0);
+  __Pyx_RefNannySetupContext("_unlink");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":21
  * 
  *     cdef _unlink(self, int link, int* f, int* e):
  *         f[0] = link/65536             # <<<<<<<<<<<<<<
@@ -9954,7 +9122,7 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_
  */
   (__pyx_v_f[0]) = __Pyx_div_long(__pyx_v_link, 65536);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":22
  *     cdef _unlink(self, int link, int* f, int* e):
  *         f[0] = link/65536
  *         e[0] = link%65536             # <<<<<<<<<<<<<<
@@ -9969,28 +9137,7 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id) {
-  int __pyx_v_sent_id;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sent_links (wrapper)", 0);
-  assert(__pyx_arg_sent_id); {
-    __pyx_v_sent_id = __Pyx_PyInt_AsInt(__pyx_arg_sent_id); if (unlikely((__pyx_v_sent_id == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.get_sent_links", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_2get_sent_links(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((int)__pyx_v_sent_id));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":24
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":24
  *         e[0] = link%65536
  * 
  *     def get_sent_links(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -9998,7 +9145,9 @@ static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self
  *         cdef int* arr
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id) {
+static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id) {
+  int __pyx_v_sent_id;
   struct __pyx_obj_3_sa_IntList *__pyx_v_sent_links = 0;
   int *__pyx_v_arr;
   int __pyx_v_arr_len;
@@ -10008,9 +9157,18 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sent_links", 0);
+  __Pyx_RefNannySetupContext("get_sent_links");
+  assert(__pyx_arg_sent_id); {
+    __pyx_v_sent_id = __Pyx_PyInt_AsInt(__pyx_arg_sent_id); if (unlikely((__pyx_v_sent_id == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.get_sent_links", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":28
  *         cdef int* arr
  *         cdef int arr_len
  *         sent_links = IntList()             # <<<<<<<<<<<<<<
@@ -10022,16 +9180,16 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
   __pyx_v_sent_links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":29
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":29
  *         cdef int arr_len
  *         sent_links = IntList()
  *         arr = self._get_sent_links(sent_id, &arr_len)             # <<<<<<<<<<<<<<
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)
  */
-  __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->_get_sent_links(__pyx_v_self, __pyx_v_sent_id, (&__pyx_v_arr_len));
+  __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->__pyx_vtab)->_get_sent_links(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_v_sent_id, (&__pyx_v_arr_len));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":30
  *         sent_links = IntList()
  *         arr = self._get_sent_links(sent_id, &arr_len)
  *         sent_links._extend_arr(arr, arr_len*2)             # <<<<<<<<<<<<<<
@@ -10040,7 +9198,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sent_links->__pyx_vtab)->_extend_arr(__pyx_v_sent_links, __pyx_v_arr, (__pyx_v_arr_len * 2));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":31
  *         arr = self._get_sent_links(sent_id, &arr_len)
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)             # <<<<<<<<<<<<<<
@@ -10049,7 +9207,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
  */
   free(__pyx_v_arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":32
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":32
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)
  *         return sent_links             # <<<<<<<<<<<<<<
@@ -10074,7 +9232,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":34
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":34
  *         return sent_links
  * 
  *     cdef int* _get_sent_links(self, int sent_id, int* num_links):             # <<<<<<<<<<<<<<
@@ -10094,9 +9252,9 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_get_sent_links", 0);
+  __Pyx_RefNannySetupContext("_get_sent_links");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":37
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":37
  *         cdef int* sent_links
  *         cdef int i, start, end
  *         start = self.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -10105,7 +9263,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_v_sent_id]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":38
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":38
  *         cdef int i, start, end
  *         start = self.sent_index.arr[sent_id]
  *         end = self.sent_index.arr[sent_id+1]             # <<<<<<<<<<<<<<
@@ -10114,7 +9272,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_end = (__pyx_v_self->sent_index->arr[(__pyx_v_sent_id + 1)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":39
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":39
  *         start = self.sent_index.arr[sent_id]
  *         end = self.sent_index.arr[sent_id+1]
  *         num_links[0] = end - start             # <<<<<<<<<<<<<<
@@ -10123,7 +9281,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   (__pyx_v_num_links[0]) = (__pyx_v_end - __pyx_v_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":40
  *         end = self.sent_index.arr[sent_id+1]
  *         num_links[0] = end - start
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))             # <<<<<<<<<<<<<<
@@ -10132,7 +9290,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_sent_links = ((int *)malloc(((2 * (__pyx_v_num_links[0])) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":41
  *         num_links[0] = end - start
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))
  *         for i from 0 <= i < num_links[0]:             # <<<<<<<<<<<<<<
@@ -10142,7 +9300,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   __pyx_t_1 = (__pyx_v_num_links[0]);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":42
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":42
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))
  *         for i from 0 <= i < num_links[0]:
  *             self._unlink(self.links.arr[start + i], sent_links + (2*i), sent_links + (2*i) + 1)             # <<<<<<<<<<<<<<
@@ -10154,7 +9312,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":43
  *         for i from 0 <= i < num_links[0]:
  *             self._unlink(self.links.arr[start + i], sent_links + (2*i), sent_links + (2*i) + 1)
  *         return sent_links             # <<<<<<<<<<<<<<
@@ -10175,38 +9333,43 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_from_binary = 0;
-  PyObject *__pyx_v_from_text = 0;
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
-    PyObject* values[2] = {0,0};
-
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":45
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":45
  *         return sent_links
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):             # <<<<<<<<<<<<<<
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  */
+
+static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_from_binary = 0;
+  PyObject *__pyx_v_from_text = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
+  __Pyx_RefNannySetupContext("__cinit__");
+  {
+    PyObject* values[2] = {0,0};
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -10219,7 +9382,7 @@ static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -10240,24 +9403,8 @@ static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_4__cinit__(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":46
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":46
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -10267,12 +9414,12 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_29), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->links);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->links));
-  __pyx_v_self->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links));
+  ((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":47
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":47
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -10282,12 +9429,12 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_30), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->sent_index);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
-  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index));
+  ((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":48
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":48
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -10297,17 +9444,17 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":49
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":49
  *         self.sent_index = IntList(1000,1000)
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_text:
  *             self.read_text(from_text)
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -10316,10 +9463,10 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":50
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":50
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -10329,17 +9476,17 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":51
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":51
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             self.read_text(from_text)             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -10348,9 +9495,9 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -10365,28 +9512,7 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_6read_text(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":53
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":53
  *             self.read_text(from_text)
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -10394,7 +9520,9 @@ static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyO
  *             for line in f:
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_line = NULL;
   PyObject *__pyx_v_pairs = NULL;
@@ -10426,9 +9554,18 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text", 0);
+  __Pyx_RefNannySetupContext("read_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -10441,7 +9578,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -10451,12 +9588,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -10464,11 +9601,10 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_v_f = __pyx_t_1;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_v_f = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":55
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":55
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -10476,78 +9612,70 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  *                 pairs = line.split()
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_3 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_3)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_3);
             }
             __Pyx_XDECREF(__pyx_v_line);
-            __pyx_v_line = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_line = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":56
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":56
  *         with gzip_or_text(filename) as f:
  *             for line in f:
  *                 self.sent_index.append(len(self.links))             # <<<<<<<<<<<<<<
  *                 pairs = line.split()
  *                 for pair in pairs:
  */
-            __pyx_t_2 = ((PyObject *)__pyx_v_self->links);
-            __Pyx_INCREF(__pyx_t_2);
-            __pyx_t_10 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_3 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_3 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
+            __Pyx_INCREF(__pyx_t_3);
+            __pyx_t_10 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":57
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":57
  *             for line in f:
  *                 self.sent_index.append(len(self.links))
  *                 pairs = line.split()             # <<<<<<<<<<<<<<
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_XDECREF(__pyx_v_pairs);
-            __pyx_v_pairs = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_pairs = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":58
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":58
  *                 self.sent_index.append(len(self.links))
  *                 pairs = line.split()
  *                 for pair in pairs:             # <<<<<<<<<<<<<<
@@ -10555,173 +9683,158 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  *                     self.links.append(self.link(i, j))
  */
             if (PyList_CheckExact(__pyx_v_pairs) || PyTuple_CheckExact(__pyx_v_pairs)) {
-              __pyx_t_2 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_2); __pyx_t_10 = 0;
+              __pyx_t_3 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
               __pyx_t_11 = NULL;
             } else {
-              __pyx_t_10 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_11 = Py_TYPE(__pyx_t_2)->tp_iternext;
+              __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
             }
             for (;;) {
-              if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_2)) {
-                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_2)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                #else
-                __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                #endif
-              } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_2)) {
-                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                #else
-                __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                #endif
+              if (PyList_CheckExact(__pyx_t_3)) {
+                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
+                __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++;
+              } else if (PyTuple_CheckExact(__pyx_t_3)) {
+                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+                __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++;
               } else {
-                __pyx_t_3 = __pyx_t_11(__pyx_t_2);
-                if (unlikely(!__pyx_t_3)) {
+                __pyx_t_1 = __pyx_t_11(__pyx_t_3);
+                if (unlikely(!__pyx_t_1)) {
                   if (PyErr_Occurred()) {
                     if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                    else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                   }
                   break;
                 }
-                __Pyx_GOTREF(__pyx_t_3);
+                __Pyx_GOTREF(__pyx_t_1);
               }
               __Pyx_XDECREF(__pyx_v_pair);
-              __pyx_v_pair = __pyx_t_3;
-              __pyx_t_3 = 0;
+              __pyx_v_pair = __pyx_t_1;
+              __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":59
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))             # <<<<<<<<<<<<<<
  *                     self.links.append(self.link(i, j))
  *             self.sent_index.append(len(self.links))
  */
-              __pyx_t_3 = PyObject_GetAttr(__pyx_v_pair, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_3);
-              __pyx_t_12 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_k_tuple_32), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyObject_GetAttr(__pyx_v_pair, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_12 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_32), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
               __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-              PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
+              PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
               __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-              PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_12);
+              PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
               __Pyx_GIVEREF(__pyx_t_12);
               __pyx_t_12 = 0;
-              __pyx_t_12 = PyObject_Call(__pyx_builtin_map, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_builtin_map, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+              __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               if ((likely(PyTuple_CheckExact(__pyx_t_12))) || (PyList_CheckExact(__pyx_t_12))) {
                 PyObject* sequence = __pyx_t_12;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                Py_ssize_t size = Py_SIZE(sequence);
-                #else
-                Py_ssize_t size = PySequence_Size(sequence);
-                #endif
-                if (unlikely(size != 2)) {
-                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                  {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                }
-                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  }
+                  __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
-                  __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
+                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  }
+                  __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
                 }
-                __Pyx_INCREF(__pyx_t_3);
+                __Pyx_INCREF(__pyx_t_1);
                 __Pyx_INCREF(__pyx_t_13);
-                #else
-                __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                __pyx_t_13 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                #endif
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              } else
-              {
+              } else {
                 Py_ssize_t index = -1;
-                __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
                 __pyx_t_15 = Py_TYPE(__pyx_t_14)->tp_iternext;
-                index = 0; __pyx_t_3 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_3)) goto __pyx_L20_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_3);
-                index = 1; __pyx_t_13 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L20_unpacking_failed;
+                index = 0; __pyx_t_1 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_1)) goto __pyx_L21_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_1);
+                index = 1; __pyx_t_13 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L21_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_13);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_14), 2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                __pyx_t_15 = NULL;
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_14), 2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                goto __pyx_L21_unpacking_done;
-                __pyx_L20_unpacking_failed:;
+                goto __pyx_L22_unpacking_done;
+                __pyx_L21_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __pyx_t_15 = NULL;
-                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                __pyx_L21_unpacking_done:;
+                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                __pyx_L22_unpacking_done:;
               }
               __Pyx_XDECREF(__pyx_v_i);
-              __pyx_v_i = __pyx_t_3;
-              __pyx_t_3 = 0;
+              __pyx_v_i = __pyx_t_1;
+              __pyx_t_1 = 0;
               __Pyx_XDECREF(__pyx_v_j);
               __pyx_v_j = __pyx_t_13;
               __pyx_t_13 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":60
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":60
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))
  *                     self.links.append(self.link(i, j))             # <<<<<<<<<<<<<<
  *             self.sent_index.append(len(self.links))
  * 
  */
-              __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_12 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->link(__pyx_v_self, __pyx_t_16, __pyx_t_17)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->__pyx_vtab)->link(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_t_16, __pyx_t_17)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __pyx_t_13 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->links), __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_13 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links), __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_13);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
             }
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":61
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":61
  *                     (i, j) = map(int, pair.split('-'))
  *                     self.links.append(self.link(i, j))
  *             self.sent_index.append(len(self.links))             # <<<<<<<<<<<<<<
  * 
  *     def read_binary(self, char* filename):
  */
-          __pyx_t_1 = ((PyObject *)__pyx_v_self->links);
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_t_8 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
+          __Pyx_INCREF(__pyx_t_2);
+          __pyx_t_8 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_3 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
-        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -10730,57 +9843,57 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_13) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_13) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_12);
+          __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+          __Pyx_INCREF(__pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_3);
+          __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_13);
           PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_t_13);
           __Pyx_GIVEREF(__pyx_t_13);
           __pyx_t_19 = PyObject_Call(__pyx_t_4, __pyx_t_12, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_19);
           __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_19);
           __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-          if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_20 = (!__pyx_t_18);
           if (__pyx_t_20) {
+            __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_13);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_13);
-            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_13 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L24;
+            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_13);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_13 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L25;
           }
-          __pyx_L24:;
+          __pyx_L25:;
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
@@ -10794,11 +9907,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
         if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L25;
-    __pyx_L3_error:;
+    goto __pyx_L26;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L25:;
+    __pyx_L26:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -10824,13 +9937,24 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":63
+ *             self.sent_index.append(len(self.links))
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_binary");
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -10840,26 +9964,8 @@ static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, P
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_8read_binary(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":63
- *             self.sent_index.append(len(self.links))
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":65
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":65
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -10868,25 +9974,25 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Ali
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":66
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.links.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.sent_index.read_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->read_handle(__pyx_v_self->links, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":67
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":67
  *         f = fopen(filename, "r")
  *         self.links.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":68
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":68
  *         self.links.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -10901,28 +10007,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Ali
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_10write_text(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":70
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":70
  *         fclose(f)
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -10930,7 +10015,9 @@ static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, P
  *             sent_num = 0
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_sent_num = NULL;
   PyObject *__pyx_v_i = NULL;
@@ -10943,9 +10030,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  Py_ssize_t __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
   PyObject *__pyx_t_10 = NULL;
   int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
@@ -10955,9 +10042,18 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text", 0);
+  __Pyx_RefNannySetupContext("write_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10968,7 +10064,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -10980,24 +10076,23 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":72
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":72
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             sent_num = 0             # <<<<<<<<<<<<<<
@@ -11007,7 +10102,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_sent_num = __pyx_int_0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":73
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":73
  *         with open(filename, "w") as f:
  *             sent_num = 0
  *             for i, link in enumerate(self.links):             # <<<<<<<<<<<<<<
@@ -11015,54 +10110,46 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
  *                     f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_4 = __pyx_int_0;
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->links)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->links))) {
-            __pyx_t_1 = ((PyObject *)__pyx_v_self->links); __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          __pyx_t_1 = __pyx_int_0;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links))) {
+            __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links); __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->links)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_9 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++;
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_9 = __pyx_t_8(__pyx_t_2);
+              if (unlikely(!__pyx_t_9)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_9);
             }
             __Pyx_XDECREF(__pyx_v_link);
-            __pyx_v_link = __pyx_t_2;
-            __pyx_t_2 = 0;
-            __Pyx_INCREF(__pyx_t_4);
+            __pyx_v_link = __pyx_t_9;
+            __pyx_t_9 = 0;
+            __Pyx_INCREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_4;
-            __pyx_t_2 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_4);
-            __pyx_t_4 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_9 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_DECREF(__pyx_t_1);
+            __pyx_t_1 = __pyx_t_9;
+            __pyx_t_9 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":74
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":74
  *             sent_num = 0
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:             # <<<<<<<<<<<<<<
@@ -11070,106 +10157,107 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
  *                     sent_num = sent_num + 1
  */
             while (1) {
-              __pyx_t_2 = PyObject_GetItem(((PyObject *)__pyx_v_self->sent_index), __pyx_v_sent_num); if (!__pyx_t_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_9 = PyObject_GetItem(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_v_sent_num); if (!__pyx_t_9) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_9, Py_GE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_10);
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               if (!__pyx_t_11) break;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":75
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":75
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  */
-              __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_2 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_k_tuple_34), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_k_tuple_34), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":76
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":76
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")
  *                     sent_num = sent_num + 1             # <<<<<<<<<<<<<<
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")
  */
-              __pyx_t_2 = PyNumber_Add(__pyx_v_sent_num, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_9 = PyNumber_Add(__pyx_v_sent_num, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_v_sent_num);
-              __pyx_v_sent_num = __pyx_t_2;
-              __pyx_t_2 = 0;
+              __pyx_v_sent_num = __pyx_t_9;
+              __pyx_t_9 = 0;
             }
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":77
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":77
  *                     f.write("\n")
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__unlink); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__unlink); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_12);
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_INCREF(__pyx_v_link);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_link);
             __Pyx_GIVEREF(__pyx_v_link);
-            __pyx_t_13 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_13 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_13);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __pyx_t_12 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_35), __pyx_t_13); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_35), __pyx_t_13); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_13);
+            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_13));
             PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_t_12));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
             __pyx_t_12 = 0;
-            __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           }
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":78
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def write_binary(self, char* filename):
  */
-          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_36), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_36), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -11178,75 +10266,75 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_4, &__pyx_t_12) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_12) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_13);
+          __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+          __Pyx_INCREF(__pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_2);
+          __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
-          __Pyx_INCREF(__pyx_t_4);
-          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4);
-          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_12);
           PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __pyx_t_14 = PyObject_Call(__pyx_t_3, __pyx_t_13, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_14);
           __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_15 = (!__pyx_t_11);
           if (__pyx_t_15) {
+            __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_12);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_4, __pyx_t_12);
-            __pyx_t_1 = 0; __pyx_t_4 = 0; __pyx_t_12 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L22;
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_12);
+            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_12 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L23;
           }
-          __pyx_L22:;
+          __pyx_L23:;
           __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_37, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_37, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L23;
-    __pyx_L3_error:;
+    goto __pyx_L24;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L23:;
+    __pyx_L24:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -11254,7 +10342,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_XDECREF(__pyx_t_13);
@@ -11270,13 +10358,24 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":80
+ *             f.write("\n")
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write_binary");
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -11286,26 +10385,8 @@ static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_12write_binary(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":80
- *             f.write("\n")
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":82
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":82
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -11314,25 +10395,25 @@ static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_A
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":83
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":83
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.links.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.sent_index.write_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->write_handle(__pyx_v_self->links, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":84
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":84
  *         f = fopen(filename, "w")
  *         self.links.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":85
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":85
  *         self.links.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -11347,28 +10428,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_A
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_14write_enhanced(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":87
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":87
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -11376,9 +10436,11 @@ static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_sel
  *             sent_num = 1
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
-  CYTHON_UNUSED long __pyx_v_sent_num;
+  long __pyx_v_sent_num;
   PyObject *__pyx_v_link = NULL;
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_r = NULL;
@@ -11389,9 +10451,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  Py_ssize_t __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
   PyObject *__pyx_t_10 = NULL;
   int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
@@ -11399,9 +10461,18 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced", 0);
+  __Pyx_RefNannySetupContext("write_enhanced");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -11412,7 +10483,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -11424,24 +10495,23 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":89
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":89
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             sent_num = 1             # <<<<<<<<<<<<<<
@@ -11450,183 +10520,167 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  */
           __pyx_v_sent_num = 1;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":90
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":90
  *         with open(filename, "w") as f:
  *             sent_num = 1
  *             for link in self.links:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % link)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->links)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->links))) {
-            __pyx_t_4 = ((PyObject *)__pyx_v_self->links); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links))) {
+            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->links)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
             } else {
-              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_link);
-            __pyx_v_link = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_link = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":91
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":91
  *             sent_num = 1
  *             for link in self.links:
  *                 f.write("%d " % link)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i in self.sent_index:
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_2));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
+            __pyx_t_9 = 0;
+            __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           }
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":92
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
  *                 f.write("%d " % link)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  */
-          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_38), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_38), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":93
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":93
  *                 f.write("%d " % link)
  *             f.write("\n")
  *             for i in self.sent_index:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_index))) {
-            __pyx_t_2 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index))) {
+            __pyx_t_9 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index); __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
             } else {
-              __pyx_t_4 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_4)) {
+              __pyx_t_1 = __pyx_t_8(__pyx_t_9);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_4);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_4;
-            __pyx_t_4 = 0;
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":94
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":94
  *             f.write("\n")
  *             for i in self.sent_index:
  *                 f.write("%d " % i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":95
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def alignment(self, i):
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_39), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_39), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -11635,75 +10689,75 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_9, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
           __Pyx_INCREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
+          __Pyx_INCREF(__pyx_t_9);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
+          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
-          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
+          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
+            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_2, __pyx_t_1);
-            __pyx_t_10 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L22;
+            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_9, __pyx_t_2);
+            __pyx_t_10 = 0; __pyx_t_9 = 0; __pyx_t_2 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L23;
           }
-          __pyx_L22:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+          __pyx_L23:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_40, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_40, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L23;
-    __pyx_L3_error:;
+    goto __pyx_L24;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L23:;
+    __pyx_L24:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -11711,7 +10765,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -11724,19 +10778,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static char __pyx_doc_3_sa_9Alignment_16alignment[] = "Return all (e,f) pairs for sentence i";
-static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("alignment (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9Alignment_16alignment(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":97
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":97
  *             f.write("\n")
  * 
  *     def alignment(self, i):             # <<<<<<<<<<<<<<
@@ -11744,7 +10786,9 @@ static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, Py
  *         cdef int j, start, end
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static char __pyx_doc_3_sa_9Alignment_8alignment[] = "Return all (e,f) pairs for sentence i";
+static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_j;
   int __pyx_v_start;
   int __pyx_v_end;
@@ -11760,9 +10804,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("alignment", 0);
+  __Pyx_RefNannySetupContext("alignment");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":100
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":100
  *         """Return all (e,f) pairs for sentence i"""
  *         cdef int j, start, end
  *         result = []             # <<<<<<<<<<<<<<
@@ -11770,11 +10814,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
  *         end = self.sent_index.arr[i+1]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":101
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":101
  *         cdef int j, start, end
  *         result = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
@@ -11782,9 +10826,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
  *         for j from start <= j < end:
  */
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
+  __pyx_v_start = (((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":102
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":102
  *         result = []
  *         start = self.sent_index.arr[i]
  *         end = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
@@ -11795,9 +10839,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_end = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
+  __pyx_v_end = (((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":103
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":103
  *         start = self.sent_index.arr[i]
  *         end = self.sent_index.arr[i+1]
  *         for j from start <= j < end:             # <<<<<<<<<<<<<<
@@ -11807,18 +10851,21 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   __pyx_t_3 = __pyx_v_end;
   for (__pyx_v_j = __pyx_v_start; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":104
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":104
  *         end = self.sent_index.arr[i+1]
  *         for j from start <= j < end:
  *             result.append(self.unlink(self.links.arr[j]))             # <<<<<<<<<<<<<<
  *         return result
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__unlink); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_v_result) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__unlink); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyInt_FromLong((__pyx_v_self->links->arr[__pyx_v_j])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->arr[__pyx_v_j])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
@@ -11830,7 +10877,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":105
  *         for j from start <= j < end:
  *             result.append(self.unlink(self.links.arr[j]))
  *         return result             # <<<<<<<<<<<<<<
@@ -11855,7 +10902,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":15
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":15
  *     int val
  * 
  * cdef _node* new_node(int key):             # <<<<<<<<<<<<<<
@@ -11867,9 +10914,9 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   struct __pyx_t_3_sa__node *__pyx_v_n;
   struct __pyx_t_3_sa__node *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_node", 0);
+  __Pyx_RefNannySetupContext("new_node");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":17
  * cdef _node* new_node(int key):
  *     cdef _node* n
  *     n = <_node*> malloc(sizeof(_node))             # <<<<<<<<<<<<<<
@@ -11878,7 +10925,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n = ((struct __pyx_t_3_sa__node *)malloc((sizeof(struct __pyx_t_3_sa__node))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":18
  *     cdef _node* n
  *     n = <_node*> malloc(sizeof(_node))
  *     n.smaller = NULL             # <<<<<<<<<<<<<<
@@ -11887,7 +10934,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->smaller = NULL;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":19
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":19
  *     n = <_node*> malloc(sizeof(_node))
  *     n.smaller = NULL
  *     n.bigger = NULL             # <<<<<<<<<<<<<<
@@ -11896,7 +10943,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->bigger = NULL;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":20
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":20
  *     n.smaller = NULL
  *     n.bigger = NULL
  *     n.key = key             # <<<<<<<<<<<<<<
@@ -11905,7 +10952,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->key = __pyx_v_key;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":21
  *     n.bigger = NULL
  *     n.key = key
  *     n.val = 0             # <<<<<<<<<<<<<<
@@ -11914,7 +10961,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->val = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":22
  *     n.key = key
  *     n.val = 0
  *     return n             # <<<<<<<<<<<<<<
@@ -11930,7 +10977,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":25
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":25
  * 
  * 
  * cdef del_node(_node* n):             # <<<<<<<<<<<<<<
@@ -11946,9 +10993,9 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("del_node", 0);
+  __Pyx_RefNannySetupContext("del_node");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":26
  * 
  * cdef del_node(_node* n):
  *     if n.smaller != NULL:             # <<<<<<<<<<<<<<
@@ -11958,7 +11005,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   __pyx_t_1 = (__pyx_v_n->smaller != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":27
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":27
  * cdef del_node(_node* n):
  *     if n.smaller != NULL:
  *         del_node(n.smaller)             # <<<<<<<<<<<<<<
@@ -11972,7 +11019,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":28
  *     if n.smaller != NULL:
  *         del_node(n.smaller)
  *     if n.bigger != NULL:             # <<<<<<<<<<<<<<
@@ -11982,7 +11029,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   __pyx_t_1 = (__pyx_v_n->bigger != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":29
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":29
  *         del_node(n.smaller)
  *     if n.bigger != NULL:
  *         del_node(n.bigger)             # <<<<<<<<<<<<<<
@@ -11996,7 +11043,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":30
  *     if n.bigger != NULL:
  *         del_node(n.bigger)
  *     free(n)             # <<<<<<<<<<<<<<
@@ -12017,7 +11064,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":32
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":32
  *     free(n)
  * 
  * cdef int* get_val(_node* n, int key):             # <<<<<<<<<<<<<<
@@ -12029,9 +11076,9 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("get_val", 0);
+  __Pyx_RefNannySetupContext("get_val");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":33
  * 
  * cdef int* get_val(_node* n, int key):
  *     if key == n.key:             # <<<<<<<<<<<<<<
@@ -12041,7 +11088,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   __pyx_t_1 = (__pyx_v_key == __pyx_v_n->key);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":34
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":34
  * cdef int* get_val(_node* n, int key):
  *     if key == n.key:
  *         return &n.val             # <<<<<<<<<<<<<<
@@ -12053,7 +11100,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":35
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":35
  *     if key == n.key:
  *         return &n.val
  *     elif key < n.key:             # <<<<<<<<<<<<<<
@@ -12063,7 +11110,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   __pyx_t_1 = (__pyx_v_key < __pyx_v_n->key);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":36
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":36
  *         return &n.val
  *     elif key < n.key:
  *         if n.smaller == NULL:             # <<<<<<<<<<<<<<
@@ -12073,7 +11120,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     __pyx_t_1 = (__pyx_v_n->smaller == NULL);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":37
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":37
  *     elif key < n.key:
  *         if n.smaller == NULL:
  *             n.smaller = new_node(key)             # <<<<<<<<<<<<<<
@@ -12082,7 +11129,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
  */
       __pyx_v_n->smaller = __pyx_f_3_sa_new_node(__pyx_v_key);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":38
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":38
  *         if n.smaller == NULL:
  *             n.smaller = new_node(key)
  *             return &(n.smaller.val)             # <<<<<<<<<<<<<<
@@ -12095,7 +11142,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":39
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":39
  *             n.smaller = new_node(key)
  *             return &(n.smaller.val)
  *         return get_val(n.smaller, key)             # <<<<<<<<<<<<<<
@@ -12108,7 +11155,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":41
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":41
  *         return get_val(n.smaller, key)
  *     else:
  *         if n.bigger == NULL:             # <<<<<<<<<<<<<<
@@ -12118,7 +11165,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     __pyx_t_1 = (__pyx_v_n->bigger == NULL);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":42
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":42
  *     else:
  *         if n.bigger == NULL:
  *             n.bigger = new_node(key)             # <<<<<<<<<<<<<<
@@ -12127,7 +11174,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
  */
       __pyx_v_n->bigger = __pyx_f_3_sa_new_node(__pyx_v_key);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":43
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":43
  *         if n.bigger == NULL:
  *             n.bigger = new_node(key)
  *             return &(n.bigger.val)             # <<<<<<<<<<<<<<
@@ -12140,7 +11187,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":44
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":44
  *             n.bigger = new_node(key)
  *             return &(n.bigger.val)
  *         return get_val(n.bigger, key)             # <<<<<<<<<<<<<<
@@ -12158,9 +11205,16 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
+ *     cdef id2eword, id2fword, eword2id, fword2id
+ * 
+ *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
+ *             earray=None, fsarray=None, alignment=None):
+ *         self.id2eword = []
+ */
+
+static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_from_data = 0;
   PyObject *__pyx_v_from_binary = 0;
@@ -12169,23 +11223,23 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
   PyObject *__pyx_v_alignment = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
     PyObject* values[6] = {0,0,0,0,0,0};
-
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
- *     cdef id2eword, id2fword, eword2id, fword2id
- * 
- *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
- *             earray=None, fsarray=None, alignment=None):
- *         self.id2eword = []
- */
     values[0] = ((PyObject *)Py_None);
     values[1] = __pyx_k_41;
     values[2] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":55
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":55
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,
  *             earray=None, fsarray=None, alignment=None):             # <<<<<<<<<<<<<<
@@ -12197,8 +11251,7 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
     values[5] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -12209,7 +11262,7 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_text);
@@ -12242,7 +11295,7 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -12271,33 +11324,8 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex___cinit__(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_v_from_text, __pyx_v_from_data, __pyx_v_from_binary, __pyx_v_earray, __pyx_v_fsarray, __pyx_v_alignment);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
- *     cdef id2eword, id2fword, eword2id, fword2id
- * 
- *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
- *             earray=None, fsarray=None, alignment=None):
- *         self.id2eword = []
- */
-
-static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_from_text, PyObject *__pyx_v_from_data, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_earray, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_alignment) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":56
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":56
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,
  *             earray=None, fsarray=None, alignment=None):
  *         self.id2eword = []             # <<<<<<<<<<<<<<
@@ -12305,14 +11333,14 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  *         self.eword2id = {}
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->id2eword);
-  __Pyx_DECREF(__pyx_v_self->id2eword);
-  __pyx_v_self->id2eword = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword);
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":57
  *             earray=None, fsarray=None, alignment=None):
  *         self.id2eword = []
  *         self.id2fword = []             # <<<<<<<<<<<<<<
@@ -12320,14 +11348,14 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  *         self.fword2id = {}
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->id2fword);
-  __Pyx_DECREF(__pyx_v_self->id2fword);
-  __pyx_v_self->id2fword = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword);
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":58
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":58
  *         self.id2eword = []
  *         self.id2fword = []
  *         self.eword2id = {}             # <<<<<<<<<<<<<<
@@ -12337,12 +11365,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->eword2id);
-  __Pyx_DECREF(__pyx_v_self->eword2id);
-  __pyx_v_self->eword2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id);
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":59
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":59
  *         self.id2fword = []
  *         self.eword2id = {}
  *         self.fword2id = {}             # <<<<<<<<<<<<<<
@@ -12352,12 +11380,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->fword2id);
-  __Pyx_DECREF(__pyx_v_self->fword2id);
-  __pyx_v_self->fword2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id);
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":60
  *         self.eword2id = {}
  *         self.fword2id = {}
  *         self.e_index = IntList()             # <<<<<<<<<<<<<<
@@ -12367,12 +11395,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->e_index);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->e_index));
-  __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":61
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":61
  *         self.fword2id = {}
  *         self.e_index = IntList()
  *         self.f_index = IntList()             # <<<<<<<<<<<<<<
@@ -12382,12 +11410,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->f_index);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->f_index));
-  __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index));
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":62
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":62
  *         self.e_index = IntList()
  *         self.f_index = IntList()
  *         self.col1 = FloatList()             # <<<<<<<<<<<<<<
@@ -12397,12 +11425,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->col1);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->col1));
-  __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":63
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":63
  *         self.f_index = IntList()
  *         self.col1 = FloatList()
  *         self.col2 = FloatList()             # <<<<<<<<<<<<<<
@@ -12412,12 +11440,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->col2);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->col2));
-  __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":64
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":64
  *         self.col1 = FloatList()
  *         self.col2 = FloatList()
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -12427,17 +11455,17 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":65
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":65
  *         self.col2 = FloatList()
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_data:
  *             self.compute_from_data(fsarray, earray, alignment)
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -12446,10 +11474,10 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":66
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_data:             # <<<<<<<<<<<<<<
@@ -12459,7 +11487,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_data); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":67
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":67
  *             self.read_binary(from_binary)
  *         elif from_data:
  *             self.compute_from_data(fsarray, earray, alignment)             # <<<<<<<<<<<<<<
@@ -12475,27 +11503,27 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
     if (!(likely(((__pyx_v_alignment) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_alignment, __pyx_ptype_3_sa_Alignment))))) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __pyx_v_alignment;
     __Pyx_INCREF(__pyx_t_1);
-    __pyx_t_5 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->compute_from_data(__pyx_v_self, ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_t_4), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_3), ((struct __pyx_obj_3_sa_Alignment *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->compute_from_data(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_t_4), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_3), ((struct __pyx_obj_3_sa_Alignment *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":69
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":69
  *             self.compute_from_data(fsarray, earray, alignment)
  *         else:
  *             self.read_text(from_text)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -12505,7 +11533,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -12521,7 +11549,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":72
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":72
  * 
  * 
  *     cdef compute_from_data(self, SuffixArray fsa, DataArray eda, Alignment aa):             # <<<<<<<<<<<<<<
@@ -12573,9 +11601,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("compute_from_data", 0);
+  __Pyx_RefNannySetupContext("compute_from_data");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":79
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":79
  *         cdef int null_word
  * 
  *         null_word = 0             # <<<<<<<<<<<<<<
@@ -12584,7 +11612,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_null_word = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":80
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":80
  * 
  *         null_word = 0
  *         for word in fsa.darray.id2word: # I miss list comprehensions             # <<<<<<<<<<<<<<
@@ -12600,20 +11628,12 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -12629,7 +11649,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":81
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":81
  *         null_word = 0
  *         for word in fsa.darray.id2word: # I miss list comprehensions
  *             self.id2fword.append(word)             # <<<<<<<<<<<<<<
@@ -12642,7 +11662,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":82
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":82
  *         for word in fsa.darray.id2word: # I miss list comprehensions
  *             self.id2fword.append(word)
  *         self.id2fword[null_word] = "NULL"             # <<<<<<<<<<<<<<
@@ -12651,7 +11671,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   if (__Pyx_SetItemInt(__pyx_v_self->id2fword, __pyx_v_null_word, ((PyObject *)__pyx_n_s__NULL), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":83
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":83
  *             self.id2fword.append(word)
  *         self.id2fword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2fword):             # <<<<<<<<<<<<<<
@@ -12669,20 +11689,12 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
+    if (PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_5)) {
@@ -12706,7 +11718,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":84
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":84
  *         self.id2fword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2fword):
  *             self.fword2id[word] = id             # <<<<<<<<<<<<<<
@@ -12718,7 +11730,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":86
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":86
  *             self.fword2id[word] = id
  * 
  *         for word in eda.id2word:             # <<<<<<<<<<<<<<
@@ -12734,20 +11746,12 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -12763,7 +11767,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":87
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":87
  * 
  *         for word in eda.id2word:
  *             self.id2eword.append(word)             # <<<<<<<<<<<<<<
@@ -12776,7 +11780,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":88
  *         for word in eda.id2word:
  *             self.id2eword.append(word)
  *         self.id2eword[null_word] = "NULL"             # <<<<<<<<<<<<<<
@@ -12785,7 +11789,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   if (__Pyx_SetItemInt(__pyx_v_self->id2eword, __pyx_v_null_word, ((PyObject *)__pyx_n_s__NULL), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":89
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":89
  *             self.id2eword.append(word)
  *         self.id2eword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2eword):             # <<<<<<<<<<<<<<
@@ -12803,20 +11807,12 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
+    if (PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_5)) {
@@ -12840,7 +11836,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":90
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":90
  *         self.id2eword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2eword):
  *             self.eword2id[word] = id             # <<<<<<<<<<<<<<
@@ -12852,7 +11848,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":92
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":92
  *             self.eword2id[word] = id
  * 
  *         num_pairs = 0             # <<<<<<<<<<<<<<
@@ -12861,7 +11857,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_num_pairs = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":94
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":94
  *         num_pairs = 0
  * 
  *         V_E = len(eda.id2word)             # <<<<<<<<<<<<<<
@@ -12874,7 +11870,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_V_E = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":95
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":95
  * 
  *         V_E = len(eda.id2word)
  *         V_F = len(fsa.darray.id2word)             # <<<<<<<<<<<<<<
@@ -12887,7 +11883,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_V_F = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":96
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":96
  *         V_E = len(eda.id2word)
  *         V_F = len(fsa.darray.id2word)
  *         fmargin = <int*> malloc(V_F*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12896,7 +11892,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_fmargin = ((int *)malloc((__pyx_v_V_F * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":97
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":97
  *         V_F = len(fsa.darray.id2word)
  *         fmargin = <int*> malloc(V_F*sizeof(int))
  *         emargin = <int*> malloc(V_E*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12905,7 +11901,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_emargin = ((int *)malloc((__pyx_v_V_E * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":98
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":98
  *         fmargin = <int*> malloc(V_F*sizeof(int))
  *         emargin = <int*> malloc(V_E*sizeof(int))
  *         memset(fmargin, 0, V_F*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12914,7 +11910,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_fmargin, 0, (__pyx_v_V_F * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":99
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":99
  *         emargin = <int*> malloc(V_E*sizeof(int))
  *         memset(fmargin, 0, V_F*sizeof(int))
  *         memset(emargin, 0, V_E*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12923,7 +11919,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_emargin, 0, (__pyx_v_V_E * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":101
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":101
  *         memset(emargin, 0, V_E*sizeof(int))
  * 
  *         dict = <_node**> malloc(V_F*sizeof(_node*))             # <<<<<<<<<<<<<<
@@ -12932,7 +11928,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_dict = ((struct __pyx_t_3_sa__node **)malloc((__pyx_v_V_F * (sizeof(struct __pyx_t_3_sa__node *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":102
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":102
  * 
  *         dict = <_node**> malloc(V_F*sizeof(_node*))
  *         memset(dict, 0, V_F*sizeof(_node*))             # <<<<<<<<<<<<<<
@@ -12941,7 +11937,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_dict, 0, (__pyx_v_V_F * (sizeof(struct __pyx_t_3_sa__node *))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":104
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":104
  *         memset(dict, 0, V_F*sizeof(_node*))
  * 
  *         num_sents = len(fsa.darray.sent_index)             # <<<<<<<<<<<<<<
@@ -12957,7 +11953,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_num_sents = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":105
  * 
  *         num_sents = len(fsa.darray.sent_index)
  *         for sent_id from 0 <= sent_id < num_sents-1:             # <<<<<<<<<<<<<<
@@ -12970,7 +11966,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (__pyx_v_sent_id = 0; __pyx_v_sent_id < __pyx_t_6; __pyx_v_sent_id++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":107
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":107
  *         for sent_id from 0 <= sent_id < num_sents-1:
  * 
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -12979,7 +11975,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_fsent = (__pyx_v_fsa->darray->data->arr + (__pyx_v_fsa->darray->sent_index->arr[__pyx_v_sent_id]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":108
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":108
  * 
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1             # <<<<<<<<<<<<<<
@@ -12988,7 +11984,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_I = (((__pyx_v_fsa->darray->sent_index->arr[(__pyx_v_sent_id + 1)]) - (__pyx_v_fsa->darray->sent_index->arr[__pyx_v_sent_id])) - 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":109
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":109
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1
  *             faligned = <int*> malloc(I*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12997,7 +11993,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_faligned = ((int *)malloc((__pyx_v_I * (sizeof(int)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":110
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":110
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1
  *             faligned = <int*> malloc(I*sizeof(int))
  *             memset(faligned, 0, I*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13006,7 +12002,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     memset(__pyx_v_faligned, 0, (__pyx_v_I * (sizeof(int))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":112
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":112
  *             memset(faligned, 0, I*sizeof(int))
  * 
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -13015,7 +12011,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_esent = (__pyx_v_eda->data->arr + (__pyx_v_eda->sent_index->arr[__pyx_v_sent_id]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":113
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":113
  * 
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1             # <<<<<<<<<<<<<<
@@ -13024,7 +12020,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_J = (((__pyx_v_eda->sent_index->arr[(__pyx_v_sent_id + 1)]) - (__pyx_v_eda->sent_index->arr[__pyx_v_sent_id])) - 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":114
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":114
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1
  *             ealigned = <int*> malloc(J*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13033,7 +12029,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_ealigned = ((int *)malloc((__pyx_v_J * (sizeof(int)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":115
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":115
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1
  *             ealigned = <int*> malloc(J*sizeof(int))
  *             memset(ealigned, 0, J*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13042,7 +12038,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     memset(__pyx_v_ealigned, 0, (__pyx_v_J * (sizeof(int))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":117
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":117
  *             memset(ealigned, 0, J*sizeof(int))
  * 
  *             links = aa._get_sent_links(sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -13051,7 +12047,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_aa->__pyx_vtab)->_get_sent_links(__pyx_v_aa, __pyx_v_sent_id, (&__pyx_v_num_links));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":119
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":119
  *             links = aa._get_sent_links(sent_id, &num_links)
  * 
  *             for l from 0 <= l < num_links:             # <<<<<<<<<<<<<<
@@ -13061,7 +12057,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_num_links;
     for (__pyx_v_l = 0; __pyx_v_l < __pyx_t_7; __pyx_v_l++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":120
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":120
  * 
  *             for l from 0 <= l < num_links:
  *                 i = links[l*2]             # <<<<<<<<<<<<<<
@@ -13070,7 +12066,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_i = (__pyx_v_links[(__pyx_v_l * 2)]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":121
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":121
  *             for l from 0 <= l < num_links:
  *                 i = links[l*2]
  *                 j = links[l*2+1]             # <<<<<<<<<<<<<<
@@ -13079,7 +12075,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_j = (__pyx_v_links[((__pyx_v_l * 2) + 1)]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":122
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":122
  *                 i = links[l*2]
  *                 j = links[l*2+1]
  *                 if i >= I or j >= J:             # <<<<<<<<<<<<<<
@@ -13095,7 +12091,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       if (__pyx_t_10) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":123
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":123
  *                 j = links[l*2+1]
  *                 if i >= I or j >= J:
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))             # <<<<<<<<<<<<<<
@@ -13113,7 +12109,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_12 = PyInt_FromLong((__pyx_v_sent_id + 1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_12);
         __pyx_t_13 = PyTuple_New(5); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_13);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4);
@@ -13133,7 +12129,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __Pyx_GOTREF(((PyObject *)__pyx_t_12));
         __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
         __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_13);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
         PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_t_12));
         __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
         __pyx_t_12 = 0;
@@ -13147,7 +12143,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       __pyx_L15:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":124
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":124
  *                 if i >= I or j >= J:
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))
  *                 f_i = fsent[i]             # <<<<<<<<<<<<<<
@@ -13156,7 +12152,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_f_i = (__pyx_v_fsent[__pyx_v_i]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":125
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":125
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))
  *                 f_i = fsent[i]
  *                 e_j = esent[j]             # <<<<<<<<<<<<<<
@@ -13165,7 +12161,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_e_j = (__pyx_v_esent[__pyx_v_j]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":126
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":126
  *                 f_i = fsent[i]
  *                 e_j = esent[j]
  *                 fmargin[f_i] = fmargin[f_i]+1             # <<<<<<<<<<<<<<
@@ -13174,7 +12170,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_fmargin[__pyx_v_f_i]) = ((__pyx_v_fmargin[__pyx_v_f_i]) + 1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":127
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":127
  *                 e_j = esent[j]
  *                 fmargin[f_i] = fmargin[f_i]+1
  *                 emargin[e_j] = emargin[e_j]+1             # <<<<<<<<<<<<<<
@@ -13183,7 +12179,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_emargin[__pyx_v_e_j]) = ((__pyx_v_emargin[__pyx_v_e_j]) + 1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":128
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":128
  *                 fmargin[f_i] = fmargin[f_i]+1
  *                 emargin[e_j] = emargin[e_j]+1
  *                 if dict[f_i] == NULL:             # <<<<<<<<<<<<<<
@@ -13193,7 +12189,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_dict[__pyx_v_f_i]) == NULL);
       if (__pyx_t_10) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":129
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":129
  *                 emargin[e_j] = emargin[e_j]+1
  *                 if dict[f_i] == NULL:
  *                     dict[f_i] = new_node(e_j)             # <<<<<<<<<<<<<<
@@ -13202,7 +12198,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_dict[__pyx_v_f_i]) = __pyx_f_3_sa_new_node(__pyx_v_e_j);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":130
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":130
  *                 if dict[f_i] == NULL:
  *                     dict[f_i] = new_node(e_j)
  *                     dict[f_i].val = 1             # <<<<<<<<<<<<<<
@@ -13211,7 +12207,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_dict[__pyx_v_f_i])->val = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":131
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":131
  *                     dict[f_i] = new_node(e_j)
  *                     dict[f_i].val = 1
  *                     num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -13223,7 +12219,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":133
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":133
  *                     num_pairs = num_pairs + 1
  *                 else:
  *                     count = get_val(dict[f_i], e_j)             # <<<<<<<<<<<<<<
@@ -13232,7 +12228,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_f_i]), __pyx_v_e_j);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":134
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":134
  *                 else:
  *                     count = get_val(dict[f_i], e_j)
  *                     if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -13242,7 +12238,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_count[0]) == 0);
         if (__pyx_t_10) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":135
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":135
  *                     count = get_val(dict[f_i], e_j)
  *                     if count[0] == 0:
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -13254,7 +12250,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         __pyx_L17:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":136
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":136
  *                     if count[0] == 0:
  *                         num_pairs = num_pairs + 1
  *                     count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -13265,7 +12261,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       __pyx_L16:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":138
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":138
  *                     count[0] = count[0] + 1
  *                 # add count
  *                 faligned[i] = 1             # <<<<<<<<<<<<<<
@@ -13274,7 +12270,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_faligned[__pyx_v_i]) = 1;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":139
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":139
  *                 # add count
  *                 faligned[i] = 1
  *                 ealigned[j] = 1             # <<<<<<<<<<<<<<
@@ -13284,7 +12280,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       (__pyx_v_ealigned[__pyx_v_j]) = 1;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":140
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":140
  *                 faligned[i] = 1
  *                 ealigned[j] = 1
  *             for i from 0 <= i < I:             # <<<<<<<<<<<<<<
@@ -13294,7 +12290,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_I;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_7; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":141
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":141
  *                 ealigned[j] = 1
  *             for i from 0 <= i < I:
  *                 if faligned[i] == 0:             # <<<<<<<<<<<<<<
@@ -13304,7 +12300,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_faligned[__pyx_v_i]) == 0);
       if (__pyx_t_10) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":142
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":142
  *             for i from 0 <= i < I:
  *                 if faligned[i] == 0:
  *                     f_i = fsent[i]             # <<<<<<<<<<<<<<
@@ -13313,7 +12309,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_f_i = (__pyx_v_fsent[__pyx_v_i]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":143
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":143
  *                 if faligned[i] == 0:
  *                     f_i = fsent[i]
  *                     fmargin[f_i] = fmargin[f_i] + 1             # <<<<<<<<<<<<<<
@@ -13322,7 +12318,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_fmargin[__pyx_v_f_i]) = ((__pyx_v_fmargin[__pyx_v_f_i]) + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":144
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":144
  *                     f_i = fsent[i]
  *                     fmargin[f_i] = fmargin[f_i] + 1
  *                     emargin[null_word] = emargin[null_word] + 1             # <<<<<<<<<<<<<<
@@ -13331,7 +12327,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_emargin[__pyx_v_null_word]) = ((__pyx_v_emargin[__pyx_v_null_word]) + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":145
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":145
  *                     fmargin[f_i] = fmargin[f_i] + 1
  *                     emargin[null_word] = emargin[null_word] + 1
  *                     if dict[f_i] == NULL:             # <<<<<<<<<<<<<<
@@ -13341,7 +12337,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_dict[__pyx_v_f_i]) == NULL);
         if (__pyx_t_10) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":146
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":146
  *                     emargin[null_word] = emargin[null_word] + 1
  *                     if dict[f_i] == NULL:
  *                         dict[f_i] = new_node(null_word)             # <<<<<<<<<<<<<<
@@ -13350,7 +12346,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_f_i]) = __pyx_f_3_sa_new_node(__pyx_v_null_word);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":147
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":147
  *                     if dict[f_i] == NULL:
  *                         dict[f_i] = new_node(null_word)
  *                         dict[f_i].val = 1             # <<<<<<<<<<<<<<
@@ -13359,7 +12355,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_f_i])->val = 1;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":148
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":148
  *                         dict[f_i] = new_node(null_word)
  *                         dict[f_i].val = 1
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -13371,7 +12367,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":150
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":150
  *                         num_pairs = num_pairs + 1
  *                     else:
  *                         count = get_val(dict[f_i], null_word)             # <<<<<<<<<<<<<<
@@ -13380,7 +12376,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_f_i]), __pyx_v_null_word);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":151
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":151
  *                     else:
  *                         count = get_val(dict[f_i], null_word)
  *                         if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -13390,7 +12386,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           __pyx_t_10 = ((__pyx_v_count[0]) == 0);
           if (__pyx_t_10) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":152
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":152
  *                         count = get_val(dict[f_i], null_word)
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -13402,7 +12398,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           }
           __pyx_L22:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":153
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":153
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -13417,7 +12413,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_L20:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":154
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":154
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1
  *             for j from 0 <= j < J:             # <<<<<<<<<<<<<<
@@ -13427,7 +12423,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_J;
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_7; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":155
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":155
  *                         count[0] = count[0] + 1
  *             for j from 0 <= j < J:
  *                 if ealigned[j] == 0:             # <<<<<<<<<<<<<<
@@ -13437,7 +12433,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_ealigned[__pyx_v_j]) == 0);
       if (__pyx_t_10) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":156
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":156
  *             for j from 0 <= j < J:
  *                 if ealigned[j] == 0:
  *                     e_j = esent[j]             # <<<<<<<<<<<<<<
@@ -13446,7 +12442,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_e_j = (__pyx_v_esent[__pyx_v_j]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":157
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":157
  *                 if ealigned[j] == 0:
  *                     e_j = esent[j]
  *                     fmargin[null_word] = fmargin[null_word] + 1             # <<<<<<<<<<<<<<
@@ -13455,7 +12451,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_fmargin[__pyx_v_null_word]) = ((__pyx_v_fmargin[__pyx_v_null_word]) + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":158
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":158
  *                     e_j = esent[j]
  *                     fmargin[null_word] = fmargin[null_word] + 1
  *                     emargin[e_j] = emargin[e_j] + 1             # <<<<<<<<<<<<<<
@@ -13464,7 +12460,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_emargin[__pyx_v_e_j]) = ((__pyx_v_emargin[__pyx_v_e_j]) + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":159
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":159
  *                     fmargin[null_word] = fmargin[null_word] + 1
  *                     emargin[e_j] = emargin[e_j] + 1
  *                     if dict[null_word] == NULL:             # <<<<<<<<<<<<<<
@@ -13474,7 +12470,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_dict[__pyx_v_null_word]) == NULL);
         if (__pyx_t_10) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":160
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":160
  *                     emargin[e_j] = emargin[e_j] + 1
  *                     if dict[null_word] == NULL:
  *                         dict[null_word] = new_node(e_j)             # <<<<<<<<<<<<<<
@@ -13483,7 +12479,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_null_word]) = __pyx_f_3_sa_new_node(__pyx_v_e_j);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":161
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":161
  *                     if dict[null_word] == NULL:
  *                         dict[null_word] = new_node(e_j)
  *                         dict[null_word].val = 1             # <<<<<<<<<<<<<<
@@ -13492,7 +12488,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_null_word])->val = 1;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":162
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":162
  *                         dict[null_word] = new_node(e_j)
  *                         dict[null_word].val = 1
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -13504,7 +12500,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":164
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":164
  *                         num_pairs = num_pairs + 1
  *                     else:
  *                         count = get_val(dict[null_word], e_j)             # <<<<<<<<<<<<<<
@@ -13513,7 +12509,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_null_word]), __pyx_v_e_j);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":165
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":165
  *                     else:
  *                         count = get_val(dict[null_word], e_j)
  *                         if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -13523,7 +12519,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           __pyx_t_10 = ((__pyx_v_count[0]) == 0);
           if (__pyx_t_10) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":166
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":166
  *                         count = get_val(dict[null_word], e_j)
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -13535,7 +12531,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           }
           __pyx_L27:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":167
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":167
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -13550,7 +12546,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_L25:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":168
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":168
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1
  *             free(links)             # <<<<<<<<<<<<<<
@@ -13559,7 +12555,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     free(__pyx_v_links);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":169
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":169
  *                         count[0] = count[0] + 1
  *             free(links)
  *             free(faligned)             # <<<<<<<<<<<<<<
@@ -13568,7 +12564,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     free(__pyx_v_faligned);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":170
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":170
  *             free(links)
  *             free(faligned)
  *             free(ealigned)             # <<<<<<<<<<<<<<
@@ -13578,7 +12574,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     free(__pyx_v_ealigned);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":171
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":171
  *             free(faligned)
  *             free(ealigned)
  *         self.f_index = IntList(initial_len=V_F)             # <<<<<<<<<<<<<<
@@ -13591,7 +12587,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_13);
   if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_GIVEREF(__pyx_t_13);
@@ -13600,7 +12596,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_13);
   __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":172
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":172
  *             free(ealigned)
  *         self.f_index = IntList(initial_len=V_F)
  *         self.e_index = IntList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -13613,7 +12609,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_12);
   if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
   __Pyx_GIVEREF(__pyx_t_12);
@@ -13622,7 +12618,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
   __pyx_t_12 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":173
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":173
  *         self.f_index = IntList(initial_len=V_F)
  *         self.e_index = IntList(initial_len=num_pairs)
  *         self.col1 = FloatList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -13635,7 +12631,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_13);
   if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_GIVEREF(__pyx_t_13);
@@ -13644,7 +12640,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_13);
   __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":174
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":174
  *         self.e_index = IntList(initial_len=num_pairs)
  *         self.col1 = FloatList(initial_len=num_pairs)
  *         self.col2 = FloatList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -13657,7 +12653,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_12);
   if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
   __Pyx_GIVEREF(__pyx_t_12);
@@ -13666,7 +12662,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
   __pyx_t_12 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":176
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":176
  *         self.col2 = FloatList(initial_len=num_pairs)
  * 
  *         num_pairs = 0             # <<<<<<<<<<<<<<
@@ -13675,7 +12671,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_num_pairs = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":177
  * 
  *         num_pairs = 0
  *         for i from 0 <= i < V_F:             # <<<<<<<<<<<<<<
@@ -13685,7 +12681,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_t_6 = __pyx_v_V_F;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_6; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":179
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":179
  *         for i from 0 <= i < V_F:
  *             #self.f_index[i] = num_pairs
  *             self.f_index.set(i, num_pairs)             # <<<<<<<<<<<<<<
@@ -13694,7 +12690,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->set(__pyx_v_self->f_index, __pyx_v_i, __pyx_v_num_pairs);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":180
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":180
  *             #self.f_index[i] = num_pairs
  *             self.f_index.set(i, num_pairs)
  *             if dict[i] != NULL:             # <<<<<<<<<<<<<<
@@ -13704,7 +12700,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_10 = ((__pyx_v_dict[__pyx_v_i]) != NULL);
     if (__pyx_t_10) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":181
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":181
  *             self.f_index.set(i, num_pairs)
  *             if dict[i] != NULL:
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)             # <<<<<<<<<<<<<<
@@ -13715,7 +12711,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":182
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":182
  *             if dict[i] != NULL:
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)
  *                 del_node(dict[i])             # <<<<<<<<<<<<<<
@@ -13730,7 +12726,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_L30:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":183
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)
  *                 del_node(dict[i])
  *         free(fmargin)             # <<<<<<<<<<<<<<
@@ -13739,7 +12735,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_fmargin);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":184
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":184
  *                 del_node(dict[i])
  *         free(fmargin)
  *         free(emargin)             # <<<<<<<<<<<<<<
@@ -13748,7 +12744,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_emargin);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":185
  *         free(fmargin)
  *         free(emargin)
  *         free(dict)             # <<<<<<<<<<<<<<
@@ -13757,7 +12753,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_dict);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":186
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":186
  *         free(emargin)
  *         free(dict)
  *         return             # <<<<<<<<<<<<<<
@@ -13788,7 +12784,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":189
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":189
  * 
  * 
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):             # <<<<<<<<<<<<<<
@@ -13805,9 +12801,9 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_add_node", 0);
+  __Pyx_RefNannySetupContext("_add_node");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":191
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":191
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):
  *         cdef int loc
  *         if n.smaller != NULL:             # <<<<<<<<<<<<<<
@@ -13817,7 +12813,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   __pyx_t_1 = (__pyx_v_n->smaller != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":192
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":192
  *         cdef int loc
  *         if n.smaller != NULL:
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)             # <<<<<<<<<<<<<<
@@ -13831,7 +12827,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":193
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":193
  *         if n.smaller != NULL:
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)
  *         loc = num_pairs[0]             # <<<<<<<<<<<<<<
@@ -13840,7 +12836,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   __pyx_v_loc = (__pyx_v_num_pairs[0]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":194
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":194
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)
  *         loc = num_pairs[0]
  *         self.e_index.set(loc, n.key)             # <<<<<<<<<<<<<<
@@ -13849,7 +12845,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->set(__pyx_v_self->e_index, __pyx_v_loc, __pyx_v_n->key);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":195
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":195
  *         loc = num_pairs[0]
  *         self.e_index.set(loc, n.key)
  *         self.col1.set(loc, float(n.val)/fmargin)             # <<<<<<<<<<<<<<
@@ -13862,7 +12858,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->set(__pyx_v_self->col1, __pyx_v_loc, (((double)__pyx_v_n->val) / __pyx_v_fmargin));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":196
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":196
  *         self.e_index.set(loc, n.key)
  *         self.col1.set(loc, float(n.val)/fmargin)
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))             # <<<<<<<<<<<<<<
@@ -13875,7 +12871,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->set(__pyx_v_self->col2, __pyx_v_loc, (((double)__pyx_v_n->val) / ((double)(__pyx_v_emargin[__pyx_v_n->key]))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":197
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":197
  *         self.col1.set(loc, float(n.val)/fmargin)
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))
  *         num_pairs[0] = loc + 1             # <<<<<<<<<<<<<<
@@ -13884,7 +12880,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   (__pyx_v_num_pairs[0]) = (__pyx_v_loc + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":198
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":198
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))
  *         num_pairs[0] = loc + 1
  *         if n.bigger != NULL:             # <<<<<<<<<<<<<<
@@ -13894,7 +12890,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   __pyx_t_1 = (__pyx_v_n->bigger != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":199
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":199
  *         num_pairs[0] = loc + 1
  *         if n.bigger != NULL:
  *             self._add_node(n.bigger, num_pairs, fmargin, emargin)             # <<<<<<<<<<<<<<
@@ -13920,28 +12916,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_2write_binary(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":202
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":202
  * 
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -13949,7 +12924,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyOb
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -13958,9 +12935,18 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary", 0);
+  __Pyx_RefNannySetupContext("write_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":204
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":204
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -13969,71 +12955,71 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":205
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":205
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.f_index.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->write_handle(__pyx_v_self->f_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":206
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":206
  *         f = fopen(filename, "w")
  *         self.f_index.write_handle(f)
  *         self.e_index.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->write_handle(__pyx_v_self->e_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":207
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":207
  *         self.f_index.write_handle(f)
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->write_handle(__pyx_v_self->col1, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":208
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":208
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->write_handle(__pyx_v_self->col2, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":209
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":209
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)             # <<<<<<<<<<<<<<
  *         self.write_wordlist(self.id2eword, f)
  *         fclose(f)
  */
-  __pyx_t_1 = __pyx_v_self->id2fword;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->write_wordlist(__pyx_v_self, __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->write_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":210
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":210
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_2 = __pyx_v_self->id2eword;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->write_wordlist(__pyx_v_self, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->write_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":211
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":211
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -14055,7 +13041,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":214
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":214
  * 
  * 
  *     cdef write_wordlist(self, wordlist, FILE* f):             # <<<<<<<<<<<<<<
@@ -14063,7 +13049,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  *         cdef int num_words
  */
 
-static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_wordlist, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_wordlist, FILE *__pyx_v_f) {
   int __pyx_v_word_len;
   int __pyx_v_num_words;
   PyObject *__pyx_v_word = NULL;
@@ -14078,9 +13064,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_wordlist", 0);
+  __Pyx_RefNannySetupContext("write_wordlist");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":218
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":218
  *         cdef int num_words
  * 
  *         num_words = len(wordlist)             # <<<<<<<<<<<<<<
@@ -14090,7 +13076,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
   __pyx_t_1 = PyObject_Length(__pyx_v_wordlist); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_num_words = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":219
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":219
  * 
  *         num_words = len(wordlist)
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -14099,7 +13085,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":220
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":220
  *         num_words = len(wordlist)
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in wordlist:             # <<<<<<<<<<<<<<
@@ -14115,20 +13101,12 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
     __pyx_t_3 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_2)) {
+    if (PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_2)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
+    } else if (PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
@@ -14144,7 +13122,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":221
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":221
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in wordlist:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
@@ -14154,7 +13132,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
     __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":222
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":222
  *         for word in wordlist:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -14163,7 +13141,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":223
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":223
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -14189,7 +13167,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":226
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":226
  * 
  * 
  *     cdef read_wordlist(self, word2id, id2word, FILE* f):             # <<<<<<<<<<<<<<
@@ -14197,11 +13175,11 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
  *         cdef int word_len
  */
 
-static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_word2id, PyObject *__pyx_v_id2word, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_word2id, PyObject *__pyx_v_id2word, FILE *__pyx_v_f) {
   int __pyx_v_num_words;
   int __pyx_v_word_len;
   char *__pyx_v_word;
-  CYTHON_UNUSED long __pyx_v_i;
+  long __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -14211,9 +13189,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_wordlist", 0);
+  __Pyx_RefNannySetupContext("read_wordlist");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":231
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":231
  *         cdef char* word
  * 
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -14222,7 +13200,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":232
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":232
  * 
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i from 0 <= i < num_words:             # <<<<<<<<<<<<<<
@@ -14232,7 +13210,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
   __pyx_t_1 = __pyx_v_num_words;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":233
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":233
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i from 0 <= i < num_words:
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -14241,7 +13219,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":234
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":234
  *         for i from 0 <= i < num_words:
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -14250,7 +13228,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":235
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":235
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -14259,7 +13237,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":236
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":236
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             word2id[word] = len(id2word)             # <<<<<<<<<<<<<<
@@ -14275,7 +13253,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":237
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":237
  *             fread(word, sizeof(char), word_len, f)
  *             word2id[word] = len(id2word)
  *             id2word.append(word)             # <<<<<<<<<<<<<<
@@ -14289,7 +13267,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":238
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":238
  *             word2id[word] = len(id2word)
  *             id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -14312,28 +13290,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_4read_binary(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":240
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":240
  *             free(word)
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -14341,7 +13298,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObj
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -14351,9 +13310,18 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary", 0);
+  __Pyx_RefNannySetupContext("read_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":242
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":242
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -14362,77 +13330,77 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":243
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":243
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.f_index.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->read_handle(__pyx_v_self->f_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":244
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":244
  *         f = fopen(filename, "r")
  *         self.f_index.read_handle(f)
  *         self.e_index.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->read_handle(__pyx_v_self->e_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":245
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":245
  *         self.f_index.read_handle(f)
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->read_handle(__pyx_v_self->col1, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":246
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":246
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->read_handle(__pyx_v_self->col2, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":247
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":247
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)             # <<<<<<<<<<<<<<
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  *         fclose(f)
  */
-  __pyx_t_1 = __pyx_v_self->fword2id;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_v_self->id2fword;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->read_wordlist(__pyx_v_self, __pyx_t_1, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->read_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_1, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":248
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":248
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_3 = __pyx_v_self->eword2id;
+  __pyx_t_3 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id;
   __Pyx_INCREF(__pyx_t_3);
-  __pyx_t_2 = __pyx_v_self->id2eword;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->read_wordlist(__pyx_v_self, __pyx_t_3, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->read_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_3, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":249
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":249
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -14455,18 +13423,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_e_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_5BiLex_6get_e_id(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((PyObject *)__pyx_v_eword));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":252
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":252
  * 
  * 
  *     def get_e_id(self, eword):             # <<<<<<<<<<<<<<
@@ -14474,8 +13431,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject
  *             e_id = len(self.id2eword)
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_eword) {
-  PyObject *__pyx_v_e_id = NULL;
+static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword) {
+  Py_ssize_t __pyx_v_e_id;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -14484,58 +13442,58 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_e_id", 0);
+  __Pyx_RefNannySetupContext("get_e_id");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":253
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":253
  * 
  *     def get_e_id(self, eword):
  *         if eword not in self.eword2id:             # <<<<<<<<<<<<<<
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":254
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":254
  *     def get_e_id(self, eword):
  *         if eword not in self.eword2id:
  *             e_id = len(self.id2eword)             # <<<<<<<<<<<<<<
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id
  */
-    __pyx_t_2 = __pyx_v_self->id2eword;
+    __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_v_e_id = __pyx_t_2;
-    __pyx_t_2 = 0;
+    __pyx_v_e_id = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":255
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":255
  *         if eword not in self.eword2id:
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)             # <<<<<<<<<<<<<<
  *             self.eword2id[eword] = e_id
  *         return self.eword2id[eword]
  */
-    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_self->id2eword, __pyx_v_eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword, __pyx_v_eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":256
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":256
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id             # <<<<<<<<<<<<<<
  *         return self.eword2id[eword]
  * 
  */
-    if (PyObject_SetItem(__pyx_v_self->eword2id, __pyx_v_eword, __pyx_v_e_id) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_e_id); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    if (PyObject_SetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":257
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":257
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id
  *         return self.eword2id[eword]             # <<<<<<<<<<<<<<
@@ -14543,7 +13501,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -14556,24 +13514,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
   __Pyx_AddTraceback("_sa.BiLex.get_e_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_e_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_f_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_5BiLex_8get_f_id(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((PyObject *)__pyx_v_fword));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":260
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":260
  * 
  * 
  *     def get_f_id(self, fword):             # <<<<<<<<<<<<<<
@@ -14581,8 +13527,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject
  *             f_id = len(self.id2fword)
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword) {
-  PyObject *__pyx_v_f_id = NULL;
+static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword) {
+  Py_ssize_t __pyx_v_f_id;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -14591,58 +13538,58 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_f_id", 0);
+  __Pyx_RefNannySetupContext("get_f_id");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":261
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":261
  * 
  *     def get_f_id(self, fword):
  *         if fword not in self.fword2id:             # <<<<<<<<<<<<<<
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":262
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":262
  *     def get_f_id(self, fword):
  *         if fword not in self.fword2id:
  *             f_id = len(self.id2fword)             # <<<<<<<<<<<<<<
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id
  */
-    __pyx_t_2 = __pyx_v_self->id2fword;
+    __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_v_f_id = __pyx_t_2;
-    __pyx_t_2 = 0;
+    __pyx_v_f_id = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":263
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":263
  *         if fword not in self.fword2id:
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)             # <<<<<<<<<<<<<<
  *             self.fword2id[fword] = f_id
  *         return self.fword2id[fword]
  */
-    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_self->id2fword, __pyx_v_fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword, __pyx_v_fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":264
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":264
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id             # <<<<<<<<<<<<<<
  *         return self.fword2id[fword]
  * 
  */
-    if (PyObject_SetItem(__pyx_v_self->fword2id, __pyx_v_fword, __pyx_v_f_id) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_f_id); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    if (PyObject_SetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":265
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":265
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id
  *         return self.fword2id[fword]             # <<<<<<<<<<<<<<
@@ -14650,7 +13597,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -14663,34 +13610,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
   __Pyx_AddTraceback("_sa.BiLex.get_f_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_f_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_10read_text(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":268
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":268
  * 
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -14698,7 +13623,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObje
  *         cdef IntList fcount
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_j = 0;
   PyObject *__pyx_v_e_id = 0;
@@ -14743,9 +13670,18 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text", 0);
+  __Pyx_RefNannySetupContext("read_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":272
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":272
  *         cdef IntList fcount
  * 
  *         fcount = IntList()             # <<<<<<<<<<<<<<
@@ -14757,7 +13693,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
   __pyx_v_fcount = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -14770,7 +13706,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -14780,12 +13716,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -14793,11 +13729,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_v_f = __pyx_t_1;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_v_f = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":275
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":275
  *         with gzip_or_text(filename) as f:
  *             # first loop merely establishes size of array objects
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -14805,119 +13740,102 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 f_id = self.get_f_id(fword)
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_3 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_3)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_3);
             }
             __Pyx_XDECREF(__pyx_v_line);
-            __pyx_v_line = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_line = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":276
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":276
  *             # first loop merely establishes size of array objects
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()             # <<<<<<<<<<<<<<
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-              PyObject* sequence = __pyx_t_3;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              Py_ssize_t size = Py_SIZE(sequence);
-              #else
-              Py_ssize_t size = PySequence_Size(sequence);
-              #endif
-              if (unlikely(size != 4)) {
-                if (size > 4) __Pyx_RaiseTooManyValuesError(4);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              }
-              #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
+              PyObject* sequence = __pyx_t_1;
               if (likely(PyTuple_CheckExact(sequence))) {
-                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
+                if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
+                  if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
+                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
                 __pyx_t_12 = PyTuple_GET_ITEM(sequence, 3); 
               } else {
-                __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
+                if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
+                  if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
+                __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
                 __pyx_t_12 = PyList_GET_ITEM(sequence, 3); 
               }
-              __Pyx_INCREF(__pyx_t_2);
+              __Pyx_INCREF(__pyx_t_3);
               __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_12);
-              #else
-              Py_ssize_t i;
-              PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_10,&__pyx_t_11,&__pyx_t_12};
-              for (i=0; i < 4; i++) {
-                PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                *(temps[i]) = item;
-              }
-              #endif
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            } else
-            {
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            } else {
               Py_ssize_t index = -1;
-              PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_10,&__pyx_t_11,&__pyx_t_12};
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              for (index=0; index < 4; index++) {
-                PyObject* item = __pyx_t_14(__pyx_t_13); if (unlikely(!item)) goto __pyx_L18_unpacking_failed;
-                __Pyx_GOTREF(item);
-                *(temps[index]) = item;
-              }
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_14 = NULL;
+              index = 0; __pyx_t_3 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L19_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_3);
+              index = 1; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L19_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_10);
+              index = 2; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L19_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_11);
+              index = 3; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L19_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_12);
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L19_unpacking_done;
-              __pyx_L18_unpacking_failed:;
+              goto __pyx_L20_unpacking_done;
+              __pyx_L19_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              __pyx_t_14 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_L19_unpacking_done:;
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_L20_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_fword);
-            __pyx_v_fword = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_fword = __pyx_t_3;
+            __pyx_t_3 = 0;
             __Pyx_XDECREF(__pyx_v_eword);
             __pyx_v_eword = __pyx_t_10;
             __pyx_t_10 = 0;
@@ -14928,51 +13846,51 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_score2 = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":277
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":277
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)             # <<<<<<<<<<<<<<
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_12);
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_INCREF(__pyx_v_fword);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_fword);
             __Pyx_GIVEREF(__pyx_v_fword);
-            __pyx_t_11 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XDECREF(__pyx_v_f_id);
             __pyx_v_f_id = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":278
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":278
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)             # <<<<<<<<<<<<<<
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)
  */
-            __pyx_t_11 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_12);
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_INCREF(__pyx_v_eword);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_eword);
             __Pyx_GIVEREF(__pyx_v_eword);
-            __pyx_t_3 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_e_id = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":279
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":279
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):             # <<<<<<<<<<<<<<
@@ -14980,41 +13898,42 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  */
             while (1) {
-              __pyx_t_15 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_3);
-              __pyx_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_15 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_12);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               if (!__pyx_t_16) break;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":280
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":280
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)             # <<<<<<<<<<<<<<
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  * 
  */
-              __pyx_t_12 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_fcount), __pyx_int_0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_fcount), __pyx_int_0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             }
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":281
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":281
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1             # <<<<<<<<<<<<<<
  * 
  *             # Allocate space for dictionary in arrays
  */
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             (__pyx_v_fcount->arr[__pyx_t_17]) = ((__pyx_v_fcount->arr[__pyx_t_15]) + 1);
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":284
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":284
  * 
  *             # Allocate space for dictionary in arrays
  *             N = 0             # <<<<<<<<<<<<<<
@@ -15024,192 +13943,192 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_N = __pyx_int_0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":285
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":285
  *             # Allocate space for dictionary in arrays
  *             N = 0
  *             n_f = len(fcount)             # <<<<<<<<<<<<<<
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:
  */
-          __pyx_t_8 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_v_n_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_t_8 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_v_n_f = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":286
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":286
  *             N = 0
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)             # <<<<<<<<<<<<<<
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N
  */
-          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-          __pyx_t_12 = PyNumber_Add(__pyx_v_n_f, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+          __pyx_t_12 = PyNumber_Add(__pyx_v_n_f, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(__pyx_v_self->f_index);
-          __Pyx_DECREF(((PyObject *)__pyx_v_self->f_index));
-          __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
+          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index);
+          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index));
+          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":287
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:             # <<<<<<<<<<<<<<
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  */
-          __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19++) {
-            __pyx_t_12 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_XDECREF(__pyx_v_i);
             __pyx_v_i = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":288
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":288
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N             # <<<<<<<<<<<<<<
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0
  */
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":289
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":289
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]             # <<<<<<<<<<<<<<
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_12 = PyInt_FromLong((__pyx_v_fcount->arr[__pyx_t_8])); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyInt_FromLong((__pyx_v_fcount->arr[__pyx_t_8])); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_1 = PyNumber_Add(__pyx_v_N, __pyx_t_12); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_2 = PyNumber_Add(__pyx_v_N, __pyx_t_12); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             __Pyx_DECREF(__pyx_v_N);
-            __pyx_v_N = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_N = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":290
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":290
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0             # <<<<<<<<<<<<<<
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             (__pyx_v_fcount->arr[__pyx_t_8]) = 0;
-            __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":287
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:             # <<<<<<<<<<<<<<
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  */
-          __pyx_t_1 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_XDECREF(__pyx_v_i);
-          __pyx_v_i = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_v_i = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":291
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":291
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N             # <<<<<<<<<<<<<<
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)
  */
-          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
+          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":292
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":292
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)             # <<<<<<<<<<<<<<
  *             self.col1 = FloatList(initial_len=N)
  *             self.col2 = FloatList(initial_len=N)
  */
-          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(__pyx_v_self->e_index);
-          __Pyx_DECREF(((PyObject *)__pyx_v_self->e_index));
-          __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
+          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
+          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
+          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":293
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":293
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)             # <<<<<<<<<<<<<<
  *             self.col2 = FloatList(initial_len=N)
  * 
  */
-          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-          __Pyx_GIVEREF(__pyx_t_1);
-          __Pyx_GOTREF(__pyx_v_self->col1);
-          __Pyx_DECREF(((PyObject *)__pyx_v_self->col1));
-          __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
-          __pyx_t_1 = 0;
+          __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1);
+          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
+          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_2);
+          __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":294
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":294
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)
  *             self.col2 = FloatList(initial_len=N)             # <<<<<<<<<<<<<<
  * 
  *             # Re-read file, placing words into buckets
  */
-          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(__pyx_v_self->col2);
-          __Pyx_DECREF(((PyObject *)__pyx_v_self->col2));
-          __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
+          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2);
+          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
+          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":297
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":297
  * 
  *             # Re-read file, placing words into buckets
  *             f.seek(0)             # <<<<<<<<<<<<<<
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  */
-          __pyx_t_12 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_1 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":298
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":298
  *             # Re-read file, placing words into buckets
  *             f.seek(0)
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -15217,34 +14136,26 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 f_id = self.get_f_id(fword)
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_12 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_12 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
             } else {
-              __pyx_t_12 = __pyx_t_9(__pyx_t_1);
+              __pyx_t_12 = __pyx_t_9(__pyx_t_2);
               if (unlikely(!__pyx_t_12)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
@@ -15254,78 +14165,69 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_line = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":299
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":299
  *             f.seek(0)
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()             # <<<<<<<<<<<<<<
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  */
-            __pyx_t_12 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-              PyObject* sequence = __pyx_t_3;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              Py_ssize_t size = Py_SIZE(sequence);
-              #else
-              Py_ssize_t size = PySequence_Size(sequence);
-              #endif
-              if (unlikely(size != 4)) {
-                if (size > 4) __Pyx_RaiseTooManyValuesError(4);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              }
-              #if CYTHON_COMPILING_IN_CPYTHON
+            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
+              PyObject* sequence = __pyx_t_1;
               if (likely(PyTuple_CheckExact(sequence))) {
+                if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
+                  if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
                 __pyx_t_12 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
-                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 3); 
+                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 3); 
               } else {
+                if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
+                  if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
                 __pyx_t_12 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
-                __pyx_t_2 = PyList_GET_ITEM(sequence, 3); 
+                __pyx_t_3 = PyList_GET_ITEM(sequence, 3); 
               }
               __Pyx_INCREF(__pyx_t_12);
               __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_2);
-              #else
-              Py_ssize_t i;
-              PyObject** temps[4] = {&__pyx_t_12,&__pyx_t_11,&__pyx_t_10,&__pyx_t_2};
-              for (i=0; i < 4; i++) {
-                PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                *(temps[i]) = item;
-              }
-              #endif
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            } else
-            {
+              __Pyx_INCREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            } else {
               Py_ssize_t index = -1;
-              PyObject** temps[4] = {&__pyx_t_12,&__pyx_t_11,&__pyx_t_10,&__pyx_t_2};
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              for (index=0; index < 4; index++) {
-                PyObject* item = __pyx_t_14(__pyx_t_13); if (unlikely(!item)) goto __pyx_L26_unpacking_failed;
-                __Pyx_GOTREF(item);
-                *(temps[index]) = item;
-              }
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_14 = NULL;
+              index = 0; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L27_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_12);
+              index = 1; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L27_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_11);
+              index = 2; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L27_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_10);
+              index = 3; __pyx_t_3 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L27_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_3);
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L27_unpacking_done;
-              __pyx_L26_unpacking_failed:;
+              goto __pyx_L28_unpacking_done;
+              __pyx_L27_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              __pyx_t_14 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_L27_unpacking_done:;
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_L28_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_fword);
             __pyx_v_fword = __pyx_t_12;
@@ -15337,141 +14239,141 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_score1 = __pyx_t_10;
             __pyx_t_10 = 0;
             __Pyx_XDECREF(__pyx_v_score2);
-            __pyx_v_score2 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_score2 = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":300
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":300
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)             # <<<<<<<<<<<<<<
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
             __Pyx_INCREF(__pyx_v_fword);
-            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fword);
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fword);
             __Pyx_GIVEREF(__pyx_v_fword);
-            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
             __Pyx_XDECREF(__pyx_v_f_id);
             __pyx_v_f_id = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":301
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":301
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)             # <<<<<<<<<<<<<<
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  */
-            __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
             __Pyx_INCREF(__pyx_v_eword);
-            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_eword);
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_eword);
             __Pyx_GIVEREF(__pyx_v_eword);
-            __pyx_t_3 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_e_id = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":302
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":302
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]             # <<<<<<<<<<<<<<
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)
  */
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_3 = PyInt_FromLong(((__pyx_v_self->f_index->arr[__pyx_t_15]) + (__pyx_v_fcount->arr[__pyx_t_17]))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyInt_FromLong(((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_15]) + (__pyx_v_fcount->arr[__pyx_t_17]))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_index);
-            __pyx_v_index = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_index = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":303
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":303
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1             # <<<<<<<<<<<<<<
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)
  */
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             (__pyx_v_fcount->arr[__pyx_t_15]) = ((__pyx_v_fcount->arr[__pyx_t_17]) + 1);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":304
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":304
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)             # <<<<<<<<<<<<<<
  *                 self.col1[index] = float(score1)
  *                 self.col2[index] = float(score2)
  */
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_INCREF(__pyx_v_e_id);
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_e_id);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_e_id);
             __Pyx_GIVEREF(__pyx_v_e_id);
-            __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            (__pyx_v_self->e_index->arr[__pyx_t_17]) = __pyx_t_20;
+            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_17]) = __pyx_t_20;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":305
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":305
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)             # <<<<<<<<<<<<<<
  *                 self.col2[index] = float(score2)
  * 
  */
-            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score1); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_2 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            if (PyObject_SetItem(((PyObject *)__pyx_v_self->col1), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score1); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_3 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            if (PyObject_SetItem(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1), __pyx_v_index, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":306
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":306
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)
  *                 self.col2[index] = float(score2)             # <<<<<<<<<<<<<<
  * 
  *         # Sort buckets by eword
  */
-            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score2); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_2 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            if (PyObject_SetItem(((PyObject *)__pyx_v_self->col2), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score2); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_3 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            if (PyObject_SetItem(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2), __pyx_v_index, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -15480,57 +14382,57 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_22 = PyObject_Call(__pyx_t_4, __pyx_t_10, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_22)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_22)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_22);
           __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_22);
           __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
-          if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_23 = (!__pyx_t_16);
           if (__pyx_t_23) {
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_3);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_3);
-            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L30;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_3, __pyx_t_1);
+            __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L31;
           }
-          __pyx_L30:;
+          __pyx_L31:;
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          goto __pyx_L8_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
@@ -15544,30 +14446,29 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
         if (unlikely(__pyx_t_23 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L31;
-    __pyx_L3_error:;
+    goto __pyx_L32;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L31:;
+    __pyx_L32:;
   }
+  if (unlikely(!__pyx_v_n_f)) { __Pyx_RaiseUnboundLocalError("n_f"); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":309
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":309
  * 
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:             # <<<<<<<<<<<<<<
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  */
-  if (unlikely(!__pyx_v_n_f)) { __Pyx_RaiseUnboundLocalError("n_f"); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_19; __pyx_t_18++) {
-    __pyx_t_3 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_b);
-    __pyx_v_b = __pyx_t_3;
-    __pyx_t_3 = 0;
+    __pyx_v_b = __pyx_t_1;
+    __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":310
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":310
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:
  *             i = self.f_index.arr[b]             # <<<<<<<<<<<<<<
@@ -15575,30 +14476,30 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             self.qsort(i,j, "")
  */
     __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_b); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_i);
-    __pyx_v_i = __pyx_t_3;
-    __pyx_t_3 = 0;
+    __pyx_v_i = __pyx_t_1;
+    __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":311
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":311
  *         for b from 0 <= b < n_f:
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]             # <<<<<<<<<<<<<<
  *             self.qsort(i,j, "")
  * 
  */
-    __pyx_t_3 = PyNumber_Add(__pyx_v_b, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = PyNumber_Add(__pyx_v_b, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_j);
-    __pyx_v_j = __pyx_t_3;
-    __pyx_t_3 = 0;
+    __pyx_v_j = __pyx_t_1;
+    __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":312
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":312
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  *             self.qsort(i,j, "")             # <<<<<<<<<<<<<<
@@ -15607,27 +14508,27 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  */
     __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_24 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_24 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_3 = ((PyObject *)__pyx_kp_s_45);
-    __Pyx_INCREF(__pyx_t_3);
-    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->qsort(__pyx_v_self, __pyx_t_20, __pyx_t_24, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = ((PyObject *)__pyx_kp_s_45);
+    __Pyx_INCREF(__pyx_t_1);
+    __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->qsort(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_20, __pyx_t_24, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_b); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":309
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":309
  * 
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:             # <<<<<<<<<<<<<<
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  */
-  __pyx_t_2 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_v_b);
-  __pyx_v_b = __pyx_t_2;
-  __pyx_t_2 = 0;
+  __pyx_v_b = __pyx_t_3;
+  __pyx_t_3 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -15662,7 +14563,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":315
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":315
  * 
  * 
  *     cdef swap(self, int i, int j):             # <<<<<<<<<<<<<<
@@ -15676,9 +14577,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("swap", 0);
+  __Pyx_RefNannySetupContext("swap");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":319
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":319
  *         cdef float ftmp
  * 
  *         if i == j:             # <<<<<<<<<<<<<<
@@ -15688,7 +14589,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = (__pyx_v_i == __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":320
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":320
  * 
  *         if i == j:
  *             return             # <<<<<<<<<<<<<<
@@ -15702,7 +14603,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":322
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":322
  *             return
  * 
  *         itmp = self.e_index.arr[i]             # <<<<<<<<<<<<<<
@@ -15711,7 +14612,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_itmp = (__pyx_v_self->e_index->arr[__pyx_v_i]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":323
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":323
  * 
  *         itmp = self.e_index.arr[i]
  *         self.e_index.arr[i] = self.e_index.arr[j]             # <<<<<<<<<<<<<<
@@ -15720,7 +14621,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->e_index->arr[__pyx_v_i]) = (__pyx_v_self->e_index->arr[__pyx_v_j]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":324
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":324
  *         itmp = self.e_index.arr[i]
  *         self.e_index.arr[i] = self.e_index.arr[j]
  *         self.e_index.arr[j] = itmp             # <<<<<<<<<<<<<<
@@ -15729,7 +14630,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->e_index->arr[__pyx_v_j]) = __pyx_v_itmp;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":326
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":326
  *         self.e_index.arr[j] = itmp
  * 
  *         ftmp = self.col1.arr[i]             # <<<<<<<<<<<<<<
@@ -15738,7 +14639,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_ftmp = (__pyx_v_self->col1->arr[__pyx_v_i]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":327
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":327
  * 
  *         ftmp = self.col1.arr[i]
  *         self.col1.arr[i] = self.col1.arr[j]             # <<<<<<<<<<<<<<
@@ -15747,7 +14648,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col1->arr[__pyx_v_i]) = (__pyx_v_self->col1->arr[__pyx_v_j]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":328
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":328
  *         ftmp = self.col1.arr[i]
  *         self.col1.arr[i] = self.col1.arr[j]
  *         self.col1.arr[j] = ftmp             # <<<<<<<<<<<<<<
@@ -15756,7 +14657,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col1->arr[__pyx_v_j]) = __pyx_v_ftmp;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":330
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":330
  *         self.col1.arr[j] = ftmp
  * 
  *         ftmp = self.col2.arr[i]             # <<<<<<<<<<<<<<
@@ -15765,7 +14666,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_ftmp = (__pyx_v_self->col2->arr[__pyx_v_i]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":331
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":331
  * 
  *         ftmp = self.col2.arr[i]
  *         self.col2.arr[i] = self.col2.arr[j]             # <<<<<<<<<<<<<<
@@ -15774,7 +14675,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col2->arr[__pyx_v_i]) = (__pyx_v_self->col2->arr[__pyx_v_j]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":332
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":332
  *         ftmp = self.col2.arr[i]
  *         self.col2.arr[i] = self.col2.arr[j]
  *         self.col2.arr[j] = ftmp             # <<<<<<<<<<<<<<
@@ -15790,7 +14691,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":335
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":335
  * 
  * 
  *     cdef qsort(self, int i, int j, pad):             # <<<<<<<<<<<<<<
@@ -15811,9 +14712,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("qsort", 0);
+  __Pyx_RefNannySetupContext("qsort");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":338
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":338
  *         cdef int pval, p
  * 
  *         if i > j:             # <<<<<<<<<<<<<<
@@ -15823,7 +14724,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i > __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":339
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":339
  * 
  *         if i > j:
  *             raise Exception("Sort error in CLex")             # <<<<<<<<<<<<<<
@@ -15839,7 +14740,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":340
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":340
  *         if i > j:
  *             raise Exception("Sort error in CLex")
  *         if i == j: #empty interval             # <<<<<<<<<<<<<<
@@ -15849,7 +14750,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i == __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":341
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":341
  *             raise Exception("Sort error in CLex")
  *         if i == j: #empty interval
  *             return             # <<<<<<<<<<<<<<
@@ -15863,7 +14764,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":342
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":342
  *         if i == j: #empty interval
  *             return
  *         if i == j-1: # singleton interval             # <<<<<<<<<<<<<<
@@ -15873,7 +14774,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i == (__pyx_v_j - 1));
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":343
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":343
  *             return
  *         if i == j-1: # singleton interval
  *             return             # <<<<<<<<<<<<<<
@@ -15887,7 +14788,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":345
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":345
  *             return
  * 
  *         p = (i+j)/2             # <<<<<<<<<<<<<<
@@ -15896,7 +14797,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_p = __Pyx_div_long((__pyx_v_i + __pyx_v_j), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":346
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":346
  * 
  *         p = (i+j)/2
  *         pval = self.e_index.arr[p]             # <<<<<<<<<<<<<<
@@ -15905,7 +14806,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_pval = (__pyx_v_self->e_index->arr[__pyx_v_p]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":347
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":347
  *         p = (i+j)/2
  *         pval = self.e_index.arr[p]
  *         self.swap(i, p)             # <<<<<<<<<<<<<<
@@ -15916,7 +14817,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":348
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":348
  *         pval = self.e_index.arr[p]
  *         self.swap(i, p)
  *         p = i             # <<<<<<<<<<<<<<
@@ -15925,7 +14826,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_p = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":349
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":349
  *         self.swap(i, p)
  *         p = i
  *         for k from i+1 <= k < j:             # <<<<<<<<<<<<<<
@@ -15935,7 +14836,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_3 = __pyx_v_j;
   for (__pyx_v_k = (__pyx_v_i + 1); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":350
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":350
  *         p = i
  *         for k from i+1 <= k < j:
  *             if pval >= self.e_index.arr[k]:             # <<<<<<<<<<<<<<
@@ -15945,7 +14846,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
     __pyx_t_1 = (__pyx_v_pval >= (__pyx_v_self->e_index->arr[__pyx_v_k]));
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":351
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":351
  *         for k from i+1 <= k < j:
  *             if pval >= self.e_index.arr[k]:
  *                 self.swap(p+1, k)             # <<<<<<<<<<<<<<
@@ -15956,7 +14857,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":352
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":352
  *             if pval >= self.e_index.arr[k]:
  *                 self.swap(p+1, k)
  *                 self.swap(p, p+1)             # <<<<<<<<<<<<<<
@@ -15967,7 +14868,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":353
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":353
  *                 self.swap(p+1, k)
  *                 self.swap(p, p+1)
  *                 p = p + 1             # <<<<<<<<<<<<<<
@@ -15980,7 +14881,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
     __pyx_L8:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":354
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":354
  *                 self.swap(p, p+1)
  *                 p = p + 1
  *         self.qsort(i,p, pad+"    ")             # <<<<<<<<<<<<<<
@@ -15994,7 +14895,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":355
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":355
  *                 p = p + 1
  *         self.qsort(i,p, pad+"    ")
  *         self.qsort(p+1,j, pad+"    ")             # <<<<<<<<<<<<<<
@@ -16021,28 +14922,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_12write_enhanced(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":358
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":358
  * 
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -16050,7 +14930,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, P
  *             for i in self.f_index:
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_s1 = NULL;
@@ -16064,9 +14946,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  Py_ssize_t __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
   PyObject *__pyx_t_10 = NULL;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
@@ -16077,9 +14959,18 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced", 0);
+  __Pyx_RefNannySetupContext("write_enhanced");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -16090,7 +14981,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -16102,238 +14993,213 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":360
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":360
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             for i in self.f_index:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->f_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->f_index))) {
-            __pyx_t_4 = ((PyObject *)__pyx_v_self->f_index); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index))) {
+            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->f_index)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
             } else {
-              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_i = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":361
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":361
  *         with open(filename, "w") as f:
  *             for i in self.f_index:
  *                 f.write("%d " % i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_2));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
+            __pyx_t_9 = 0;
+            __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           }
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":362
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  */
-          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_49), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_49), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":363
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":363
  *                 f.write("%d " % i)
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):             # <<<<<<<<<<<<<<
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")
  */
-          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_INCREF(((PyObject *)__pyx_v_self->e_index));
-          PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->e_index));
-          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e_index));
-          __Pyx_INCREF(((PyObject *)__pyx_v_self->col1));
-          PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->col1));
-          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->col1));
-          __Pyx_INCREF(((PyObject *)__pyx_v_self->col2));
-          PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->col2));
-          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->col2));
-          __pyx_t_4 = PyObject_Call(__pyx_builtin_zip, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
-            __pyx_t_2 = __pyx_t_4; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
+          PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
+          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
+          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
+          PyTuple_SET_ITEM(__pyx_t_9, 1, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
+          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
+          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
+          PyTuple_SET_ITEM(__pyx_t_9, 2, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
+          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
+          __pyx_t_1 = PyObject_Call(__pyx_builtin_zip, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+          if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
+            __pyx_t_9 = __pyx_t_1; __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
           }
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
             } else {
-              __pyx_t_4 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_4)) {
+              __pyx_t_1 = __pyx_t_8(__pyx_t_9);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_4);
+              __Pyx_GOTREF(__pyx_t_1);
             }
-            if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
-              PyObject* sequence = __pyx_t_4;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              Py_ssize_t size = Py_SIZE(sequence);
-              #else
-              Py_ssize_t size = PySequence_Size(sequence);
-              #endif
-              if (unlikely(size != 3)) {
-                if (size > 3) __Pyx_RaiseTooManyValuesError(3);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              }
-              #if CYTHON_COMPILING_IN_CPYTHON
+            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
+              PyObject* sequence = __pyx_t_1;
               if (likely(PyTuple_CheckExact(sequence))) {
+                if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
+                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); 
-                __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); 
+                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
+                if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
+                  if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 0); 
-                __pyx_t_1 = PyList_GET_ITEM(sequence, 1); 
+                __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
               }
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_1);
+              __Pyx_INCREF(__pyx_t_2);
               __Pyx_INCREF(__pyx_t_11);
-              #else
-              __pyx_t_10 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_11 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-            } else
-            {
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            } else {
               Py_ssize_t index = -1;
-              __pyx_t_12 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __pyx_t_13 = Py_TYPE(__pyx_t_12)->tp_iternext;
-              index = 0; __pyx_t_10 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_10)) goto __pyx_L20_unpacking_failed;
+              index = 0; __pyx_t_10 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_10);
-              index = 1; __pyx_t_1 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_1)) goto __pyx_L20_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_1);
-              index = 2; __pyx_t_11 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L20_unpacking_failed;
+              index = 1; __pyx_t_2 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_2)) goto __pyx_L21_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_2);
+              index = 2; __pyx_t_11 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L21_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_11);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_13 = NULL;
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              goto __pyx_L21_unpacking_done;
-              __pyx_L20_unpacking_failed:;
+              goto __pyx_L22_unpacking_done;
+              __pyx_L21_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_13 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_L21_unpacking_done:;
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_L22_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_i);
             __pyx_v_i = __pyx_t_10;
             __pyx_t_10 = 0;
             __Pyx_XDECREF(__pyx_v_s1);
-            __pyx_v_s1 = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_s1 = __pyx_t_2;
+            __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_s2);
             __pyx_v_s2 = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":364
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":364
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):
  */
-            __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
             __Pyx_INCREF(__pyx_v_i);
             PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
@@ -16343,37 +15209,37 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             __Pyx_INCREF(__pyx_v_s2);
             PyTuple_SET_ITEM(__pyx_t_11, 2, __pyx_v_s2);
             __Pyx_GIVEREF(__pyx_v_s2);
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_50), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_t_1));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-            __pyx_t_1 = 0;
-            __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_50), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
             __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
+            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+            PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":365
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":365
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_51), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_51), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":366
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":366
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):             # <<<<<<<<<<<<<<
@@ -16381,36 +15247,28 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_1 = __pyx_int_0;
-          if (PyList_CheckExact(__pyx_v_self->id2fword) || PyTuple_CheckExact(__pyx_v_self->id2fword)) {
-            __pyx_t_2 = __pyx_v_self->id2fword; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          __pyx_t_2 = __pyx_int_0;
+          if (PyList_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword)) {
+            __pyx_t_9 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword; __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self->id2fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_11 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_11 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_11); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_11); __pyx_t_7++;
             } else {
-              __pyx_t_11 = __pyx_t_9(__pyx_t_2);
+              __pyx_t_11 = __pyx_t_8(__pyx_t_9);
               if (unlikely(!__pyx_t_11)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
@@ -16419,64 +15277,64 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             __Pyx_XDECREF(__pyx_v_w);
             __pyx_v_w = __pyx_t_11;
             __pyx_t_11 = 0;
-            __Pyx_INCREF(__pyx_t_1);
+            __Pyx_INCREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_11 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_v_i = __pyx_t_2;
+            __pyx_t_11 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_1);
-            __pyx_t_1 = __pyx_t_11;
+            __Pyx_DECREF(__pyx_t_2);
+            __pyx_t_2 = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":367
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":367
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):
  */
-            __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_INCREF(__pyx_v_i);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
             __Pyx_INCREF(__pyx_v_w);
-            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_w);
+            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_w);
             __Pyx_GIVEREF(__pyx_v_w);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_10));
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":368
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_53), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_53), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":369
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":369
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):             # <<<<<<<<<<<<<<
@@ -16484,36 +15342,28 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_2 = __pyx_int_0;
-          if (PyList_CheckExact(__pyx_v_self->id2eword) || PyTuple_CheckExact(__pyx_v_self->id2eword)) {
-            __pyx_t_1 = __pyx_v_self->id2eword; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          __pyx_t_9 = __pyx_int_0;
+          if (PyList_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword)) {
+            __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->id2eword); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_10 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_10 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_10); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_10); __pyx_t_7++;
             } else {
-              __pyx_t_10 = __pyx_t_9(__pyx_t_1);
+              __pyx_t_10 = __pyx_t_8(__pyx_t_2);
               if (unlikely(!__pyx_t_10)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
@@ -16522,76 +15372,76 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             __Pyx_XDECREF(__pyx_v_w);
             __pyx_v_w = __pyx_t_10;
             __pyx_t_10 = 0;
-            __Pyx_INCREF(__pyx_t_2);
+            __Pyx_INCREF(__pyx_t_9);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_2;
-            __pyx_t_10 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_v_i = __pyx_t_9;
+            __pyx_t_10 = PyNumber_Add(__pyx_t_9, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_2);
-            __pyx_t_2 = __pyx_t_10;
+            __Pyx_DECREF(__pyx_t_9);
+            __pyx_t_9 = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":370
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":370
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_INCREF(__pyx_v_i);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
             __Pyx_INCREF(__pyx_v_w);
-            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_w);
+            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_w);
             __Pyx_GIVEREF(__pyx_v_w);
-            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_11));
-            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_11));
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_11));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
             __pyx_t_11 = 0;
-            __pyx_t_11 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":371
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  * 
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_54), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_54), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -16600,75 +15450,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_9, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_9);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
+          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
-          __pyx_t_15 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
+          __pyx_t_15 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_16 = (!__pyx_t_14);
           if (__pyx_t_16) {
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_11);
-            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L28;
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_9, __pyx_t_11);
+            __pyx_t_2 = 0; __pyx_t_9 = 0; __pyx_t_11 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L29;
           }
-          __pyx_L28:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_L29:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_55, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_55, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L29;
-    __pyx_L3_error:;
+    goto __pyx_L30;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L29:;
+    __pyx_L30:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -16676,7 +15526,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
@@ -16693,22 +15543,41 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":374
+ * 
+ * 
+ *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
+ *         cdef e_id, f_id, low, high, midpoint, val
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fword = 0;
   PyObject *__pyx_v_eword = 0;
   PyObject *__pyx_v_col = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_e_id = 0;
+  PyObject *__pyx_v_f_id = 0;
+  PyObject *__pyx_v_low = 0;
+  PyObject *__pyx_v_high = 0;
+  PyObject *__pyx_v_midpoint = 0;
+  PyObject *__pyx_v_val = 0;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_score (wrapper)", 0);
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
+  __Pyx_RefNannySetupContext("get_score");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -16716,23 +15585,26 @@ static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObje
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fword)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fword);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eword)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eword);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_score", 1, 3, 3, 1); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__col)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__col);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_score", 1, 3, 3, 2); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_score") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_score") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -16753,48 +15625,18 @@ static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObje
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_14get_score(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_v_fword, __pyx_v_eword, __pyx_v_col);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":374
- * 
- * 
- *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
- *         cdef e_id, f_id, low, high, midpoint, val
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword, PyObject *__pyx_v_eword, PyObject *__pyx_v_col) {
-  PyObject *__pyx_v_e_id = 0;
-  PyObject *__pyx_v_f_id = 0;
-  PyObject *__pyx_v_low = 0;
-  PyObject *__pyx_v_high = 0;
-  PyObject *__pyx_v_midpoint = 0;
-  PyObject *__pyx_v_val = 0;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_score", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":377
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":377
  *         cdef e_id, f_id, low, high, midpoint, val
  * 
  *         if eword not in self.eword2id:             # <<<<<<<<<<<<<<
  *             return None
  *         if fword not in self.fword2id:
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":378
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":378
  * 
  *         if eword not in self.eword2id:
  *             return None             # <<<<<<<<<<<<<<
@@ -16805,21 +15647,21 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __Pyx_INCREF(Py_None);
     __pyx_r = Py_None;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":379
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":379
  *         if eword not in self.eword2id:
  *             return None
  *         if fword not in self.fword2id:             # <<<<<<<<<<<<<<
  *             return None
  *         f_id = self.fword2id[fword]
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":380
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":380
  *             return None
  *         if fword not in self.fword2id:
  *             return None             # <<<<<<<<<<<<<<
@@ -16830,35 +15672,35 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __Pyx_INCREF(Py_None);
     __pyx_r = Py_None;
     goto __pyx_L0;
-    goto __pyx_L4;
+    goto __pyx_L7;
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":381
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":381
  *         if fword not in self.fword2id:
  *             return None
  *         f_id = self.fword2id[fword]             # <<<<<<<<<<<<<<
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]
  */
-  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_f_id = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":382
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":382
  *             return None
  *         f_id = self.fword2id[fword]
  *         e_id = self.eword2id[eword]             # <<<<<<<<<<<<<<
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]
  */
-  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_e_id = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":383
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":383
  *         f_id = self.fword2id[fword]
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]             # <<<<<<<<<<<<<<
@@ -16866,12 +15708,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *         while high - low > 0:
  */
   __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_low = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":384
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":384
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]             # <<<<<<<<<<<<<<
@@ -16882,12 +15724,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_t_2); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_high = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":385
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":385
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]
  *         while high - low > 0:             # <<<<<<<<<<<<<<
@@ -16897,13 +15739,14 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   while (1) {
     __pyx_t_2 = PyNumber_Subtract(__pyx_v_high, __pyx_v_low); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (!__pyx_t_1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":386
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":386
  *         high = self.f_index.arr[f_id+1]
  *         while high - low > 0:
  *             midpoint = (low+high)/2             # <<<<<<<<<<<<<<
@@ -16919,7 +15762,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __pyx_v_midpoint = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":387
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":387
  *         while high - low > 0:
  *             midpoint = (low+high)/2
  *             val = self.e_index.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -16927,37 +15770,39 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *                 if col == 0:
  */
     __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->e_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_XDECREF(__pyx_v_val);
     __pyx_v_val = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":388
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":388
  *             midpoint = (low+high)/2
  *             val = self.e_index.arr[midpoint]
  *             if val == e_id:             # <<<<<<<<<<<<<<
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":389
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":389
  *             val = self.e_index.arr[midpoint]
  *             if val == e_id:
  *                 if col == 0:             # <<<<<<<<<<<<<<
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":390
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":390
  *             if val == e_id:
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -16966,28 +15811,29 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  */
         __Pyx_XDECREF(__pyx_r);
         __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_2 = PyFloat_FromDouble((__pyx_v_self->col1->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_r = __pyx_t_2;
         __pyx_t_2 = 0;
         goto __pyx_L0;
-        goto __pyx_L8;
+        goto __pyx_L11;
       }
-      __pyx_L8:;
+      __pyx_L11:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":391
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":391
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:             # <<<<<<<<<<<<<<
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":392
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":392
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:
  *                     return self.col2.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -16996,31 +15842,32 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  */
         __Pyx_XDECREF(__pyx_r);
         __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_2 = PyFloat_FromDouble((__pyx_v_self->col2->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_r = __pyx_t_2;
         __pyx_t_2 = 0;
         goto __pyx_L0;
-        goto __pyx_L9;
+        goto __pyx_L12;
       }
-      __pyx_L9:;
-      goto __pyx_L7;
+      __pyx_L12:;
+      goto __pyx_L10;
     }
-    __pyx_L7:;
+    __pyx_L10:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":393
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":393
  *                 if col == 1:
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:             # <<<<<<<<<<<<<<
  *                 high = midpoint
  *             if val < e_id:
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":394
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":394
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:
  *                 high = midpoint             # <<<<<<<<<<<<<<
@@ -17030,23 +15877,24 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
       __Pyx_INCREF(__pyx_v_midpoint);
       __Pyx_DECREF(__pyx_v_high);
       __pyx_v_high = __pyx_v_midpoint;
-      goto __pyx_L10;
+      goto __pyx_L13;
     }
-    __pyx_L10:;
+    __pyx_L13:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":395
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":395
  *             if val > e_id:
  *                 high = midpoint
  *             if val < e_id:             # <<<<<<<<<<<<<<
  *                 low = midpoint + 1
  *         return None
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":396
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":396
  *                 high = midpoint
  *             if val < e_id:
  *                 low = midpoint + 1             # <<<<<<<<<<<<<<
@@ -17058,12 +15906,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
       __Pyx_DECREF(__pyx_v_low);
       __pyx_v_low = __pyx_t_2;
       __pyx_t_2 = 0;
-      goto __pyx_L11;
+      goto __pyx_L14;
     }
-    __pyx_L11:;
+    __pyx_L14:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":397
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":397
  *             if val < e_id:
  *                 low = midpoint + 1
  *         return None             # <<<<<<<<<<<<<<
@@ -17094,29 +15942,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static char __pyx_doc_3_sa_5BiLex_16write_text[] = "Note: does not guarantee writing the dictionary in the original order";
-static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_16write_text(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":400
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":400
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -17124,7 +15950,10 @@ static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObj
  *         cdef i, N, e_id, f_id
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static char __pyx_doc_3_sa_5BiLex_8write_text[] = "Note: does not guarantee writing the dictionary in the original order";
+static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_N = 0;
   PyObject *__pyx_v_e_id = 0;
@@ -17140,20 +15969,29 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  Py_ssize_t __pyx_t_8;
+  Py_ssize_t __pyx_t_7;
+  long __pyx_t_8;
   long __pyx_t_9;
-  long __pyx_t_10;
-  int __pyx_t_11;
+  int __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
   PyObject *__pyx_t_13 = NULL;
   int __pyx_t_14;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text", 0);
+  __Pyx_RefNannySetupContext("write_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -17164,7 +16002,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -17176,40 +16014,39 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":405
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":405
  * 
  *         with open(filename, "w") as f:
  *             N = len(self.e_index)             # <<<<<<<<<<<<<<
  *             f_id = 0
  *             for i from 0 <= i < N:
  */
-          __pyx_t_4 = ((PyObject *)__pyx_v_self->e_index);
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_t_8 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_v_N = __pyx_t_4;
-          __pyx_t_4 = 0;
+          __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_t_7 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_v_N = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":406
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":406
  *         with open(filename, "w") as f:
  *             N = len(self.e_index)
  *             f_id = 0             # <<<<<<<<<<<<<<
@@ -17219,22 +16056,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_f_id = __pyx_int_0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":407
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":407
  *             N = len(self.e_index)
  *             f_id = 0
  *             for i from 0 <= i < N:             # <<<<<<<<<<<<<<
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  */
-          __pyx_t_9 = __Pyx_PyInt_AsLong(__pyx_v_N); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10++) {
-            __pyx_t_4 = PyInt_FromLong(__pyx_t_10); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_8 = __Pyx_PyInt_AsLong(__pyx_v_N); if (unlikely((__pyx_t_8 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9++) {
+            __pyx_t_1 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_4;
-            __pyx_t_4 = 0;
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":408
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":408
  *             f_id = 0
  *             for i from 0 <= i < N:
  *                 while self.f_index.arr[f_id+1] == i:             # <<<<<<<<<<<<<<
@@ -17242,138 +16079,139 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  *                 e_id = self.e_index.arr[i]
  */
             while (1) {
-              __pyx_t_4 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_4);
-              __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-              __pyx_t_4 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_4);
-              __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_v_i, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              if (!__pyx_t_11) break;
+              __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_7])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_v_i, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              if (!__pyx_t_10) break;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":409
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":409
  *             for i from 0 <= i < N:
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1             # <<<<<<<<<<<<<<
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]
  */
-              __pyx_t_1 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_2 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_2);
               __Pyx_DECREF(__pyx_v_f_id);
-              __pyx_v_f_id = __pyx_t_1;
-              __pyx_t_1 = 0;
+              __pyx_v_f_id = __pyx_t_2;
+              __pyx_t_2 = 0;
             }
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":410
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":410
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  *                 e_id = self.e_index.arr[i]             # <<<<<<<<<<<<<<
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_1 = PyInt_FromLong((__pyx_v_self->e_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_e_id = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":411
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":411
  *                     f_id = f_id + 1
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]             # <<<<<<<<<<<<<<
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->col1->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_score1);
-            __pyx_v_score1 = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_score1 = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":412
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":412
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]             # <<<<<<<<<<<<<<
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->col2->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_score2);
-            __pyx_v_score2 = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_score2 = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":413
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":413
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))             # <<<<<<<<<<<<<<
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_4 = PyObject_GetItem(__pyx_v_self->id2fword, __pyx_v_f_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_2 = PyObject_GetItem(__pyx_v_self->id2eword, __pyx_v_e_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_12 = PyTuple_New(4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_12);
-            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_4);
-            __Pyx_GIVEREF(__pyx_t_4);
-            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_2);
+            __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword, __pyx_v_f_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_11 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword, __pyx_v_e_id); if (!__pyx_t_11) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_12 = PyTuple_New(4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_1);
+            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_11);
+            __Pyx_GIVEREF(__pyx_t_11);
             __Pyx_INCREF(__pyx_v_score1);
             PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_v_score1);
             __Pyx_GIVEREF(__pyx_v_score1);
             __Pyx_INCREF(__pyx_v_score2);
             PyTuple_SET_ITEM(__pyx_t_12, 3, __pyx_v_score2);
             __Pyx_GIVEREF(__pyx_v_score2);
-            __pyx_t_4 = 0;
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_56), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_12);
-            PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_2));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_1 = 0;
+            __pyx_t_11 = 0;
+            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_56), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
+            __pyx_t_11 = 0;
+            __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_10 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+            __pyx_t_9 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":407
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":407
  *             N = len(self.e_index)
  *             f_id = 0
  *             for i from 0 <= i < N:             # <<<<<<<<<<<<<<
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_11 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_11);
           __Pyx_XDECREF(__pyx_v_i);
-          __pyx_v_i = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_v_i = __pyx_t_11;
+          __pyx_t_11 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -17382,75 +16220,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_12, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          if (__Pyx_GetException(&__pyx_t_11, &__pyx_t_12, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_11);
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __Pyx_INCREF(__pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
+          __Pyx_GIVEREF(__pyx_t_11);
           __Pyx_INCREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_12);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
-          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
+          __Pyx_INCREF(__pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
+          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __pyx_t_14 = (!__pyx_t_11);
+          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __pyx_t_14 = (!__pyx_t_10);
           if (__pyx_t_14) {
-            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_11);
             __Pyx_GIVEREF(__pyx_t_12);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_12, __pyx_t_1);
-            __pyx_t_2 = 0; __pyx_t_12 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L22;
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_ErrRestore(__pyx_t_11, __pyx_t_12, __pyx_t_2);
+            __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_2 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L23;
           }
-          __pyx_L22:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_L23:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L8_exception_handled;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_57, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_57, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L23;
-    __pyx_L3_error:;
+    goto __pyx_L24;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L23:;
+    __pyx_L24:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -17458,7 +16296,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -17475,7 +16313,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":21
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":21
  * cdef int LOWER_MASK[32]
  * 
  * cdef void _init_lower_mask():             # <<<<<<<<<<<<<<
@@ -17489,9 +16327,9 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   unsigned int __pyx_t_2;
-  __Pyx_RefNannySetupContext("_init_lower_mask", 0);
+  __Pyx_RefNannySetupContext("_init_lower_mask");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":23
  * cdef void _init_lower_mask():
  *     cdef unsigned i
  *     cdef int mask = 0             # <<<<<<<<<<<<<<
@@ -17500,7 +16338,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
  */
   __pyx_v_mask = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":24
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":24
  *     cdef unsigned i
  *     cdef int mask = 0
  *     for i in range(MIN_BOTTOM_SIZE):             # <<<<<<<<<<<<<<
@@ -17511,7 +16349,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":25
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":25
  *     cdef int mask = 0
  *     for i in range(MIN_BOTTOM_SIZE):
  *         mask = (mask << 1) + 1             # <<<<<<<<<<<<<<
@@ -17520,7 +16358,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
  */
     __pyx_v_mask = ((__pyx_v_mask << 1) + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":26
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":26
  *     for i in range(MIN_BOTTOM_SIZE):
  *         mask = (mask << 1) + 1
  *         LOWER_MASK[i] = mask             # <<<<<<<<<<<<<<
@@ -17533,7 +16371,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":37
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":37
  * 
  * 
  * cdef _BitSet* new_BitSet():             # <<<<<<<<<<<<<<
@@ -17545,9 +16383,9 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   struct __pyx_t_3_sa__BitSet *__pyx_v_b;
   struct __pyx_t_3_sa__BitSet *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_BitSet", 0);
+  __Pyx_RefNannySetupContext("new_BitSet");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":40
  *     cdef _BitSet* b
  * 
  *     b = <_BitSet*> malloc(sizeof(_BitSet))             # <<<<<<<<<<<<<<
@@ -17556,7 +16394,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b = ((struct __pyx_t_3_sa__BitSet *)malloc((sizeof(struct __pyx_t_3_sa__BitSet))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":41
  * 
  *     b = <_BitSet*> malloc(sizeof(_BitSet))
  *     b.bitset = 0             # <<<<<<<<<<<<<<
@@ -17565,7 +16403,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->bitset = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":42
  *     b = <_BitSet*> malloc(sizeof(_BitSet))
  *     b.bitset = 0
  *     b.min_val = -1             # <<<<<<<<<<<<<<
@@ -17574,7 +16412,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->min_val = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":43
  *     b.bitset = 0
  *     b.min_val = -1
  *     b.max_val = -1             # <<<<<<<<<<<<<<
@@ -17583,7 +16421,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->max_val = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":44
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":44
  *     b.min_val = -1
  *     b.max_val = -1
  *     b.size = 0             # <<<<<<<<<<<<<<
@@ -17592,7 +16430,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->size = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":45
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":45
  *     b.max_val = -1
  *     b.size = 0
  *     return b             # <<<<<<<<<<<<<<
@@ -17608,7 +16446,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":48
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":48
  * 
  * 
  * cdef int bitset_findsucc(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -17627,9 +16465,9 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("bitset_findsucc", 0);
+  __Pyx_RefNannySetupContext("bitset_findsucc");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":52
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":52
  *     cdef int low, high, mid
  * 
  *     if b.max_val == -1 or i >= b.max_val:             # <<<<<<<<<<<<<<
@@ -17645,7 +16483,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":53
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":53
  * 
  *     if b.max_val == -1 or i >= b.max_val:
  *         return -1             # <<<<<<<<<<<<<<
@@ -17658,7 +16496,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":54
  *     if b.max_val == -1 or i >= b.max_val:
  *         return -1
  *     if i < b.min_val:             # <<<<<<<<<<<<<<
@@ -17668,7 +16506,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   __pyx_t_3 = (__pyx_v_i < __pyx_v_b->min_val);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":55
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":55
  *         return -1
  *     if i < b.min_val:
  *         return b.min_val             # <<<<<<<<<<<<<<
@@ -17681,7 +16519,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":57
  *         return b.min_val
  * 
  *     bitset = b.bitset & ~LOWER_MASK[i]             # <<<<<<<<<<<<<<
@@ -17690,7 +16528,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_bitset = (__pyx_v_b->bitset & (~(__pyx_v_3_sa_LOWER_MASK[__pyx_v_i])));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":58
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":58
  * 
  *     bitset = b.bitset & ~LOWER_MASK[i]
  *     low = i+1             # <<<<<<<<<<<<<<
@@ -17699,7 +16537,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_low = (__pyx_v_i + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":59
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":59
  *     bitset = b.bitset & ~LOWER_MASK[i]
  *     low = i+1
  *     high = b.max_val+1             # <<<<<<<<<<<<<<
@@ -17708,7 +16546,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_high = (__pyx_v_b->max_val + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":60
  *     low = i+1
  *     high = b.max_val+1
  *     while low < high-1:             # <<<<<<<<<<<<<<
@@ -17719,7 +16557,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_t_3 = (__pyx_v_low < (__pyx_v_high - 1));
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":61
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":61
  *     high = b.max_val+1
  *     while low < high-1:
  *         mid = (high + low)/2             # <<<<<<<<<<<<<<
@@ -17728,7 +16566,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
     __pyx_v_mid = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":62
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":62
  *     while low < high-1:
  *         mid = (high + low)/2
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])             # <<<<<<<<<<<<<<
@@ -17737,7 +16575,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
     __pyx_v_mask = (~((__pyx_v_3_sa_LOWER_MASK[(__pyx_v_high - 1)]) ^ (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_mid - 1)])));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":63
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":63
  *         mid = (high + low)/2
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])
  *         if bitset & mask == 0:             # <<<<<<<<<<<<<<
@@ -17747,7 +16585,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_t_3 = ((__pyx_v_bitset & __pyx_v_mask) == 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":64
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":64
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])
  *         if bitset & mask == 0:
  *             low = mid             # <<<<<<<<<<<<<<
@@ -17759,7 +16597,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":66
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":66
  *             low = mid
  *         else:
  *             bitset = bitset & mask             # <<<<<<<<<<<<<<
@@ -17768,7 +16606,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
       __pyx_v_bitset = (__pyx_v_bitset & __pyx_v_mask);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":67
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":67
  *         else:
  *             bitset = bitset & mask
  *             high = mid             # <<<<<<<<<<<<<<
@@ -17780,7 +16618,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":68
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":68
  *             bitset = bitset & mask
  *             high = mid
  *     return low             # <<<<<<<<<<<<<<
@@ -17796,7 +16634,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":71
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":71
  * 
  * 
  * cdef int bitset_insert(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -17809,9 +16647,9 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("bitset_insert", 0);
+  __Pyx_RefNannySetupContext("bitset_insert");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":74
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":74
  *     cdef int val
  * 
  *     val = 1 << i             # <<<<<<<<<<<<<<
@@ -17820,7 +16658,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
   __pyx_v_val = (1 << __pyx_v_i);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":75
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":75
  * 
  *     val = 1 << i
  *     if b.bitset & val == 0:             # <<<<<<<<<<<<<<
@@ -17830,7 +16668,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   __pyx_t_1 = ((__pyx_v_b->bitset & __pyx_v_val) == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":76
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":76
  *     val = 1 << i
  *     if b.bitset & val == 0:
  *         b.bitset = b.bitset | val             # <<<<<<<<<<<<<<
@@ -17839,7 +16677,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
     __pyx_v_b->bitset = (__pyx_v_b->bitset | __pyx_v_val);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":77
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":77
  *     if b.bitset & val == 0:
  *         b.bitset = b.bitset | val
  *         if b.size == 0:             # <<<<<<<<<<<<<<
@@ -17849,7 +16687,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     __pyx_t_1 = (__pyx_v_b->size == 0);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":78
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":78
  *         b.bitset = b.bitset | val
  *         if b.size == 0:
  *             b.min_val = i             # <<<<<<<<<<<<<<
@@ -17858,7 +16696,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
       __pyx_v_b->min_val = __pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":79
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":79
  *         if b.size == 0:
  *             b.min_val = i
  *             b.max_val = i             # <<<<<<<<<<<<<<
@@ -17870,7 +16708,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":81
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":81
  *             b.max_val = i
  *         else:
  *             if i < b.min_val:             # <<<<<<<<<<<<<<
@@ -17880,7 +16718,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       __pyx_t_1 = (__pyx_v_i < __pyx_v_b->min_val);
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":82
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":82
  *         else:
  *             if i < b.min_val:
  *                 b.min_val = i             # <<<<<<<<<<<<<<
@@ -17892,7 +16730,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       }
       __pyx_L5:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":83
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":83
  *             if i < b.min_val:
  *                 b.min_val = i
  *             if i > b.max_val:             # <<<<<<<<<<<<<<
@@ -17902,7 +16740,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       __pyx_t_1 = (__pyx_v_i > __pyx_v_b->max_val);
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":84
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":84
  *                 b.min_val = i
  *             if i > b.max_val:
  *                 b.max_val = i             # <<<<<<<<<<<<<<
@@ -17916,7 +16754,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":85
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":85
  *             if i > b.max_val:
  *                 b.max_val = i
  *         b.size = b.size + 1             # <<<<<<<<<<<<<<
@@ -17925,7 +16763,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
     __pyx_v_b->size = (__pyx_v_b->size + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":86
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":86
  *                 b.max_val = i
  *         b.size = b.size + 1
  *         return 1             # <<<<<<<<<<<<<<
@@ -17938,7 +16776,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":87
  *         b.size = b.size + 1
  *         return 1
  *     return 0             # <<<<<<<<<<<<<<
@@ -17954,7 +16792,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":90
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":90
  * 
  * 
  * cdef int bitset_contains(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -17967,9 +16805,9 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("bitset_contains", 0);
+  __Pyx_RefNannySetupContext("bitset_contains");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":93
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":93
  *     cdef int val
  * 
  *     val = 1 << i             # <<<<<<<<<<<<<<
@@ -17978,7 +16816,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_val = (1 << __pyx_v_i);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":94
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":94
  * 
  *     val = 1 << i
  *     if b.bitset & val == 0:             # <<<<<<<<<<<<<<
@@ -17988,7 +16826,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   __pyx_t_1 = ((__pyx_v_b->bitset & __pyx_v_val) == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":95
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":95
  *     val = 1 << i
  *     if b.bitset & val == 0:
  *         return 0             # <<<<<<<<<<<<<<
@@ -18001,7 +16839,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":97
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":97
  *         return 0
  *     else:
  *         return 1             # <<<<<<<<<<<<<<
@@ -18019,18 +16857,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_14BitSetIterator___next__(((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":104
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":104
  *     cdef int next_val
  * 
  *     def __next__(self):             # <<<<<<<<<<<<<<
@@ -18038,7 +16865,8 @@ static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self) {
   int __pyx_v_ret_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -18047,19 +16875,19 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__next__", 0);
+  __Pyx_RefNannySetupContext("__next__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":107
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":107
  *         cdef int ret_val
  * 
  *         if self.next_val == -1:             # <<<<<<<<<<<<<<
  *             raise StopIteration()
  *         ret_val = self.next_val
  */
-  __pyx_t_1 = (__pyx_v_self->next_val == -1);
+  __pyx_t_1 = (((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":108
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":108
  * 
  *         if self.next_val == -1:
  *             raise StopIteration()             # <<<<<<<<<<<<<<
@@ -18071,29 +16899,29 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[6]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":109
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":109
  *         if self.next_val == -1:
  *             raise StopIteration()
  *         ret_val = self.next_val             # <<<<<<<<<<<<<<
  *         self.next_val = bitset_findsucc(self.b, ret_val)
  *         return ret_val
  */
-  __pyx_v_ret_val = __pyx_v_self->next_val;
+  __pyx_v_ret_val = ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":110
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":110
  *             raise StopIteration()
  *         ret_val = self.next_val
  *         self.next_val = bitset_findsucc(self.b, ret_val)             # <<<<<<<<<<<<<<
  *         return ret_val
  * 
  */
-  __pyx_v_self->next_val = __pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_v_ret_val);
+  ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val = __pyx_f_3_sa_bitset_findsucc(((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->b, __pyx_v_ret_val);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":111
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":111
  *         ret_val = self.next_val
  *         self.next_val = bitset_findsucc(self.b, ret_val)
  *         return ret_val             # <<<<<<<<<<<<<<
@@ -18119,21 +16947,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
-  __pyx_r = __pyx_pf_3_sa_6BitSet___cinit__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":122
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":122
  *     cdef _BitSet* b
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -18141,35 +16955,30 @@ static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__
  * 
  */
 
-static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_RefNannySetupContext("__cinit__");
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":123
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":123
  * 
  *     def __cinit__(self):
  *         self.b = new_BitSet()             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  __pyx_v_self->b = __pyx_f_3_sa_new_BitSet();
+  ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b = __pyx_f_3_sa_new_BitSet();
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_6BitSet_2__dealloc__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":125
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":125
  *         self.b = new_BitSet()
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -18177,34 +16986,24 @@ static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":126
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":126
  * 
  *     def __dealloc__(self):
  *         free(self.b)             # <<<<<<<<<<<<<<
  * 
  *     def __iter__(self):
  */
-  free(__pyx_v_self->b);
-
-  __Pyx_RefNannyFinishContext();
-}
+  free(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b);
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_4__iter__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
   __Pyx_RefNannyFinishContext();
-  return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":128
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":128
  *         free(self.b)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -18212,7 +17011,8 @@ static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self) {
  *         it = BitSetIterator()
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_it = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -18220,9 +17020,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__", 0);
+  __Pyx_RefNannySetupContext("__iter__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":130
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":130
  *     def __iter__(self):
  *         cdef BitSetIterator it
  *         it = BitSetIterator()             # <<<<<<<<<<<<<<
@@ -18234,25 +17034,25 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
   __pyx_v_it = ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":131
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":131
  *         cdef BitSetIterator it
  *         it = BitSetIterator()
  *         it.b = self.b             # <<<<<<<<<<<<<<
  *         it.next_val = self.b.min_val
  *         return it
  */
-  __pyx_v_it->b = __pyx_v_self->b;
+  __pyx_v_it->b = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":132
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":132
  *         it = BitSetIterator()
  *         it.b = self.b
  *         it.next_val = self.b.min_val             # <<<<<<<<<<<<<<
  *         return it
  * 
  */
-  __pyx_v_it->next_val = __pyx_v_self->b->min_val;
+  __pyx_v_it->next_val = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":133
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":133
  *         it.b = self.b
  *         it.next_val = self.b.min_val
  *         return it             # <<<<<<<<<<<<<<
@@ -18277,18 +17077,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_6insert(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":135
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":135
  *         return it
  * 
  *     def insert(self, i):             # <<<<<<<<<<<<<<
@@ -18296,7 +17085,8 @@ static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -18304,9 +17094,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert", 0);
+  __Pyx_RefNannySetupContext("insert");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":136
  * 
  *     def insert(self, i):
  *         return bitset_insert(self.b, i)             # <<<<<<<<<<<<<<
@@ -18315,7 +17105,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__p
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_insert(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_insert(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -18333,18 +17123,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("findsucc (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_8findsucc(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":138
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":138
  *         return bitset_insert(self.b, i)
  * 
  *     def findsucc(self, i):             # <<<<<<<<<<<<<<
@@ -18352,7 +17131,8 @@ static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -18360,9 +17140,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("findsucc", 0);
+  __Pyx_RefNannySetupContext("findsucc");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":139
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":139
  * 
  *     def findsucc(self, i):
  *         return bitset_findsucc(self.b, i)             # <<<<<<<<<<<<<<
@@ -18371,7 +17151,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *_
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_findsucc(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -18389,18 +17169,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_10__str__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":141
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":141
  *         return bitset_findsucc(self.b, i)
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -18408,7 +17177,8 @@ static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -18417,9 +17187,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__", 0);
+  __Pyx_RefNannySetupContext("__str__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":142
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":142
  * 
  *     def __str__(self):
  *         return dec2bin(self.b.bitset)+"  ("+str(self.b.size)+","+str(self.b.min_val)+","+str(self.b.max_val)+")"             # <<<<<<<<<<<<<<
@@ -18427,15 +17197,15 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
  *     def min(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = ((PyObject *)__pyx_f_3_sa_dec2bin(__pyx_v_self->b->bitset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PyObject *)__pyx_f_3_sa_dec2bin(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->bitset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyNumber_Add(__pyx_t_1, ((PyObject *)__pyx_kp_s_58)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -18449,10 +17219,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
   __pyx_t_1 = PyNumber_Add(__pyx_t_3, ((PyObject *)__pyx_kp_s_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromLong(__pyx_v_self->b->min_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -18466,10 +17236,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
   __pyx_t_3 = PyNumber_Add(__pyx_t_2, ((PyObject *)__pyx_kp_s_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyInt_FromLong(__pyx_v_self->b->max_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->max_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -18501,18 +17271,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("min (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_12min(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":144
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":144
  *         return dec2bin(self.b.bitset)+"  ("+str(self.b.size)+","+str(self.b.min_val)+","+str(self.b.max_val)+")"
  * 
  *     def min(self):             # <<<<<<<<<<<<<<
@@ -18520,16 +17279,17 @@ static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUS
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("min", 0);
+  __Pyx_RefNannySetupContext("min");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":145
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":145
  * 
  *     def min(self):
  *         return self.b.min_val             # <<<<<<<<<<<<<<
@@ -18537,7 +17297,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx
  *     def max(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->min_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -18555,18 +17315,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("max (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_14max(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":147
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":147
  *         return self.b.min_val
  * 
  *     def max(self):             # <<<<<<<<<<<<<<
@@ -18574,16 +17323,17 @@ static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUS
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("max", 0);
+  __Pyx_RefNannySetupContext("max");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":148
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":148
  * 
  *     def max(self):
  *         return self.b.max_val             # <<<<<<<<<<<<<<
@@ -18591,7 +17341,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx
  *     def __len__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->max_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->max_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -18609,18 +17359,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_16__len__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":150
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":150
  *         return self.b.max_val
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -18628,19 +17367,20 @@ static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":151
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":151
  * 
  *     def __len__(self):
  *         return self.b.size             # <<<<<<<<<<<<<<
  * 
  *     def __contains__(self, i):
  */
-  __pyx_r = __pyx_v_self->b->size;
+  __pyx_r = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->size;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -18649,18 +17389,7 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_18__contains__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":153
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":153
  *         return self.b.size
  * 
  *     def __contains__(self, i):             # <<<<<<<<<<<<<<
@@ -18668,7 +17397,8 @@ static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
+static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -18677,9 +17407,9 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__contains__", 0);
+  __Pyx_RefNannySetupContext("__contains__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":154
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":154
  * 
  *     def __contains__(self, i):
  *         return bool(bitset_contains(self.b, i))             # <<<<<<<<<<<<<<
@@ -18687,7 +17417,7 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
  * 
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_contains(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_contains(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -18705,7 +17435,7 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":157
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":157
  * 
  * 
  * cdef str dec2bin(long i):             # <<<<<<<<<<<<<<
@@ -18715,7 +17445,7 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
 
 static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   PyObject *__pyx_v_result = 0;
-  CYTHON_UNUSED unsigned int __pyx_v_d;
+  unsigned int __pyx_v_d;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -18725,9 +17455,9 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("dec2bin", 0);
+  __Pyx_RefNannySetupContext("dec2bin");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":158
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":158
  * 
  * cdef str dec2bin(long i):
  *     cdef str result = ""             # <<<<<<<<<<<<<<
@@ -18737,7 +17467,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_result = __pyx_kp_s_45;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":160
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":160
  *     cdef str result = ""
  *     cdef unsigned d
  *     for d in range(MIN_BOTTOM_SIZE):             # <<<<<<<<<<<<<<
@@ -18748,7 +17478,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_d = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":161
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":161
  *     cdef unsigned d
  *     for d in range(MIN_BOTTOM_SIZE):
  *         if i & LOWER_MASK[0] == 0:             # <<<<<<<<<<<<<<
@@ -18758,7 +17488,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     __pyx_t_3 = ((__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[0])) == 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":162
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":162
  *     for d in range(MIN_BOTTOM_SIZE):
  *         if i & LOWER_MASK[0] == 0:
  *             result = "0"+result             # <<<<<<<<<<<<<<
@@ -18774,7 +17504,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":164
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":164
  *             result = "0"+result
  *         else:
  *             result = "1"+result             # <<<<<<<<<<<<<<
@@ -18789,7 +17519,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":165
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":165
  *         else:
  *             result = "1"+result
  *         i = i >> 1             # <<<<<<<<<<<<<<
@@ -18799,7 +17529,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     __pyx_v_i = (__pyx_v_i >> 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":166
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":166
  *             result = "1"+result
  *         i = i >> 1
  *     return result             # <<<<<<<<<<<<<<
@@ -18824,7 +17554,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":177
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":177
  *     void** bottom
  * 
  * cdef _VEB* new_VEB(int n):             # <<<<<<<<<<<<<<
@@ -18843,9 +17573,9 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("new_VEB", 0);
+  __Pyx_RefNannySetupContext("new_VEB");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":181
  *     cdef int num_bits, num_top_bits, i
  * 
  *     veb = <_VEB*> malloc(sizeof(_VEB))             # <<<<<<<<<<<<<<
@@ -18854,7 +17584,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb = ((struct __pyx_t_3_sa__VEB *)malloc((sizeof(struct __pyx_t_3_sa__VEB))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":183
  *     veb = <_VEB*> malloc(sizeof(_VEB))
  * 
  *     num_bits = int(ceil(log(n) / log(2)))             # <<<<<<<<<<<<<<
@@ -18869,7 +17599,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_v_num_bits = ((int)ceil((__pyx_t_1 / __pyx_t_2)));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":184
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":184
  * 
  *     num_bits = int(ceil(log(n) / log(2)))
  *     veb.num_bottom_bits = num_bits/2             # <<<<<<<<<<<<<<
@@ -18878,7 +17608,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->num_bottom_bits = __Pyx_div_long(__pyx_v_num_bits, 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":185
  *     num_bits = int(ceil(log(n) / log(2)))
  *     veb.num_bottom_bits = num_bits/2
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -18888,7 +17618,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   __pyx_t_3 = (__pyx_v_veb->num_bottom_bits < __pyx_v_3_sa_MIN_BOTTOM_BITS);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":186
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":186
  *     veb.num_bottom_bits = num_bits/2
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:
  *         veb.num_bottom_bits = MIN_BOTTOM_BITS             # <<<<<<<<<<<<<<
@@ -18900,7 +17630,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":187
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":187
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:
  *         veb.num_bottom_bits = MIN_BOTTOM_BITS
  *     veb.top_universe_size = (n >> veb.num_bottom_bits) + 1             # <<<<<<<<<<<<<<
@@ -18909,7 +17639,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->top_universe_size = ((__pyx_v_n >> __pyx_v_veb->num_bottom_bits) + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":189
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":189
  *     veb.top_universe_size = (n >> veb.num_bottom_bits) + 1
  * 
  *     veb.bottom = <void**> malloc(veb.top_universe_size * sizeof(void*))             # <<<<<<<<<<<<<<
@@ -18918,7 +17648,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->bottom = ((void **)malloc((__pyx_v_veb->top_universe_size * (sizeof(void *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":190
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":190
  * 
  *     veb.bottom = <void**> malloc(veb.top_universe_size * sizeof(void*))
  *     memset(veb.bottom, 0, veb.top_universe_size * sizeof(void*))             # <<<<<<<<<<<<<<
@@ -18927,7 +17657,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   memset(__pyx_v_veb->bottom, 0, (__pyx_v_veb->top_universe_size * (sizeof(void *))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":192
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":192
  *     memset(veb.bottom, 0, veb.top_universe_size * sizeof(void*))
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -18937,7 +17667,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":193
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":193
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         veb.top = new_VEB(veb.top_universe_size)             # <<<<<<<<<<<<<<
@@ -18949,7 +17679,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":195
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":195
  *         veb.top = new_VEB(veb.top_universe_size)
  *     else:
  *         veb.top = new_BitSet()             # <<<<<<<<<<<<<<
@@ -18960,7 +17690,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":197
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":197
  *         veb.top = new_BitSet()
  * 
  *     veb.max_val = -1             # <<<<<<<<<<<<<<
@@ -18969,7 +17699,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->max_val = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":198
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":198
  * 
  *     veb.max_val = -1
  *     veb.min_val = -1             # <<<<<<<<<<<<<<
@@ -18978,7 +17708,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->min_val = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":199
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":199
  *     veb.max_val = -1
  *     veb.min_val = -1
  *     veb.size = 0             # <<<<<<<<<<<<<<
@@ -18987,7 +17717,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->size = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":200
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":200
  *     veb.min_val = -1
  *     veb.size = 0
  *     return veb             # <<<<<<<<<<<<<<
@@ -19007,7 +17737,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":203
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":203
  * 
  * 
  * cdef int VEB_insert(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -19026,9 +17756,9 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("VEB_insert", 0);
+  __Pyx_RefNannySetupContext("VEB_insert");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":208
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":208
  *     cdef int a, b, tmp
  * 
  *     if veb.size == 0:             # <<<<<<<<<<<<<<
@@ -19038,7 +17768,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   __pyx_t_1 = (__pyx_v_veb->size == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":209
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":209
  * 
  *     if veb.size == 0:
  *         veb.min_val = i             # <<<<<<<<<<<<<<
@@ -19047,7 +17777,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_veb->min_val = __pyx_v_i;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":210
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":210
  *     if veb.size == 0:
  *         veb.min_val = i
  *         veb.max_val = i             # <<<<<<<<<<<<<<
@@ -19058,7 +17788,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":211
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":211
  *         veb.min_val = i
  *         veb.max_val = i
  *     elif i == veb.min_val or i == veb.max_val:             # <<<<<<<<<<<<<<
@@ -19074,7 +17804,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":212
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":212
  *         veb.max_val = i
  *     elif i == veb.min_val or i == veb.max_val:
  *         return 0             # <<<<<<<<<<<<<<
@@ -19087,7 +17817,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":214
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":214
  *         return 0
  *     else:
  *         if i < veb.min_val:             # <<<<<<<<<<<<<<
@@ -19097,7 +17827,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_i < __pyx_v_veb->min_val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":215
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":215
  *     else:
  *         if i < veb.min_val:
  *             tmp = i             # <<<<<<<<<<<<<<
@@ -19106,7 +17836,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_tmp = __pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":216
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":216
  *         if i < veb.min_val:
  *             tmp = i
  *             i = veb.min_val             # <<<<<<<<<<<<<<
@@ -19115,7 +17845,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_i = __pyx_v_veb->min_val;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":217
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":217
  *             tmp = i
  *             i = veb.min_val
  *             veb.min_val = tmp             # <<<<<<<<<<<<<<
@@ -19127,7 +17857,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":218
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":218
  *             i = veb.min_val
  *             veb.min_val = tmp
  *         a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -19136,7 +17866,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":219
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":219
  *             veb.min_val = tmp
  *         a = i >> veb.num_bottom_bits
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -19145,7 +17875,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":220
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":220
  *         a = i >> veb.num_bottom_bits
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *         if veb.bottom[a] == NULL:             # <<<<<<<<<<<<<<
@@ -19155,7 +17885,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = ((__pyx_v_veb->bottom[__pyx_v_a]) == NULL);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":221
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":221
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *         if veb.bottom[a] == NULL:
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -19165,7 +17895,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":222
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":222
  *         if veb.bottom[a] == NULL:
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *                 subv = <_VEB*> veb.top             # <<<<<<<<<<<<<<
@@ -19174,7 +17904,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
         __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)__pyx_v_veb->top);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":223
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":223
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *                 subv = <_VEB*> veb.top
  *                 VEB_insert(subv, a)             # <<<<<<<<<<<<<<
@@ -19186,7 +17916,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":225
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":225
  *                 VEB_insert(subv, a)
  *             else:
  *                 subb = <_BitSet*> veb.top             # <<<<<<<<<<<<<<
@@ -19195,7 +17925,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
         __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)__pyx_v_veb->top);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":226
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":226
  *             else:
  *                 subb = <_BitSet*> veb.top
  *                 bitset_insert(subb, a)             # <<<<<<<<<<<<<<
@@ -19206,7 +17936,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       __pyx_L6:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":227
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":227
  *                 subb = <_BitSet*> veb.top
  *                 bitset_insert(subb, a)
  *             if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -19216,7 +17946,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":228
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":228
  *                 bitset_insert(subb, a)
  *             if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *                 veb.bottom[a] = new_VEB(1 << veb.num_bottom_bits)             # <<<<<<<<<<<<<<
@@ -19228,7 +17958,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":230
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":230
  *                 veb.bottom[a] = new_VEB(1 << veb.num_bottom_bits)
  *             else:
  *                 veb.bottom[a] = new_BitSet()             # <<<<<<<<<<<<<<
@@ -19242,7 +17972,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":231
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":231
  *             else:
  *                 veb.bottom[a] = new_BitSet()
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -19252,7 +17982,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":232
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":232
  *                 veb.bottom[a] = new_BitSet()
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -19261,7 +17991,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":233
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":233
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             if VEB_insert(subv, b) == 0:             # <<<<<<<<<<<<<<
@@ -19271,7 +18001,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_f_3_sa_VEB_insert(__pyx_v_subv, __pyx_v_b) == 0);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":234
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":234
  *             subv = <_VEB*> veb.bottom[a]
  *             if VEB_insert(subv, b) == 0:
  *                 return 0             # <<<<<<<<<<<<<<
@@ -19287,7 +18017,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":236
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":236
  *                 return 0
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -19296,7 +18026,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":237
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":237
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             if bitset_insert(subb, b) == 0:             # <<<<<<<<<<<<<<
@@ -19306,7 +18036,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_f_3_sa_bitset_insert(__pyx_v_subb, __pyx_v_b) == 0);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":238
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":238
  *             subb = <_BitSet*> veb.bottom[a]
  *             if bitset_insert(subb, b) == 0:
  *                 return 0             # <<<<<<<<<<<<<<
@@ -19321,7 +18051,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":240
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":240
  *                 return 0
  * 
  *         if i > veb.max_val:             # <<<<<<<<<<<<<<
@@ -19331,7 +18061,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_i > __pyx_v_veb->max_val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":241
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":241
  * 
  *         if i > veb.max_val:
  *             veb.max_val = i             # <<<<<<<<<<<<<<
@@ -19345,7 +18075,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":242
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":242
  *         if i > veb.max_val:
  *             veb.max_val = i
  *     veb.size = veb.size + 1             # <<<<<<<<<<<<<<
@@ -19354,7 +18084,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
   __pyx_v_veb->size = (__pyx_v_veb->size + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":243
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":243
  *             veb.max_val = i
  *     veb.size = veb.size + 1
  *     return 1             # <<<<<<<<<<<<<<
@@ -19370,7 +18100,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":246
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":246
  * 
  * 
  * cdef del_VEB(_VEB* veb):             # <<<<<<<<<<<<<<
@@ -19387,9 +18117,9 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("del_VEB", 0);
+  __Pyx_RefNannySetupContext("del_VEB");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":249
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":249
  *     cdef int i
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -19399,7 +18129,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":250
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":250
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         i = (<_VEB*> veb.top).min_val             # <<<<<<<<<<<<<<
@@ -19411,7 +18141,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":252
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":252
  *         i = (<_VEB*> veb.top).min_val
  *     else:
  *         i = (<_BitSet*> veb.top).min_val             # <<<<<<<<<<<<<<
@@ -19422,7 +18152,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":254
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":254
  *         i = (<_BitSet*> veb.top).min_val
  * 
  *     while i != -1:             # <<<<<<<<<<<<<<
@@ -19433,7 +18163,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_i != -1);
     if (!__pyx_t_1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":255
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":255
  * 
  *     while i != -1:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -19443,7 +18173,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":256
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":256
  *     while i != -1:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             del_VEB(<_VEB*> veb.bottom[i])             # <<<<<<<<<<<<<<
@@ -19457,7 +18187,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":258
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":258
  *             del_VEB(<_VEB*> veb.bottom[i])
  *         else:
  *             free(<_BitSet*> veb.bottom[i])             # <<<<<<<<<<<<<<
@@ -19468,7 +18198,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     __pyx_L6:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":260
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":260
  *             free(<_BitSet*> veb.bottom[i])
  * 
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -19478,7 +18208,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":261
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":261
  * 
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             i = VEB_findsucc(<_VEB*> veb.top, i)             # <<<<<<<<<<<<<<
@@ -19490,7 +18220,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":263
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":263
  *             i = VEB_findsucc(<_VEB*> veb.top, i)
  *         else:
  *             i = bitset_findsucc(<_BitSet*> veb.top, i)             # <<<<<<<<<<<<<<
@@ -19502,7 +18232,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":265
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":265
  *             i = bitset_findsucc(<_BitSet*> veb.top, i)
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -19512,7 +18242,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":266
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":266
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         del_VEB(<_VEB*> veb.top)             # <<<<<<<<<<<<<<
@@ -19526,7 +18256,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":268
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":268
  *         del_VEB(<_VEB*> veb.top)
  *     else:
  *         free(<_BitSet*> veb.top)             # <<<<<<<<<<<<<<
@@ -19537,7 +18267,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   __pyx_L8:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":269
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":269
  *     else:
  *         free(<_BitSet*> veb.top)
  *     free(veb.bottom)             # <<<<<<<<<<<<<<
@@ -19546,7 +18276,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
  */
   free(__pyx_v_veb->bottom);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":270
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":270
  *         free(<_BitSet*> veb.top)
  *     free(veb.bottom)
  *     free(veb)             # <<<<<<<<<<<<<<
@@ -19567,7 +18297,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":273
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":273
  * 
  * 
  * cdef int VEB_findsucc(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -19588,9 +18318,9 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("VEB_findsucc", 0);
+  __Pyx_RefNannySetupContext("VEB_findsucc");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":278
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":278
  *     cdef int a, b, j, c, found
  * 
  *     if veb.max_val == -1 or i>=veb.max_val:             # <<<<<<<<<<<<<<
@@ -19606,7 +18336,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":279
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":279
  * 
  *     if veb.max_val == -1 or i>=veb.max_val:
  *         return -1             # <<<<<<<<<<<<<<
@@ -19619,7 +18349,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":280
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":280
  *     if veb.max_val == -1 or i>=veb.max_val:
  *         return -1
  *     if i < veb.min_val:             # <<<<<<<<<<<<<<
@@ -19629,7 +18359,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = (__pyx_v_i < __pyx_v_veb->min_val);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":281
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":281
  *         return -1
  *     if i < veb.min_val:
  *         return veb.min_val             # <<<<<<<<<<<<<<
@@ -19642,7 +18372,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":283
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":283
  *         return veb.min_val
  * 
  *     a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -19651,7 +18381,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":284
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":284
  * 
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -19660,7 +18390,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":285
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":285
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     found = 0             # <<<<<<<<<<<<<<
@@ -19669,7 +18399,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_found = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":286
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":286
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     found = 0
  *     if veb.bottom[a] != NULL:             # <<<<<<<<<<<<<<
@@ -19679,7 +18409,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = ((__pyx_v_veb->bottom[__pyx_v_a]) != NULL);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":287
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":287
  *     found = 0
  *     if veb.bottom[a] != NULL:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -19689,7 +18419,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":288
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":288
  *     if veb.bottom[a] != NULL:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -19698,7 +18428,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":289
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":289
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             if subv.max_val > b:             # <<<<<<<<<<<<<<
@@ -19708,7 +18438,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
       __pyx_t_3 = (__pyx_v_subv->max_val > __pyx_v_b);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":290
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":290
  *             subv = <_VEB*> veb.bottom[a]
  *             if subv.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + VEB_findsucc(subv, b)             # <<<<<<<<<<<<<<
@@ -19717,7 +18447,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
         __pyx_v_j = ((__pyx_v_a << __pyx_v_veb->num_bottom_bits) + __pyx_f_3_sa_VEB_findsucc(__pyx_v_subv, __pyx_v_b));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":291
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":291
  *             if subv.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + VEB_findsucc(subv, b)
  *                 found = 1             # <<<<<<<<<<<<<<
@@ -19732,7 +18462,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":293
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":293
  *                 found = 1
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -19741,7 +18471,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":294
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":294
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             if subb.max_val > b:             # <<<<<<<<<<<<<<
@@ -19751,7 +18481,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
       __pyx_t_3 = (__pyx_v_subb->max_val > __pyx_v_b);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":295
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":295
  *             subb = <_BitSet*> veb.bottom[a]
  *             if subb.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)             # <<<<<<<<<<<<<<
@@ -19760,7 +18490,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
         __pyx_v_j = ((__pyx_v_a << __pyx_v_veb->num_bottom_bits) + __pyx_f_3_sa_bitset_findsucc(__pyx_v_subb, __pyx_v_b));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":296
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":296
  *             if subb.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)
  *                 found = 1             # <<<<<<<<<<<<<<
@@ -19777,7 +18507,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":297
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":297
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)
  *                 found = 1
  *     if found==0:             # <<<<<<<<<<<<<<
@@ -19787,7 +18517,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = (__pyx_v_found == 0);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":298
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":298
  *                 found = 1
  *     if found==0:
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -19797,7 +18527,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":299
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":299
  *     if found==0:
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             subv = <_VEB*> veb.top             # <<<<<<<<<<<<<<
@@ -19806,7 +18536,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)__pyx_v_veb->top);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":300
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":300
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             subv = <_VEB*> veb.top
  *             c = VEB_findsucc(subv, a)             # <<<<<<<<<<<<<<
@@ -19818,7 +18548,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":302
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":302
  *             c = VEB_findsucc(subv, a)
  *         else:
  *             subb = <_BitSet*> veb.top             # <<<<<<<<<<<<<<
@@ -19827,7 +18557,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)__pyx_v_veb->top);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":303
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":303
  *         else:
  *             subb = <_BitSet*> veb.top
  *             c = bitset_findsucc(subb, a)             # <<<<<<<<<<<<<<
@@ -19838,7 +18568,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     __pyx_L10:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":304
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":304
  *             subb = <_BitSet*> veb.top
  *             c = bitset_findsucc(subb, a)
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -19848,7 +18578,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":305
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":305
  *             c = bitset_findsucc(subb, a)
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[c]             # <<<<<<<<<<<<<<
@@ -19857,7 +18587,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_c]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":306
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":306
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subv.min_val             # <<<<<<<<<<<<<<
@@ -19869,7 +18599,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":308
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":308
  *             j = (c << veb.num_bottom_bits) + subv.min_val
  *         else:
  *             subb = <_BitSet*> veb.bottom[c]             # <<<<<<<<<<<<<<
@@ -19878,7 +18608,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_c]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":309
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":309
  *         else:
  *             subb = <_BitSet*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subb.min_val             # <<<<<<<<<<<<<<
@@ -19892,7 +18622,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L9:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":310
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":310
  *             subb = <_BitSet*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subb.min_val
  *     return j             # <<<<<<<<<<<<<<
@@ -19908,7 +18638,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":313
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":313
  * 
  * 
  * cdef int VEB_contains(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -19927,9 +18657,9 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("VEB_contains", 0);
+  __Pyx_RefNannySetupContext("VEB_contains");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":318
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":318
  *     cdef int a, b
  * 
  *     if veb.size == 0 or i < veb.min_val or i > veb.max_val:             # <<<<<<<<<<<<<<
@@ -19951,7 +18681,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":319
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":319
  * 
  *     if veb.size == 0 or i < veb.min_val or i > veb.max_val:
  *         return 0             # <<<<<<<<<<<<<<
@@ -19964,7 +18694,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":321
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":321
  *         return 0
  * 
  *     if veb.min_val == i:             # <<<<<<<<<<<<<<
@@ -19974,7 +18704,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_2 = (__pyx_v_veb->min_val == __pyx_v_i);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":322
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":322
  * 
  *     if veb.min_val == i:
  *         return 1             # <<<<<<<<<<<<<<
@@ -19987,7 +18717,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":324
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":324
  *         return 1
  *     else:
  *         if veb.size == 1:             # <<<<<<<<<<<<<<
@@ -19997,7 +18727,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_2 = (__pyx_v_veb->size == 1);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":325
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":325
  *     else:
  *         if veb.size == 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -20012,7 +18742,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":327
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":327
  *             return 0
  * 
  *     a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -20021,7 +18751,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":328
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":328
  * 
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -20030,7 +18760,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":329
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":329
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     if veb.bottom[a] == NULL:             # <<<<<<<<<<<<<<
@@ -20040,7 +18770,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_2 = ((__pyx_v_veb->bottom[__pyx_v_a]) == NULL);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":330
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":330
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     if veb.bottom[a] == NULL:
  *         return 0             # <<<<<<<<<<<<<<
@@ -20053,7 +18783,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":332
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":332
  *         return 0
  *     else:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -20063,7 +18793,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_2 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":333
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":333
  *     else:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -20072,7 +18802,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":334
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":334
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             return VEB_contains(subv, b)             # <<<<<<<<<<<<<<
@@ -20085,7 +18815,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":336
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":336
  *             return VEB_contains(subv, b)
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -20094,7 +18824,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":337
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":337
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             return bitset_contains(subb, b)             # <<<<<<<<<<<<<<
@@ -20114,18 +18844,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11VEBIterator___next__(((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":344
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":344
  *     cdef int next_val
  * 
  *     def __next__(self):             # <<<<<<<<<<<<<<
@@ -20133,7 +18852,8 @@ static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBIterator *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
   int __pyx_v_ret_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -20142,19 +18862,19 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__next__", 0);
+  __Pyx_RefNannySetupContext("__next__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":347
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":347
  *         cdef int ret_val
  * 
  *         if self.next_val == -1:             # <<<<<<<<<<<<<<
  *             raise StopIteration()
  *         ret_val = self.next_val
  */
-  __pyx_t_1 = (__pyx_v_self->next_val == -1);
+  __pyx_t_1 = (((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":348
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":348
  * 
  *         if self.next_val == -1:
  *             raise StopIteration()             # <<<<<<<<<<<<<<
@@ -20166,29 +18886,29 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[6]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":349
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":349
  *         if self.next_val == -1:
  *             raise StopIteration()
  *         ret_val = self.next_val             # <<<<<<<<<<<<<<
  *         self.next_val = VEB_findsucc(self.v, ret_val)
  *         return ret_val
  */
-  __pyx_v_ret_val = __pyx_v_self->next_val;
+  __pyx_v_ret_val = ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":350
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":350
  *             raise StopIteration()
  *         ret_val = self.next_val
  *         self.next_val = VEB_findsucc(self.v, ret_val)             # <<<<<<<<<<<<<<
  *         return ret_val
  * 
  */
-  __pyx_v_self->next_val = __pyx_f_3_sa_VEB_findsucc(__pyx_v_self->v, __pyx_v_ret_val);
+  ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val = __pyx_f_3_sa_VEB_findsucc(((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->v, __pyx_v_ret_val);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":351
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":351
  *         ret_val = self.next_val
  *         self.next_val = VEB_findsucc(self.v, ret_val)
  *         return ret_val             # <<<<<<<<<<<<<<
@@ -20214,32 +18934,42 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":360
+ *     cdef int _first(self)
+ * 
+ *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
+ *         self.veb = new_VEB(size)
+ * 
+ */
+
+static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -20256,48 +18986,22 @@ static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_3VEB___cinit__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), __pyx_v_size);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":360
- *     cdef int _first(self)
- * 
- *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
- *         self.veb = new_VEB(size)
- * 
- */
-
-static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_size) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":361
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":361
  * 
  *     def __cinit__(self, int size):
  *         self.veb = new_VEB(size)             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  __pyx_v_self->veb = __pyx_f_3_sa_new_VEB(__pyx_v_size);
+  ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb = __pyx_f_3_sa_new_VEB(__pyx_v_size);
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_3VEB_2__dealloc__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":363
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":363
  *         self.veb = new_VEB(size)
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -20305,22 +19009,23 @@ static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
+static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":364
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":364
  * 
  *     def __dealloc__(self):
  *         del_VEB(self.veb)             # <<<<<<<<<<<<<<
  * 
  *     def __iter__(self):
  */
-  __pyx_t_1 = __pyx_f_3_sa_del_VEB(__pyx_v_self->veb); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_3_sa_del_VEB(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -20332,18 +19037,7 @@ static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_s
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_3VEB_4__iter__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":366
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":366
  *         del_VEB(self.veb)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -20351,7 +19045,8 @@ static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self) {
  *         it = VEBIterator()
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa_VEBIterator *__pyx_v_it = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -20359,9 +19054,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__", 0);
+  __Pyx_RefNannySetupContext("__iter__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":368
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":368
  *     def __iter__(self):
  *         cdef VEBIterator it
  *         it = VEBIterator()             # <<<<<<<<<<<<<<
@@ -20373,25 +19068,25 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
   __pyx_v_it = ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":369
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":369
  *         cdef VEBIterator it
  *         it = VEBIterator()
  *         it.v = self.veb             # <<<<<<<<<<<<<<
  *         it.next_val = self.veb.min_val
  *         return it
  */
-  __pyx_v_it->v = __pyx_v_self->veb;
+  __pyx_v_it->v = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":370
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":370
  *         it = VEBIterator()
  *         it.v = self.veb
  *         it.next_val = self.veb.min_val             # <<<<<<<<<<<<<<
  *         return it
  * 
  */
-  __pyx_v_it->next_val = __pyx_v_self->veb->min_val;
+  __pyx_v_it->next_val = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb->min_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":371
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":371
  *         it.v = self.veb
  *         it.next_val = self.veb.min_val
  *         return it             # <<<<<<<<<<<<<<
@@ -20416,18 +19111,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_3VEB_6insert(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":373
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":373
  *         return it
  * 
  *     def insert(self, i):             # <<<<<<<<<<<<<<
@@ -20435,7 +19119,8 @@ static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -20443,9 +19128,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert", 0);
+  __Pyx_RefNannySetupContext("insert");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":374
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":374
  * 
  *     def insert(self, i):
  *         return VEB_insert(self.veb, i)             # <<<<<<<<<<<<<<
@@ -20454,7 +19139,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_s
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_insert(__pyx_v_self->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_insert(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -20472,7 +19157,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":376
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":376
  *         return VEB_insert(self.veb, i)
  * 
  *     cdef int _insert(self, int i):             # <<<<<<<<<<<<<<
@@ -20483,9 +19168,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_s
 static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_insert", 0);
+  __Pyx_RefNannySetupContext("_insert");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":377
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":377
  * 
  *     cdef int _insert(self, int i):
  *         return VEB_insert(self.veb, i)             # <<<<<<<<<<<<<<
@@ -20501,18 +19186,7 @@ static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("findsucc (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_3VEB_8findsucc(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":379
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":379
  *         return VEB_insert(self.veb, i)
  * 
  *     def findsucc(self, i):             # <<<<<<<<<<<<<<
@@ -20520,7 +19194,8 @@ static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -20528,9 +19203,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("findsucc", 0);
+  __Pyx_RefNannySetupContext("findsucc");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":380
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":380
  * 
  *     def findsucc(self, i):
  *         return VEB_findsucc(self.veb, i)             # <<<<<<<<<<<<<<
@@ -20539,7 +19214,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_findsucc(__pyx_v_self->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_findsucc(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -20557,7 +19232,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":382
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":382
  *         return VEB_findsucc(self.veb, i)
  * 
  *     cdef int _first(self):             # <<<<<<<<<<<<<<
@@ -20568,9 +19243,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v
 static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_first", 0);
+  __Pyx_RefNannySetupContext("_first");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":383
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":383
  * 
  *     cdef int _first(self):
  *         return self.veb.min_val             # <<<<<<<<<<<<<<
@@ -20586,7 +19261,7 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":385
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":385
  *         return self.veb.min_val
  * 
  *     cdef int _findsucc(self, int i):             # <<<<<<<<<<<<<<
@@ -20597,9 +19272,9 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
 static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_findsucc", 0);
+  __Pyx_RefNannySetupContext("_findsucc");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":386
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":386
  * 
  *     cdef int _findsucc(self, int i):
  *         return VEB_findsucc(self.veb, i)             # <<<<<<<<<<<<<<
@@ -20615,18 +19290,7 @@ static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_3VEB_10__len__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":388
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":388
  *         return VEB_findsucc(self.veb, i)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -20634,19 +19298,20 @@ static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":389
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":389
  * 
  *     def __len__(self):
  *         return self.veb.size             # <<<<<<<<<<<<<<
  * 
  *     def __contains__(self, i):
  */
-  __pyx_r = __pyx_v_self->veb->size;
+  __pyx_r = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb->size;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -20655,40 +19320,30 @@ static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_3VEB_12__contains__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":391
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":391
  *         return self.veb.size
  * 
  *     def __contains__(self, i):             # <<<<<<<<<<<<<<
  *         return VEB_contains(self.veb, i)
  */
 
-static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
+static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__contains__", 0);
+  __Pyx_RefNannySetupContext("__contains__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":392
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":392
  * 
  *     def __contains__(self, i):
  *         return VEB_contains(self.veb, i)             # <<<<<<<<<<<<<<
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_f_3_sa_VEB_contains(__pyx_v_self->veb, __pyx_t_1);
+  __pyx_r = __pyx_f_3_sa_VEB_contains(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1);
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -20701,32 +19356,55 @@ static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":9
+ *     cdef IntList lcp
+ * 
+ *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
+ *         cdef int i, k, j, h, n
+ *         cdef IntList rank
+ */
+
+static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa = 0;
+  int __pyx_v_i;
+  int __pyx_v_k;
+  int __pyx_v_j;
+  int __pyx_v_h;
+  int __pyx_v_n;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_rank = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -20744,45 +19422,8 @@ static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sa), __pyx_ptype_3_sa_SuffixArray, 1, "sa", 0))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_3LCP___cinit__(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self), __pyx_v_sa);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":9
- *     cdef IntList lcp
- * 
- *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
- *         cdef int i, k, j, h, n
- *         cdef IntList rank
- */
-
-static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa) {
-  int __pyx_v_i;
-  int __pyx_v_k;
-  int __pyx_v_j;
-  int __pyx_v_h;
-  int __pyx_v_n;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_rank = 0;
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  int __pyx_t_4;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":13
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
  * 
  *         logger.info("Constructing LCP array")             # <<<<<<<<<<<<<<
@@ -20799,7 +19440,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":14
  * 
  *         logger.info("Constructing LCP array")
  *         self.sa = sa             # <<<<<<<<<<<<<<
@@ -20808,20 +19449,20 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_sa));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_sa));
-  __Pyx_GOTREF(__pyx_v_self->sa);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
-  __pyx_v_self->sa = __pyx_v_sa;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa));
+  ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa = __pyx_v_sa;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":15
  *         logger.info("Constructing LCP array")
  *         self.sa = sa
  *         n = self.sa.sa.len             # <<<<<<<<<<<<<<
  *         self.lcp = IntList(initial_len=n)
  * 
  */
-  __pyx_v_n = __pyx_v_self->sa->sa->len;
+  __pyx_v_n = ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa->sa->len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":16
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":16
  *         self.sa = sa
  *         n = self.sa.sa.len
  *         self.lcp = IntList(initial_len=n)             # <<<<<<<<<<<<<<
@@ -20834,16 +19475,16 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->lcp);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->lcp));
-  __pyx_v_self->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp));
+  ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":18
  *         self.lcp = IntList(initial_len=n)
  * 
  *         rank = IntList(initial_len=n)             # <<<<<<<<<<<<<<
@@ -20856,13 +19497,13 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":19
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":19
  * 
  *         rank = IntList(initial_len=n)
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -20872,7 +19513,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __pyx_t_3 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":20
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":20
  *         rank = IntList(initial_len=n)
  *         for i from 0 <= i < n:
  *             rank.arr[sa.sa.arr[i]] = i             # <<<<<<<<<<<<<<
@@ -20882,7 +19523,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     (__pyx_v_rank->arr[(__pyx_v_sa->sa->arr[__pyx_v_i])]) = __pyx_v_i;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":22
  *             rank.arr[sa.sa.arr[i]] = i
  * 
  *         h = 0             # <<<<<<<<<<<<<<
@@ -20891,7 +19532,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  */
   __pyx_v_h = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":23
  * 
  *         h = 0
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -20901,7 +19542,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __pyx_t_3 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":24
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":24
  *         h = 0
  *         for i from 0 <= i < n:
  *             k = rank.arr[i]             # <<<<<<<<<<<<<<
@@ -20910,7 +19551,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  */
     __pyx_v_k = (__pyx_v_rank->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":25
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":25
  *         for i from 0 <= i < n:
  *             k = rank.arr[i]
  *             if k == 0:             # <<<<<<<<<<<<<<
@@ -20920,19 +19561,19 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     __pyx_t_4 = (__pyx_v_k == 0);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":26
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":26
  *             k = rank.arr[i]
  *             if k == 0:
  *                 self.lcp.arr[k] = -1             # <<<<<<<<<<<<<<
  *             else:
  *                 j = sa.sa.arr[k-1]
  */
-      (__pyx_v_self->lcp->arr[__pyx_v_k]) = -1;
-      goto __pyx_L7;
+      (((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp->arr[__pyx_v_k]) = -1;
+      goto __pyx_L10;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":28
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":28
  *                 self.lcp.arr[k] = -1
  *             else:
  *                 j = sa.sa.arr[k-1]             # <<<<<<<<<<<<<<
@@ -20941,7 +19582,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  */
       __pyx_v_j = (__pyx_v_sa->sa->arr[(__pyx_v_k - 1)]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":29
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":29
  *             else:
  *                 j = sa.sa.arr[k-1]
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:             # <<<<<<<<<<<<<<
@@ -20964,7 +19605,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
         }
         if (!__pyx_t_5) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":30
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":30
  *                 j = sa.sa.arr[k-1]
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:
  *                     h = h+1             # <<<<<<<<<<<<<<
@@ -20974,18 +19615,18 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
         __pyx_v_h = (__pyx_v_h + 1);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":31
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":31
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:
  *                     h = h+1
  *                 self.lcp.arr[k] = h             # <<<<<<<<<<<<<<
  *             if h > 0:
  *                 h = h-1
  */
-      (__pyx_v_self->lcp->arr[__pyx_v_k]) = __pyx_v_h;
+      (((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp->arr[__pyx_v_k]) = __pyx_v_h;
     }
-    __pyx_L7:;
+    __pyx_L10:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":32
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":32
  *                     h = h+1
  *                 self.lcp.arr[k] = h
  *             if h > 0:             # <<<<<<<<<<<<<<
@@ -20995,7 +19636,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     __pyx_t_5 = (__pyx_v_h > 0);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":33
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":33
  *                 self.lcp.arr[k] = h
  *             if h > 0:
  *                 h = h-1             # <<<<<<<<<<<<<<
@@ -21003,12 +19644,12 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  * 
  */
       __pyx_v_h = (__pyx_v_h - 1);
-      goto __pyx_L10;
+      goto __pyx_L13;
     }
-    __pyx_L10:;
+    __pyx_L13:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":34
  *             if h > 0:
  *                 h = h-1
  *         logger.info("LCP array completed")             # <<<<<<<<<<<<<<
@@ -21037,31 +19678,9 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n); /*proto*/
-static char __pyx_doc_3_sa_3LCP_2compute_stats[] = "Note: the output of this function is not exact.  In\n        particular, the frequency associated with each word is \n        not guaranteed to be correct.  This is due to a bit of\n        laxness in the design; the function is intended only to\n        obtain a list of the most frequent words; for this \n        purpose it is perfectly fine";
-static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n) {
-  int __pyx_v_max_n;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("compute_stats (wrapper)", 0);
-  assert(__pyx_arg_max_n); {
-    __pyx_v_max_n = __Pyx_PyInt_AsInt(__pyx_arg_max_n); if (unlikely((__pyx_v_max_n == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_3LCP_2compute_stats(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self), ((int)__pyx_v_max_n));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":36
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
  * 
  *     def compute_stats(self, int max_n):             # <<<<<<<<<<<<<<
@@ -21069,46 +19688,51 @@ static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObj
  *         particular, the frequency associated with each word is
  */
 
-static PyObject *__pyx_pf_3_sa_3LCP_2compute_stats(struct __pyx_obj_3_sa_LCP *__pyx_v_self, int __pyx_v_max_n) {
+static PyObject *__pyx_pf_3_sa_3LCP_1compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n); /*proto*/
+static char __pyx_doc_3_sa_3LCP_1compute_stats[] = "Note: the output of this function is not exact.  In\n        particular, the frequency associated with each word is \n        not guaranteed to be correct.  This is due to a bit of\n        laxness in the design; the function is intended only to\n        obtain a list of the most frequent words; for this \n        purpose it is perfectly fine";
+static PyObject *__pyx_pf_3_sa_3LCP_1compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("compute_stats", 0);
+  __Pyx_RefNannySetupContext("compute_stats");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_v_max_n = __pyx_v_max_n;
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_3LCP_4generator1, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
+  assert(__pyx_arg_max_n); {
+    __pyx_cur_scope->__pyx_v_max_n = __Pyx_PyInt_AsInt(__pyx_arg_max_n); if (unlikely((__pyx_cur_scope->__pyx_v_max_n == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF((PyObject *)__pyx_cur_scope->__pyx_v_self); __pyx_cur_scope->__pyx_v_self = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_3LCP_2generator1;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   int __pyx_t_2;
@@ -21121,8 +19745,8 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   long __pyx_t_9;
   PyObject *__pyx_t_10 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L26_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -21132,16 +19756,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":48
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":48
  *         cdef VEB veb
  * 
  *         N = self.sa.sa.len             # <<<<<<<<<<<<<<
  * 
  *         ngram_starts = []
  */
-  __pyx_cur_scope->__pyx_v_N = __pyx_cur_scope->__pyx_v_self->sa->sa->len;
+  __pyx_cur_scope->__pyx_v_N = ((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->sa->len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":50
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":50
  *         N = self.sa.sa.len
  * 
  *         ngram_starts = []             # <<<<<<<<<<<<<<
@@ -21149,12 +19773,12 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  *             ngram_starts.append(IntList(initial_len=N))
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_cur_scope->__pyx_v_ngram_starts = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":51
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":51
  * 
  *         ngram_starts = []
  *         for n from 0 <= n < max_n:             # <<<<<<<<<<<<<<
@@ -21164,27 +19788,30 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_t_2 = __pyx_cur_scope->__pyx_v_max_n;
   for (__pyx_cur_scope->__pyx_v_n = 0; __pyx_cur_scope->__pyx_v_n < __pyx_t_2; __pyx_cur_scope->__pyx_v_n++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":52
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":52
  *         ngram_starts = []
  *         for n from 0 <= n < max_n:
  *             ngram_starts.append(IntList(initial_len=N))             # <<<<<<<<<<<<<<
  * 
  *         run_start = IntList(initial_len=max_n)
  */
+    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_ngram_starts) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __pyx_t_4 = PyList_Append(__pyx_cur_scope->__pyx_v_ngram_starts, __pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":54
  *             ngram_starts.append(IntList(initial_len=N))
  * 
  *         run_start = IntList(initial_len=max_n)             # <<<<<<<<<<<<<<
@@ -21197,14 +19824,14 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_cur_scope->__pyx_v_run_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":55
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":55
  * 
  *         run_start = IntList(initial_len=max_n)
  *         veb = VEB(N)             # <<<<<<<<<<<<<<
@@ -21214,7 +19841,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_t_1 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -21225,7 +19852,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_cur_scope->__pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":57
  *         veb = VEB(N)
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -21235,16 +19862,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_t_2 = __pyx_cur_scope->__pyx_v_N;
   for (__pyx_cur_scope->__pyx_v_i = 0; __pyx_cur_scope->__pyx_v_i < __pyx_t_2; __pyx_cur_scope->__pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":58
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":58
  * 
  *         for i from 0 <= i < N:
  *             h = self.lcp.arr[i]             # <<<<<<<<<<<<<<
  *             if h < 0:
  *                 h = 0
  */
-    __pyx_cur_scope->__pyx_v_h = (__pyx_cur_scope->__pyx_v_self->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
+    __pyx_cur_scope->__pyx_v_h = (((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":59
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":59
  *         for i from 0 <= i < N:
  *             h = self.lcp.arr[i]
  *             if h < 0:             # <<<<<<<<<<<<<<
@@ -21254,7 +19881,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     __pyx_t_5 = (__pyx_cur_scope->__pyx_v_h < 0);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":60
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":60
  *             h = self.lcp.arr[i]
  *             if h < 0:
  *                 h = 0             # <<<<<<<<<<<<<<
@@ -21266,7 +19893,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     }
     __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":61
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":61
  *             if h < 0:
  *                 h = 0
  *             for n from h <= n < max_n:             # <<<<<<<<<<<<<<
@@ -21276,7 +19903,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     __pyx_t_6 = __pyx_cur_scope->__pyx_v_max_n;
     for (__pyx_cur_scope->__pyx_v_n = __pyx_cur_scope->__pyx_v_h; __pyx_cur_scope->__pyx_v_n < __pyx_t_6; __pyx_cur_scope->__pyx_v_n++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":62
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":62
  *                 h = 0
  *             for n from h <= n < max_n:
  *                 rs = run_start.arr[n]             # <<<<<<<<<<<<<<
@@ -21285,7 +19912,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
       __pyx_cur_scope->__pyx_v_rs = (__pyx_cur_scope->__pyx_v_run_start->arr[__pyx_cur_scope->__pyx_v_n]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":63
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":63
  *             for n from h <= n < max_n:
  *                 rs = run_start.arr[n]
  *                 run_start.arr[n] = i             # <<<<<<<<<<<<<<
@@ -21294,7 +19921,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
       (__pyx_cur_scope->__pyx_v_run_start->arr[__pyx_cur_scope->__pyx_v_n]) = __pyx_cur_scope->__pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":64
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":64
  *                 rs = run_start.arr[n]
  *                 run_start.arr[n] = i
  *                 freq = i - rs             # <<<<<<<<<<<<<<
@@ -21303,7 +19930,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
       __pyx_cur_scope->__pyx_v_freq = (__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_rs);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":65
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":65
  *                 run_start.arr[n] = i
  *                 freq = i - rs
  *                 if freq > 1000: # arbitrary, but see note below             # <<<<<<<<<<<<<<
@@ -21313,7 +19940,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
       __pyx_t_5 = (__pyx_cur_scope->__pyx_v_freq > 1000);
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":66
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":66
  *                 freq = i - rs
  *                 if freq > 1000: # arbitrary, but see note below
  *                     veb._insert(freq)             # <<<<<<<<<<<<<<
@@ -21322,7 +19949,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_cur_scope->__pyx_v_veb->__pyx_vtab)->_insert(__pyx_cur_scope->__pyx_v_veb, __pyx_cur_scope->__pyx_v_freq);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":67
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":67
  *                 if freq > 1000: # arbitrary, but see note below
  *                     veb._insert(freq)
  *                     ngram_start = ngram_starts[n]             # <<<<<<<<<<<<<<
@@ -21338,7 +19965,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
         __pyx_cur_scope->__pyx_v_ngram_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
         __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":68
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":68
  *                     veb._insert(freq)
  *                     ngram_start = ngram_starts[n]
  *                     while ngram_start.arr[freq] > 0:             # <<<<<<<<<<<<<<
@@ -21349,7 +19976,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_t_5 = ((__pyx_cur_scope->__pyx_v_ngram_start->arr[__pyx_cur_scope->__pyx_v_freq]) > 0);
           if (!__pyx_t_5) break;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":69
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":69
  *                     ngram_start = ngram_starts[n]
  *                     while ngram_start.arr[freq] > 0:
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram             # <<<<<<<<<<<<<<
@@ -21359,7 +19986,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_cur_scope->__pyx_v_freq = (__pyx_cur_scope->__pyx_v_freq + 1);
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":70
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":70
  *                     while ngram_start.arr[freq] > 0:
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram
  *                     ngram_start.arr[freq] = rs             # <<<<<<<<<<<<<<
@@ -21373,7 +20000,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":71
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram
  *                     ngram_start.arr[freq] = rs
  *         i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -21382,7 +20009,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
   __pyx_cur_scope->__pyx_v_i = __pyx_cur_scope->__pyx_v_veb->veb->min_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":72
  *                     ngram_start.arr[freq] = rs
  *         i = veb.veb.min_val
  *         while i != -1:             # <<<<<<<<<<<<<<
@@ -21393,7 +20020,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     __pyx_t_5 = (__pyx_cur_scope->__pyx_v_i != -1);
     if (!__pyx_t_5) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":73
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":73
  *         i = veb.veb.min_val
  *         while i != -1:
  *             ii = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -21402,7 +20029,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
     __pyx_cur_scope->__pyx_v_ii = ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_cur_scope->__pyx_v_veb->__pyx_vtab)->_findsucc(__pyx_cur_scope->__pyx_v_veb, __pyx_cur_scope->__pyx_v_i);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":74
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":74
  *         while i != -1:
  *             ii = veb._findsucc(i)
  *             for n from 0 <= n < max_n:             # <<<<<<<<<<<<<<
@@ -21412,7 +20039,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     __pyx_t_2 = __pyx_cur_scope->__pyx_v_max_n;
     for (__pyx_cur_scope->__pyx_v_n = 0; __pyx_cur_scope->__pyx_v_n < __pyx_t_2; __pyx_cur_scope->__pyx_v_n++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":75
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":75
  *             ii = veb._findsucc(i)
  *             for n from 0 <= n < max_n:
  *                 ngram_start = ngram_starts[n]             # <<<<<<<<<<<<<<
@@ -21428,7 +20055,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
       __pyx_cur_scope->__pyx_v_ngram_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
       __pyx_t_1 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":76
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":76
  *             for n from 0 <= n < max_n:
  *                 ngram_start = ngram_starts[n]
  *                 iii = i             # <<<<<<<<<<<<<<
@@ -21437,7 +20064,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
       __pyx_cur_scope->__pyx_v_iii = __pyx_cur_scope->__pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":77
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":77
  *                 ngram_start = ngram_starts[n]
  *                 iii = i
  *                 rs = ngram_start.arr[iii]             # <<<<<<<<<<<<<<
@@ -21446,7 +20073,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
       __pyx_cur_scope->__pyx_v_rs = (__pyx_cur_scope->__pyx_v_ngram_start->arr[__pyx_cur_scope->__pyx_v_iii]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":78
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":78
  *                 iii = i
  *                 rs = ngram_start.arr[iii]
  *                 while (ii==-1 or iii < ii) and rs != 0:             # <<<<<<<<<<<<<<
@@ -21469,16 +20096,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
         }
         if (!__pyx_t_7) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":79
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":79
  *                 rs = ngram_start.arr[iii]
  *                 while (ii==-1 or iii < ii) and rs != 0:
  *                     j = self.sa.sa.arr[rs]             # <<<<<<<<<<<<<<
  *                     valid = 1
  *                     for k from 0 <= k < n+1:
  */
-        __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_self->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
+        __pyx_cur_scope->__pyx_v_j = (((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":80
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":80
  *                 while (ii==-1 or iii < ii) and rs != 0:
  *                     j = self.sa.sa.arr[rs]
  *                     valid = 1             # <<<<<<<<<<<<<<
@@ -21487,7 +20114,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         __pyx_cur_scope->__pyx_v_valid = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":81
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":81
  *                     j = self.sa.sa.arr[rs]
  *                     valid = 1
  *                     for k from 0 <= k < n+1:             # <<<<<<<<<<<<<<
@@ -21497,17 +20124,17 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
         __pyx_t_9 = (__pyx_cur_scope->__pyx_v_n + 1);
         for (__pyx_cur_scope->__pyx_v_k = 0; __pyx_cur_scope->__pyx_v_k < __pyx_t_9; __pyx_cur_scope->__pyx_v_k++) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":82
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":82
  *                     valid = 1
  *                     for k from 0 <= k < n+1:
  *                         if self.sa.darray.data.arr[j+k] < 2:             # <<<<<<<<<<<<<<
  *                             valid = 0
  *                     if valid:
  */
-          __pyx_t_7 = ((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
+          __pyx_t_7 = ((((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":83
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":83
  *                     for k from 0 <= k < n+1:
  *                         if self.sa.darray.data.arr[j+k] < 2:
  *                             valid = 0             # <<<<<<<<<<<<<<
@@ -21520,7 +20147,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_L22:;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":84
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":84
  *                         if self.sa.darray.data.arr[j+k] < 2:
  *                             valid = 0
  *                     if valid:             # <<<<<<<<<<<<<<
@@ -21529,7 +20156,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         if (__pyx_cur_scope->__pyx_v_valid) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":85
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":85
  *                             valid = 0
  *                     if valid:
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])             # <<<<<<<<<<<<<<
@@ -21537,13 +20164,13 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  *                     iii = iii + 1
  */
           __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
           __pyx_t_9 = (__pyx_cur_scope->__pyx_v_n + 1);
           for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_9; __pyx_t_6+=1) {
             __pyx_cur_scope->__pyx_v_k = __pyx_t_6;
-            __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           }
           __pyx_t_3 = ((PyObject *)PyList_AsTuple(__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -21555,7 +20182,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_cur_scope->__pyx_v_ngram = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":86
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":86
  *                     if valid:
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])
  *                         yield i, n+1, ngram             # <<<<<<<<<<<<<<
@@ -21567,7 +20194,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_t_1 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_n + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
           PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
@@ -21583,7 +20210,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __Pyx_XGIVEREF(__pyx_r);
           __Pyx_RefNannyFinishContext();
           /* return from generator, yielding value */
-          __pyx_generator->resume_label = 1;
+          __pyx_cur_scope->__pyx_base.resume_label = 1;
           return __pyx_r;
           __pyx_L26_resume_from_yield:;
           __pyx_t_2 = __pyx_cur_scope->__pyx_t_0;
@@ -21592,7 +20219,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
         }
         __pyx_L23:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":87
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":87
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])
  *                         yield i, n+1, ngram
  *                     iii = iii + 1             # <<<<<<<<<<<<<<
@@ -21601,7 +20228,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         __pyx_cur_scope->__pyx_v_iii = (__pyx_cur_scope->__pyx_v_iii + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":88
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":88
  *                         yield i, n+1, ngram
  *                     iii = iii + 1
  *                     rs = ngram_start.arr[iii]             # <<<<<<<<<<<<<<
@@ -21611,14 +20238,14 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
       }
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":89
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":89
  *                     iii = iii + 1
  *                     rs = ngram_start.arr[iii]
  *             i = ii             # <<<<<<<<<<<<<<
  */
     __pyx_cur_scope->__pyx_v_i = __pyx_cur_scope->__pyx_v_ii;
   }
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -21627,27 +20254,12 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __Pyx_AddTraceback("compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
-  __pyx_r = __pyx_pf_3_sa_8Alphabet___cinit__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":12
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":12
  *     cdef dict id2sym
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -21655,16 +20267,20 @@ static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.nonterminals = StringMap()
  */
 
-static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
+static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_RefNannySetupContext("__cinit__");
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":13
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":13
  * 
  *     def __cinit__(self):
  *         self.terminals = StringMap()             # <<<<<<<<<<<<<<
@@ -21674,12 +20290,12 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->terminals);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->terminals));
-  __pyx_v_self->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals));
+  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":14
  *     def __cinit__(self):
  *         self.terminals = StringMap()
  *         self.nonterminals = StringMap()             # <<<<<<<<<<<<<<
@@ -21689,12 +20305,12 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->nonterminals);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->nonterminals));
-  __pyx_v_self->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals));
+  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":15
  *         self.terminals = StringMap()
  *         self.nonterminals = StringMap()
  *         self.id2sym = {}             # <<<<<<<<<<<<<<
@@ -21704,19 +20320,19 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->id2sym);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->id2sym));
-  __pyx_v_self->id2sym = __pyx_t_1;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym));
+  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":16
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":16
  *         self.nonterminals = StringMap()
  *         self.id2sym = {}
  *         self.first_nonterminal = -1             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  __pyx_v_self->first_nonterminal = -1;
+  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->first_nonterminal = -1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -21729,16 +20345,7 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_8Alphabet_2__dealloc__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":18
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":18
  *         self.first_nonterminal = -1
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -21746,14 +20353,15 @@ static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
+static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":21
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":21
  *         pass
  * 
  *     cdef int isvar(self, int sym):             # <<<<<<<<<<<<<<
@@ -21761,12 +20369,12 @@ static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_isvar(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("isvar", 0);
+  __Pyx_RefNannySetupContext("isvar");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":22
  * 
  *     cdef int isvar(self, int sym):
  *         return sym < 0             # <<<<<<<<<<<<<<
@@ -21782,7 +20390,7 @@ static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alph
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":24
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":24
  *         return sym < 0
  * 
  *     cdef int isword(self, int sym):             # <<<<<<<<<<<<<<
@@ -21790,12 +20398,12 @@ static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alph
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_isword(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("isword", 0);
+  __Pyx_RefNannySetupContext("isword");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":25
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":25
  * 
  *     cdef int isword(self, int sym):
  *         return sym >= 0             # <<<<<<<<<<<<<<
@@ -21811,7 +20419,7 @@ static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alp
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":27
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":27
  *         return sym >= 0
  * 
  *     cdef int getindex(self, int sym):             # <<<<<<<<<<<<<<
@@ -21819,12 +20427,12 @@ static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alp
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_getindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getindex", 0);
+  __Pyx_RefNannySetupContext("getindex");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":28
  * 
  *     cdef int getindex(self, int sym):
  *         return -sym & INDEX_MASK             # <<<<<<<<<<<<<<
@@ -21840,7 +20448,7 @@ static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":30
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":30
  *         return -sym & INDEX_MASK
  * 
  *     cdef int setindex(self, int sym, int ind):             # <<<<<<<<<<<<<<
@@ -21848,12 +20456,12 @@ static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym, int __pyx_v_ind) {
+static int __pyx_f_3_sa_8Alphabet_setindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym, int __pyx_v_ind) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("setindex", 0);
+  __Pyx_RefNannySetupContext("setindex");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":31
  * 
  *     cdef int setindex(self, int sym, int ind):
  *         return -(-sym & ~INDEX_MASK | ind)             # <<<<<<<<<<<<<<
@@ -21869,7 +20477,7 @@ static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":33
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":33
  *         return -(-sym & ~INDEX_MASK | ind)
  * 
  *     cdef int clearindex(self, int sym):             # <<<<<<<<<<<<<<
@@ -21877,12 +20485,12 @@ static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_clearindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("clearindex", 0);
+  __Pyx_RefNannySetupContext("clearindex");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":34
  * 
  *     cdef int clearindex(self, int sym):
  *         return -(-sym& ~INDEX_MASK)             # <<<<<<<<<<<<<<
@@ -21898,7 +20506,7 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":36
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":36
  *         return -(-sym& ~INDEX_MASK)
  * 
  *     cdef int match(self, int sym1, int sym2):             # <<<<<<<<<<<<<<
@@ -21909,9 +20517,9 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa
 static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym1, int __pyx_v_sym2) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("match", 0);
+  __Pyx_RefNannySetupContext("match");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":37
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":37
  * 
  *     cdef int match(self, int sym1, int sym2):
  *         return self.clearindex(sym1) == self.clearindex(sym2);             # <<<<<<<<<<<<<<
@@ -21927,7 +20535,7 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":39
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":39
  *         return self.clearindex(sym1) == self.clearindex(sym2);
  * 
  *     cdef char* tocat(self, int sym):             # <<<<<<<<<<<<<<
@@ -21938,9 +20546,9 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
 static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("tocat", 0);
+  __Pyx_RefNannySetupContext("tocat");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":40
  * 
  *     cdef char* tocat(self, int sym):
  *         return self.nonterminals.word((-sym >> INDEX_SHIFT)-1)             # <<<<<<<<<<<<<<
@@ -21956,7 +20564,7 @@ static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":42
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":42
  *         return self.nonterminals.word((-sym >> INDEX_SHIFT)-1)
  * 
  *     cdef int fromcat(self, char *s):             # <<<<<<<<<<<<<<
@@ -21969,9 +20577,9 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("fromcat", 0);
+  __Pyx_RefNannySetupContext("fromcat");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":44
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":44
  *     cdef int fromcat(self, char *s):
  *         cdef int i
  *         i = self.nonterminals.index(s)             # <<<<<<<<<<<<<<
@@ -21980,7 +20588,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
  */
   __pyx_v_i = ((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_self->nonterminals->__pyx_vtab)->index(__pyx_v_self->nonterminals, __pyx_v_s);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":45
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":45
  *         cdef int i
  *         i = self.nonterminals.index(s)
  *         if self.first_nonterminal == -1:             # <<<<<<<<<<<<<<
@@ -21990,7 +20598,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   __pyx_t_1 = (__pyx_v_self->first_nonterminal == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":46
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":46
  *         i = self.nonterminals.index(s)
  *         if self.first_nonterminal == -1:
  *             self.first_nonterminal = i             # <<<<<<<<<<<<<<
@@ -22002,7 +20610,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":47
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":47
  *         if self.first_nonterminal == -1:
  *             self.first_nonterminal = i
  *         if i > self.last_nonterminal:             # <<<<<<<<<<<<<<
@@ -22012,7 +20620,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   __pyx_t_1 = (__pyx_v_i > __pyx_v_self->last_nonterminal);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":48
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":48
  *             self.first_nonterminal = i
  *         if i > self.last_nonterminal:
  *             self.last_nonterminal = i             # <<<<<<<<<<<<<<
@@ -22024,7 +20632,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":49
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":49
  *         if i > self.last_nonterminal:
  *             self.last_nonterminal = i
  *         return -(i+1 << INDEX_SHIFT)             # <<<<<<<<<<<<<<
@@ -22040,7 +20648,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":51
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":51
  *         return -(i+1 << INDEX_SHIFT)
  * 
  *     cdef char* tostring(self, int sym):             # <<<<<<<<<<<<<<
@@ -22061,9 +20669,9 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("tostring", 0);
+  __Pyx_RefNannySetupContext("tostring");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":53
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":53
  *     cdef char* tostring(self, int sym):
  *         cdef int ind
  *         if self.isvar(sym):             # <<<<<<<<<<<<<<
@@ -22073,7 +20681,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_self->__pyx_vtab)->isvar(__pyx_v_self, __pyx_v_sym);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":54
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":54
  *         cdef int ind
  *         if self.isvar(sym):
  *             if sym in self.id2sym:             # <<<<<<<<<<<<<<
@@ -22083,24 +20691,19 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_2 = PyInt_FromLong(__pyx_v_sym); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
-      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
     }
-    __pyx_t_3 = (__Pyx_PyDict_Contains(__pyx_t_2, ((PyObject *)__pyx_v_self->id2sym), Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = ((PyDict_Contains(((PyObject *)__pyx_v_self->id2sym), __pyx_t_2))); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":55
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":55
  *         if self.isvar(sym):
  *             if sym in self.id2sym:
  *                 return self.id2sym[sym]             # <<<<<<<<<<<<<<
  *             ind = self.getindex(sym)
  *             if ind > 0:
  */
-      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
       __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_4 = PyBytes_AsString(__pyx_t_2); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -22111,7 +20714,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":56
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":56
  *             if sym in self.id2sym:
  *                 return self.id2sym[sym]
  *             ind = self.getindex(sym)             # <<<<<<<<<<<<<<
@@ -22120,7 +20723,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_ind = ((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_self->__pyx_vtab)->getindex(__pyx_v_self, __pyx_v_sym);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":57
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":57
  *                 return self.id2sym[sym]
  *             ind = self.getindex(sym)
  *             if ind > 0:             # <<<<<<<<<<<<<<
@@ -22130,7 +20733,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_3 = (__pyx_v_ind > 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":58
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":58
  *             ind = self.getindex(sym)
  *             if ind > 0:
  *                 self.id2sym[sym] = "[%s,%d]" % (self.tocat(sym), ind)             # <<<<<<<<<<<<<<
@@ -22142,7 +20745,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_5 = PyInt_FromLong(__pyx_v_ind); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -22152,17 +20755,13 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_64), ((PyObject *)__pyx_t_6)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
-      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
       if (__Pyx_SetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, ((PyObject *)__pyx_t_5), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":60
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":60
  *                 self.id2sym[sym] = "[%s,%d]" % (self.tocat(sym), ind)
  *             else:
  *                 self.id2sym[sym] = "[%s]" % self.tocat(sym)             # <<<<<<<<<<<<<<
@@ -22174,26 +20773,18 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_65), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
       if (__Pyx_SetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, ((PyObject *)__pyx_t_6), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":61
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":61
  *             else:
  *                 self.id2sym[sym] = "[%s]" % self.tocat(sym)
  *             return self.id2sym[sym]             # <<<<<<<<<<<<<<
  *         else:
  *             return self.terminals.word(sym)
  */
-    if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
     __pyx_t_6 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, sizeof(int), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_4 = PyBytes_AsString(__pyx_t_6); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -22204,7 +20795,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":63
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":63
  *             return self.id2sym[sym]
  *         else:
  *             return self.terminals.word(sym)             # <<<<<<<<<<<<<<
@@ -22229,7 +20820,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":65
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":65
  *             return self.terminals.word(sym)
  * 
  *     cdef int fromstring(self, char *s, bint terminal):             # <<<<<<<<<<<<<<
@@ -22255,9 +20846,9 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("fromstring", 0);
+  __Pyx_RefNannySetupContext("fromstring");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":69
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":69
  *         cdef char *comma
  *         cdef int n
  *         n = strlen(s)             # <<<<<<<<<<<<<<
@@ -22266,7 +20857,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
   __pyx_v_n = strlen(__pyx_v_s);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":71
  *         n = strlen(s)
  *         cdef char *sep
  *         sep = strstr(s,"_SEP_")             # <<<<<<<<<<<<<<
@@ -22275,7 +20866,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
   __pyx_v_sep = strstr(__pyx_v_s, __pyx_k___SEP_);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":72
  *         cdef char *sep
  *         sep = strstr(s,"_SEP_")
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:             # <<<<<<<<<<<<<<
@@ -22303,7 +20894,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":73
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":73
  *         sep = strstr(s,"_SEP_")
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:
  *             if terminal:             # <<<<<<<<<<<<<<
@@ -22312,7 +20903,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     if (__pyx_v_terminal) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":74
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":74
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:
  *             if terminal:
  *                 s1 = "\\"+s             # <<<<<<<<<<<<<<
@@ -22327,7 +20918,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_v_s1 = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":75
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":75
  *             if terminal:
  *                 s1 = "\\"+s
  *                 return self.terminals.index(s1)             # <<<<<<<<<<<<<<
@@ -22341,7 +20932,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":76
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":76
  *                 s1 = "\\"+s
  *                 return self.terminals.index(s1)
  *             s[n-1] = c'\0'             # <<<<<<<<<<<<<<
@@ -22350,7 +20941,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     (__pyx_v_s[(__pyx_v_n - 1)]) = '\x00';
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":77
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":77
  *                 return self.terminals.index(s1)
  *             s[n-1] = c'\0'
  *             s = s + 1             # <<<<<<<<<<<<<<
@@ -22359,7 +20950,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_s = (__pyx_v_s + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":78
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":78
  *             s[n-1] = c'\0'
  *             s = s + 1
  *             comma = strrchr(s, c',')             # <<<<<<<<<<<<<<
@@ -22368,7 +20959,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_comma = strrchr(__pyx_v_s, ',');
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":79
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":79
  *             s = s + 1
  *             comma = strrchr(s, c',')
  *             if comma != NULL:             # <<<<<<<<<<<<<<
@@ -22378,7 +20969,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_2 = (__pyx_v_comma != NULL);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":80
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":80
  *             comma = strrchr(s, c',')
  *             if comma != NULL:
  *                 comma[0] = c'\0'             # <<<<<<<<<<<<<<
@@ -22387,7 +20978,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
       (__pyx_v_comma[0]) = '\x00';
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":81
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":81
  *             if comma != NULL:
  *                 comma[0] = c'\0'
  *                 return self.setindex(self.fromcat(s), strtol(comma+1, NULL, 10))             # <<<<<<<<<<<<<<
@@ -22400,7 +20991,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":83
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":83
  *                 return self.setindex(self.fromcat(s), strtol(comma+1, NULL, 10))
  *             else:
  *                 return self.fromcat(s)             # <<<<<<<<<<<<<<
@@ -22415,7 +21006,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":85
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":85
  *                 return self.fromcat(s)
  *         else:
  *             return self.terminals.index(s)             # <<<<<<<<<<<<<<
@@ -22440,18 +21031,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_8Alphabet_9terminals___get__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":8
  * 
  * cdef class Alphabet:
  *     cdef readonly StringMap terminals, nonterminals             # <<<<<<<<<<<<<<
@@ -22459,13 +21039,14 @@ static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_s
  *     cdef dict id2sym
  */
 
-static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->terminals));
-  __pyx_r = ((PyObject *)__pyx_v_self->terminals);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals));
+  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -22475,24 +21056,14 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_8Alphabet_12nonterminals___get__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->nonterminals));
-  __pyx_r = ((PyObject *)__pyx_v_self->nonterminals);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals));
+  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -22502,7 +21073,7 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":89
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":89
  * cdef Alphabet ALPHABET = Alphabet()
  * 
  * cdef char* sym_tostring(int sym):             # <<<<<<<<<<<<<<
@@ -22513,9 +21084,9 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj
 static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_tostring", 0);
+  __Pyx_RefNannySetupContext("sym_tostring");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":90
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":90
  * 
  * cdef char* sym_tostring(int sym):
  *     return ALPHABET.tostring(sym)             # <<<<<<<<<<<<<<
@@ -22531,7 +21102,7 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":92
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":92
  *     return ALPHABET.tostring(sym)
  * 
  * cdef char* sym_tocat(int sym):             # <<<<<<<<<<<<<<
@@ -22542,9 +21113,9 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
 static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_tocat", 0);
+  __Pyx_RefNannySetupContext("sym_tocat");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":93
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":93
  * 
  * cdef char* sym_tocat(int sym):
  *     return ALPHABET.tocat(sym)             # <<<<<<<<<<<<<<
@@ -22560,7 +21131,7 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":95
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":95
  *     return ALPHABET.tocat(sym)
  * 
  * cdef int sym_isvar(int sym):             # <<<<<<<<<<<<<<
@@ -22571,9 +21142,9 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_isvar", 0);
+  __Pyx_RefNannySetupContext("sym_isvar");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":96
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":96
  * 
  * cdef int sym_isvar(int sym):
  *     return ALPHABET.isvar(sym)             # <<<<<<<<<<<<<<
@@ -22589,7 +21160,7 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":98
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":98
  *     return ALPHABET.isvar(sym)
  * 
  * cdef int sym_getindex(int sym):             # <<<<<<<<<<<<<<
@@ -22600,9 +21171,9 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_getindex", 0);
+  __Pyx_RefNannySetupContext("sym_getindex");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":99
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":99
  * 
  * cdef int sym_getindex(int sym):
  *     return ALPHABET.getindex(sym)             # <<<<<<<<<<<<<<
@@ -22618,7 +21189,7 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":101
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":101
  *     return ALPHABET.getindex(sym)
  * 
  * cdef int sym_setindex(int sym, int id):             # <<<<<<<<<<<<<<
@@ -22629,9 +21200,9 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_setindex", 0);
+  __Pyx_RefNannySetupContext("sym_setindex");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":102
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":102
  * 
  * cdef int sym_setindex(int sym, int id):
  *     return ALPHABET.setindex(sym, id)             # <<<<<<<<<<<<<<
@@ -22647,40 +21218,52 @@ static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_3sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_3sym_fromstring = {__Pyx_NAMESTR("sym_fromstring"), (PyCFunction)__pyx_pw_3_sa_3sym_fromstring, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pw_3_sa_3sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
+ *     return ALPHABET.setindex(sym, id)
+ * 
+ * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
+ *     return ALPHABET.fromstring(string, terminal)
+ */
+
+static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_1sym_fromstring = {__Pyx_NAMESTR("sym_fromstring"), (PyCFunction)__pyx_pf_3_sa_1sym_fromstring, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_string;
   int __pyx_v_terminal;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_fromstring (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__string,&__pyx_n_s__terminal,0};
+  __Pyx_RefNannySetupContext("sym_fromstring");
+  __pyx_self = __pyx_self;
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__string,&__pyx_n_s__terminal,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__string)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__string);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__terminal)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__terminal);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("sym_fromstring", 1, 2, 2, 1); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "sym_fromstring") < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "sym_fromstring") < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -22699,28 +21282,8 @@ static PyObject *__pyx_pw_3_sa_3sym_fromstring(PyObject *__pyx_self, PyObject *_
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_2sym_fromstring(__pyx_self, __pyx_v_string, __pyx_v_terminal);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":104
- *     return ALPHABET.setindex(sym, id)
- * 
- * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
- *     return ALPHABET.fromstring(string, terminal)
- */
-
-static PyObject *__pyx_pf_3_sa_2sym_fromstring(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_string, int __pyx_v_terminal) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sym_fromstring", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":105
  * 
  * def sym_fromstring(char* string, bint terminal):
  *     return ALPHABET.fromstring(string, terminal)             # <<<<<<<<<<<<<<
@@ -22744,32 +21307,50 @@ static PyObject *__pyx_pf_3_sa_2sym_fromstring(CYTHON_UNUSED PyObject *__pyx_sel
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":6
+ * cdef class Phrase:
+ * 
+ *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
+ *         cdef int i, j, n, n_vars
+ *         n_vars = 0
+ */
+
+static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_words = 0;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_n;
+  int __pyx_v_n_vars;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  Py_ssize_t __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__words,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__words,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__words)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__words);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -22786,36 +21367,8 @@ static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_6Phrase___cinit__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_v_words);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":6
- * cdef class Phrase:
- * 
- *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
- *         cdef int i, j, n, n_vars
- *         n_vars = 0
- */
-
-static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_words) {
-  int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_n;
-  int __pyx_v_n_vars;
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":8
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":8
  *     def __cinit__(self, words):
  *         cdef int i, j, n, n_vars
  *         n_vars = 0             # <<<<<<<<<<<<<<
@@ -22824,7 +21377,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_n_vars = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":9
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":9
  *         cdef int i, j, n, n_vars
  *         n_vars = 0
  *         n = len(words)             # <<<<<<<<<<<<<<
@@ -22834,16 +21387,16 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __pyx_t_1 = PyObject_Length(__pyx_v_words); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_n = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":10
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":10
  *         n_vars = 0
  *         n = len(words)
  *         self.syms = <int *>malloc(n*sizeof(int))             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]
  */
-  __pyx_v_self->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
+  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":11
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":11
  *         n = len(words)
  *         self.syms = <int *>malloc(n*sizeof(int))
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -22853,7 +21406,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __pyx_t_2 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":12
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":12
  *         self.syms = <int *>malloc(n*sizeof(int))
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]             # <<<<<<<<<<<<<<
@@ -22864,19 +21417,19 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    (__pyx_v_self->syms[__pyx_v_i]) = __pyx_t_4;
+    (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":13
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":13
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
  *                 n_vars += 1
  *         self.n = n
  */
-    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
+    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":14
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":14
  *             self.syms[i] = words[i]
  *             if sym_isvar(self.syms[i]):
  *                 n_vars += 1             # <<<<<<<<<<<<<<
@@ -22884,39 +21437,39 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *         self.n_vars = n_vars
  */
       __pyx_v_n_vars = (__pyx_v_n_vars + 1);
-      goto __pyx_L5;
+      goto __pyx_L8;
     }
-    __pyx_L5:;
+    __pyx_L8:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":15
  *             if sym_isvar(self.syms[i]):
  *                 n_vars += 1
  *         self.n = n             # <<<<<<<<<<<<<<
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  */
-  __pyx_v_self->n = __pyx_v_n;
+  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n = __pyx_v_n;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":16
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":16
  *                 n_vars += 1
  *         self.n = n
  *         self.n_vars = n_vars             # <<<<<<<<<<<<<<
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0
  */
-  __pyx_v_self->n_vars = __pyx_v_n_vars;
+  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars = __pyx_v_n_vars;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":17
  *         self.n = n
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))             # <<<<<<<<<<<<<<
  *         j = 0
  *         for i from 0 <= i < n:
  */
-  __pyx_v_self->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
+  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":18
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0             # <<<<<<<<<<<<<<
@@ -22925,7 +21478,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_j = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":19
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":19
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -22935,26 +21488,26 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __pyx_t_2 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":20
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":20
  *         j = 0
  *         for i from 0 <= i < n:
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
  *                 self.varpos[j] = i
  *                 j = j + 1
  */
-    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
+    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":21
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":21
  *         for i from 0 <= i < n:
  *             if sym_isvar(self.syms[i]):
  *                 self.varpos[j] = i             # <<<<<<<<<<<<<<
  *                 j = j + 1
  * 
  */
-      (__pyx_v_self->varpos[__pyx_v_j]) = __pyx_v_i;
+      (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_v_j]) = __pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":22
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":22
  *             if sym_isvar(self.syms[i]):
  *                 self.varpos[j] = i
  *                 j = j + 1             # <<<<<<<<<<<<<<
@@ -22962,9 +21515,9 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *     def __dealloc__(self):
  */
       __pyx_v_j = (__pyx_v_j + 1);
-      goto __pyx_L8;
+      goto __pyx_L11;
     }
-    __pyx_L8:;
+    __pyx_L11:;
   }
 
   __pyx_r = 0;
@@ -22978,16 +21531,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_6Phrase_2__dealloc__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":24
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":24
  *                 j = j + 1
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -22995,43 +21539,33 @@ static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self) {
  *         free(self.varpos)
  */
 
-static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":25
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":25
  * 
  *     def __dealloc__(self):
  *         free(self.syms)             # <<<<<<<<<<<<<<
  *         free(self.varpos)
  * 
  */
-  free(__pyx_v_self->syms);
+  free(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":26
  *     def __dealloc__(self):
  *         free(self.syms)
  *         free(self.varpos)             # <<<<<<<<<<<<<<
  * 
  *     def __str__(self):
  */
-  free(__pyx_v_self->varpos);
+  free(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_4__str__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":28
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":28
  *         free(self.varpos)
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -23039,7 +21573,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self) {
  *         cdef int i, s
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   PyObject *__pyx_v_strs = NULL;
   int __pyx_v_i;
   int __pyx_v_s;
@@ -23053,9 +21588,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__", 0);
+  __Pyx_RefNannySetupContext("__str__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":29
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":29
  * 
  *     def __str__(self):
  *         strs = []             # <<<<<<<<<<<<<<
@@ -23063,43 +21598,46 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
  *         for i from 0 <= i < self.n:
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":31
  *         strs = []
  *         cdef int i, s
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))
  */
-  __pyx_t_2 = __pyx_v_self->n;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":32
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":32
  *         cdef int i, s
  *         for i from 0 <= i < self.n:
  *             s = self.syms[i]             # <<<<<<<<<<<<<<
  *             strs.append(sym_tostring(s))
  *         return ' '.join(strs)
  */
-    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_i]);
+    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":33
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":33
  *         for i from 0 <= i < self.n:
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))             # <<<<<<<<<<<<<<
  *         return ' '.join(strs)
  * 
  */
+    if (unlikely(((PyObject *)__pyx_v_strs) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_v_s)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_3 = PyList_Append(__pyx_v_strs, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":34
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))
  *         return ' '.join(strs)             # <<<<<<<<<<<<<<
@@ -23110,7 +21648,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_INCREF(((PyObject *)__pyx_v_strs));
   PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_strs));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_strs));
@@ -23137,19 +21675,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static char __pyx_doc_3_sa_6Phrase_6handle[] = "return a hashable representation that normalizes the ordering\n        of the nonterminal indices";
-static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("handle (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_6handle(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":36
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":36
  *         return ' '.join(strs)
  * 
  *     def handle(self):             # <<<<<<<<<<<<<<
@@ -23157,7 +21683,9 @@ static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UN
  *         of the nonterminal indices"""
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_3_sa_6Phrase_3handle[] = "return a hashable representation that normalizes the ordering\n        of the nonterminal indices";
+static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_v_norm = NULL;
   int __pyx_v_i;
   int __pyx_v_j;
@@ -23171,9 +21699,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("handle", 0);
+  __Pyx_RefNannySetupContext("handle");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":39
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":39
  *         """return a hashable representation that normalizes the ordering
  *         of the nonterminal indices"""
  *         norm = []             # <<<<<<<<<<<<<<
@@ -23181,11 +21709,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  *         i = 1
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":41
  *         norm = []
  *         cdef int i, j, s
  *         i = 1             # <<<<<<<<<<<<<<
@@ -23194,7 +21722,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  */
   __pyx_v_i = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":42
  *         cdef int i, j, s
  *         i = 1
  *         j = 0             # <<<<<<<<<<<<<<
@@ -23203,26 +21731,26 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  */
   __pyx_v_j = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":43
  *         i = 1
  *         j = 0
  *         for j from 0 <= j < self.n:             # <<<<<<<<<<<<<<
  *             s = self.syms[j]
  *             if sym_isvar(s):
  */
-  __pyx_t_2 = __pyx_v_self->n;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":44
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":44
  *         j = 0
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]             # <<<<<<<<<<<<<<
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  */
-    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
+    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":45
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":45
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]
  *             if sym_isvar(s):             # <<<<<<<<<<<<<<
@@ -23232,7 +21760,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
     __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_v_s);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":46
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":46
  *             s = self.syms[j]
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)             # <<<<<<<<<<<<<<
@@ -23241,7 +21769,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  */
       __pyx_v_s = __pyx_f_3_sa_sym_setindex(__pyx_v_s, __pyx_v_i);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":47
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":47
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  *                 i = i + 1             # <<<<<<<<<<<<<<
@@ -23249,24 +21777,27 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  *         return tuple(norm)
  */
       __pyx_v_i = (__pyx_v_i + 1);
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":48
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":48
  *                 s = sym_setindex(s,i)
  *                 i = i + 1
  *             norm.append(s)             # <<<<<<<<<<<<<<
  *         return tuple(norm)
  * 
  */
+    if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_1 = PyInt_FromLong(__pyx_v_s); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyList_Append(__pyx_v_norm, __pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":49
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":49
  *                 i = i + 1
  *             norm.append(s)
  *         return tuple(norm)             # <<<<<<<<<<<<<<
@@ -23274,6 +21805,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  *     def strhandle(self):
  */
   __Pyx_XDECREF(__pyx_r);
+  if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
   __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_v_norm)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_r = ((PyObject *)__pyx_t_1);
@@ -23293,18 +21827,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("strhandle (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_8strhandle(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":51
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":51
  *         return tuple(norm)
  * 
  *     def strhandle(self):             # <<<<<<<<<<<<<<
@@ -23312,8 +21835,9 @@ static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON
  *         norm = []
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
-  CYTHON_UNUSED PyObject *__pyx_v_strs = NULL;
+static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_v_strs = NULL;
   PyObject *__pyx_v_norm = NULL;
   int __pyx_v_i;
   int __pyx_v_j;
@@ -23329,9 +21853,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("strhandle", 0);
+  __Pyx_RefNannySetupContext("strhandle");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":52
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":52
  * 
  *     def strhandle(self):
  *         strs = []             # <<<<<<<<<<<<<<
@@ -23339,11 +21863,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  *         cdef int i, j, s
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":53
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":53
  *     def strhandle(self):
  *         strs = []
  *         norm = []             # <<<<<<<<<<<<<<
@@ -23351,11 +21875,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  *         i = 1
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":55
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":55
  *         norm = []
  *         cdef int i, j, s
  *         i = 1             # <<<<<<<<<<<<<<
@@ -23364,7 +21888,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  */
   __pyx_v_i = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":56
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":56
  *         cdef int i, j, s
  *         i = 1
  *         j = 0             # <<<<<<<<<<<<<<
@@ -23373,26 +21897,26 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  */
   __pyx_v_j = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":57
  *         i = 1
  *         j = 0
  *         for j from 0 <= j < self.n:             # <<<<<<<<<<<<<<
  *             s = self.syms[j]
  *             if sym_isvar(s):
  */
-  __pyx_t_2 = __pyx_v_self->n;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":58
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":58
  *         j = 0
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]             # <<<<<<<<<<<<<<
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  */
-    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
+    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":59
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":59
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]
  *             if sym_isvar(s):             # <<<<<<<<<<<<<<
@@ -23402,7 +21926,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
     __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_v_s);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":60
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":60
  *             s = self.syms[j]
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)             # <<<<<<<<<<<<<<
@@ -23411,7 +21935,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  */
       __pyx_v_s = __pyx_f_3_sa_sym_setindex(__pyx_v_s, __pyx_v_i);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":61
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":61
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  *                 i = i + 1             # <<<<<<<<<<<<<<
@@ -23419,24 +21943,27 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  *         return ' '.join(norm)
  */
       __pyx_v_i = (__pyx_v_i + 1);
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":62
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":62
  *                 s = sym_setindex(s,i)
  *                 i = i + 1
  *             norm.append(sym_tostring(s))             # <<<<<<<<<<<<<<
  *         return ' '.join(norm)
  * 
  */
+    if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_v_s)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyList_Append(__pyx_v_norm, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":63
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":63
  *                 i = i + 1
  *             norm.append(sym_tostring(s))
  *         return ' '.join(norm)             # <<<<<<<<<<<<<<
@@ -23447,7 +21974,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
   __Pyx_INCREF(((PyObject *)__pyx_v_norm));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_norm));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_norm));
@@ -23475,18 +22002,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("arity (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_10arity(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":65
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":65
  *         return ' '.join(norm)
  * 
  *     def arity(self):             # <<<<<<<<<<<<<<
@@ -23494,16 +22010,17 @@ static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UN
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("arity", 0);
+  __Pyx_RefNannySetupContext("arity");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":66
  * 
  *     def arity(self):
  *         return self.n_vars             # <<<<<<<<<<<<<<
@@ -23511,7 +22028,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__p
  *     def getvarpos(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -23529,18 +22046,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getvarpos (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_12getvarpos(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":68
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":68
  *         return self.n_vars
  * 
  *     def getvarpos(self, i):             # <<<<<<<<<<<<<<
@@ -23548,7 +22054,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObj
  *             return self.varpos[i]
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23558,28 +22065,30 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getvarpos", 0);
+  __Pyx_RefNannySetupContext("getvarpos");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":69
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":69
  * 
  *     def getvarpos(self, i):
  *         if 0 <= i < self.n_vars:             # <<<<<<<<<<<<<<
  *             return self.varpos[i]
  *         else:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
     __Pyx_DECREF(__pyx_t_1);
-    __pyx_t_2 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":70
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":70
  *     def getvarpos(self, i):
  *         if 0 <= i < self.n_vars:
  *             return self.varpos[i]             # <<<<<<<<<<<<<<
@@ -23588,16 +22097,16 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->varpos[__pyx_t_4])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_t_4])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":72
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":72
  *             return self.varpos[i]
  *         else:
  *             raise IndexError             # <<<<<<<<<<<<<<
@@ -23607,7 +22116,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
     __Pyx_Raise(__pyx_builtin_IndexError, 0, 0, 0);
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -23622,18 +22131,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getvar (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_14getvar(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":74
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":74
  *             raise IndexError
  * 
  *     def getvar(self, i):             # <<<<<<<<<<<<<<
@@ -23641,7 +22139,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject
  *             return self.syms[self.varpos[i]]
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23651,28 +22150,30 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getvar", 0);
+  __Pyx_RefNannySetupContext("getvar");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":75
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":75
  * 
  *     def getvar(self, i):
  *         if 0 <= i < self.n_vars:             # <<<<<<<<<<<<<<
  *             return self.syms[self.varpos[i]]
  *         else:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
     __Pyx_DECREF(__pyx_t_1);
-    __pyx_t_2 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":76
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":76
  *     def getvar(self, i):
  *         if 0 <= i < self.n_vars:
  *             return self.syms[self.varpos[i]]             # <<<<<<<<<<<<<<
@@ -23681,16 +22182,16 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->syms[(__pyx_v_self->varpos[__pyx_t_4])])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_t_4])])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":78
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":78
  *             return self.syms[self.varpos[i]]
  *         else:
  *             raise IndexError             # <<<<<<<<<<<<<<
@@ -23700,7 +22201,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
     __Pyx_Raise(__pyx_builtin_IndexError, 0, 0, 0);
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -23715,7 +22216,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":80
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":80
  *             raise IndexError
  * 
  *     cdef int chunkpos(self, int k):             # <<<<<<<<<<<<<<
@@ -23727,9 +22228,9 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("chunkpos", 0);
+  __Pyx_RefNannySetupContext("chunkpos");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":81
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":81
  * 
  *     cdef int chunkpos(self, int k):
  *         if k == 0:             # <<<<<<<<<<<<<<
@@ -23739,7 +22240,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":82
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":82
  *     cdef int chunkpos(self, int k):
  *         if k == 0:
  *             return 0             # <<<<<<<<<<<<<<
@@ -23752,7 +22253,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":84
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":84
  *             return 0
  *         else:
  *             return self.varpos[k-1]+1             # <<<<<<<<<<<<<<
@@ -23770,7 +22271,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":86
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":86
  *             return self.varpos[k-1]+1
  * 
  *     cdef int chunklen(self, int k):             # <<<<<<<<<<<<<<
@@ -23782,9 +22283,9 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("chunklen", 0);
+  __Pyx_RefNannySetupContext("chunklen");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":87
  * 
  *     cdef int chunklen(self, int k):
  *         if self.n_vars == 0:             # <<<<<<<<<<<<<<
@@ -23794,7 +22295,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_self->n_vars == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":88
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":88
  *     cdef int chunklen(self, int k):
  *         if self.n_vars == 0:
  *             return self.n             # <<<<<<<<<<<<<<
@@ -23806,7 +22307,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":89
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":89
  *         if self.n_vars == 0:
  *             return self.n
  *         elif k == 0:             # <<<<<<<<<<<<<<
@@ -23816,7 +22317,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":90
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":90
  *             return self.n
  *         elif k == 0:
  *             return self.varpos[0]             # <<<<<<<<<<<<<<
@@ -23828,7 +22329,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":91
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":91
  *         elif k == 0:
  *             return self.varpos[0]
  *         elif k == self.n_vars:             # <<<<<<<<<<<<<<
@@ -23838,7 +22339,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == __pyx_v_self->n_vars);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":92
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":92
  *             return self.varpos[0]
  *         elif k == self.n_vars:
  *             return self.n-self.varpos[k-1]-1             # <<<<<<<<<<<<<<
@@ -23851,7 +22352,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":94
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":94
  *             return self.n-self.varpos[k-1]-1
  *         else:
  *             return self.varpos[k]-self.varpos[k-1]-1             # <<<<<<<<<<<<<<
@@ -23869,18 +22370,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("clen (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_16clen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_k));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":96
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":96
  *             return self.varpos[k]-self.varpos[k-1]-1
  * 
  *     def clen(self, k):             # <<<<<<<<<<<<<<
@@ -23888,7 +22378,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_k) {
+static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -23896,9 +22387,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("clen", 0);
+  __Pyx_RefNannySetupContext("clen");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":97
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":97
  * 
  *     def clen(self, k):
  *          return self.chunklen(k)             # <<<<<<<<<<<<<<
@@ -23907,7 +22398,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__py
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_k); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunklen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -23925,18 +22416,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__py
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getchunk (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_18getchunk(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_ci));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":99
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":99
  *          return self.chunklen(k)
  * 
  *     def getchunk(self, ci):             # <<<<<<<<<<<<<<
@@ -23944,7 +22424,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObje
  *         start = self.chunkpos(ci)
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_ci) {
+static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_chunk = NULL;
@@ -23957,9 +22438,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getchunk", 0);
+  __Pyx_RefNannySetupContext("getchunk");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":101
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":101
  *     def getchunk(self, ci):
  *         cdef int start, stop
  *         start = self.chunkpos(ci)             # <<<<<<<<<<<<<<
@@ -23967,9 +22448,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
  *         chunk = []
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunkpos(__pyx_v_self, __pyx_t_1);
+  __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunkpos(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":102
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":102
  *         cdef int start, stop
  *         start = self.chunkpos(ci)
  *         stop = start+self.chunklen(ci)             # <<<<<<<<<<<<<<
@@ -23977,9 +22458,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
  *         for i from start <= i < stop:
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1));
+  __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunklen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":103
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":103
  *         start = self.chunkpos(ci)
  *         stop = start+self.chunklen(ci)
  *         chunk = []             # <<<<<<<<<<<<<<
@@ -23987,11 +22468,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
  *             chunk.append(self.syms[i])
  */
   __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __pyx_v_chunk = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":104
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":104
  *         stop = start+self.chunklen(ci)
  *         chunk = []
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -24001,20 +22482,23 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   __pyx_t_1 = __pyx_v_stop;
   for (__pyx_v_i = __pyx_v_start; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":105
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":105
  *         chunk = []
  *         for i from start <= i < stop:
  *             chunk.append(self.syms[i])             # <<<<<<<<<<<<<<
  *         return chunk
  * 
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->syms[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_v_chunk) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_3 = PyList_Append(__pyx_v_chunk, __pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":106
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":106
  *         for i from start <= i < stop:
  *             chunk.append(self.syms[i])
  *         return chunk             # <<<<<<<<<<<<<<
@@ -24039,20 +22523,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   return __pyx_r;
 }
 
-/* Python wrapper */
-#if PY_MAJOR_VERSION < 3
-static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cmp__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_20__cmp__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_other));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-#endif /*!(#if PY_MAJOR_VERSION < 3)*/
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":108
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":108
  *         return chunk
  * 
  *     def __cmp__(self, other):             # <<<<<<<<<<<<<<
@@ -24061,7 +22532,8 @@ static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
 
 #if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_other) {
+static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
   struct __pyx_obj_3_sa_Phrase *__pyx_v_otherp = 0;
   int __pyx_v_i;
   int __pyx_r;
@@ -24073,9 +22545,9 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cmp__", 0);
+  __Pyx_RefNannySetupContext("__cmp__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":111
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":111
  *         cdef Phrase otherp
  *         cdef int i
  *         otherp = other             # <<<<<<<<<<<<<<
@@ -24086,7 +22558,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __Pyx_INCREF(__pyx_v_other);
   __pyx_v_otherp = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_other);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":112
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":112
  *         cdef int i
  *         otherp = other
  *         for i from 0 <= i < min(self.n, otherp.n):             # <<<<<<<<<<<<<<
@@ -24094,7 +22566,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *                 return -1
  */
   __pyx_t_1 = __pyx_v_otherp->n;
-  __pyx_t_2 = __pyx_v_self->n;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   if ((__pyx_t_1 < __pyx_t_2)) {
     __pyx_t_3 = __pyx_t_1;
   } else {
@@ -24103,17 +22575,17 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __pyx_t_1 = __pyx_t_3;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":113
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":113
  *         otherp = other
  *         for i from 0 <= i < min(self.n, otherp.n):
  *             if self.syms[i] < otherp.syms[i]:             # <<<<<<<<<<<<<<
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:
  */
-    __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
+    __pyx_t_4 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":114
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":114
  *         for i from 0 <= i < min(self.n, otherp.n):
  *             if self.syms[i] < otherp.syms[i]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -24122,20 +22594,20 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
       __pyx_r = -1;
       goto __pyx_L0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":115
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":115
  *             if self.syms[i] < otherp.syms[i]:
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:             # <<<<<<<<<<<<<<
  *                 return 1
  *         if self.n < otherp.n:
  */
-    __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
+    __pyx_t_4 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":116
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":116
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -24144,22 +22616,22 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
       __pyx_r = 1;
       goto __pyx_L0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":117
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":117
  *             elif self.syms[i] > otherp.syms[i]:
  *                 return 1
  *         if self.n < otherp.n:             # <<<<<<<<<<<<<<
  *             return -1
  *         elif self.n > otherp.n:
  */
-  __pyx_t_4 = (__pyx_v_self->n < __pyx_v_otherp->n);
+  __pyx_t_4 = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n < __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":118
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":118
  *                 return 1
  *         if self.n < otherp.n:
  *             return -1             # <<<<<<<<<<<<<<
@@ -24168,20 +22640,20 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
     __pyx_r = -1;
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L8;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":119
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":119
  *         if self.n < otherp.n:
  *             return -1
  *         elif self.n > otherp.n:             # <<<<<<<<<<<<<<
  *             return 1
  *         else:
  */
-  __pyx_t_4 = (__pyx_v_self->n > __pyx_v_otherp->n);
+  __pyx_t_4 = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n > __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":120
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":120
  *             return -1
  *         elif self.n > otherp.n:
  *             return 1             # <<<<<<<<<<<<<<
@@ -24190,11 +22662,11 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
     __pyx_r = 1;
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L8;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":122
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":122
  *             return 1
  *         else:
  *             return 0             # <<<<<<<<<<<<<<
@@ -24204,7 +22676,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __pyx_r = 0;
     goto __pyx_L0;
   }
-  __pyx_L6:;
+  __pyx_L8:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -24218,18 +22690,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* Python wrapper */
-static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self) {
-  Py_hash_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_22__hash__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":124
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":124
  *             return 0
  * 
  *     def __hash__(self):             # <<<<<<<<<<<<<<
@@ -24237,16 +22698,17 @@ static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self) {
  *         cdef unsigned h
  */
 
-static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self); /*proto*/
+static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
   int __pyx_v_i;
   unsigned int __pyx_v_h;
   Py_hash_t __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("__hash__", 0);
+  __Pyx_RefNannySetupContext("__hash__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":127
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":127
  *         cdef int i
  *         cdef unsigned h
  *         h = 0             # <<<<<<<<<<<<<<
@@ -24255,51 +22717,51 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
  */
   __pyx_v_h = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":128
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":128
  *         cdef unsigned h
  *         h = 0
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             if self.syms[i] > 0:
  *                 h = (h << 1) + self.syms[i]
  */
-  __pyx_t_1 = __pyx_v_self->n;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":129
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":129
  *         h = 0
  *         for i from 0 <= i < self.n:
  *             if self.syms[i] > 0:             # <<<<<<<<<<<<<<
  *                 h = (h << 1) + self.syms[i]
  *             else:
  */
-    __pyx_t_2 = ((__pyx_v_self->syms[__pyx_v_i]) > 0);
+    __pyx_t_2 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) > 0);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":130
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":130
  *         for i from 0 <= i < self.n:
  *             if self.syms[i] > 0:
  *                 h = (h << 1) + self.syms[i]             # <<<<<<<<<<<<<<
  *             else:
  *                 h = (h << 1) + -self.syms[i]
  */
-      __pyx_v_h = ((__pyx_v_h << 1) + (__pyx_v_self->syms[__pyx_v_i]));
-      goto __pyx_L5;
+      __pyx_v_h = ((__pyx_v_h << 1) + (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+      goto __pyx_L7;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":132
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":132
  *                 h = (h << 1) + self.syms[i]
  *             else:
  *                 h = (h << 1) + -self.syms[i]             # <<<<<<<<<<<<<<
  *         return h
  * 
  */
-      __pyx_v_h = ((__pyx_v_h << 1) + (-(__pyx_v_self->syms[__pyx_v_i])));
+      __pyx_v_h = ((__pyx_v_h << 1) + (-(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])));
     }
-    __pyx_L5:;
+    __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":133
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":133
  *             else:
  *                 h = (h << 1) + -self.syms[i]
  *         return h             # <<<<<<<<<<<<<<
@@ -24316,18 +22778,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_24__len__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":135
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":135
  *         return h
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -24335,19 +22786,20 @@ static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":136
  * 
  *     def __len__(self):
  *         return self.n             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, i):
  */
-  __pyx_r = __pyx_v_self->n;
+  __pyx_r = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -24356,18 +22808,7 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_26__getitem__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":138
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":138
  *         return self.n
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -24375,7 +22816,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -24383,9 +22825,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phras
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __Pyx_RefNannySetupContext("__getitem__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":139
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":139
  * 
  *     def __getitem__(self, i):
  *         return self.syms[i]             # <<<<<<<<<<<<<<
@@ -24394,7 +22836,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phras
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->syms[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -24411,20 +22853,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phras
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_28__iter__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":141
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -24432,51 +22863,42 @@ static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self) {
  *         for i from 0 <= i < self.n:
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_28__iter__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_14__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_14__iter__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__", 0);
+  __Pyx_RefNannySetupContext("__iter__");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_4___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_4___iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_6Phrase_30generator2, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_6Phrase_15generator2;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.Phrase.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -24486,24 +22908,24 @@ static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":143
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":143
  *     def __iter__(self):
  *         cdef int i
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             yield self.syms[i]
  * 
  */
-  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->n;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_self)->n;
   for (__pyx_cur_scope->__pyx_v_i = 0; __pyx_cur_scope->__pyx_v_i < __pyx_t_1; __pyx_cur_scope->__pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":144
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":144
  *         cdef int i
  *         for i from 0 <= i < self.n:
  *             yield self.syms[i]             # <<<<<<<<<<<<<<
  * 
  *     def subst(self, start, children):
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->syms[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_self)->syms[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
@@ -24511,58 +22933,74 @@ static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":146
+ *             yield self.syms[i]
+ * 
+ *     def subst(self, start, children):             # <<<<<<<<<<<<<<
+ *         cdef int i
+ *         for i from 0 <= i < self.n:
+ */
+
+static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_children = 0;
-  PyObject *__pyx_r = 0;
+  int __pyx_v_i;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("subst (wrapper)", 0);
+  int __pyx_t_1;
+  int __pyx_t_2;
+  long __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
+  __Pyx_RefNannySetupContext("subst");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("subst", 1, 2, 2, 1); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "subst") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "subst") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -24581,62 +23019,36 @@ static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_6Phrase_31subst(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_v_start, __pyx_v_children);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":146
- *             yield self.syms[i]
- * 
- *     def subst(self, start, children):             # <<<<<<<<<<<<<<
- *         cdef int i
- *         for i from 0 <= i < self.n:
- */
-
-static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_children) {
-  int __pyx_v_i;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  long __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("subst", 0);
   __Pyx_INCREF(__pyx_v_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":148
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":148
  *     def subst(self, start, children):
  *         cdef int i
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             if sym_isvar(self.syms[i]):
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  */
-  __pyx_t_1 = __pyx_v_self->n;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":149
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":149
  *         cdef int i
  *         for i from 0 <= i < self.n:
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  *             else:
  */
-    __pyx_t_2 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
+    __pyx_t_2 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":150
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":150
  *         for i from 0 <= i < self.n:
  *             if sym_isvar(self.syms[i]):
  *                 start = start + children[sym_getindex(self.syms[i])-1]             # <<<<<<<<<<<<<<
  *             else:
  *                 start = start + (self.syms[i],)
  */
-      __pyx_t_3 = (__pyx_f_3_sa_sym_getindex((__pyx_v_self->syms[__pyx_v_i])) - 1);
+      __pyx_t_3 = (__pyx_f_3_sa_sym_getindex((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])) - 1);
       __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_children, __pyx_t_3, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_5 = PyNumber_Add(__pyx_v_start, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -24645,21 +23057,21 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
       __Pyx_DECREF(__pyx_v_start);
       __pyx_v_start = __pyx_t_5;
       __pyx_t_5 = 0;
-      goto __pyx_L5;
+      goto __pyx_L8;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":152
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":152
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  *             else:
  *                 start = start + (self.syms[i],)             # <<<<<<<<<<<<<<
  *         return start
  * 
  */
-      __pyx_t_5 = PyInt_FromLong((__pyx_v_self->syms[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
@@ -24670,10 +23082,10 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
       __pyx_v_start = __pyx_t_5;
       __pyx_t_5 = 0;
     }
-    __pyx_L5:;
+    __pyx_L8:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":153
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":153
  *             else:
  *                 start = start + (self.syms[i],)
  *         return start             # <<<<<<<<<<<<<<
@@ -24699,18 +23111,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_5words___get__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":156
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":156
  * 
  *     property words:
  *         def __get__(self):             # <<<<<<<<<<<<<<
@@ -24718,7 +23119,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_v_w = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -24732,9 +23134,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":157
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":157
  *     property words:
  *         def __get__(self):
  *             return [sym_tostring(w) for w in self if not sym_isvar(w)]             # <<<<<<<<<<<<<<
@@ -24743,30 +23145,22 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyList_CheckExact(((PyObject *)__pyx_v_self)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self))) {
-    __pyx_t_2 = ((PyObject *)__pyx_v_self); __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  if (PyList_CheckExact(__pyx_v_self) || PyTuple_CheckExact(__pyx_v_self)) {
+    __pyx_t_2 = __pyx_v_self; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
+    if (PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
+    } else if (PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
@@ -24787,11 +23181,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-      if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_INCREF(((PyObject *)__pyx_t_1));
@@ -24814,9 +23208,16 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":161
+ * cdef class Rule:
+ * 
+ *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
+ *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
+ *         self.lhs = lhs
+ */
+
+static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_lhs;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_f = 0;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_e = 0;
@@ -24824,24 +23225,21 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
   PyObject *__pyx_v_word_alignments = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
     PyObject* values[5] = {0,0,0,0,0};
-
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":161
- * cdef class Rule:
- * 
- *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
- *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
- *         self.lhs = lhs
- */
     values[3] = ((PyObject *)Py_None);
     values[4] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -24851,17 +23249,20 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lhs)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lhs);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -24877,7 +23278,7 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -24906,27 +23307,8 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_e), __pyx_ptype_3_sa_Phrase, 1, "e", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_4Rule___cinit__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), __pyx_v_lhs, __pyx_v_f, __pyx_v_e, __pyx_v_scores, __pyx_v_word_alignments);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, int __pyx_v_lhs, struct __pyx_obj_3_sa_Phrase *__pyx_v_f, struct __pyx_obj_3_sa_Phrase *__pyx_v_e, PyObject *__pyx_v_scores, PyObject *__pyx_v_word_alignments) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":162
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":162
  * 
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)             # <<<<<<<<<<<<<<
@@ -24941,7 +23323,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -24951,20 +23333,20 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":163
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":163
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
  *         self.lhs = lhs             # <<<<<<<<<<<<<<
  *         self.f = f
  *         self.e = e
  */
-  __pyx_v_self->lhs = __pyx_v_lhs;
+  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs = __pyx_v_lhs;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":164
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":164
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
  *         self.lhs = lhs
  *         self.f = f             # <<<<<<<<<<<<<<
@@ -24973,11 +23355,11 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_f));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_f));
-  __Pyx_GOTREF(__pyx_v_self->f);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
-  __pyx_v_self->f = __pyx_v_f;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f = __pyx_v_f;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":165
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":165
  *         self.lhs = lhs
  *         self.f = f
  *         self.e = e             # <<<<<<<<<<<<<<
@@ -24986,11 +23368,11 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_e));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_e));
-  __Pyx_GOTREF(__pyx_v_self->e);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->e));
-  __pyx_v_self->e = __pyx_v_e;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e = __pyx_v_e;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":166
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":166
  *         self.f = f
  *         self.e = e
  *         self.word_alignments = word_alignments             # <<<<<<<<<<<<<<
@@ -24999,11 +23381,11 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
  */
   __Pyx_INCREF(__pyx_v_word_alignments);
   __Pyx_GIVEREF(__pyx_v_word_alignments);
-  __Pyx_GOTREF(__pyx_v_self->word_alignments);
-  __Pyx_DECREF(__pyx_v_self->word_alignments);
-  __pyx_v_self->word_alignments = __pyx_v_word_alignments;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments = __pyx_v_word_alignments;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":167
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":167
  *         self.e = e
  *         self.word_alignments = word_alignments
  *         self.scores = scores             # <<<<<<<<<<<<<<
@@ -25013,9 +23395,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
   if (!(likely(((__pyx_v_scores) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_scores, __pyx_ptype_3_sa_FeatureVector))))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_scores);
   __Pyx_GIVEREF(__pyx_v_scores);
-  __Pyx_GOTREF(__pyx_v_self->scores);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->scores));
-  __pyx_v_self->scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_scores);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores));
+  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_scores);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -25029,18 +23411,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self) {
-  Py_hash_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_2__hash__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":169
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":169
  *         self.scores = scores
  * 
  *     def __hash__(self):             # <<<<<<<<<<<<<<
@@ -25048,7 +23419,8 @@ static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self); /*proto*/
+static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
   Py_hash_t __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -25057,27 +23429,27 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__hash__", 0);
+  __Pyx_RefNannySetupContext("__hash__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":170
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":170
  * 
  *     def __hash__(self):
  *         return hash((self.lhs, self.f, self.e))             # <<<<<<<<<<<<<<
  * 
  *     def __cmp__(self, Rule other):
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->f));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->f));
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->e));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
   __pyx_t_1 = 0;
   __pyx_t_3 = PyObject_Hash(((PyObject *)__pyx_t_2)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -25097,25 +23469,7 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-#if PY_MAJOR_VERSION < 3
-static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cmp__ (wrapper)", 0);
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_ptype_3_sa_Rule, 1, "other", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_4Rule_4__cmp__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), ((struct __pyx_obj_3_sa_Rule *)__pyx_v_other));
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-#endif /*!(#if PY_MAJOR_VERSION < 3)*/
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":172
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":172
  *         return hash((self.lhs, self.f, self.e))
  * 
  *     def __cmp__(self, Rule other):             # <<<<<<<<<<<<<<
@@ -25124,7 +23478,8 @@ static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
 
 #if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Rule *__pyx_v_other) {
+static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -25134,57 +23489,58 @@ static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cmp__", 0);
+  __Pyx_RefNannySetupContext("__cmp__");
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_ptype_3_sa_Rule, 1, "other", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":173
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":173
  * 
  *     def __cmp__(self, Rule other):
  *         return cmp((self.lhs, self.f, self.e, self.word_alignments),             # <<<<<<<<<<<<<<
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->f));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->f));
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->e));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e));
-  __Pyx_INCREF(__pyx_v_self->word_alignments);
-  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->word_alignments);
-  __Pyx_GIVEREF(__pyx_v_self->word_alignments);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  PyTuple_SET_ITEM(__pyx_t_2, 3, ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_GIVEREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":174
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":174
  *     def __cmp__(self, Rule other):
  *         return cmp((self.lhs, self.f, self.e, self.word_alignments),
  *                 (other.lhs, other.f, other.e, self.word_alignments))             # <<<<<<<<<<<<<<
  * 
  *     def fmerge(self, Phrase f):
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_other->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)__pyx_v_other->f));
-  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_other->f));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_other->f));
-  __Pyx_INCREF(((PyObject *)__pyx_v_other->e));
-  PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)__pyx_v_other->e));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_other->e));
-  __Pyx_INCREF(__pyx_v_self->word_alignments);
-  PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_v_self->word_alignments);
-  __Pyx_GIVEREF(__pyx_v_self->word_alignments);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
+  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
+  PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  PyTuple_SET_ITEM(__pyx_t_3, 3, ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_GIVEREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
   __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_3));
@@ -25213,23 +23569,7 @@ static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("fmerge (wrapper)", 0);
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_4Rule_6fmerge(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_f));
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":176
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":176
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
  *     def fmerge(self, Phrase f):             # <<<<<<<<<<<<<<
@@ -25237,7 +23577,8 @@ static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *_
  *             self.f = f
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Phrase *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -25245,35 +23586,37 @@ static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("fmerge", 0);
+  __Pyx_RefNannySetupContext("fmerge");
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":177
  * 
  *     def fmerge(self, Phrase f):
  *         if self.f == f:             # <<<<<<<<<<<<<<
  *             self.f = f
  * 
  */
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_self->f), ((PyObject *)__pyx_v_f), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f), __pyx_v_f, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":178
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":178
  *     def fmerge(self, Phrase f):
  *         if self.f == f:
  *             self.f = f             # <<<<<<<<<<<<<<
  * 
  *     def arity(self):
  */
-    __Pyx_INCREF(((PyObject *)__pyx_v_f));
-    __Pyx_GIVEREF(((PyObject *)__pyx_v_f));
-    __Pyx_GOTREF(__pyx_v_self->f);
-    __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
-    __pyx_v_self->f = __pyx_v_f;
-    goto __pyx_L3;
+    __Pyx_INCREF(__pyx_v_f);
+    __Pyx_GIVEREF(__pyx_v_f);
+    __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
+    __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+    ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_f);
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -25287,18 +23630,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("arity (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_8arity(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":180
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":180
  *             self.f = f
  * 
  *     def arity(self):             # <<<<<<<<<<<<<<
@@ -25306,7 +23638,8 @@ static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSE
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -25314,9 +23647,9 @@ static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("arity", 0);
+  __Pyx_RefNannySetupContext("arity");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":181
  * 
  *     def arity(self):
  *         return self.f.arity()             # <<<<<<<<<<<<<<
@@ -25324,7 +23657,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_
  *     def __str__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->f), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -25345,20 +23678,9 @@ static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
+static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_10__str__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
@@ -25366,53 +23688,45 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_7__str___genexpr(PyObject *__pyx_self) {
+static PyObject *__pyx_pf_3_sa_7__str___genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_7__str___genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("genexpr", 0);
+  __Pyx_RefNannySetupContext("genexpr");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *) __pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)__pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_7__str___2generator7, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_self = __pyx_self;
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7__str___1generator7;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.Rule.__str__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   Py_ssize_t __pyx_t_3;
   PyObject *(*__pyx_t_4)(PyObject *);
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -25421,8 +23735,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self), __pyx_n_s__alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self, __pyx_n_s__alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -25437,20 +23750,12 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   for (;;) {
-    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
     } else {
       __pyx_t_2 = __pyx_t_4(__pyx_t_1);
       if (unlikely(!__pyx_t_2)) {
@@ -25478,7 +23783,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -25489,7 +23794,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -25497,13 +23802,12 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":183
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":183
  *         return self.f.arity()
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -25511,7 +23815,8 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *__pyx_cur_scope;
   PyObject *__pyx_v_fields = NULL;
   PyObject *__pyx_r = NULL;
@@ -25526,52 +23831,52 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__", 0);
+  __Pyx_RefNannySetupContext("__str__");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_5___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_5___str__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":185
  *     def __str__(self):
  *         cdef unsigned i
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]             # <<<<<<<<<<<<<<
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  */
-  __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_cur_scope->__pyx_v_self->lhs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->lhs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
-  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
   __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
-  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
   __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
-  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
   __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyList_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
@@ -25587,29 +23892,32 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   __pyx_v_fields = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":186
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":186
  *         cdef unsigned i
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:             # <<<<<<<<<<<<<<
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  *         return ' ||| '.join(fields)
  */
-  __pyx_t_6 = (__pyx_cur_scope->__pyx_v_self->word_alignments != Py_None);
+  __pyx_t_6 = (((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments != Py_None);
   if (__pyx_t_6) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
  *         return ' ||| '.join(fields)
  * 
  */
+    if (unlikely(((PyObject *)__pyx_v_fields) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_5 = __pyx_pf_3_sa_4Rule_7__str___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __pyx_pf_3_sa_7__str___genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
@@ -25619,11 +23927,11 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_t_7 = PyList_Append(__pyx_v_fields, __pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":188
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":188
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  *         return ' ||| '.join(fields)             # <<<<<<<<<<<<<<
@@ -25634,7 +23942,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_18), __pyx_n_s__join); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_INCREF(((PyObject *)__pyx_v_fields));
   PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_fields));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fields));
@@ -25663,20 +23971,9 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("alignments (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_12alignments(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":190
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
  * 
  *     def alignments(self):             # <<<<<<<<<<<<<<
@@ -25684,45 +23981,36 @@ static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON
  *             yield point/65536, point%65536
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_12alignments(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_6alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_6alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("alignments", 0);
+  __Pyx_RefNannySetupContext("alignments");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)__pyx_ptype_3_sa___pyx_scope_struct_7_alignments->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_7_alignments, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_14generator3, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_7generator3;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.Rule.alignments", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
@@ -25731,8 +24019,8 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -25742,35 +24030,27 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":191
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":191
  * 
  *     def alignments(self):
  *         for point in self.word_alignments:             # <<<<<<<<<<<<<<
  *             yield point/65536, point%65536
  */
-  if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_self->word_alignments) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_self->word_alignments)) {
-    __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->word_alignments; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments)) {
+    __pyx_t_1 = ((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_self->word_alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -25788,7 +24068,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
     __pyx_cur_scope->__pyx_v_point = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":192
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":192
  *     def alignments(self):
  *         for point in self.word_alignments:
  *             yield point/65536, point%65536             # <<<<<<<<<<<<<<
@@ -25798,7 +24078,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
     __pyx_t_5 = PyNumber_Remainder(__pyx_cur_scope->__pyx_v_point, __pyx_int_65536); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -25814,7 +24094,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -25825,7 +24105,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -25835,23 +24115,11 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
   __Pyx_AddTraceback("alignments", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_1f___get__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "_sa.pxd":37
  * cdef class Rule:
  *     cdef int lhs
@@ -25860,13 +24128,14 @@ static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self) {
  *     cdef int n_scores
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
-  __pyx_r = ((PyObject *)__pyx_v_self->f);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -25876,24 +24145,14 @@ static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__py
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_1e_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_1e_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_1e___get__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
-  __pyx_r = ((PyObject *)__pyx_v_self->e);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -25903,7 +24162,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":21
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":21
  *     int arr_len
  * 
  * cdef _Trie_Node* new_trie_node():             # <<<<<<<<<<<<<<
@@ -25915,9 +24174,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   struct __pyx_t_3_sa__Trie_Node *__pyx_v_node;
   struct __pyx_t_3_sa__Trie_Node *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_trie_node", 0);
+  __Pyx_RefNannySetupContext("new_trie_node");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":23
  * cdef _Trie_Node* new_trie_node():
  *     cdef _Trie_Node* node
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))             # <<<<<<<<<<<<<<
@@ -25926,7 +24185,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node = ((struct __pyx_t_3_sa__Trie_Node *)malloc((sizeof(struct __pyx_t_3_sa__Trie_Node))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":24
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":24
  *     cdef _Trie_Node* node
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))
  *     node.root = NULL             # <<<<<<<<<<<<<<
@@ -25935,7 +24194,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->root = NULL;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":25
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":25
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))
  *     node.root = NULL
  *     node.arr_len = 0             # <<<<<<<<<<<<<<
@@ -25944,7 +24203,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->arr_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":26
  *     node.root = NULL
  *     node.arr_len = 0
  *     node.arr = <int*> malloc(sizeof(0*sizeof(int)))             # <<<<<<<<<<<<<<
@@ -25953,7 +24212,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->arr = ((int *)malloc((sizeof((0 * (sizeof(int)))))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":27
  *     node.arr_len = 0
  *     node.arr = <int*> malloc(sizeof(0*sizeof(int)))
  *     return node             # <<<<<<<<<<<<<<
@@ -25969,7 +24228,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":29
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":29
  *     return node
  * 
  * cdef _Trie_Edge* new_trie_edge(int val):             # <<<<<<<<<<<<<<
@@ -25981,9 +24240,9 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   struct __pyx_t_3_sa__Trie_Edge *__pyx_v_edge;
   struct __pyx_t_3_sa__Trie_Edge *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_trie_edge", 0);
+  __Pyx_RefNannySetupContext("new_trie_edge");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":31
  * cdef _Trie_Edge* new_trie_edge(int val):
  *     cdef _Trie_Edge* edge
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))             # <<<<<<<<<<<<<<
@@ -25992,7 +24251,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge = ((struct __pyx_t_3_sa__Trie_Edge *)malloc((sizeof(struct __pyx_t_3_sa__Trie_Edge))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":32
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":32
  *     cdef _Trie_Edge* edge
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))
  *     edge.node = new_trie_node()             # <<<<<<<<<<<<<<
@@ -26001,7 +24260,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->node = __pyx_f_3_sa_new_trie_node();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":33
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))
  *     edge.node = new_trie_node()
  *     edge.bigger = NULL             # <<<<<<<<<<<<<<
@@ -26010,7 +24269,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->bigger = NULL;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":34
  *     edge.node = new_trie_node()
  *     edge.bigger = NULL
  *     edge.smaller = NULL             # <<<<<<<<<<<<<<
@@ -26019,7 +24278,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->smaller = NULL;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":35
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":35
  *     edge.bigger = NULL
  *     edge.smaller = NULL
  *     edge.val = val             # <<<<<<<<<<<<<<
@@ -26028,7 +24287,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->val = __pyx_v_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":36
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":36
  *     edge.smaller = NULL
  *     edge.val = val
  *     return edge             # <<<<<<<<<<<<<<
@@ -26044,7 +24303,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":38
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":38
  *     return edge
  * 
  * cdef free_trie_node(_Trie_Node* node):             # <<<<<<<<<<<<<<
@@ -26060,9 +24319,9 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("free_trie_node", 0);
+  __Pyx_RefNannySetupContext("free_trie_node");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":39
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":39
  * 
  * cdef free_trie_node(_Trie_Node* node):
  *     if node != NULL:             # <<<<<<<<<<<<<<
@@ -26072,7 +24331,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   __pyx_t_1 = (__pyx_v_node != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":40
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":40
  * cdef free_trie_node(_Trie_Node* node):
  *     if node != NULL:
  *         free_trie_edge(node.root)             # <<<<<<<<<<<<<<
@@ -26083,7 +24342,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":41
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":41
  *     if node != NULL:
  *         free_trie_edge(node.root)
  *         free(node.arr)             # <<<<<<<<<<<<<<
@@ -26107,7 +24366,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":43
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":43
  *         free(node.arr)
  * 
  * cdef free_trie_edge(_Trie_Edge* edge):             # <<<<<<<<<<<<<<
@@ -26123,9 +24382,9 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("free_trie_edge", 0);
+  __Pyx_RefNannySetupContext("free_trie_edge");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":44
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":44
  * 
  * cdef free_trie_edge(_Trie_Edge* edge):
  *     if edge != NULL:             # <<<<<<<<<<<<<<
@@ -26135,7 +24394,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   __pyx_t_1 = (__pyx_v_edge != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":45
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":45
  * cdef free_trie_edge(_Trie_Edge* edge):
  *     if edge != NULL:
  *         free_trie_node(edge.node)             # <<<<<<<<<<<<<<
@@ -26146,7 +24405,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":46
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":46
  *     if edge != NULL:
  *         free_trie_node(edge.node)
  *         free_trie_edge(edge.bigger)             # <<<<<<<<<<<<<<
@@ -26157,7 +24416,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":47
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":47
  *         free_trie_node(edge.node)
  *         free_trie_edge(edge.bigger)
  *         free_trie_edge(edge.smaller)             # <<<<<<<<<<<<<<
@@ -26183,7 +24442,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":49
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":49
  *         free_trie_edge(edge.smaller)
  * 
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -26198,9 +24457,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("trie_find", 0);
+  __Pyx_RefNannySetupContext("trie_find");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":51
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":51
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):
  *     cdef _Trie_Edge* cur
  *     cur = node.root             # <<<<<<<<<<<<<<
@@ -26209,7 +24468,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
  */
   __pyx_v_cur = __pyx_v_node->root;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":52
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":52
  *     cdef _Trie_Edge* cur
  *     cur = node.root
  *     while cur != NULL and cur.val != val:             # <<<<<<<<<<<<<<
@@ -26226,7 +24485,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":53
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":53
  *     cur = node.root
  *     while cur != NULL and cur.val != val:
  *         if val > cur.val:             # <<<<<<<<<<<<<<
@@ -26236,7 +24495,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_t_3 = (__pyx_v_val > __pyx_v_cur->val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":54
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":54
  *     while cur != NULL and cur.val != val:
  *         if val > cur.val:
  *             cur = cur.bigger             # <<<<<<<<<<<<<<
@@ -26247,7 +24506,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
       goto __pyx_L5;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":55
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":55
  *         if val > cur.val:
  *             cur = cur.bigger
  *         elif val < cur.val:             # <<<<<<<<<<<<<<
@@ -26257,7 +24516,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_t_3 = (__pyx_v_val < __pyx_v_cur->val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":56
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":56
  *             cur = cur.bigger
  *         elif val < cur.val:
  *             cur = cur.smaller             # <<<<<<<<<<<<<<
@@ -26270,7 +24529,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_L5:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":57
  *         elif val < cur.val:
  *             cur = cur.smaller
  *     if cur == NULL:             # <<<<<<<<<<<<<<
@@ -26280,7 +24539,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   __pyx_t_3 = (__pyx_v_cur == NULL);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":58
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":58
  *             cur = cur.smaller
  *     if cur == NULL:
  *         return NULL             # <<<<<<<<<<<<<<
@@ -26293,7 +24552,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":60
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":60
  *         return NULL
  *     else:
  *         return cur.node             # <<<<<<<<<<<<<<
@@ -26311,7 +24570,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":62
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":62
  *         return cur.node
  * 
  * cdef trie_node_data_append(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -26323,9 +24582,9 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   int __pyx_v_new_len;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("trie_node_data_append", 0);
+  __Pyx_RefNannySetupContext("trie_node_data_append");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":64
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":64
  * cdef trie_node_data_append(_Trie_Node* node, int val):
  *     cdef int new_len
  *     new_len = node.arr_len + 1             # <<<<<<<<<<<<<<
@@ -26334,7 +24593,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_new_len = (__pyx_v_node->arr_len + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":65
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":65
  *     cdef int new_len
  *     new_len = node.arr_len + 1
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -26343,7 +24602,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_node->arr = ((int *)realloc(__pyx_v_node->arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":66
  *     new_len = node.arr_len + 1
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     node.arr[node.arr_len] = val             # <<<<<<<<<<<<<<
@@ -26352,7 +24611,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   (__pyx_v_node->arr[__pyx_v_node->arr_len]) = __pyx_v_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":67
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":67
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     node.arr[node.arr_len] = val
  *     node.arr_len = new_len             # <<<<<<<<<<<<<<
@@ -26367,7 +24626,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":69
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":69
  *     node.arr_len = new_len
  * 
  * cdef trie_node_data_extend(_Trie_Node* node, int* vals, int num_vals):             # <<<<<<<<<<<<<<
@@ -26379,9 +24638,9 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   int __pyx_v_new_len;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("trie_node_data_extend", 0);
+  __Pyx_RefNannySetupContext("trie_node_data_extend");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":71
  * cdef trie_node_data_extend(_Trie_Node* node, int* vals, int num_vals):
  *     cdef int new_len
  *     new_len = node.arr_len + num_vals             # <<<<<<<<<<<<<<
@@ -26390,7 +24649,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_new_len = (__pyx_v_node->arr_len + __pyx_v_num_vals);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":72
  *     cdef int new_len
  *     new_len = node.arr_len + num_vals
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -26399,7 +24658,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_node->arr = ((int *)realloc(__pyx_v_node->arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":73
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":73
  *     new_len = node.arr_len + num_vals
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     memcpy(node.arr + node.arr_len, vals, num_vals*sizeof(int))             # <<<<<<<<<<<<<<
@@ -26408,7 +24667,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   memcpy((__pyx_v_node->arr + __pyx_v_node->arr_len), __pyx_v_vals, (__pyx_v_num_vals * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":74
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":74
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     memcpy(node.arr + node.arr_len, vals, num_vals*sizeof(int))
  *     node.arr_len = new_len             # <<<<<<<<<<<<<<
@@ -26423,7 +24682,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":77
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":77
  * 
  * 
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -26438,9 +24697,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("trie_insert", 0);
+  __Pyx_RefNannySetupContext("trie_insert");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":79
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":79
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):
  *     cdef _Trie_Edge** cur
  *     cur = &node.root             # <<<<<<<<<<<<<<
@@ -26449,7 +24708,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
  */
   __pyx_v_cur = (&__pyx_v_node->root);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":80
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":80
  *     cdef _Trie_Edge** cur
  *     cur = &node.root
  *     while cur[0] != NULL and cur[0].val != val:             # <<<<<<<<<<<<<<
@@ -26466,7 +24725,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":81
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":81
  *     cur = &node.root
  *     while cur[0] != NULL and cur[0].val != val:
  *         if val > cur[0].val:             # <<<<<<<<<<<<<<
@@ -26476,7 +24735,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_t_3 = (__pyx_v_val > (__pyx_v_cur[0])->val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":82
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":82
  *     while cur[0] != NULL and cur[0].val != val:
  *         if val > cur[0].val:
  *             cur = &cur[0].bigger             # <<<<<<<<<<<<<<
@@ -26487,7 +24746,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
       goto __pyx_L5;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":83
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":83
  *         if val > cur[0].val:
  *             cur = &cur[0].bigger
  *         elif val < cur[0].val:             # <<<<<<<<<<<<<<
@@ -26497,7 +24756,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_t_3 = (__pyx_v_val < (__pyx_v_cur[0])->val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":84
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":84
  *             cur = &cur[0].bigger
  *         elif val < cur[0].val:
  *             cur = &cur[0].smaller             # <<<<<<<<<<<<<<
@@ -26510,7 +24769,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_L5:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":85
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":85
  *         elif val < cur[0].val:
  *             cur = &cur[0].smaller
  *     if cur[0] == NULL:             # <<<<<<<<<<<<<<
@@ -26520,7 +24779,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   __pyx_t_3 = ((__pyx_v_cur[0]) == NULL);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":86
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":86
  *             cur = &cur[0].smaller
  *     if cur[0] == NULL:
  *         cur[0] = new_trie_edge(val)             # <<<<<<<<<<<<<<
@@ -26532,7 +24791,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":87
  *     if cur[0] == NULL:
  *         cur[0] = new_trie_edge(val)
  *     return cur[0].node             # <<<<<<<<<<<<<<
@@ -26548,7 +24807,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":89
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":89
  *     return cur[0].node
  * 
  * cdef trie_node_to_map(_Trie_Node* node, result, prefix, int include_zeros):             # <<<<<<<<<<<<<<
@@ -26566,9 +24825,9 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("trie_node_to_map", 0);
+  __Pyx_RefNannySetupContext("trie_node_to_map");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":92
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":92
  *     cdef IntList arr
  * 
  *     if include_zeros or node.arr_len > 0:             # <<<<<<<<<<<<<<
@@ -26583,7 +24842,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   }
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":93
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":93
  * 
  *     if include_zeros or node.arr_len > 0:
  *         arr = IntList()             # <<<<<<<<<<<<<<
@@ -26595,7 +24854,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":94
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":94
  *     if include_zeros or node.arr_len > 0:
  *         arr = IntList()
  *         free(arr.arr)             # <<<<<<<<<<<<<<
@@ -26604,7 +24863,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     free(__pyx_v_arr->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":95
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":95
  *         arr = IntList()
  *         free(arr.arr)
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -26613,7 +24872,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->arr = ((int *)malloc((__pyx_v_node->arr_len * (sizeof(int)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":96
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":96
  *         free(arr.arr)
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -26622,7 +24881,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     memcpy(__pyx_v_arr->arr, __pyx_v_node->arr, (__pyx_v_node->arr_len * (sizeof(int))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":97
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":97
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))
  *         arr.len = node.arr_len             # <<<<<<<<<<<<<<
@@ -26631,7 +24890,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->len = __pyx_v_node->arr_len;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":98
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":98
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))
  *         arr.len = node.arr_len
  *         arr.size = node.arr_len             # <<<<<<<<<<<<<<
@@ -26640,7 +24899,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->size = __pyx_v_node->arr_len;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":99
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":99
  *         arr.len = node.arr_len
  *         arr.size = node.arr_len
  *         result[prefix] = arr             # <<<<<<<<<<<<<<
@@ -26652,7 +24911,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":100
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":100
  *         arr.size = node.arr_len
  *         result[prefix] = arr
  *     trie_edge_to_map(node.root, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -26676,7 +24935,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":102
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":102
  *     trie_edge_to_map(node.root, result, prefix, include_zeros)
  * 
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):             # <<<<<<<<<<<<<<
@@ -26693,10 +24952,10 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("trie_edge_to_map", 0);
+  __Pyx_RefNannySetupContext("trie_edge_to_map");
   __Pyx_INCREF(__pyx_v_prefix);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":103
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":103
  * 
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):
  *     if edge != NULL:             # <<<<<<<<<<<<<<
@@ -26706,7 +24965,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   __pyx_t_1 = (__pyx_v_edge != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":104
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":104
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):
  *     if edge != NULL:
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -26717,7 +24976,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":105
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":105
  *     if edge != NULL:
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -26728,7 +24987,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":106
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":106
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)
  *         prefix = prefix + (edge.val,)             # <<<<<<<<<<<<<<
@@ -26738,7 +24997,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __pyx_t_2 = PyInt_FromLong(__pyx_v_edge->val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
@@ -26749,7 +25008,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __pyx_v_prefix = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":107
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":107
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)
  *         prefix = prefix + (edge.val,)
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -26777,32 +25036,42 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":114
+ *     cdef int V
+ * 
+ *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
+ *         self.V = alphabet_size
+ *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
+ */
+
+static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_alphabet_size;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alphabet_size)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alphabet_size);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -26819,66 +25088,40 @@ static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7TrieMap___cinit__(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_alphabet_size);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":114
- *     cdef int V
- * 
- *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
- *         self.V = alphabet_size
- *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
- */
 
-static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, int __pyx_v_alphabet_size) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":115
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":115
  * 
  *     def __cinit__(self, int alphabet_size):
  *         self.V = alphabet_size             # <<<<<<<<<<<<<<
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))
  */
-  __pyx_v_self->V = __pyx_v_alphabet_size;
+  ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V = __pyx_v_alphabet_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":116
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":116
  *     def __cinit__(self, int alphabet_size):
  *         self.V = alphabet_size
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))             # <<<<<<<<<<<<<<
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))
  * 
  */
-  __pyx_v_self->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
+  ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":117
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":117
  *         self.V = alphabet_size
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  memset(__pyx_v_self->root, 0, (__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *))));
+  memset(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root, 0, (((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_7TrieMap_2__dealloc__(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":120
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":120
  * 
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -26886,7 +25129,8 @@ static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self) {
  *         for i from 0 <= i < self.V:
  */
 
-static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self) {
+static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
   int __pyx_v_i;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -26895,51 +25139,51 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":122
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":122
  *     def __dealloc__(self):
  *         cdef int i
  *         for i from 0 <= i < self.V:             # <<<<<<<<<<<<<<
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])
  */
-  __pyx_t_1 = __pyx_v_self->V;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":123
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":123
  *         cdef int i
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:             # <<<<<<<<<<<<<<
  *                 free_trie_node(self.root[i])
  *         free(self.root)
  */
-    __pyx_t_2 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
+    __pyx_t_2 = ((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]) != NULL);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":124
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":124
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])             # <<<<<<<<<<<<<<
  *         free(self.root)
  * 
  */
-      __pyx_t_3 = __pyx_f_3_sa_free_trie_node((__pyx_v_self->root[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __pyx_f_3_sa_free_trie_node((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":125
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":125
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])
  *         free(self.root)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  free(__pyx_v_self->root);
+  free(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root);
 
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -26949,18 +25193,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7TrieMap_4insert(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":128
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":128
  * 
  * 
  *     def insert(self, pattern):             # <<<<<<<<<<<<<<
@@ -26968,7 +25201,8 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject
  *         cdef int i, l
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
   int *__pyx_v_p;
   int __pyx_v_i;
   int __pyx_v_l;
@@ -26981,9 +25215,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert", 0);
+  __Pyx_RefNannySetupContext("insert");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":131
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":131
  *         cdef int* p
  *         cdef int i, l
  *         l = len(pattern)             # <<<<<<<<<<<<<<
@@ -26993,7 +25227,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   __pyx_t_1 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_l = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":132
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":132
  *         cdef int i, l
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))             # <<<<<<<<<<<<<<
@@ -27002,7 +25236,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
  */
   __pyx_v_p = ((int *)malloc((__pyx_v_l * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":133
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":133
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:             # <<<<<<<<<<<<<<
@@ -27012,7 +25246,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   __pyx_t_2 = __pyx_v_l;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":134
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":134
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]             # <<<<<<<<<<<<<<
@@ -27026,16 +25260,16 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
     (__pyx_v_p[__pyx_v_i]) = __pyx_t_4;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":135
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":135
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]
  *         self._insert(p,l)             # <<<<<<<<<<<<<<
  *         free(p)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_insert(__pyx_v_self, __pyx_v_p, __pyx_v_l);
+  ((struct __pyx_vtabstruct_3_sa_TrieMap *)((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->__pyx_vtab)->_insert(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_p, __pyx_v_l);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":136
  *             p[i] = pattern[i]
  *         self._insert(p,l)
  *         free(p)             # <<<<<<<<<<<<<<
@@ -27056,7 +25290,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":139
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":139
  * 
  * 
  *     cdef _Trie_Node* _insert(self, int* pattern, int pattern_len):             # <<<<<<<<<<<<<<
@@ -27071,9 +25305,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("_insert", 0);
+  __Pyx_RefNannySetupContext("_insert");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":142
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":142
  *         cdef int i
  *         cdef _Trie_Node* node
  *         if self.root[pattern[0]] == NULL:             # <<<<<<<<<<<<<<
@@ -27083,7 +25317,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __pyx_t_1 = ((__pyx_v_self->root[(__pyx_v_pattern[0])]) == NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":143
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":143
  *         cdef _Trie_Node* node
  *         if self.root[pattern[0]] == NULL:
  *             self.root[pattern[0]] = new_trie_node()             # <<<<<<<<<<<<<<
@@ -27095,7 +25329,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":144
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":144
  *         if self.root[pattern[0]] == NULL:
  *             self.root[pattern[0]] = new_trie_node()
  *         node = self.root[pattern[0]]             # <<<<<<<<<<<<<<
@@ -27104,7 +25338,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
  */
   __pyx_v_node = (__pyx_v_self->root[(__pyx_v_pattern[0])]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":145
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":145
  *             self.root[pattern[0]] = new_trie_node()
  *         node = self.root[pattern[0]]
  *         for i from 1 <= i < pattern_len:             # <<<<<<<<<<<<<<
@@ -27114,7 +25348,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __pyx_t_2 = __pyx_v_pattern_len;
   for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":146
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":146
  *         node = self.root[pattern[0]]
  *         for i from 1 <= i < pattern_len:
  *             node = trie_insert(node, pattern[i])             # <<<<<<<<<<<<<<
@@ -27124,7 +25358,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_pattern[__pyx_v_i]));
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":147
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":147
  *         for i from 1 <= i < pattern_len:
  *             node = trie_insert(node, pattern[i])
  *         return node             # <<<<<<<<<<<<<<
@@ -27140,18 +25374,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("contains (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7TrieMap_6contains(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":149
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":149
  *         return node
  * 
  *     def contains(self, pattern):             # <<<<<<<<<<<<<<
@@ -27159,7 +25382,8 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObje
  *         cdef int i, l
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
   int *__pyx_v_p;
   int __pyx_v_i;
   int __pyx_v_l;
@@ -27174,9 +25398,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("contains", 0);
+  __Pyx_RefNannySetupContext("contains");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":153
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":153
  *         cdef int i, l
  *         cdef _Trie_Node* node
  *         l = len(pattern)             # <<<<<<<<<<<<<<
@@ -27186,7 +25410,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   __pyx_t_1 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_l = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":154
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":154
  *         cdef _Trie_Node* node
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))             # <<<<<<<<<<<<<<
@@ -27195,7 +25419,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
  */
   __pyx_v_p = ((int *)malloc((__pyx_v_l * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":155
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":155
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:             # <<<<<<<<<<<<<<
@@ -27205,7 +25429,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   __pyx_t_2 = __pyx_v_l;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":156
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":156
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]             # <<<<<<<<<<<<<<
@@ -27219,16 +25443,16 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
     (__pyx_v_p[__pyx_v_i]) = __pyx_t_4;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":157
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":157
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]
  *         node = self._contains(p,l)             # <<<<<<<<<<<<<<
  *         free(p)
  *         if node == NULL:
  */
-  __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_contains(__pyx_v_self, __pyx_v_p, __pyx_v_l);
+  __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->__pyx_vtab)->_contains(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_p, __pyx_v_l);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":158
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":158
  *             p[i] = pattern[i]
  *         node = self._contains(p,l)
  *         free(p)             # <<<<<<<<<<<<<<
@@ -27237,7 +25461,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
  */
   free(__pyx_v_p);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":159
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":159
  *         node = self._contains(p,l)
  *         free(p)
  *         if node == NULL:             # <<<<<<<<<<<<<<
@@ -27247,7 +25471,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   __pyx_t_5 = (__pyx_v_node == NULL);
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":160
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":160
  *         free(p)
  *         if node == NULL:
  *             return False             # <<<<<<<<<<<<<<
@@ -27260,11 +25484,11 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
     __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L7;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":162
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":162
  *             return False
  *         else:
  *             return True             # <<<<<<<<<<<<<<
@@ -27278,7 +25502,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
     __pyx_t_3 = 0;
     goto __pyx_L0;
   }
-  __pyx_L5:;
+  __pyx_L7:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -27292,7 +25516,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":164
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":164
  *             return True
  * 
  *     cdef _Trie_Node* _contains(self, int* pattern, int pattern_len):             # <<<<<<<<<<<<<<
@@ -27308,9 +25532,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("_contains", 0);
+  __Pyx_RefNannySetupContext("_contains");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":167
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":167
  *         cdef int i
  *         cdef _Trie_Node* node
  *         node = self.root[pattern[0]]             # <<<<<<<<<<<<<<
@@ -27319,7 +25543,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
   __pyx_v_node = (__pyx_v_self->root[(__pyx_v_pattern[0])]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":168
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":168
  *         cdef _Trie_Node* node
  *         node = self.root[pattern[0]]
  *         i = 1             # <<<<<<<<<<<<<<
@@ -27328,7 +25552,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
   __pyx_v_i = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":169
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":169
  *         node = self.root[pattern[0]]
  *         i = 1
  *         while node != NULL and i < pattern_len:             # <<<<<<<<<<<<<<
@@ -27345,7 +25569,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":170
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":170
  *         i = 1
  *         while node != NULL and i < pattern_len:
  *             node = trie_find(node, pattern[i])             # <<<<<<<<<<<<<<
@@ -27354,7 +25578,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
     __pyx_v_node = __pyx_f_3_sa_trie_find(__pyx_v_node, (__pyx_v_pattern[__pyx_v_i]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":171
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":171
  *         while node != NULL and i < pattern_len:
  *             node = trie_find(node, pattern[i])
  *             i = i+1             # <<<<<<<<<<<<<<
@@ -27364,7 +25588,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
     __pyx_v_i = (__pyx_v_i + 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":172
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":172
  *             node = trie_find(node, pattern[i])
  *             i = i+1
  *         return node             # <<<<<<<<<<<<<<
@@ -27380,18 +25604,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
-static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("toMap (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7TrieMap_8toMap(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_flag));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":174
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":174
  *         return node
  * 
  *     def toMap(self, flag):             # <<<<<<<<<<<<<<
@@ -27399,7 +25612,8 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_flag) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
+static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
   int __pyx_v_i;
   int __pyx_v_include_zeros;
   PyObject *__pyx_v_result = NULL;
@@ -27412,9 +25626,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("toMap", 0);
+  __Pyx_RefNannySetupContext("toMap");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":177
  *         cdef int i, include_zeros
  * 
  *         if flag:             # <<<<<<<<<<<<<<
@@ -27424,7 +25638,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_flag); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":178
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":178
  * 
  *         if flag:
  *             include_zeros=1             # <<<<<<<<<<<<<<
@@ -27432,11 +25646,11 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
  *             include_zeros=0
  */
     __pyx_v_include_zeros = 1;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":180
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":180
  *             include_zeros=1
  *         else:
  *             include_zeros=0             # <<<<<<<<<<<<<<
@@ -27445,9 +25659,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
  */
     __pyx_v_include_zeros = 0;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":181
  *         else:
  *             include_zeros=0
  *         result = {}             # <<<<<<<<<<<<<<
@@ -27459,27 +25673,27 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   __pyx_v_result = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":182
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":182
  *             include_zeros=0
  *         result = {}
  *         for i from 0 <= i < self.V:             # <<<<<<<<<<<<<<
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  */
-  __pyx_t_3 = __pyx_v_self->V;
+  __pyx_t_3 = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":183
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":183
  *         result = {}
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:             # <<<<<<<<<<<<<<
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  *         return result
  */
-    __pyx_t_1 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
+    __pyx_t_1 = ((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]) != NULL);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":184
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":184
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)             # <<<<<<<<<<<<<<
@@ -27489,20 +25703,20 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
       __pyx_t_2 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_2 = 0;
-      __pyx_t_2 = __pyx_f_3_sa_trie_node_to_map((__pyx_v_self->root[__pyx_v_i]), ((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_4), __pyx_v_include_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __pyx_f_3_sa_trie_node_to_map((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]), ((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_4), __pyx_v_include_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      goto __pyx_L6;
+      goto __pyx_L8;
     }
-    __pyx_L6:;
+    __pyx_L8:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":185
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  *         return result             # <<<<<<<<<<<<<<
@@ -27528,9 +25742,16 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":200
+ *     cdef write_map(self, m, FILE* f)
+ * 
+ *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
+ *             precompute_rank=1000, precompute_secondary_rank=20,
+ *             max_length=5, max_nonterminals=2,
+ */
+
+static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fsarray = 0;
   PyObject *__pyx_v_from_stats = 0;
   PyObject *__pyx_v_from_binary = 0;
@@ -27542,18 +25763,18 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
   PyObject *__pyx_v_train_min_gap_size = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
     PyObject* values[9] = {0,0,0,0,0,0,0,0,0};
-
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":200
- *     cdef write_map(self, m, FILE* f)
- * 
- *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
- *             precompute_rank=1000, precompute_secondary_rank=20,
- *             max_length=5, max_nonterminals=2,
- */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
@@ -27565,8 +25786,7 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
     values[8] = ((PyObject *)__pyx_int_2);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
         case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
         case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
@@ -27580,7 +25800,7 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
@@ -27628,7 +25848,7 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -27663,25 +25883,8 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_14Precomputation___cinit__(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_from_stats, __pyx_v_from_binary, __pyx_v_precompute_rank, __pyx_v_precompute_secondary_rank, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_from_stats, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_precompute_rank, PyObject *__pyx_v_precompute_secondary_rank, PyObject *__pyx_v_max_length, PyObject *__pyx_v_max_nonterminals, PyObject *__pyx_v_train_max_initial_size, PyObject *__pyx_v_train_min_gap_size) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":204
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":204
  *             max_length=5, max_nonterminals=2,
  *             train_max_initial_size=10, train_min_gap_size=2):
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
@@ -27689,9 +25892,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         self.max_length = max_length
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->precompute_rank = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":205
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":205
  *             train_max_initial_size=10, train_min_gap_size=2):
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
@@ -27699,9 +25902,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         self.max_nonterminals = max_nonterminals
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_secondary_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->precompute_secondary_rank = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":206
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":206
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
@@ -27709,9 +25912,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         self.train_max_initial_size = train_max_initial_size
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_length); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->max_length = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":207
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":207
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
@@ -27719,9 +25922,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         self.train_min_gap_size = train_min_gap_size
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_nonterminals); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->max_nonterminals = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":208
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":208
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
@@ -27729,9 +25932,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         if from_binary:
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_max_initial_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->train_max_initial_size = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":209
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":209
  *         self.max_nonterminals = max_nonterminals
  *         self.train_max_initial_size = train_max_initial_size
  *         self.train_min_gap_size = train_min_gap_size             # <<<<<<<<<<<<<<
@@ -27739,9 +25942,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *             self.read_binary(from_binary)
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_min_gap_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->train_min_gap_size = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":210
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":210
  *         self.train_max_initial_size = train_max_initial_size
  *         self.train_min_gap_size = train_min_gap_size
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -27751,17 +25954,17 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":211
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":211
  *         self.train_min_gap_size = train_min_gap_size
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_stats:
  *             self.precompute(from_stats, fsarray)
  */
-    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -27770,10 +25973,10 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":212
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":212
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_stats:             # <<<<<<<<<<<<<<
@@ -27783,17 +25986,17 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_stats); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":213
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":213
  *             self.read_binary(from_binary)
  *         elif from_stats:
  *             self.precompute(from_stats, fsarray)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__precompute); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_INCREF(__pyx_v_from_stats);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_from_stats);
     __Pyx_GIVEREF(__pyx_v_from_stats);
@@ -27805,9 +26008,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -27822,28 +26025,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_14Precomputation_2read_binary(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":216
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":216
  * 
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -27851,7 +26033,9 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_s
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -27859,9 +26043,18 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary", 0);
+  __Pyx_RefNannySetupContext("read_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":218
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":218
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -27870,91 +26063,91 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":219
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":219
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)
  */
-  fread((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":220
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":220
  *         f = fopen(filename, "r")
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  */
-  fread((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":221
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":221
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  */
-  fread((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":222
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":222
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  */
-  fread((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":223
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":223
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)
  */
-  fread((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":224
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":224
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)
  */
-  fread((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":225
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":225
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)             # <<<<<<<<<<<<<<
  *         self.precomputed_collocations = self.read_map(f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->read_map(__pyx_v_self, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->read_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
-  __Pyx_DECREF(__pyx_v_self->precomputed_index);
-  __pyx_v_self->precomputed_index = __pyx_t_1;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":226
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":226
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->read_map(__pyx_v_self, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->read_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
-  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
-  __pyx_v_self->precomputed_collocations = __pyx_t_1;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":227
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":227
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -27975,28 +26168,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_14Precomputation_4write_binary(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":230
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":230
  * 
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -28004,7 +26176,9 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -28013,9 +26187,18 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary", 0);
+  __Pyx_RefNannySetupContext("write_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":232
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":232
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -28024,89 +26207,89 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":233
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":233
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  */
-  fwrite((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":234
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":234
  *         f = fopen(filename, "w")
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  */
-  fwrite((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":235
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":235
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  */
-  fwrite((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":236
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":236
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  */
-  fwrite((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":237
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":237
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)
  */
-  fwrite((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":238
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":238
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)
  */
-  fwrite((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":239
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":239
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)             # <<<<<<<<<<<<<<
  *         self.write_map(self.precomputed_collocations, f)
  *         fclose(f)
  */
-  __pyx_t_1 = __pyx_v_self->precomputed_index;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->write_map(__pyx_v_self, __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->write_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":240
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":240
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_2 = __pyx_v_self->precomputed_collocations;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->write_map(__pyx_v_self, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->write_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":241
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":241
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -28128,7 +26311,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":244
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":244
  * 
  * 
  *     cdef write_map(self, m, FILE* f):             # <<<<<<<<<<<<<<
@@ -28136,7 +26319,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  *         cdef IntList arr
  */
 
-static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_m, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_m, FILE *__pyx_v_f) {
   int __pyx_v_i;
   int __pyx_v_N;
   struct __pyx_obj_3_sa_IntList *__pyx_v_arr = 0;
@@ -28147,19 +26330,21 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *(*__pyx_t_4)(PyObject *);
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  int __pyx_t_7;
-  Py_ssize_t __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  Py_ssize_t __pyx_t_9;
+  PyObject *(*__pyx_t_10)(PyObject *);
+  int __pyx_t_11;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_map", 0);
+  __Pyx_RefNannySetupContext("write_map");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":248
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":248
  *         cdef IntList arr
  * 
  *         N = len(m)             # <<<<<<<<<<<<<<
@@ -28169,7 +26354,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
   __pyx_t_1 = PyObject_Length(__pyx_v_m); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":249
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":249
  * 
  *         N = len(m)
  *         fwrite(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -28178,29 +26363,87 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  */
   fwrite((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":250
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":250
  *         N = len(m)
  *         fwrite(&(N), sizeof(int), 1, f)
  *         for pattern, val in m.iteritems():             # <<<<<<<<<<<<<<
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)
  */
-  __pyx_t_1 = 0;
-  if (unlikely(__pyx_v_m == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_v_m, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+    __pyx_t_2 = __pyx_t_3; __Pyx_INCREF(__pyx_t_2); __pyx_t_1 = 0;
+    __pyx_t_4 = NULL;
+  } else {
+    __pyx_t_1 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
-  __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_m, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_2);
-  __pyx_t_2 = __pyx_t_5;
-  __pyx_t_5 = 0;
-  while (1) {
-    __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_2, __pyx_t_3, &__pyx_t_1, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4);
-    if (unlikely(__pyx_t_7 == 0)) break;
-    if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  for (;;) {
+    if (PyList_CheckExact(__pyx_t_2)) {
+      if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
+    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
+    } else {
+      __pyx_t_3 = __pyx_t_4(__pyx_t_2);
+      if (unlikely(!__pyx_t_3)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+      PyObject* sequence = __pyx_t_3;
+      if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
+        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
+      } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
+        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
+      }
+      __Pyx_INCREF(__pyx_t_5);
+      __Pyx_INCREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    } else {
+      Py_ssize_t index = -1;
+      __pyx_t_7 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
+      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_5);
+      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_6);
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L6_unpacking_done;
+      __pyx_L5_unpacking_failed:;
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_L6_unpacking_done:;
+    }
     __Pyx_XDECREF(__pyx_v_pattern);
     __pyx_v_pattern = __pyx_t_5;
     __pyx_t_5 = 0;
@@ -28208,17 +26451,17 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
     __pyx_v_val = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":251
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":251
  *         fwrite(&(N), sizeof(int), 1, f)
  *         for pattern, val in m.iteritems():
  *             N = len(pattern)             # <<<<<<<<<<<<<<
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:
  */
-    __pyx_t_8 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_N = __pyx_t_8;
+    __pyx_t_9 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_N = __pyx_t_9;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":252
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":252
  *         for pattern, val in m.iteritems():
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -28227,7 +26470,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  */
     fwrite((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":253
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":253
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -28235,54 +26478,46 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  *                 fwrite(&(i), sizeof(int), 1, f)
  */
     if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-      __pyx_t_6 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_6); __pyx_t_8 = 0;
-      __pyx_t_9 = NULL;
+      __pyx_t_3 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_3); __pyx_t_9 = 0;
+      __pyx_t_10 = NULL;
     } else {
-      __pyx_t_8 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_9 = Py_TYPE(__pyx_t_6)->tp_iternext;
+      __pyx_t_9 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_10 = Py_TYPE(__pyx_t_3)->tp_iternext;
     }
     for (;;) {
-      if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_6)) {
-        if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_6)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
-      } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_6)) {
-        if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+      if (PyList_CheckExact(__pyx_t_3)) {
+        if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_3)) break;
+        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++;
+      } else if (PyTuple_CheckExact(__pyx_t_3)) {
+        if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++;
       } else {
-        __pyx_t_5 = __pyx_t_9(__pyx_t_6);
-        if (unlikely(!__pyx_t_5)) {
+        __pyx_t_6 = __pyx_t_10(__pyx_t_3);
+        if (unlikely(!__pyx_t_6)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
             else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
-        __Pyx_GOTREF(__pyx_t_5);
+        __Pyx_GOTREF(__pyx_t_6);
       }
       __Pyx_XDECREF(__pyx_v_word_id);
-      __pyx_v_word_id = __pyx_t_5;
-      __pyx_t_5 = 0;
+      __pyx_v_word_id = __pyx_t_6;
+      __pyx_t_6 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":254
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":254
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:
  *                 i = word_id             # <<<<<<<<<<<<<<
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val
  */
-      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_i = __pyx_t_7;
+      __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_i = __pyx_t_11;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":255
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":255
  *             for word_id in pattern:
  *                 i = word_id
  *                 fwrite(&(i), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -28291,9 +26526,9 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  */
       fwrite((&__pyx_v_i), (sizeof(int)), 1, __pyx_v_f);
     }
-    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":256
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":256
  *                 i = word_id
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val             # <<<<<<<<<<<<<<
@@ -28305,7 +26540,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
     __Pyx_XDECREF(((PyObject *)__pyx_v_arr));
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_val);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":257
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":257
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val
  *             arr.write_handle(f)             # <<<<<<<<<<<<<<
@@ -28320,8 +26555,10 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_5);
   __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_AddTraceback("_sa.Precomputation.write_map", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
@@ -28334,7 +26571,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":260
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":260
  * 
  * 
  *     cdef read_map(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -28342,10 +26579,10 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  *         cdef IntList arr
  */
 
-static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, FILE *__pyx_v_f) {
   int __pyx_v_i;
-  CYTHON_UNUSED int __pyx_v_j;
-  CYTHON_UNUSED int __pyx_v_k;
+  int __pyx_v_j;
+  int __pyx_v_k;
   int __pyx_v_word_id;
   int __pyx_v_N;
   struct __pyx_obj_3_sa_IntList *__pyx_v_arr = 0;
@@ -28360,9 +26597,9 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_map", 0);
+  __Pyx_RefNannySetupContext("read_map");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":264
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":264
  *         cdef IntList arr
  * 
  *         m = {}             # <<<<<<<<<<<<<<
@@ -28374,7 +26611,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   __pyx_v_m = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":265
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":265
  * 
  *         m = {}
  *         fread(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -28383,7 +26620,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
  */
   fread((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":266
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":266
  *         m = {}
  *         fread(&(N), sizeof(int), 1, f)
  *         for j from 0 <= j < N:             # <<<<<<<<<<<<<<
@@ -28393,7 +26630,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   __pyx_t_2 = __pyx_v_N;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":267
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":267
  *         fread(&(N), sizeof(int), 1, f)
  *         for j from 0 <= j < N:
  *             fread(&(i), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -28402,7 +26639,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
  */
     fread((&__pyx_v_i), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":268
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":268
  *         for j from 0 <= j < N:
  *             fread(&(i), sizeof(int), 1, f)
  *             key = ()             # <<<<<<<<<<<<<<
@@ -28413,7 +26650,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
     __Pyx_XDECREF(((PyObject *)__pyx_v_key));
     __pyx_v_key = __pyx_empty_tuple;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":269
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":269
  *             fread(&(i), sizeof(int), 1, f)
  *             key = ()
  *             for k from 0 <= k < i:             # <<<<<<<<<<<<<<
@@ -28423,7 +26660,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
     __pyx_t_3 = __pyx_v_i;
     for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":270
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":270
  *             key = ()
  *             for k from 0 <= k < i:
  *                 fread(&(word_id), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -28432,7 +26669,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
  */
       fread((&__pyx_v_word_id), (sizeof(int)), 1, __pyx_v_f);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":271
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":271
  *             for k from 0 <= k < i:
  *                 fread(&(word_id), sizeof(int), 1, f)
  *                 key = key + (word_id,)             # <<<<<<<<<<<<<<
@@ -28442,7 +26679,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
       __pyx_t_1 = PyInt_FromLong(__pyx_v_word_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
@@ -28454,7 +26691,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
       __pyx_t_1 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":272
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":272
  *                 fread(&(word_id), sizeof(int), 1, f)
  *                 key = key + (word_id,)
  *             arr = IntList()             # <<<<<<<<<<<<<<
@@ -28467,7 +26704,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":273
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":273
  *                 key = key + (word_id,)
  *             arr = IntList()
  *             arr.read_handle(f)             # <<<<<<<<<<<<<<
@@ -28476,7 +26713,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_arr->__pyx_vtab)->read_handle(__pyx_v_arr, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":274
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":274
  *             arr = IntList()
  *             arr.read_handle(f)
  *             m[key] = arr             # <<<<<<<<<<<<<<
@@ -28486,7 +26723,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
     if (PyDict_SetItem(((PyObject *)__pyx_v_m), ((PyObject *)__pyx_v_key), ((PyObject *)__pyx_v_arr)) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":275
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":275
  *             arr.read_handle(f)
  *             m[key] = arr
  *         return m             # <<<<<<<<<<<<<<
@@ -28514,39 +26751,119 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":278
+ * 
+ * 
+ *     def precompute(self, stats, SuffixArray sarray):             # <<<<<<<<<<<<<<
+ *         cdef int i, l, N, max_pattern_len, i1, l1, i2, l2, i3, l3, ptr1, ptr2, ptr3, is_super, sent_count, max_rank
+ *         cdef DataArray darray = sarray.darray
+ */
+
+static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_stats = 0;
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray = 0;
-  PyObject *__pyx_r = 0;
+  int __pyx_v_i;
+  int __pyx_v_l;
+  int __pyx_v_N;
+  int __pyx_v_max_pattern_len;
+  int __pyx_v_i1;
+  int __pyx_v_l1;
+  int __pyx_v_i2;
+  int __pyx_v_l2;
+  int __pyx_v_i3;
+  int __pyx_v_l3;
+  int __pyx_v_ptr1;
+  int __pyx_v_ptr2;
+  int __pyx_v_ptr3;
+  int __pyx_v_is_super;
+  int __pyx_v_sent_count;
+  int __pyx_v_max_rank;
+  struct __pyx_obj_3_sa_DataArray *__pyx_v_darray = 0;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_data = 0;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_queue = 0;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_cost_by_rank = 0;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_count_by_rank = 0;
+  struct __pyx_obj_3_sa_TrieMap *__pyx_v_frequent_patterns = 0;
+  struct __pyx_obj_3_sa_TrieMap *__pyx_v_super_frequent_patterns = 0;
+  struct __pyx_obj_3_sa_TrieMap *__pyx_v_collocations = 0;
+  struct __pyx_t_3_sa__Trie_Node *__pyx_v_node;
+  PyObject *__pyx_v_I_set = NULL;
+  PyObject *__pyx_v_J_set = NULL;
+  PyObject *__pyx_v_J2_set = NULL;
+  PyObject *__pyx_v_IJ_set = NULL;
+  PyObject *__pyx_v_pattern_rank = NULL;
+  float __pyx_v_start_time;
+  PyObject *__pyx_v_rank = NULL;
+  PyObject *__pyx_v__ = NULL;
+  PyObject *__pyx_v_phrase = NULL;
+  int __pyx_v_sa_word_id;
+  PyObject *__pyx_v_x = NULL;
+  PyObject *__pyx_v_pattern1 = NULL;
+  PyObject *__pyx_v_pattern2 = NULL;
+  PyObject *__pyx_v_combined_pattern = NULL;
+  PyObject *__pyx_v_pattern = NULL;
+  PyObject *__pyx_v_arr = NULL;
+  PyObject *__pyx_v_s = NULL;
+  PyObject *__pyx_v_word_id = NULL;
+  PyObject *__pyx_v_chunk = NULL;
+  PyObject *__pyx_v_arity = NULL;
+  PyObject *__pyx_v_cumul_cost = NULL;
+  PyObject *__pyx_v_cumul_count = NULL;
+  Py_ssize_t __pyx_v_num_found_patterns;
+  float __pyx_v_stop_time;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("precompute (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *(*__pyx_t_4)(PyObject *);
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *(*__pyx_t_10)(PyObject *);
+  int __pyx_t_11;
+  Py_ssize_t __pyx_t_12;
+  int __pyx_t_13;
+  Py_ssize_t __pyx_t_14;
+  int __pyx_t_15;
+  int __pyx_t_16;
+  int __pyx_t_17;
+  int __pyx_t_18;
+  int __pyx_t_19;
+  PyObject *(*__pyx_t_20)(PyObject *);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__sarray,0};
+  __Pyx_RefNannySetupContext("precompute");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__sarray,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stats)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stats);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sarray)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sarray);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, 1); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "precompute") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "precompute") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -28566,101 +26883,8 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_se
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sarray), __pyx_ptype_3_sa_SuffixArray, 1, "sarray", 0))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_14Precomputation_6precompute(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_stats, __pyx_v_sarray);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":278
- * 
- * 
- *     def precompute(self, stats, SuffixArray sarray):             # <<<<<<<<<<<<<<
- *         cdef int i, l, N, max_pattern_len, i1, l1, i2, l2, i3, l3, ptr1, ptr2, ptr3, is_super, sent_count, max_rank
- *         cdef DataArray darray = sarray.darray
- */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray) {
-  int __pyx_v_i;
-  int __pyx_v_l;
-  int __pyx_v_N;
-  int __pyx_v_max_pattern_len;
-  int __pyx_v_i1;
-  int __pyx_v_l1;
-  int __pyx_v_i2;
-  int __pyx_v_l2;
-  int __pyx_v_i3;
-  int __pyx_v_l3;
-  int __pyx_v_ptr1;
-  int __pyx_v_ptr2;
-  int __pyx_v_ptr3;
-  int __pyx_v_is_super;
-  int __pyx_v_sent_count;
-  int __pyx_v_max_rank;
-  struct __pyx_obj_3_sa_DataArray *__pyx_v_darray = 0;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_data = 0;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_queue = 0;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_cost_by_rank = 0;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_count_by_rank = 0;
-  struct __pyx_obj_3_sa_TrieMap *__pyx_v_frequent_patterns = 0;
-  struct __pyx_obj_3_sa_TrieMap *__pyx_v_super_frequent_patterns = 0;
-  struct __pyx_obj_3_sa_TrieMap *__pyx_v_collocations = 0;
-  struct __pyx_t_3_sa__Trie_Node *__pyx_v_node;
-  PyObject *__pyx_v_I_set = NULL;
-  PyObject *__pyx_v_J_set = NULL;
-  PyObject *__pyx_v_J2_set = NULL;
-  PyObject *__pyx_v_IJ_set = NULL;
-  PyObject *__pyx_v_pattern_rank = NULL;
-  float __pyx_v_start_time;
-  PyObject *__pyx_v_rank = NULL;
-  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
-  PyObject *__pyx_v_phrase = NULL;
-  int __pyx_v_sa_word_id;
-  PyObject *__pyx_v_x = NULL;
-  PyObject *__pyx_v_pattern1 = NULL;
-  PyObject *__pyx_v_pattern2 = NULL;
-  PyObject *__pyx_v_combined_pattern = NULL;
-  PyObject *__pyx_v_pattern = NULL;
-  PyObject *__pyx_v_arr = NULL;
-  PyObject *__pyx_v_s = NULL;
-  PyObject *__pyx_v_word_id = NULL;
-  PyObject *__pyx_v_chunk = NULL;
-  PyObject *__pyx_v_arity = NULL;
-  PyObject *__pyx_v_cumul_cost = NULL;
-  PyObject *__pyx_v_cumul_count = NULL;
-  PyObject *__pyx_v_num_found_patterns = NULL;
-  float __pyx_v_stop_time;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *(*__pyx_t_4)(PyObject *);
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *__pyx_t_8 = NULL;
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *(*__pyx_t_10)(PyObject *);
-  int __pyx_t_11;
-  Py_ssize_t __pyx_t_12;
-  int __pyx_t_13;
-  Py_ssize_t __pyx_t_14;
-  int __pyx_t_15;
-  int __pyx_t_16;
-  int __pyx_t_17;
-  int __pyx_t_18;
-  int __pyx_t_19;
-  PyObject *(*__pyx_t_20)(PyObject *);
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("precompute", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":280
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":280
  *     def precompute(self, stats, SuffixArray sarray):
  *         cdef int i, l, N, max_pattern_len, i1, l1, i2, l2, i3, l3, ptr1, ptr2, ptr3, is_super, sent_count, max_rank
  *         cdef DataArray darray = sarray.darray             # <<<<<<<<<<<<<<
@@ -28670,7 +26894,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(((PyObject *)__pyx_v_sarray->darray));
   __pyx_v_darray = __pyx_v_sarray->darray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":285
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":285
  *         cdef _Trie_Node* node
  * 
  *         data = darray.data             # <<<<<<<<<<<<<<
@@ -28680,7 +26904,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(((PyObject *)__pyx_v_darray->data));
   __pyx_v_data = __pyx_v_darray->data;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":287
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":287
  *         data = darray.data
  * 
  *         frequent_patterns = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -28694,7 +26918,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -28704,7 +26928,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_frequent_patterns = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":288
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":288
  * 
  *         frequent_patterns = TrieMap(len(darray.id2word))
  *         super_frequent_patterns = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -28718,7 +26942,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -28728,7 +26952,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_super_frequent_patterns = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":289
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":289
  *         frequent_patterns = TrieMap(len(darray.id2word))
  *         super_frequent_patterns = TrieMap(len(darray.id2word))
  *         collocations = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -28742,7 +26966,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -28752,7 +26976,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_collocations = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":291
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":291
  *         collocations = TrieMap(len(darray.id2word))
  * 
  *         I_set = set()             # <<<<<<<<<<<<<<
@@ -28764,7 +26988,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_I_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":292
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":292
  * 
  *         I_set = set()
  *         J_set = set()             # <<<<<<<<<<<<<<
@@ -28776,7 +27000,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_J_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":293
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":293
  *         I_set = set()
  *         J_set = set()
  *         J2_set = set()             # <<<<<<<<<<<<<<
@@ -28788,7 +27012,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_J2_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":294
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":294
  *         J_set = set()
  *         J2_set = set()
  *         IJ_set = set()             # <<<<<<<<<<<<<<
@@ -28800,7 +27024,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_IJ_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":295
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":295
  *         J2_set = set()
  *         IJ_set = set()
  *         pattern_rank = {}             # <<<<<<<<<<<<<<
@@ -28812,7 +27036,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_pattern_rank = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":297
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":297
  *         pattern_rank = {}
  * 
  *         logger.info("Precomputing frequent intersections")             # <<<<<<<<<<<<<<
@@ -28829,7 +27053,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":298
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":298
  * 
  *         logger.info("Precomputing frequent intersections")
  *         cdef float start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -28838,7 +27062,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":300
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":300
  *         cdef float start_time = monitor_cpu()
  * 
  *         max_pattern_len = 0             # <<<<<<<<<<<<<<
@@ -28847,7 +27071,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_max_pattern_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":301
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":301
  * 
  *         max_pattern_len = 0
  *         for rank, (_, _, phrase) in enumerate(stats):             # <<<<<<<<<<<<<<
@@ -28865,20 +27089,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
+    if (PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_5)) {
@@ -28892,22 +27108,21 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
       PyObject* sequence = __pyx_t_5;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      Py_ssize_t size = Py_SIZE(sequence);
-      #else
-      Py_ssize_t size = PySequence_Size(sequence);
-      #endif
-      if (unlikely(size != 3)) {
-        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
+          if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_8 = PyTuple_GET_ITEM(sequence, 2); 
       } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
+          if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_8 = PyList_GET_ITEM(sequence, 2); 
@@ -28915,35 +27130,28 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_INCREF(__pyx_t_6);
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_8);
-      #else
-      __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    } else
-    {
+    } else {
       Py_ssize_t index = -1;
       __pyx_t_9 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_10 = Py_TYPE(__pyx_t_9)->tp_iternext;
-      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
+      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
-      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L5_unpacking_failed;
+      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L8_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L5_unpacking_failed;
+      index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L8_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_8);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_9), 3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_10 = NULL;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      goto __pyx_L6_unpacking_done;
-      __pyx_L5_unpacking_failed:;
+      goto __pyx_L9_unpacking_done;
+      __pyx_L8_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_10 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L6_unpacking_done:;
+      __pyx_L9_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v__);
     __pyx_v__ = __pyx_t_6;
@@ -28963,34 +27171,35 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":302
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":302
  *         max_pattern_len = 0
  *         for rank, (_, _, phrase) in enumerate(stats):
  *             if rank >= self.precompute_rank:             # <<<<<<<<<<<<<<
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  */
-    __pyx_t_5 = PyInt_FromLong(__pyx_v_self->precompute_rank); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_8 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_5, Py_GE); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
     if (__pyx_t_11) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":303
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":303
  *         for rank, (_, _, phrase) in enumerate(stats):
  *             if rank >= self.precompute_rank:
  *                 break             # <<<<<<<<<<<<<<
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)
  */
-      goto __pyx_L4_break;
-      goto __pyx_L7;
+      goto __pyx_L7_break;
+      goto __pyx_L10;
     }
-    __pyx_L7:;
+    __pyx_L10:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":304
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":304
  *             if rank >= self.precompute_rank:
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))             # <<<<<<<<<<<<<<
@@ -29006,7 +27215,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     __pyx_v_max_pattern_len = __pyx_t_14;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":305
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":305
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)             # <<<<<<<<<<<<<<
@@ -29016,7 +27225,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_frequent_patterns), __pyx_n_s__insert); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_INCREF(__pyx_v_phrase);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_phrase);
     __Pyx_GIVEREF(__pyx_v_phrase);
@@ -29026,16 +27235,19 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":306
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":306
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)
  *             I_set.add(phrase)             # <<<<<<<<<<<<<<
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:
  */
+    if (unlikely(((PyObject *)__pyx_v_I_set) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_15 = PySet_Add(__pyx_v_I_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":307
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":307
  *             frequent_patterns.insert(phrase)
  *             I_set.add(phrase)
  *             pattern_rank[phrase] = rank             # <<<<<<<<<<<<<<
@@ -29044,22 +27256,23 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     if (PyDict_SetItem(((PyObject *)__pyx_v_pattern_rank), __pyx_v_phrase, __pyx_v_rank) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":308
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":308
  *             I_set.add(phrase)
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:             # <<<<<<<<<<<<<<
  *                 super_frequent_patterns.insert(phrase)
  *                 J_set.add(phrase)
  */
-    __pyx_t_7 = PyInt_FromLong(__pyx_v_self->precompute_secondary_rank); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyInt_FromLong(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_7, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_7, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_11) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":309
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":309
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:
  *                 super_frequent_patterns.insert(phrase)             # <<<<<<<<<<<<<<
@@ -29069,7 +27282,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_super_frequent_patterns), __pyx_n_s__insert); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_7));
       __Pyx_INCREF(__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_v_phrase);
@@ -29079,23 +27292,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":310
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":310
  *             if rank < self.precompute_secondary_rank:
  *                 super_frequent_patterns.insert(phrase)
  *                 J_set.add(phrase)             # <<<<<<<<<<<<<<
  * 
  *         queue = IntList(increment=1000)
  */
+      if (unlikely(((PyObject *)__pyx_v_J_set) == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+      }
       __pyx_t_15 = PySet_Add(__pyx_v_J_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L8;
+      goto __pyx_L11;
     }
-    __pyx_L8:;
+    __pyx_L11:;
   }
-  __pyx_L4_break:;
+  __pyx_L7_break:;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":312
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":312
  *                 J_set.add(phrase)
  * 
  *         queue = IntList(increment=1000)             # <<<<<<<<<<<<<<
@@ -29105,13 +27321,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__increment), __pyx_int_1000) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_queue = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":314
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":314
  *         queue = IntList(increment=1000)
  * 
  *         logger.info("    Computing inverted indexes...")             # <<<<<<<<<<<<<<
@@ -29128,7 +27344,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":315
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":315
  * 
  *         logger.info("    Computing inverted indexes...")
  *         N = len(data)             # <<<<<<<<<<<<<<
@@ -29138,7 +27354,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_data)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":316
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":316
  *         logger.info("    Computing inverted indexes...")
  *         N = len(data)
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -29148,7 +27364,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_13 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":317
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":317
  *         N = len(data)
  *         for i from 0 <= i < N:
  *             sa_word_id = data.arr[i]             # <<<<<<<<<<<<<<
@@ -29157,7 +27373,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     __pyx_v_sa_word_id = (__pyx_v_data->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":318
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":318
  *         for i from 0 <= i < N:
  *             sa_word_id = data.arr[i]
  *             if sa_word_id == 1:             # <<<<<<<<<<<<<<
@@ -29167,7 +27383,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_11 = (__pyx_v_sa_word_id == 1);
     if (__pyx_t_11) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":319
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":319
  *             sa_word_id = data.arr[i]
  *             if sa_word_id == 1:
  *                 queue._append(-1)             # <<<<<<<<<<<<<<
@@ -29175,11 +27391,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 for l from 1 <= l <= max_pattern_len:
  */
       ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, -1);
-      goto __pyx_L11;
+      goto __pyx_L14;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":321
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":321
  *                 queue._append(-1)
  *             else:
  *                 for l from 1 <= l <= max_pattern_len:             # <<<<<<<<<<<<<<
@@ -29189,7 +27405,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_16 = __pyx_v_max_pattern_len;
       for (__pyx_v_l = 1; __pyx_v_l <= __pyx_t_16; __pyx_v_l++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":322
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":322
  *             else:
  *                 for l from 1 <= l <= max_pattern_len:
  *                     node = frequent_patterns._contains(data.arr+i, l)             # <<<<<<<<<<<<<<
@@ -29198,7 +27414,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i), __pyx_v_l);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":323
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":323
  *                 for l from 1 <= l <= max_pattern_len:
  *                     node = frequent_patterns._contains(data.arr+i, l)
  *                     if node == NULL:             # <<<<<<<<<<<<<<
@@ -29208,19 +27424,19 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_t_11 = (__pyx_v_node == NULL);
         if (__pyx_t_11) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":324
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":324
  *                     node = frequent_patterns._contains(data.arr+i, l)
  *                     if node == NULL:
  *                         break             # <<<<<<<<<<<<<<
  *                     queue._append(i)
  *                     queue._append(l)
  */
-          goto __pyx_L13_break;
-          goto __pyx_L14;
+          goto __pyx_L16_break;
+          goto __pyx_L17;
         }
-        __pyx_L14:;
+        __pyx_L17:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":325
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":325
  *                     if node == NULL:
  *                         break
  *                     queue._append(i)             # <<<<<<<<<<<<<<
@@ -29229,7 +27445,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, __pyx_v_i);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":326
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":326
  *                         break
  *                     queue._append(i)
  *                     queue._append(l)             # <<<<<<<<<<<<<<
@@ -29238,7 +27454,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, __pyx_v_l);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":327
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":327
  *                     queue._append(i)
  *                     queue._append(l)
  *                     trie_node_data_append(node, i)             # <<<<<<<<<<<<<<
@@ -29249,12 +27465,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       }
-      __pyx_L13_break:;
+      __pyx_L16_break:;
     }
-    __pyx_L11:;
+    __pyx_L14:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":329
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":329
  *                     trie_node_data_append(node, i)
  * 
  *         logger.info("    Computing collocations...")             # <<<<<<<<<<<<<<
@@ -29271,7 +27487,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":330
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":330
  * 
  *         logger.info("    Computing collocations...")
  *         N = len(queue)             # <<<<<<<<<<<<<<
@@ -29281,7 +27497,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_queue)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":331
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":331
  *         logger.info("    Computing collocations...")
  *         N = len(queue)
  *         ptr1 = 0             # <<<<<<<<<<<<<<
@@ -29290,7 +27506,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_ptr1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":332
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":332
  *         N = len(queue)
  *         ptr1 = 0
  *         sent_count = 0             # <<<<<<<<<<<<<<
@@ -29299,7 +27515,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_sent_count = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":333
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":333
  *         ptr1 = 0
  *         sent_count = 0
  *         while ptr1 < N:    # main loop             # <<<<<<<<<<<<<<
@@ -29310,7 +27526,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_11 = (__pyx_v_ptr1 < __pyx_v_N);
     if (!__pyx_t_11) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":334
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":334
  *         sent_count = 0
  *         while ptr1 < N:    # main loop
  *             i1 = queue.arr[ptr1]             # <<<<<<<<<<<<<<
@@ -29319,7 +27535,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     __pyx_v_i1 = (__pyx_v_queue->arr[__pyx_v_ptr1]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":335
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":335
  *         while ptr1 < N:    # main loop
  *             i1 = queue.arr[ptr1]
  *             if i1 > -1:             # <<<<<<<<<<<<<<
@@ -29329,7 +27545,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_11 = (__pyx_v_i1 > -1);
     if (__pyx_t_11) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":336
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":336
  *             i1 = queue.arr[ptr1]
  *             if i1 > -1:
  *                 l1 = queue.arr[ptr1+1]             # <<<<<<<<<<<<<<
@@ -29338,7 +27554,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_l1 = (__pyx_v_queue->arr[(__pyx_v_ptr1 + 1)]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":337
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":337
  *             if i1 > -1:
  *                 l1 = queue.arr[ptr1+1]
  *                 ptr2 = ptr1 + 2             # <<<<<<<<<<<<<<
@@ -29347,7 +27563,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_ptr2 = (__pyx_v_ptr1 + 2);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":338
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":338
  *                 l1 = queue.arr[ptr1+1]
  *                 ptr2 = ptr1 + 2
  *                 while ptr2 < N:             # <<<<<<<<<<<<<<
@@ -29358,7 +27574,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_t_11 = (__pyx_v_ptr2 < __pyx_v_N);
         if (!__pyx_t_11) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":339
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":339
  *                 ptr2 = ptr1 + 2
  *                 while ptr2 < N:
  *                     i2 = queue.arr[ptr2]             # <<<<<<<<<<<<<<
@@ -29367,7 +27583,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_v_i2 = (__pyx_v_queue->arr[__pyx_v_ptr2]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":340
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":340
  *                 while ptr2 < N:
  *                     i2 = queue.arr[ptr2]
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -29376,26 +27592,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_t_11 = (__pyx_v_i2 == -1);
         if (!__pyx_t_11) {
-          __pyx_t_17 = ((__pyx_v_i2 - __pyx_v_i1) >= __pyx_v_self->train_max_initial_size);
+          __pyx_t_17 = ((__pyx_v_i2 - __pyx_v_i1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
           __pyx_t_18 = __pyx_t_17;
         } else {
           __pyx_t_18 = __pyx_t_11;
         }
         if (__pyx_t_18) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":341
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":341
  *                     i2 = queue.arr[ptr2]
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
  *                         break             # <<<<<<<<<<<<<<
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  */
-          goto __pyx_L19_break;
-          goto __pyx_L20;
+          goto __pyx_L22_break;
+          goto __pyx_L23;
         }
-        __pyx_L20:;
+        __pyx_L23:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":342
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":342
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
  *                         break
  *                     l2 = queue.arr[ptr2+1]             # <<<<<<<<<<<<<<
@@ -29404,34 +27620,34 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_v_l2 = (__pyx_v_queue->arr[(__pyx_v_ptr2 + 1)]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":343
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":343
  *                         break
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):
  */
-        __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= __pyx_v_self->train_min_gap_size);
+        __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size);
         if (__pyx_t_18) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":344
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":344
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  *                             i2 + l2 - i1 <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)
  */
-          __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
+          __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
           if (__pyx_t_11) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":345
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":345
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):             # <<<<<<<<<<<<<<
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)
  */
-            __pyx_t_17 = (((__pyx_v_l1 + __pyx_v_l2) + 1) <= __pyx_v_self->max_length);
+            __pyx_t_17 = (((__pyx_v_l1 + __pyx_v_l2) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
             __pyx_t_19 = __pyx_t_17;
           } else {
             __pyx_t_19 = __pyx_t_11;
@@ -29442,7 +27658,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         if (__pyx_t_11) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":346
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":346
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)             # <<<<<<<<<<<<<<
@@ -29451,7 +27667,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
           __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_collocations->__pyx_vtab)->_insert(__pyx_v_collocations, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":347
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":347
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -29460,7 +27676,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
           __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":348
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":348
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)
  *                         for i from i2 <= i < i2+l2:             # <<<<<<<<<<<<<<
@@ -29470,7 +27686,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __pyx_t_13 = (__pyx_v_i2 + __pyx_v_l2);
           for (__pyx_v_i = __pyx_v_i2; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":349
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":349
  *                         node = trie_insert(node, -1)
  *                         for i from i2 <= i < i2+l2:
  *                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -29480,7 +27696,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
             __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":350
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":350
  *                         for i from i2 <= i < i2+l2:
  *                             node = trie_insert(node, data.arr[i])
  *                         trie_node_data_append(node, i1)             # <<<<<<<<<<<<<<
@@ -29491,7 +27707,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":351
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":351
  *                             node = trie_insert(node, data.arr[i])
  *                         trie_node_data_append(node, i1)
  *                         trie_node_data_append(node, i2)             # <<<<<<<<<<<<<<
@@ -29502,7 +27718,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":352
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":352
  *                         trie_node_data_append(node, i1)
  *                         trie_node_data_append(node, i2)
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:             # <<<<<<<<<<<<<<
@@ -29512,7 +27728,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __pyx_t_11 = (((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_super_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_super_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i2), __pyx_v_l2) != NULL);
           if (__pyx_t_11) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":353
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":353
  *                         trie_node_data_append(node, i2)
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:
  *                             if super_frequent_patterns._contains(data.arr+i1, l1) != NULL:             # <<<<<<<<<<<<<<
@@ -29522,7 +27738,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
             __pyx_t_11 = (((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_super_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_super_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1) != NULL);
             if (__pyx_t_11) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":354
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":354
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:
  *                             if super_frequent_patterns._contains(data.arr+i1, l1) != NULL:
  *                                 is_super = 1             # <<<<<<<<<<<<<<
@@ -29530,11 +27746,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                                 is_super = 0
  */
               __pyx_v_is_super = 1;
-              goto __pyx_L25;
+              goto __pyx_L28;
             }
             /*else*/ {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":356
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":356
  *                                 is_super = 1
  *                             else:
  *                                 is_super = 0             # <<<<<<<<<<<<<<
@@ -29543,9 +27759,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_v_is_super = 0;
             }
-            __pyx_L25:;
+            __pyx_L28:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":357
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":357
  *                             else:
  *                                 is_super = 0
  *                             ptr3 = ptr2 + 2             # <<<<<<<<<<<<<<
@@ -29554,7 +27770,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
             __pyx_v_ptr3 = (__pyx_v_ptr2 + 2);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":358
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":358
  *                                 is_super = 0
  *                             ptr3 = ptr2 + 2
  *                             while ptr3 < N:             # <<<<<<<<<<<<<<
@@ -29565,7 +27781,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               __pyx_t_11 = (__pyx_v_ptr3 < __pyx_v_N);
               if (!__pyx_t_11) break;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":359
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":359
  *                             ptr3 = ptr2 + 2
  *                             while ptr3 < N:
  *                                 i3 = queue.arr[ptr3]             # <<<<<<<<<<<<<<
@@ -29574,7 +27790,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_v_i3 = (__pyx_v_queue->arr[__pyx_v_ptr3]);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":360
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":360
  *                             while ptr3 < N:
  *                                 i3 = queue.arr[ptr3]
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -29583,26 +27799,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_t_11 = (__pyx_v_i3 == -1);
               if (!__pyx_t_11) {
-                __pyx_t_18 = ((__pyx_v_i3 - __pyx_v_i1) >= __pyx_v_self->train_max_initial_size);
+                __pyx_t_18 = ((__pyx_v_i3 - __pyx_v_i1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
                 __pyx_t_19 = __pyx_t_18;
               } else {
                 __pyx_t_19 = __pyx_t_11;
               }
               if (__pyx_t_19) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":361
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":361
  *                                 i3 = queue.arr[ptr3]
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
  *                                     break             # <<<<<<<<<<<<<<
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  */
-                goto __pyx_L27_break;
-                goto __pyx_L28;
+                goto __pyx_L30_break;
+                goto __pyx_L31;
               }
-              __pyx_L28:;
+              __pyx_L31:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":362
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":362
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
  *                                     break
  *                                 l3 = queue.arr[ptr3+1]             # <<<<<<<<<<<<<<
@@ -29611,34 +27827,34 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_v_l3 = (__pyx_v_queue->arr[(__pyx_v_ptr3 + 1)]);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":363
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":363
  *                                     break
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):
  */
-              __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= __pyx_v_self->train_min_gap_size);
+              __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size);
               if (__pyx_t_19) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":364
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":364
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  */
-                __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
+                __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
                 if (__pyx_t_11) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":365
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":365
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):             # <<<<<<<<<<<<<<
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)
  */
-                  __pyx_t_18 = ((((__pyx_v_l1 + __pyx_v_l2) + __pyx_v_l3) + 2) <= __pyx_v_self->max_length);
+                  __pyx_t_18 = ((((__pyx_v_l1 + __pyx_v_l2) + __pyx_v_l3) + 2) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
                   __pyx_t_17 = __pyx_t_18;
                 } else {
                   __pyx_t_17 = __pyx_t_11;
@@ -29649,7 +27865,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               }
               if (__pyx_t_11) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":366
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":366
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:             # <<<<<<<<<<<<<<
@@ -29664,7 +27880,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                 }
                 if (__pyx_t_19) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":367
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":367
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)             # <<<<<<<<<<<<<<
@@ -29673,7 +27889,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
                   __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_collocations->__pyx_vtab)->_insert(__pyx_v_collocations, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":368
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":368
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)
  *                                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -29682,7 +27898,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
                   __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":369
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":369
  *                                         node = collocations._insert(data.arr+i1, l1)
  *                                         node = trie_insert(node, -1)
  *                                         for i from i2 <= i < i2+l2:             # <<<<<<<<<<<<<<
@@ -29692,7 +27908,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __pyx_t_13 = (__pyx_v_i2 + __pyx_v_l2);
                   for (__pyx_v_i = __pyx_v_i2; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":370
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":370
  *                                         node = trie_insert(node, -1)
  *                                         for i from i2 <= i < i2+l2:
  *                                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -29702,7 +27918,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
                   }
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":371
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":371
  *                                         for i from i2 <= i < i2+l2:
  *                                             node = trie_insert(node, data.arr[i])
  *                                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -29711,7 +27927,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
                   __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":372
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":372
  *                                             node = trie_insert(node, data.arr[i])
  *                                         node = trie_insert(node, -1)
  *                                         for i from i3 <= i < i3+l3:             # <<<<<<<<<<<<<<
@@ -29721,7 +27937,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __pyx_t_13 = (__pyx_v_i3 + __pyx_v_l3);
                   for (__pyx_v_i = __pyx_v_i3; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":373
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":373
  *                                         node = trie_insert(node, -1)
  *                                         for i from i3 <= i < i3+l3:
  *                                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -29731,7 +27947,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
                   }
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":374
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":374
  *                                         for i from i3 <= i < i3+l3:
  *                                             node = trie_insert(node, data.arr[i])
  *                                         trie_node_data_append(node, i1)             # <<<<<<<<<<<<<<
@@ -29742,7 +27958,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":375
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":375
  *                                             node = trie_insert(node, data.arr[i])
  *                                         trie_node_data_append(node, i1)
  *                                         trie_node_data_append(node, i2)             # <<<<<<<<<<<<<<
@@ -29753,7 +27969,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":376
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":376
  *                                         trie_node_data_append(node, i1)
  *                                         trie_node_data_append(node, i2)
  *                                         trie_node_data_append(node, i3)             # <<<<<<<<<<<<<<
@@ -29763,14 +27979,14 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __pyx_t_3 = __pyx_f_3_sa_trie_node_data_append(__pyx_v_node, __pyx_v_i3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                  goto __pyx_L30;
+                  goto __pyx_L33;
                 }
-                __pyx_L30:;
-                goto __pyx_L29;
+                __pyx_L33:;
+                goto __pyx_L32;
               }
-              __pyx_L29:;
+              __pyx_L32:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":377
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":377
  *                                         trie_node_data_append(node, i2)
  *                                         trie_node_data_append(node, i3)
  *                                 ptr3 = ptr3 + 2             # <<<<<<<<<<<<<<
@@ -29779,15 +27995,15 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_v_ptr3 = (__pyx_v_ptr3 + 2);
             }
-            __pyx_L27_break:;
-            goto __pyx_L24;
+            __pyx_L30_break:;
+            goto __pyx_L27;
           }
-          __pyx_L24:;
-          goto __pyx_L21;
+          __pyx_L27:;
+          goto __pyx_L24;
         }
-        __pyx_L21:;
+        __pyx_L24:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":378
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":378
  *                                         trie_node_data_append(node, i3)
  *                                 ptr3 = ptr3 + 2
  *                     ptr2 = ptr2 + 2             # <<<<<<<<<<<<<<
@@ -29796,9 +28012,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_v_ptr2 = (__pyx_v_ptr2 + 2);
       }
-      __pyx_L19_break:;
+      __pyx_L22_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":379
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":379
  *                                 ptr3 = ptr3 + 2
  *                     ptr2 = ptr2 + 2
  *                 ptr1 = ptr1 + 2             # <<<<<<<<<<<<<<
@@ -29806,11 +28022,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 sent_count = sent_count + 1
  */
       __pyx_v_ptr1 = (__pyx_v_ptr1 + 2);
-      goto __pyx_L17;
+      goto __pyx_L20;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":381
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":381
  *                 ptr1 = ptr1 + 2
  *             else:
  *                 sent_count = sent_count + 1             # <<<<<<<<<<<<<<
@@ -29819,7 +28035,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_sent_count = (__pyx_v_sent_count + 1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":382
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":382
  *             else:
  *                 sent_count = sent_count + 1
  *                 if sent_count % 10000 == 0:             # <<<<<<<<<<<<<<
@@ -29829,7 +28045,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_19 = (__Pyx_mod_long(__pyx_v_sent_count, 10000) == 0);
       if (__pyx_t_19) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":383
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":383
  *                 sent_count = sent_count + 1
  *                 if sent_count % 10000 == 0:
  *                     logger.debug("        %d sentences", sent_count)             # <<<<<<<<<<<<<<
@@ -29844,7 +28060,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_t_3 = PyInt_FromLong(__pyx_v_sent_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_8);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_8));
         __Pyx_INCREF(((PyObject *)__pyx_kp_s_78));
         PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_78));
         __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_78));
@@ -29856,11 +28072,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        goto __pyx_L35;
+        goto __pyx_L38;
       }
-      __pyx_L35:;
+      __pyx_L38:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":384
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":384
  *                 if sent_count % 10000 == 0:
  *                     logger.debug("        %d sentences", sent_count)
  *                 ptr1 = ptr1 + 1             # <<<<<<<<<<<<<<
@@ -29869,10 +28085,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_ptr1 = (__pyx_v_ptr1 + 1);
     }
-    __pyx_L17:;
+    __pyx_L20:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":386
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":386
  *                 ptr1 = ptr1 + 1
  * 
  *         self.precomputed_collocations = collocations.toMap(False)             # <<<<<<<<<<<<<<
@@ -29884,7 +28100,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_8 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
   __pyx_t_8 = 0;
@@ -29893,12 +28109,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_8);
-  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
-  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
-  __pyx_v_self->precomputed_collocations = __pyx_t_8;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations = __pyx_t_8;
   __pyx_t_8 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":387
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":387
  * 
  *         self.precomputed_collocations = collocations.toMap(False)
  *         self.precomputed_index = frequent_patterns.toMap(True)             # <<<<<<<<<<<<<<
@@ -29910,7 +28126,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -29919,12 +28135,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
-  __Pyx_DECREF(__pyx_v_self->precomputed_index);
-  __pyx_v_self->precomputed_index = __pyx_t_1;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":389
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":389
  *         self.precomputed_index = frequent_patterns.toMap(True)
  * 
  *         x = 0             # <<<<<<<<<<<<<<
@@ -29934,7 +28150,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_x = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":390
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":390
  * 
  *         x = 0
  *         for pattern1 in J_set:             # <<<<<<<<<<<<<<
@@ -29960,7 +28176,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":391
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":391
  *         x = 0
  *         for pattern1 in J_set:
  *             for pattern2 in J_set:             # <<<<<<<<<<<<<<
@@ -29986,7 +28202,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_pattern2 = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":392
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":392
  *         for pattern1 in J_set:
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:             # <<<<<<<<<<<<<<
@@ -29995,10 +28211,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < __pyx_v_self->max_length);
+      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
       if (__pyx_t_19) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":393
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":393
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -30014,23 +28230,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_combined_pattern = __pyx_t_7;
         __pyx_t_7 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":394
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":394
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     J2_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  * 
  *         for pattern1 in I_set:
  */
+        if (unlikely(((PyObject *)__pyx_v_J2_set) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_15 = PySet_Add(__pyx_v_J2_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L40;
+        goto __pyx_L43;
       }
-      __pyx_L40:;
+      __pyx_L43:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":396
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":396
  *                     J2_set.add(combined_pattern)
  * 
  *         for pattern1 in I_set:             # <<<<<<<<<<<<<<
@@ -30056,7 +28275,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":397
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":397
  * 
  *         for pattern1 in I_set:
  *             for pattern2 in I_set:             # <<<<<<<<<<<<<<
@@ -30082,7 +28301,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_pattern2 = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":398
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":398
  *         for pattern1 in I_set:
  *             for pattern2 in I_set:
  *                 x = x+1             # <<<<<<<<<<<<<<
@@ -30095,7 +28314,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_x = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":399
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":399
  *             for pattern2 in I_set:
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:             # <<<<<<<<<<<<<<
@@ -30104,10 +28323,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= __pyx_v_self->max_length);
+      __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
       if (__pyx_t_19) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":400
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":400
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -30123,23 +28342,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_combined_pattern = __pyx_t_8;
         __pyx_t_8 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":401
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":401
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  * 
  *         for pattern1 in I_set:
  */
+        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L45;
+        goto __pyx_L48;
       }
-      __pyx_L45:;
+      __pyx_L48:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":403
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":403
  *                     IJ_set.add(combined_pattern)
  * 
  *         for pattern1 in I_set:             # <<<<<<<<<<<<<<
@@ -30165,7 +28387,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":404
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":404
  * 
  *         for pattern1 in I_set:
  *             for pattern2 in J2_set:             # <<<<<<<<<<<<<<
@@ -30191,7 +28413,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_pattern2 = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":405
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":405
  *         for pattern1 in I_set:
  *             for pattern2 in J2_set:
  *                 x = x+2             # <<<<<<<<<<<<<<
@@ -30204,7 +28426,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_x = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":406
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":406
  *             for pattern2 in J2_set:
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:             # <<<<<<<<<<<<<<
@@ -30213,10 +28435,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= __pyx_v_self->max_length);
+      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
       if (__pyx_t_19) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":407
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":407
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -30232,16 +28454,19 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_combined_pattern = __pyx_t_7;
         __pyx_t_7 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":408
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":408
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  *                     IJ_set.add(combined_pattern)
  */
+        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":409
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":409
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1             # <<<<<<<<<<<<<<
@@ -30257,33 +28482,39 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_combined_pattern = __pyx_t_8;
         __pyx_t_8 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":410
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":410
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  * 
  *         N = len(pattern_rank)
  */
+        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L50;
+        goto __pyx_L53;
       }
-      __pyx_L50:;
+      __pyx_L53:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":412
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":412
  *                     IJ_set.add(combined_pattern)
  * 
  *         N = len(pattern_rank)             # <<<<<<<<<<<<<<
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)
  */
-  __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(((PyObject *)__pyx_v_pattern_rank) == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
+  __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); 
   __pyx_v_N = __pyx_t_14;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":413
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":413
  * 
  *         N = len(pattern_rank)
  *         cost_by_rank = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -30296,13 +28527,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_cost_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":414
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":414
  *         N = len(pattern_rank)
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -30315,53 +28546,111 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __pyx_v_count_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":415
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":415
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)
  *         for pattern, arr in self.precomputed_collocations.iteritems():             # <<<<<<<<<<<<<<
  *             if pattern not in IJ_set:
  *                 s = ""
  */
-  __pyx_t_14 = 0;
-  if (unlikely(__pyx_v_self->precomputed_collocations == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_self->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_2), (&__pyx_t_13)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_1);
-  __pyx_t_1 = __pyx_t_3;
-  __pyx_t_3 = 0;
-  while (1) {
-    __pyx_t_16 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_2, &__pyx_t_14, &__pyx_t_3, &__pyx_t_8, NULL, __pyx_t_13);
-    if (unlikely(__pyx_t_16 == 0)) break;
-    if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+    __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_14 = 0;
+    __pyx_t_4 = NULL;
+  } else {
+    __pyx_t_14 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  for (;;) {
+    if (PyList_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_14 >= PyList_GET_SIZE(__pyx_t_1)) break;
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_14 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++;
+    } else {
+      __pyx_t_3 = __pyx_t_4(__pyx_t_1);
+      if (unlikely(!__pyx_t_3)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+      PyObject* sequence = __pyx_t_3;
+      if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
+        __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
+      } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
+        __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
+      }
+      __Pyx_INCREF(__pyx_t_8);
+      __Pyx_INCREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    } else {
+      Py_ssize_t index = -1;
+      __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_10 = Py_TYPE(__pyx_t_5)->tp_iternext;
+      index = 0; __pyx_t_8 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_8)) goto __pyx_L56_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_8);
+      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_7)) goto __pyx_L56_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_7);
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_5), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      goto __pyx_L57_unpacking_done;
+      __pyx_L56_unpacking_failed:;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_L57_unpacking_done:;
+    }
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_3;
-    __pyx_t_3 = 0;
-    __Pyx_XDECREF(__pyx_v_arr);
-    __pyx_v_arr = __pyx_t_8;
+    __pyx_v_pattern = __pyx_t_8;
     __pyx_t_8 = 0;
+    __Pyx_XDECREF(__pyx_v_arr);
+    __pyx_v_arr = __pyx_t_7;
+    __pyx_t_7 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":416
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":416
  *         count_by_rank = IntList(initial_len=N)
  *         for pattern, arr in self.precomputed_collocations.iteritems():
  *             if pattern not in IJ_set:             # <<<<<<<<<<<<<<
  *                 s = ""
  *                 for word_id in pattern:
  */
-    __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, ((PyObject *)__pyx_v_IJ_set), Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_IJ_set), __pyx_v_pattern))); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":417
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":417
  *         for pattern, arr in self.precomputed_collocations.iteritems():
  *             if pattern not in IJ_set:
  *                 s = ""             # <<<<<<<<<<<<<<
@@ -30372,7 +28661,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_XDECREF(__pyx_v_s);
       __pyx_v_s = ((PyObject *)__pyx_kp_s_45);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":418
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":418
  *             if pattern not in IJ_set:
  *                 s = ""
  *                 for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -30380,124 +28669,117 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                         s = s + "X "
  */
       if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-        __pyx_t_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_12 = 0;
-        __pyx_t_4 = NULL;
+        __pyx_t_3 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
+        __pyx_t_20 = NULL;
       } else {
-        __pyx_t_12 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_4 = Py_TYPE(__pyx_t_8)->tp_iternext;
+        __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_20 = Py_TYPE(__pyx_t_3)->tp_iternext;
       }
       for (;;) {
-        if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_8)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_12); __Pyx_INCREF(__pyx_t_3); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
-        } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_12); __Pyx_INCREF(__pyx_t_3); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+        if (PyList_CheckExact(__pyx_t_3)) {
+          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
+          __pyx_t_7 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
+        } else if (PyTuple_CheckExact(__pyx_t_3)) {
+          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+          __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
         } else {
-          __pyx_t_3 = __pyx_t_4(__pyx_t_8);
-          if (unlikely(!__pyx_t_3)) {
+          __pyx_t_7 = __pyx_t_20(__pyx_t_3);
+          if (unlikely(!__pyx_t_7)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
               else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(__pyx_t_7);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_word_id = __pyx_t_7;
+        __pyx_t_7 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":419
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":419
  *                 s = ""
  *                 for word_id in pattern:
  *                     if word_id == -1:             # <<<<<<<<<<<<<<
  *                         s = s + "X "
  *                     else:
  */
-        __pyx_t_3 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_7 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (__pyx_t_19) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":420
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":420
  *                 for word_id in pattern:
  *                     if word_id == -1:
  *                         s = s + "X "             # <<<<<<<<<<<<<<
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "
  */
-          __pyx_t_3 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_7 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_7);
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_3;
-          __pyx_t_3 = 0;
-          goto __pyx_L56;
+          __pyx_v_s = __pyx_t_7;
+          __pyx_t_7 = 0;
+          goto __pyx_L61;
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":422
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":422
  *                         s = s + "X "
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "             # <<<<<<<<<<<<<<
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)
  *             else:
  */
-          __pyx_t_3 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_7 = PyNumber_Add(__pyx_v_s, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_7 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyNumber_Add(__pyx_t_7, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_8 = PyNumber_Add(__pyx_v_s, __pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_t_7 = PyNumber_Add(__pyx_t_8, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __pyx_v_s = __pyx_t_7;
+          __pyx_t_7 = 0;
         }
-        __pyx_L56:;
+        __pyx_L61:;
       }
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":423
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":423
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)             # <<<<<<<<<<<<<<
  *             else:
  *                 chunk = ()
  */
-      __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_3 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__warn); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_84));
-      PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_84));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_84));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_84));
       __Pyx_INCREF(__pyx_v_s);
-      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_s);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_s);
       __Pyx_GIVEREF(__pyx_v_s);
-      __pyx_t_7 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L53;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L58;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":425
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":425
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)
  *             else:
  *                 chunk = ()             # <<<<<<<<<<<<<<
@@ -30508,7 +28790,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_XDECREF(((PyObject *)__pyx_v_chunk));
       __pyx_v_chunk = __pyx_empty_tuple;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":426
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":426
  *             else:
  *                 chunk = ()
  *                 max_rank = 0             # <<<<<<<<<<<<<<
@@ -30517,7 +28799,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_max_rank = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":427
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":427
  *                 chunk = ()
  *                 max_rank = 0
  *                 arity = 0             # <<<<<<<<<<<<<<
@@ -30528,7 +28810,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_XDECREF(__pyx_v_arity);
       __pyx_v_arity = __pyx_int_0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":428
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":428
  *                 max_rank = 0
  *                 arity = 0
  *                 for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -30536,99 +28818,93 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  */
       if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-        __pyx_t_7 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_7); __pyx_t_12 = 0;
-        __pyx_t_4 = NULL;
+        __pyx_t_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_2 = 0;
+        __pyx_t_20 = NULL;
       } else {
-        __pyx_t_12 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_4 = Py_TYPE(__pyx_t_7)->tp_iternext;
+        __pyx_t_2 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_20 = Py_TYPE(__pyx_t_8)->tp_iternext;
       }
       for (;;) {
-        if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_7)) {
-          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_7)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_8 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_8); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
-        } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_7)) {
-          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_8); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+        if (PyList_CheckExact(__pyx_t_8)) {
+          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_8)) break;
+          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
+        } else if (PyTuple_CheckExact(__pyx_t_8)) {
+          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
+          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
         } else {
-          __pyx_t_8 = __pyx_t_4(__pyx_t_7);
-          if (unlikely(!__pyx_t_8)) {
+          __pyx_t_3 = __pyx_t_20(__pyx_t_8);
+          if (unlikely(!__pyx_t_3)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
               else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_GOTREF(__pyx_t_3);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_8;
-        __pyx_t_8 = 0;
+        __pyx_v_word_id = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":429
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":429
  *                 arity = 0
  *                 for word_id in pattern:
  *                     if word_id == -1:             # <<<<<<<<<<<<<<
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1
  */
-        __pyx_t_8 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __pyx_t_3 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_19) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":430
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":430
  *                 for word_id in pattern:
  *                     if word_id == -1:
  *                         max_rank = max(max_rank, pattern_rank[chunk])             # <<<<<<<<<<<<<<
  *                         arity = arity + 1
  *                         chunk = ()
  */
-          __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
-          __pyx_t_16 = __pyx_v_max_rank;
-          __pyx_t_5 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_13 = __pyx_v_max_rank;
+          __pyx_t_5 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
-          __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_5, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, __pyx_t_5, Py_GT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_6);
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
           __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
           if (__pyx_t_19) {
-            __Pyx_INCREF(__pyx_t_8);
-            __pyx_t_3 = __pyx_t_8;
+            __Pyx_INCREF(__pyx_t_3);
+            __pyx_t_7 = __pyx_t_3;
           } else {
-            __pyx_t_6 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_6 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_6);
-            __pyx_t_3 = __pyx_t_6;
+            __pyx_t_7 = __pyx_t_6;
             __pyx_t_6 = 0;
           }
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_v_max_rank = __pyx_t_16;
+          __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_v_max_rank = __pyx_t_13;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":431
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":431
  *                     if word_id == -1:
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1             # <<<<<<<<<<<<<<
  *                         chunk = ()
  *                     else:
  */
-          __pyx_t_3 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_7 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_7);
           __Pyx_DECREF(__pyx_v_arity);
-          __pyx_v_arity = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __pyx_v_arity = __pyx_t_7;
+          __pyx_t_7 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":432
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":432
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1
  *                         chunk = ()             # <<<<<<<<<<<<<<
@@ -30638,104 +28914,105 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
           __pyx_v_chunk = __pyx_empty_tuple;
-          goto __pyx_L59;
+          goto __pyx_L64;
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":434
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":434
  *                         chunk = ()
  *                     else:
  *                         chunk = chunk + (word_id,)             # <<<<<<<<<<<<<<
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  */
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_7));
           __Pyx_INCREF(__pyx_v_word_id);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_word_id);
+          PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_word_id);
           __Pyx_GIVEREF(__pyx_v_word_id);
-          __pyx_t_8 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+          __pyx_t_3 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
-          __pyx_v_chunk = __pyx_t_8;
-          __pyx_t_8 = 0;
+          __pyx_v_chunk = __pyx_t_3;
+          __pyx_t_3 = 0;
         }
-        __pyx_L59:;
+        __pyx_L64:;
       }
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":435
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":435
  *                     else:
  *                         chunk = chunk + (word_id,)
  *                 max_rank = max(max_rank, pattern_rank[chunk])             # <<<<<<<<<<<<<<
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  */
-      __pyx_t_7 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_13 = __pyx_v_max_rank;
+      __pyx_t_7 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_16 = __pyx_v_max_rank;
-      __pyx_t_3 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_6 = PyObject_RichCompare(__pyx_t_7, __pyx_t_3, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_7, Py_GT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       if (__pyx_t_19) {
-        __Pyx_INCREF(__pyx_t_7);
-        __pyx_t_8 = __pyx_t_7;
+        __Pyx_INCREF(__pyx_t_8);
+        __pyx_t_3 = __pyx_t_8;
       } else {
-        __pyx_t_6 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_8 = __pyx_t_6;
+        __pyx_t_3 = __pyx_t_6;
         __pyx_t_6 = 0;
       }
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_v_max_rank = __pyx_t_16;
+      __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_v_max_rank = __pyx_t_13;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":436
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":436
  *                         chunk = chunk + (word_id,)
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))             # <<<<<<<<<<<<<<
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  * 
  */
-      __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_12));
+      __pyx_t_2 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_2));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":437
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":437
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))             # <<<<<<<<<<<<<<
  * 
  *         cumul_cost = 0
  */
-      __pyx_t_8 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_2 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_7 = PyInt_FromSsize_t(__pyx_t_12); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_6 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_7 = __Pyx_PyNumber_Divide(__pyx_t_8, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyNumber_Add(__pyx_t_8, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyNumber_Add(__pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_16;
+      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_13;
     }
-    __pyx_L53:;
+    __pyx_L58:;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":439
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":439
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  * 
  *         cumul_cost = 0             # <<<<<<<<<<<<<<
@@ -30745,7 +29022,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_cumul_cost = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":440
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":440
  * 
  *         cumul_cost = 0
  *         cumul_count = 0             # <<<<<<<<<<<<<<
@@ -30755,7 +29032,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_cumul_count = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":441
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":441
  *         cumul_cost = 0
  *         cumul_count = 0
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -30765,7 +29042,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_13 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":442
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":442
  *         cumul_count = 0
  *         for i from 0 <= i < N:
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]             # <<<<<<<<<<<<<<
@@ -30781,7 +29058,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_cumul_cost = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":443
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":443
  *         for i from 0 <= i < N:
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]
  *             cumul_count = cumul_count + count_by_rank.arr[i]             # <<<<<<<<<<<<<<
@@ -30797,7 +29074,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_cumul_count = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":444
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":444
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]
  *             cumul_count = cumul_count + count_by_rank.arr[i]
  *             logger.debug("RANK %d\tCOUNT, COST: %d    %d\tCUMUL: %d, %d", i, count_by_rank.arr[i], cost_by_rank.arr[i], cumul_count, cumul_cost)             # <<<<<<<<<<<<<<
@@ -30811,107 +29088,104 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_8 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
-    __pyx_t_7 = PyTuple_New(6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_8 = PyTuple_New(6); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_85));
+    PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_85));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
-    PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7);
+    __Pyx_GIVEREF(__pyx_t_7);
+    PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_8);
-    __Pyx_GIVEREF(__pyx_t_8);
     __Pyx_INCREF(__pyx_v_cumul_count);
-    PyTuple_SET_ITEM(__pyx_t_7, 4, __pyx_v_cumul_count);
+    PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_v_cumul_count);
     __Pyx_GIVEREF(__pyx_v_cumul_count);
     __Pyx_INCREF(__pyx_v_cumul_cost);
-    PyTuple_SET_ITEM(__pyx_t_7, 5, __pyx_v_cumul_cost);
+    PyTuple_SET_ITEM(__pyx_t_8, 5, __pyx_v_cumul_cost);
     __Pyx_GIVEREF(__pyx_v_cumul_cost);
     __pyx_t_1 = 0;
+    __pyx_t_7 = 0;
     __pyx_t_3 = 0;
-    __pyx_t_8 = 0;
-    __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":446
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":446
  *             logger.debug("RANK %d\tCOUNT, COST: %d    %d\tCUMUL: %d, %d", i, count_by_rank.arr[i], cost_by_rank.arr[i], cumul_count, cumul_cost)
  * 
  *         num_found_patterns = len(self.precomputed_collocations)             # <<<<<<<<<<<<<<
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:
  */
-  __pyx_t_8 = __pyx_v_self->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_8);
-  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_v_num_found_patterns = __pyx_t_8;
-  __pyx_t_8 = 0;
+  __pyx_t_3 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_14 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_num_found_patterns = __pyx_t_14;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":447
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":447
  * 
  *         num_found_patterns = len(self.precomputed_collocations)
  *         for pattern in IJ_set:             # <<<<<<<<<<<<<<
  *             if pattern not in self.precomputed_collocations:
  *                 self.precomputed_collocations[pattern] = IntList()
  */
-  __pyx_t_8 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_4 = Py_TYPE(__pyx_t_8)->tp_iternext;
+  __pyx_t_3 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
   for (;;) {
     {
-      __pyx_t_7 = __pyx_t_4(__pyx_t_8);
-      if (unlikely(!__pyx_t_7)) {
+      __pyx_t_8 = __pyx_t_4(__pyx_t_3);
+      if (unlikely(!__pyx_t_8)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
           else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
-      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_GOTREF(__pyx_t_8);
     }
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_7;
-    __pyx_t_7 = 0;
+    __pyx_v_pattern = __pyx_t_8;
+    __pyx_t_8 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":448
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":448
  *         num_found_patterns = len(self.precomputed_collocations)
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:             # <<<<<<<<<<<<<<
  *                 self.precomputed_collocations[pattern] = IntList()
  * 
  */
-    __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, __pyx_v_self->precomputed_collocations, Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_v_pattern))); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":449
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":449
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:
  *                 self.precomputed_collocations[pattern] = IntList()             # <<<<<<<<<<<<<<
  * 
  *         cdef float stop_time = monitor_cpu()
  */
-      __pyx_t_7 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_pattern, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L64;
+      __pyx_t_8 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      if (PyObject_SetItem(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_v_pattern, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L69;
     }
-    __pyx_L64:;
+    __pyx_L69:;
   }
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":451
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":451
  *                 self.precomputed_collocations[pattern] = IntList()
  * 
  *         cdef float stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -30920,100 +29194,102 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_stop_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":452
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":452
  * 
  *         cdef float stop_time = monitor_cpu()
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)             # <<<<<<<<<<<<<<
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))
  */
-  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_7);
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = __pyx_v_self->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_8);
-  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_8 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_6 = PyTuple_New(4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_num_found_patterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_6 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_6);
+  __pyx_t_14 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_14); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_86));
-  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_s_86));
+  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_86));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_86));
-  __Pyx_INCREF(__pyx_v_num_found_patterns);
-  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_v_num_found_patterns);
-  __Pyx_GIVEREF(__pyx_v_num_found_patterns);
-  PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_8);
-  __Pyx_GIVEREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_6);
   __Pyx_INCREF(__pyx_v_x);
-  PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_v_x);
+  PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_v_x);
   __Pyx_GIVEREF(__pyx_v_x);
-  __pyx_t_8 = 0;
-  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_6 = 0;
+  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":453
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":453
  *         cdef float stop_time = monitor_cpu()
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))             # <<<<<<<<<<<<<<
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))
  */
-  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_6 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = __pyx_v_self->precomputed_index;
-  __Pyx_INCREF(__pyx_t_8);
-  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index;
+  __Pyx_INCREF(__pyx_t_6);
+  __pyx_t_14 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_14); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_8));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_87));
+  PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_87));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_8);
-  __Pyx_GIVEREF(__pyx_t_8);
-  __pyx_t_8 = 0;
-  __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_6);
+  __pyx_t_6 = 0;
+  __pyx_t_6 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":454
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":454
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
  */
-  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_7);
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_8 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_88));
-  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_s_88));
+  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_88));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_88));
-  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_8);
-  __Pyx_GIVEREF(__pyx_t_8);
-  __pyx_t_8 = 0;
-  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
+  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_6);
+  __pyx_t_6 = 0;
+  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -31056,39 +29332,43 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_XDECREF(__pyx_v_arity);
   __Pyx_XDECREF(__pyx_v_cumul_cost);
   __Pyx_XDECREF(__pyx_v_cumul_count);
-  __Pyx_XDECREF(__pyx_v_num_found_patterns);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":11
+ *     cdef IntList ha
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
+ *         self.darray = DataArray()
+ *         self.sa = IntList()
+ */
+
+static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
     PyObject* values[3] = {0,0,0};
-
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":11
- *     cdef IntList ha
- * 
- *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
- *         self.darray = DataArray()
- *         self.sa = IntList()
- */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -31096,7 +29376,7 @@ static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObje
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -31114,7 +29394,7 @@ static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObje
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -31137,24 +29417,8 @@ static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObje
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray___cinit__(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text, __pyx_v_side);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":12
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":12
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):
  *         self.darray = DataArray()             # <<<<<<<<<<<<<<
@@ -31164,12 +29428,12 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->darray);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->darray));
-  __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":13
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":13
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):
  *         self.darray = DataArray()
  *         self.sa = IntList()             # <<<<<<<<<<<<<<
@@ -31179,12 +29443,12 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->sa);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
-  __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":14
  *         self.darray = DataArray()
  *         self.sa = IntList()
  *         self.ha = IntList()             # <<<<<<<<<<<<<<
@@ -31194,12 +29458,12 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->ha);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->ha));
-  __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":15
  *         self.sa = IntList()
  *         self.ha = IntList()
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -31209,17 +29473,17 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":16
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":16
  *         self.ha = IntList()
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_text:
  *             self.read_text(from_text, side)
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -31228,10 +29492,10 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":17
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -31241,17 +29505,17 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":18
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":18
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             self.read_text(from_text, side)             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, i):
  */
-    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -31263,9 +29527,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -31280,18 +29544,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_2__getitem__(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":20
  *             self.read_text(from_text, side)
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -31299,7 +29552,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -31307,9 +29561,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __Pyx_RefNannySetupContext("__getitem__");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":21
  * 
  *     def __getitem__(self, i):
  *         return self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -31318,7 +29572,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sa->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -31336,18 +29590,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_5getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_5getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getSentId (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_4getSentId(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":23
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":23
  *         return self.sa.arr[i]
  * 
  *     def getSentId(self, i):             # <<<<<<<<<<<<<<
@@ -31355,7 +29598,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_5getSentId(PyObject *__pyx_v_self,
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentId(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -31364,9 +29608,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentId(struct __pyx_obj_3_sa_Su
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentId", 0);
+  __Pyx_RefNannySetupContext("getSentId");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":24
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":24
  * 
  *     def getSentId(self, i):
  *         return self.darray.getSentId(i)             # <<<<<<<<<<<<<<
@@ -31374,10 +29618,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentId(struct __pyx_obj_3_sa_Su
  *     def getSent(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__getSentId); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__getSentId); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(__pyx_v_i);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -31403,18 +29647,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentId(struct __pyx_obj_3_sa_Su
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_7getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_7getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getSent (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_6getSent(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":26
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":26
  *         return self.darray.getSentId(i)
  * 
  *     def getSent(self, i):             # <<<<<<<<<<<<<<
@@ -31422,7 +29655,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_7getSent(PyObject *__pyx_v_self, Py
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6getSent(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -31431,9 +29665,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6getSent(struct __pyx_obj_3_sa_Suff
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSent", 0);
+  __Pyx_RefNannySetupContext("getSent");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":27
  * 
  *     def getSent(self, i):
  *         return self.darray.getSent(i)             # <<<<<<<<<<<<<<
@@ -31441,10 +29675,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6getSent(struct __pyx_obj_3_sa_Suff
  *     def getSentPos(self, loc):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__getSent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__getSent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(__pyx_v_i);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -31470,18 +29704,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6getSent(struct __pyx_obj_3_sa_Suff
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_9getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_9getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getSentPos (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_8getSentPos(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":29
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":29
  *         return self.darray.getSent(i)
  * 
  *     def getSentPos(self, loc):             # <<<<<<<<<<<<<<
@@ -31489,7 +29712,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_9getSentPos(PyObject *__pyx_v_self,
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8getSentPos(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -31498,9 +29722,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8getSentPos(struct __pyx_obj_3_sa_S
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentPos", 0);
+  __Pyx_RefNannySetupContext("getSentPos");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":30
  * 
  *     def getSentPos(self, loc):
  *         return self.darray.getSentPos(loc)             # <<<<<<<<<<<<<<
@@ -31508,10 +29732,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8getSentPos(struct __pyx_obj_3_sa_S
  *     def read_text(self, filename, side):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__getSentPos); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__getSentPos); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(__pyx_v_loc);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_loc);
   __Pyx_GIVEREF(__pyx_v_loc);
@@ -31537,40 +29761,75 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8getSentPos(struct __pyx_obj_3_sa_S
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_10read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
-static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":32
+ *         return self.darray.getSentPos(loc)
+ * 
+ *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
+ *         '''Constructs suffix array using the algorithm
+ *         of Larsson & Sadahkane (1999)'''
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_5read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
+static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_filename = 0;
   PyObject *__pyx_v_side = 0;
-  PyObject *__pyx_r = 0;
+  int __pyx_v_V;
+  int __pyx_v_N;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_h;
+  int __pyx_v_a_i;
+  int __pyx_v_n;
+  int __pyx_v_current_run;
+  int __pyx_v_skip;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_word_count = 0;
+  float __pyx_v_sort_start_time;
+  float __pyx_v_start_time;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  long __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
+  __Pyx_RefNannySetupContext("read_text");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("read_text", 1, 2, 2, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -31589,52 +29848,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_10read_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":32
- *         return self.darray.getSentPos(loc)
- * 
- *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
- *         '''Constructs suffix array using the algorithm
- *         of Larsson & Sadahkane (1999)'''
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side) {
-  int __pyx_v_V;
-  int __pyx_v_N;
-  int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_h;
-  int __pyx_v_a_i;
-  int __pyx_v_n;
-  int __pyx_v_current_run;
-  int __pyx_v_skip;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_word_count = 0;
-  float __pyx_v_sort_start_time;
-  float __pyx_v_start_time;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  long __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":38
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":38
  *         cdef IntList isa, word_count
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)             # <<<<<<<<<<<<<<
@@ -31649,42 +29864,42 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__use_sent_id), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->darray);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->darray));
-  __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":39
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":39
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)             # <<<<<<<<<<<<<<
  *         V = len(self.darray.id2word)
  * 
  */
-  __pyx_t_2 = ((PyObject *)__pyx_v_self->darray);
+  __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
   __Pyx_INCREF(__pyx_t_2);
   __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_v_N = __pyx_t_3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":40
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)
  *         V = len(self.darray.id2word)             # <<<<<<<<<<<<<<
  * 
  *         self.sa = IntList(initial_len=N)
  */
-  __pyx_t_2 = __pyx_v_self->darray->id2word;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->id2word;
   __Pyx_INCREF(__pyx_t_2);
   __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_v_V = __pyx_t_3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":42
  *         V = len(self.darray.id2word)
  * 
  *         self.sa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -31697,16 +29912,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->sa);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
-  __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":43
  * 
  *         self.sa = IntList(initial_len=N)
  *         self.ha = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
@@ -31719,16 +29934,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->ha);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->ha));
-  __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":45
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":45
  *         self.ha = IntList(initial_len=V+1)
  * 
  *         isa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -31741,13 +29956,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_isa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":46
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":46
  * 
  *         isa = IntList(initial_len=N)
  *         word_count = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
@@ -31760,13 +29975,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_word_count = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":49
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":49
  * 
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -31775,7 +29990,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_v_sort_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":50
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":50
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()
  *         cdef float start_time = sort_start_time             # <<<<<<<<<<<<<<
@@ -31784,7 +29999,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_v_start_time = __pyx_v_sort_start_time;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":51
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":51
  *         cdef float sort_start_time = monitor_cpu()
  *         cdef float start_time = sort_start_time
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -31794,16 +30009,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":52
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":52
  *         cdef float start_time = sort_start_time
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  */
-    __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
+    __pyx_v_a_i = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->data->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":53
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":53
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1             # <<<<<<<<<<<<<<
@@ -31813,7 +30028,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     (__pyx_v_word_count->arr[__pyx_v_a_i]) = ((__pyx_v_word_count->arr[__pyx_v_a_i]) + 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":55
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":55
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  *         n = 0             # <<<<<<<<<<<<<<
@@ -31822,7 +30037,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_v_n = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":56
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":56
  * 
  *         n = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -31832,16 +30047,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_5 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":57
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":57
  *         n = 0
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n             # <<<<<<<<<<<<<<
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0
  */
-    (__pyx_v_self->ha->arr[__pyx_v_i]) = __pyx_v_n;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i]) = __pyx_v_n;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":58
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":58
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]             # <<<<<<<<<<<<<<
@@ -31850,7 +30065,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_n = (__pyx_v_n + (__pyx_v_word_count->arr[__pyx_v_i]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":59
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":59
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0             # <<<<<<<<<<<<<<
@@ -31860,7 +30075,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     (__pyx_v_word_count->arr[__pyx_v_i]) = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":61
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":61
  *             word_count.arr[i] = 0
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -31870,34 +30085,34 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":62
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":62
  * 
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  */
-    __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
+    __pyx_v_a_i = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->data->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":63
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":63
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i             # <<<<<<<<<<<<<<
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  */
-    (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":64
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":64
  *             a_i = self.darray.data.arr[i]
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket             # <<<<<<<<<<<<<<
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  */
-    (__pyx_v_isa->arr[__pyx_v_i]) = ((__pyx_v_self->ha->arr[(__pyx_v_a_i + 1)]) - 1);
+    (__pyx_v_isa->arr[__pyx_v_i]) = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[(__pyx_v_a_i + 1)]) - 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":65
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":65
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1             # <<<<<<<<<<<<<<
@@ -31907,7 +30122,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     (__pyx_v_word_count->arr[__pyx_v_a_i]) = ((__pyx_v_word_count->arr[__pyx_v_a_i]) + 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":68
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":68
  * 
  *         '''Determine size of initial runs'''
  *         current_run = 0             # <<<<<<<<<<<<<<
@@ -31916,7 +30131,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_v_current_run = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":69
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":69
  *         '''Determine size of initial runs'''
  *         current_run = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -31926,7 +30141,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_5 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":70
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":70
  *         current_run = 0
  *         for i from 0 <= i < V+1:
  *             if i < V and self.ha.arr[i+1] - self.ha.arr[i] == 1:             # <<<<<<<<<<<<<<
@@ -31935,14 +30150,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_t_6 = (__pyx_v_i < __pyx_v_V);
     if (__pyx_t_6) {
-      __pyx_t_7 = (((__pyx_v_self->ha->arr[(__pyx_v_i + 1)]) - (__pyx_v_self->ha->arr[__pyx_v_i])) == 1);
+      __pyx_t_7 = (((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[(__pyx_v_i + 1)]) - (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i])) == 1);
       __pyx_t_8 = __pyx_t_7;
     } else {
       __pyx_t_8 = __pyx_t_6;
     }
     if (__pyx_t_8) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":71
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":71
  *         for i from 0 <= i < V+1:
  *             if i < V and self.ha.arr[i+1] - self.ha.arr[i] == 1:
  *                 current_run = current_run + 1             # <<<<<<<<<<<<<<
@@ -31950,11 +30165,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                 if current_run > 0:
  */
       __pyx_v_current_run = (__pyx_v_current_run + 1);
-      goto __pyx_L11;
+      goto __pyx_L14;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":73
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":73
  *                 current_run = current_run + 1
  *             else:
  *                 if current_run > 0:             # <<<<<<<<<<<<<<
@@ -31964,16 +30179,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
       __pyx_t_8 = (__pyx_v_current_run > 0);
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":74
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":74
  *             else:
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run             # <<<<<<<<<<<<<<
  *                     current_run = 0
  * 
  */
-        (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":75
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":75
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run
  *                     current_run = 0             # <<<<<<<<<<<<<<
@@ -31981,14 +30196,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))
  */
         __pyx_v_current_run = 0;
-        goto __pyx_L12;
+        goto __pyx_L15;
       }
-      __pyx_L12:;
+      __pyx_L15:;
     }
-    __pyx_L11:;
+    __pyx_L14:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":77
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":77
  *                     current_run = 0
  * 
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
@@ -32003,7 +30218,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_2 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_9));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_89));
   PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_89));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_89));
@@ -32016,7 +30231,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":80
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":80
  * 
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1             # <<<<<<<<<<<<<<
@@ -32025,7 +30240,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_v_h = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":81
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":81
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1
  *         while self.sa.arr[0] != -N:             # <<<<<<<<<<<<<<
@@ -32033,10 +30248,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *             logger.debug("    Refining, sort depth = %d", h)
  */
   while (1) {
-    __pyx_t_8 = ((__pyx_v_self->sa->arr[0]) != (-__pyx_v_N));
+    __pyx_t_8 = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[0]) != (-__pyx_v_N));
     if (!__pyx_t_8) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":82
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":82
  *         h = 1
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -32045,7 +30260,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_sort_start_time = __pyx_f_3_sa_monitor_cpu();
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":83
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":83
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)             # <<<<<<<<<<<<<<
@@ -32060,7 +30275,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     __pyx_t_2 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_90));
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_90));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_90));
@@ -32073,7 +30288,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":84
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":84
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0             # <<<<<<<<<<<<<<
@@ -32082,7 +30297,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_i = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":85
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":85
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0
  *             skip = 0             # <<<<<<<<<<<<<<
@@ -32091,7 +30306,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_skip = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":86
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":86
  *             i = 0
  *             skip = 0
  *             while i < N:             # <<<<<<<<<<<<<<
@@ -32102,38 +30317,38 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
       __pyx_t_8 = (__pyx_v_i < __pyx_v_N);
       if (!__pyx_t_8) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":87
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":87
  *             skip = 0
  *             while i < N:
  *                 if self.sa.arr[i] < 0:             # <<<<<<<<<<<<<<
  *                     skip = skip + self.sa.arr[i]
  *                     i = i - self.sa.arr[i]
  */
-      __pyx_t_8 = ((__pyx_v_self->sa->arr[__pyx_v_i]) < 0);
+      __pyx_t_8 = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) < 0);
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":88
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":88
  *             while i < N:
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]             # <<<<<<<<<<<<<<
  *                     i = i - self.sa.arr[i]
  *                 else:
  */
-        __pyx_v_skip = (__pyx_v_skip + (__pyx_v_self->sa->arr[__pyx_v_i]));
+        __pyx_v_skip = (__pyx_v_skip + (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":89
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":89
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]
  *                     i = i - self.sa.arr[i]             # <<<<<<<<<<<<<<
  *                 else:
  *                     if skip < 0:
  */
-        __pyx_v_i = (__pyx_v_i - (__pyx_v_self->sa->arr[__pyx_v_i]));
-        goto __pyx_L17;
+        __pyx_v_i = (__pyx_v_i - (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]));
+        goto __pyx_L20;
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":91
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":91
  *                     i = i - self.sa.arr[i]
  *                 else:
  *                     if skip < 0:             # <<<<<<<<<<<<<<
@@ -32143,16 +30358,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
         __pyx_t_8 = (__pyx_v_skip < 0);
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":92
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":92
  *                 else:
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  */
-          (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
+          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":93
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":93
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0             # <<<<<<<<<<<<<<
@@ -32160,27 +30375,27 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                     self.q3sort(i, j, h, isa)
  */
           __pyx_v_skip = 0;
-          goto __pyx_L18;
+          goto __pyx_L21;
         }
-        __pyx_L18:;
+        __pyx_L21:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":94
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":94
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]             # <<<<<<<<<<<<<<
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  */
-        __pyx_v_j = (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]);
+        __pyx_v_j = (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i])]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":95
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":95
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)             # <<<<<<<<<<<<<<
  *                     i = j+1
  *             if skip < 0:
  */
-        __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
@@ -32189,7 +30404,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
         __pyx_t_10 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __pyx_t_11 = PyTuple_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_11));
         PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_9);
@@ -32208,7 +30423,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
         __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":96
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":96
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1             # <<<<<<<<<<<<<<
@@ -32217,10 +30432,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
         __pyx_v_i = (__pyx_v_j + 1);
       }
-      __pyx_L17:;
+      __pyx_L20:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":97
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":97
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  *             if skip < 0:             # <<<<<<<<<<<<<<
@@ -32230,19 +30445,19 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     __pyx_t_8 = (__pyx_v_skip < 0);
     if (__pyx_t_8) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":98
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":98
  *                     i = j+1
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
  *             h = h * 2
  *             logger.debug("    Refinement took %f seconds", (monitor_cpu() - sort_start_time))
  */
-      (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
-      goto __pyx_L19;
+      (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
+      goto __pyx_L22;
     }
-    __pyx_L19:;
+    __pyx_L22:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":99
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":99
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2             # <<<<<<<<<<<<<<
@@ -32251,7 +30466,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_h = (__pyx_v_h * 2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":100
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":100
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2
  *             logger.debug("    Refinement took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
@@ -32266,7 +30481,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_91));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_91));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_91));
@@ -32280,7 +30495,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":103
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":103
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
@@ -32297,7 +30512,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":104
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":104
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -32307,7 +30522,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":105
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":105
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]             # <<<<<<<<<<<<<<
@@ -32316,17 +30531,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_j = (__pyx_v_isa->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":106
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":106
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i             # <<<<<<<<<<<<<<
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
  * 
  */
-    (__pyx_v_self->sa->arr[__pyx_v_j]) = __pyx_v_i;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_j]) = __pyx_v_i;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":107
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":107
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))             # <<<<<<<<<<<<<<
@@ -32341,7 +30556,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
   __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_11);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_11));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_94));
   PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_kp_s_94));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_94));
@@ -32372,26 +30587,49 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_12q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
-static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":109
+ *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
+ * 
+ *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
+ *         '''This is a ternary quicksort. It divides the array into
+ *         three partitions: items less than the pivot, items equal
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_6q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_h;
   struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
   PyObject *__pyx_v_pad = 0;
-  PyObject *__pyx_r = 0;
+  int __pyx_v_k;
+  int __pyx_v_midpoint;
+  int __pyx_v_pval;
+  int __pyx_v_phead;
+  int __pyx_v_ptail;
+  int __pyx_v_tmp;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("q3sort (wrapper)", 0);
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  long __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__i,&__pyx_n_s__j,&__pyx_n_s__h,&__pyx_n_s__isa,&__pyx_n_s__pad,0};
+  __Pyx_RefNannySetupContext("q3sort");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__i,&__pyx_n_s__j,&__pyx_n_s__h,&__pyx_n_s__isa,&__pyx_n_s__pad,0};
     PyObject* values[5] = {0,0,0,0,0};
     values[4] = ((PyObject *)__pyx_kp_s_45);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -32401,22 +30639,26 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa);
+        if (likely(values[3])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -32427,7 +30669,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -32455,46 +30697,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_isa), __pyx_ptype_3_sa_IntList, 1, "isa", 0))) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_12q3sort(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_i, __pyx_v_j, __pyx_v_h, __pyx_v_isa, __pyx_v_pad);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":109
- *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
- * 
- *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
- *         '''This is a ternary quicksort. It divides the array into
- *         three partitions: items less than the pivot, items equal
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad) {
-  int __pyx_v_k;
-  int __pyx_v_midpoint;
-  int __pyx_v_pval;
-  int __pyx_v_phead;
-  int __pyx_v_ptail;
-  int __pyx_v_tmp;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  long __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *__pyx_t_8 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("q3sort", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":116
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":116
  *         cdef int k, midpoint, pval, phead, ptail, tmp
  * 
  *         if j-i < -1:             # <<<<<<<<<<<<<<
@@ -32504,7 +30708,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) < -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":117
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":117
  * 
  *         if j-i < -1:
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))             # <<<<<<<<<<<<<<
@@ -32516,7 +30720,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __pyx_t_3 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -32527,7 +30731,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -32537,11 +30741,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":118
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":118
  *         if j-i < -1:
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))
  *         if j-i == -1:    # recursive base case -- empty interval             # <<<<<<<<<<<<<<
@@ -32551,7 +30755,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":119
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":119
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return             # <<<<<<<<<<<<<<
@@ -32561,11 +30765,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __Pyx_XDECREF(__pyx_r);
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
-    goto __pyx_L4;
+    goto __pyx_L7;
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":120
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":120
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return
  *         if (j-i == 0):    # recursive base case -- singleton interval             # <<<<<<<<<<<<<<
@@ -32575,25 +30779,25 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":121
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":121
  *             return
  *         if (j-i == 0):    # recursive base case -- singleton interval
  *             isa.arr[self.sa.arr[i]] = i             # <<<<<<<<<<<<<<
  *             self.sa.arr[i] = -1
  *             return
  */
-    (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]) = __pyx_v_i;
+    (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i])]) = __pyx_v_i;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":122
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":122
  *         if (j-i == 0):    # recursive base case -- singleton interval
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1             # <<<<<<<<<<<<<<
  *             return
  * 
  */
-    (__pyx_v_self->sa->arr[__pyx_v_i]) = -1;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":123
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":123
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1
  *             return             # <<<<<<<<<<<<<<
@@ -32603,11 +30807,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __Pyx_XDECREF(__pyx_r);
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L8;
   }
-  __pyx_L5:;
+  __pyx_L8:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":132
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":132
  *         # If the method of assigning word_id's is changed, this method
  *         # may need to be reconsidered as well.
  *         midpoint = (i+j)/2             # <<<<<<<<<<<<<<
@@ -32616,16 +30820,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_i + __pyx_v_j), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":133
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":133
  *         # may need to be reconsidered as well.
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]             # <<<<<<<<<<<<<<
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  */
-  __pyx_v_pval = (__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
+  __pyx_v_pval = (__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":134
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":134
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:             # <<<<<<<<<<<<<<
@@ -32635,37 +30839,37 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__pyx_v_i != __pyx_v_midpoint);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":135
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":135
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]             # <<<<<<<<<<<<<<
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  */
-    __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_midpoint]);
+    __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":136
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":136
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]             # <<<<<<<<<<<<<<
  *             self.sa.arr[i] = tmp
  *         phead = i
  */
-    (__pyx_v_self->sa->arr[__pyx_v_midpoint]) = (__pyx_v_self->sa->arr[__pyx_v_i]);
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":137
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":137
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp             # <<<<<<<<<<<<<<
  *         phead = i
  *         ptail = i
  */
-    (__pyx_v_self->sa->arr[__pyx_v_i]) = __pyx_v_tmp;
-    goto __pyx_L6;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) = __pyx_v_tmp;
+    goto __pyx_L9;
   }
-  __pyx_L6:;
+  __pyx_L9:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":138
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":138
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  *         phead = i             # <<<<<<<<<<<<<<
@@ -32674,7 +30878,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
   __pyx_v_phead = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":139
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":139
  *             self.sa.arr[i] = tmp
  *         phead = i
  *         ptail = i             # <<<<<<<<<<<<<<
@@ -32683,7 +30887,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
   __pyx_v_ptail = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":143
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":143
  *         # find the three partitions.    phead marks the first element
  *         # of the middle partition, and ptail marks the last element
  *         for k from i+1 <= k < j+1:             # <<<<<<<<<<<<<<
@@ -32693,17 +30897,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_5 = (__pyx_v_j + 1);
   for (__pyx_v_k = (__pyx_v_i + 1); __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":144
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":144
  *         # of the middle partition, and ptail marks the last element
  *         for k from i+1 <= k < j+1:
  *             if isa.arr[self.sa.arr[k] + h] < pval:             # <<<<<<<<<<<<<<
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]
  */
-    __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
+    __pyx_t_1 = ((__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":145
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":145
  *         for k from i+1 <= k < j+1:
  *             if isa.arr[self.sa.arr[k] + h] < pval:
  *                 if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -32713,75 +30917,75 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
       __pyx_t_1 = (__pyx_v_k > (__pyx_v_ptail + 1));
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":146
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":146
  *             if isa.arr[self.sa.arr[k] + h] < pval:
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  */
-        __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
+        __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":147
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":147
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  *                     self.sa.arr[ptail+1] = tmp
  */
-        (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":148
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":148
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  */
-        (__pyx_v_self->sa->arr[__pyx_v_k]) = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":149
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":149
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  *                     self.sa.arr[ptail+1] = tmp             # <<<<<<<<<<<<<<
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]
  */
-        (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = __pyx_v_tmp;
-        goto __pyx_L10;
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]) = __pyx_v_tmp;
+        goto __pyx_L13;
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":151
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":151
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  */
-        __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
+        __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":152
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":152
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  */
-        (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":153
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":153
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp             # <<<<<<<<<<<<<<
  *                 phead = phead + 1
  *                 ptail = ptail + 1
  */
-        (__pyx_v_self->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
       }
-      __pyx_L10:;
+      __pyx_L13:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":154
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":154
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1             # <<<<<<<<<<<<<<
@@ -32790,7 +30994,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
       __pyx_v_phead = (__pyx_v_phead + 1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":155
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":155
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  *                 ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -32798,21 +31002,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  */
       __pyx_v_ptail = (__pyx_v_ptail + 1);
-      goto __pyx_L9;
+      goto __pyx_L12;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":157
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":157
  *                 ptail = ptail + 1
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:             # <<<<<<<<<<<<<<
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]
  */
-      __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
+      __pyx_t_1 = ((__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":158
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":158
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -32822,37 +31026,37 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
         __pyx_t_1 = (__pyx_v_k > (__pyx_v_ptail + 1));
         if (__pyx_t_1) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":159
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":159
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]             # <<<<<<<<<<<<<<
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp
  */
-          __pyx_v_tmp = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
+          __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":160
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":160
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]             # <<<<<<<<<<<<<<
  *                         self.sa.arr[k] = tmp
  *                     ptail = ptail + 1
  */
-          (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
+          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":161
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":161
  *                         tmp = self.sa.arr[ptail+1]
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp             # <<<<<<<<<<<<<<
  *                     ptail = ptail + 1
  * 
  */
-          (__pyx_v_self->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
-          goto __pyx_L12;
+          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
+          goto __pyx_L15;
         }
-        __pyx_L12:;
+        __pyx_L15:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":162
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":162
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp
  *                     ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -32860,21 +31064,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *         # recursively sort smaller suffixes
  */
         __pyx_v_ptail = (__pyx_v_ptail + 1);
-        goto __pyx_L11;
+        goto __pyx_L14;
       }
-      __pyx_L11:;
+      __pyx_L14:;
     }
-    __pyx_L9:;
+    __pyx_L12:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":165
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":165
  * 
  *         # recursively sort smaller suffixes
  *         self.q3sort(i, phead-1, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
  * 
  *         # update suffixes with pivot value
  */
-  __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_4 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
@@ -32885,7 +31089,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_7 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __pyx_t_8 = PyTuple_New(5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_8));
   PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
@@ -32907,7 +31111,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":169
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":169
  *         # update suffixes with pivot value
  *         # corresponds to update_group function in Larsson & Sadakane
  *         for k from phead <= k < ptail+1:             # <<<<<<<<<<<<<<
@@ -32917,17 +31121,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_5 = (__pyx_v_ptail + 1);
   for (__pyx_v_k = __pyx_v_phead; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":170
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":170
  *         # corresponds to update_group function in Larsson & Sadakane
  *         for k from phead <= k < ptail+1:
  *             isa.arr[self.sa.arr[k]] = ptail             # <<<<<<<<<<<<<<
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1
  */
-    (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
+    (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":171
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":171
  *         for k from phead <= k < ptail+1:
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:             # <<<<<<<<<<<<<<
@@ -32937,26 +31141,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__pyx_v_phead == __pyx_v_ptail);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":172
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":172
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1             # <<<<<<<<<<<<<<
  * 
  *         # recursively sort larger suffixes
  */
-    (__pyx_v_self->sa->arr[__pyx_v_phead]) = -1;
-    goto __pyx_L15;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = -1;
+    goto __pyx_L18;
   }
-  __pyx_L15:;
+  __pyx_L18:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":175
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":175
  * 
  *         # recursively sort larger suffixes
  *         self.q3sort(ptail+1, j, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __pyx_t_8 = PyInt_FromLong((__pyx_v_ptail + 1)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
@@ -32967,7 +31171,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_2 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
   PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -33006,28 +31210,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_14write_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":178
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":178
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -33035,7 +31218,9 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -33044,21 +31229,30 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text", 0);
+  __Pyx_RefNannySetupContext("write_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":179
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":179
  * 
  *     def write_text(self, char* filename):
  *         self.darray.write_text(filename)             # <<<<<<<<<<<<<<
  * 
  *     def read_binary(self, char* filename):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_t_2 = 0;
@@ -33082,13 +31276,24 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":181
+ *         self.darray.write_text(filename)
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE *f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_binary");
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -33098,26 +31303,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_16read_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":181
- *         self.darray.write_text(filename)
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE *f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":183
  *     def read_binary(self, char* filename):
  *         cdef FILE *f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -33126,34 +31313,34 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":184
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":184
  *         cdef FILE *f
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->read_handle(__pyx_v_self->darray, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":185
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.ha.read_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->read_handle(__pyx_v_self->sa, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":186
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":186
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->read_handle(__pyx_v_self->ha, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":187
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":187
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -33168,13 +31355,24 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":189
+ *         fclose(f)
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write_binary");
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -33184,26 +31382,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_se
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_18write_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":189
- *         fclose(f)
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":191
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":191
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -33212,34 +31392,34 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":192
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":192
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->write_handle(__pyx_v_self->darray, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":193
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":193
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.ha.write_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->write_handle(__pyx_v_self->sa, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":194
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":194
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->write_handle(__pyx_v_self->ha, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":195
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":195
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -33254,28 +31434,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_20write_enhanced(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":197
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":197
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -33283,7 +31442,9 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_
  *             self.darray.write_enhanced_handle(f)
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_a_i = NULL;
   PyObject *__pyx_v_w_i = NULL;
@@ -33305,9 +31466,18 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced", 0);
+  __Pyx_RefNannySetupContext("write_enhanced");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -33318,7 +31488,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -33330,220 +31500,203 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":199
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":199
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.darray.write_enhanced_handle(f)             # <<<<<<<<<<<<<<
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  */
-          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
           __Pyx_INCREF(__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":200
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":200
  *         with open(filename, "w") as f:
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->sa)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sa))) {
-            __pyx_t_2 = ((PyObject *)__pyx_v_self->sa); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa))) {
+            __pyx_t_7 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa); __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sa)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_7);
+            __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_7)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break;
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
+            } else if (PyTuple_CheckExact(__pyx_t_7)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
             } else {
-              __pyx_t_1 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_7);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_a_i);
-            __pyx_v_a_i = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_a_i = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":201
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":201
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for w_i in self.ha:
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_1));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
+            __pyx_t_1 = 0;
+            __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_4));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-            __pyx_t_4 = 0;
-            __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":202
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":202
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_96), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_t_7 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_7);
+          __pyx_t_1 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_k_tuple_96), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":203
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":203
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  *             for w_i in self.ha:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % w_i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->ha)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->ha))) {
-            __pyx_t_4 = ((PyObject *)__pyx_v_self->ha); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha))) {
+            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha); __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->ha)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_7 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_7); __pyx_t_8++;
+            } else if (PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_7); __pyx_t_8++;
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_4);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_7 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_7)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_7);
             }
             __Pyx_XDECREF(__pyx_v_w_i);
-            __pyx_v_w_i = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_w_i = __pyx_t_7;
+            __pyx_t_7 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":204
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":204
  *             f.write("\n")
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_7 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_7);
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":205
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":205
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
-          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -33552,75 +31705,75 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_4, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_1, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_7));
           __Pyx_INCREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
-          __Pyx_INCREF(__pyx_t_4);
-          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4);
-          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
-          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
+          __Pyx_INCREF(__pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_2);
+          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_7, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_4, __pyx_t_1);
-            __pyx_t_10 = 0; __pyx_t_4 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L22;
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_1, __pyx_t_2);
+            __pyx_t_10 = 0; __pyx_t_1 = 0; __pyx_t_2 = 0; 
+            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L23;
           }
-          __pyx_L22:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __pyx_L23:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L8_exception_handled;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_98, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_98, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L23;
-    __pyx_L3_error:;
+    goto __pyx_L24;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L23:;
+    __pyx_L24:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -33628,7 +31781,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -33641,7 +31794,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":207
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":207
  *             f.write("\n")
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -33654,9 +31807,9 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__search_high", 0);
+  __Pyx_RefNannySetupContext("__search_high");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":210
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":210
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -33666,7 +31819,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":211
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":211
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -33679,7 +31832,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":212
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":212
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -33688,7 +31841,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":213
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":213
  *             return high
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -33698,27 +31851,27 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":214
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":214
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__search_high(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
  *         else:
  *             return self.__search_high(word_id, offset, low, midpoint)
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
     goto __pyx_L0;
     goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":216
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":216
  *             return self.__search_high(word_id, offset, midpoint+1, high)
  *         else:
  *             return self.__search_high(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
  * 
  *     cdef int __search_low(self, int word_id, int offset, int low, int high):
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
     goto __pyx_L0;
   }
   __pyx_L4:;
@@ -33729,7 +31882,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":218
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":218
  *             return self.__search_high(word_id, offset, low, midpoint)
  * 
  *     cdef int __search_low(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -33742,9 +31895,9 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__search_low", 0);
+  __Pyx_RefNannySetupContext("__search_low");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":221
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":221
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -33754,7 +31907,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":222
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":222
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -33767,7 +31920,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":223
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":223
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -33776,7 +31929,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":224
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":224
  *             return high
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -33786,27 +31939,27 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":225
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":225
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__search_low(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
  *         else:
  *             return self.__search_low(word_id, offset, midpoint+1, high)
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
     goto __pyx_L0;
     goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":227
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":227
  *             return self.__search_low(word_id, offset, low, midpoint)
  *         else:
  *             return self.__search_low(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
     goto __pyx_L0;
   }
   __pyx_L4:;
@@ -33817,7 +31970,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":229
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":229
  *             return self.__search_low(word_id, offset, midpoint+1, high)
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):             # <<<<<<<<<<<<<<
@@ -33834,9 +31987,9 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get_range", 0);
+  __Pyx_RefNannySetupContext("__get_range");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":230
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":230
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  *         return (self.__search_low(word_id, offset, low, midpoint),             # <<<<<<<<<<<<<<
@@ -33844,20 +31997,20 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":231
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":231
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  *         return (self.__search_low(word_id, offset, low, midpoint),
  *                 self.__search_high(word_id, offset, midpoint, high))             # <<<<<<<<<<<<<<
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):
  */
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -33882,7 +32035,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":233
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":233
  *                 self.__search_high(word_id, offset, midpoint, high))
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -33901,9 +32054,9 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__lookup_helper", 0);
+  __Pyx_RefNannySetupContext("__lookup_helper");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":236
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":236
  *         cdef int midpoint
  * 
  *         if offset == 0:             # <<<<<<<<<<<<<<
@@ -33913,7 +32066,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = (__pyx_v_offset == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":237
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":237
  * 
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])             # <<<<<<<<<<<<<<
@@ -33926,7 +32079,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
     __pyx_t_3 = PyInt_FromLong((__pyx_v_self->ha->arr[(__pyx_v_word_id + 1)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -33940,7 +32093,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":238
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":238
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -33950,7 +32103,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":239
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":239
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])
  *         if low >= high:
  *             return None             # <<<<<<<<<<<<<<
@@ -33965,7 +32118,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":241
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":241
  *             return None
  * 
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -33974,7 +32127,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":242
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":242
  * 
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -33984,7 +32137,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":243
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":243
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__get_range(word_id, offset, low, high, midpoint)             # <<<<<<<<<<<<<<
@@ -33992,7 +32145,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -34001,7 +32154,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":244
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":244
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__get_range(word_id, offset, low, high, midpoint)
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] > word_id:             # <<<<<<<<<<<<<<
@@ -34011,7 +32164,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) > __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":245
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":245
  *             return self.__get_range(word_id, offset, low, high, midpoint)
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] > word_id:
  *             return self.__lookup_helper(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
@@ -34019,7 +32172,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -34028,7 +32181,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":247
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":247
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  *         else:
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
@@ -34036,7 +32189,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *     def lookup(self, word, int offset, int low, int high):
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -34058,23 +32211,37 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":249
+ *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
+ * 
+ *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
+ *         cdef int wordid
+ *         if low == -1:
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_word = 0;
   int __pyx_v_offset;
   int __pyx_v_low;
   int __pyx_v_high;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_word_id = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("lookup (wrapper)", 0);
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
+  __Pyx_RefNannySetupContext("lookup");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
     PyObject* values[4] = {0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -34083,28 +32250,32 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high);
+        if (likely(values[3])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -34127,33 +32298,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_22lookup(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_word, __pyx_v_offset, __pyx_v_low, __pyx_v_high);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":249
- *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
- * 
- *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
- *         cdef int wordid
- *         if low == -1:
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high) {
-  PyObject *__pyx_v_word_id = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lookup", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":251
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":251
  *     def lookup(self, word, int offset, int low, int high):
  *         cdef int wordid
  *         if low == -1:             # <<<<<<<<<<<<<<
@@ -34163,7 +32309,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__pyx_v_low == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":252
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":252
  *         cdef int wordid
  *         if low == -1:
  *             low = 0             # <<<<<<<<<<<<<<
@@ -34171,11 +32317,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
  *             high = len(self.sa)
  */
     __pyx_v_low = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":253
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":253
  *         if low == -1:
  *             low = 0
  *         if high == -1:             # <<<<<<<<<<<<<<
@@ -34185,45 +32331,45 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__pyx_v_high == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":254
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":254
  *             low = 0
  *         if high == -1:
  *             high = len(self.sa)             # <<<<<<<<<<<<<<
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]
  */
-    __pyx_t_2 = ((PyObject *)__pyx_v_self->sa);
+    __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_v_high = __pyx_t_3;
-    goto __pyx_L4;
+    goto __pyx_L7;
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":255
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":255
  *         if high == -1:
  *             high = len(self.sa)
  *         if word in self.darray.word2id:             # <<<<<<<<<<<<<<
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->darray->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->word2id, __pyx_v_word))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":256
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":256
  *             high = len(self.sa)
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]             # <<<<<<<<<<<<<<
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_word_id = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":257
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":257
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)             # <<<<<<<<<<<<<<
@@ -34232,16 +32378,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->__pyx_vtab)->__lookup_helper(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L8;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":259
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":259
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  *             return None             # <<<<<<<<<<<<<<
@@ -34251,7 +32397,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
     __pyx_r = Py_None;
     goto __pyx_L0;
   }
-  __pyx_L5:;
+  __pyx_L8:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -34266,21 +32412,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
-  __pyx_r = __pyx_pf_3_sa_8TrieNode___cinit__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":35
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":35
  *     cdef public children
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -34288,16 +32420,20 @@ static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
+static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_RefNannySetupContext("__cinit__");
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":36
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":36
  * 
  *     def __cinit__(self):
  *         self.children = {}             # <<<<<<<<<<<<<<
@@ -34307,9 +32443,9 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__p
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->children);
-  __Pyx_DECREF(__pyx_v_self->children);
-  __pyx_v_self->children = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   __pyx_r = 0;
@@ -34323,18 +32459,7 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children___get__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":33
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":33
  * 
  * cdef class TrieNode:
  *     cdef public children             # <<<<<<<<<<<<<<
@@ -34342,13 +32467,14 @@ static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_se
  *     def __cinit__(self):
  */
 
-static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->children);
-  __pyx_r = __pyx_v_self->children;
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  __pyx_r = ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -34358,85 +32484,66 @@ static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_8TrieNode_8children_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_8TrieNode_8children_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_8TrieNode_8children_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_8TrieNode_8children_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children_2__set__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->children);
-  __Pyx_DECREF(__pyx_v_self->children);
-  __pyx_v_self->children = __pyx_v_value;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_8TrieNode_8children_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_3_sa_8TrieNode_8children_5__del__(PyObject *__pyx_v_self) {
+static int __pyx_pf_3_sa_8TrieNode_8children_2__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pf_3_sa_8TrieNode_8children_2__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children_4__del__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_8TrieNode_8children_4__del__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__del__");
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->children);
-  __Pyx_DECREF(__pyx_v_self->children);
-  __pyx_v_self->children = Py_None;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":43
+ *     cdef public suffix_link
+ * 
+ *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
+ *         self.phrase = phrase
+ *         self.phrase_location = phrase_location
+ */
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_phrase = 0;
   PyObject *__pyx_v_phrase_location = 0;
   PyObject *__pyx_v_suffix_link = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
     PyObject* values[3] = {0,0,0};
-
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":43
- *     cdef public suffix_link
- * 
- *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
- *         self.phrase = phrase
- *         self.phrase_location = phrase_location
- */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -34444,7 +32551,7 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__phrase);
@@ -34462,7 +32569,7 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -34485,17 +32592,8 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), __pyx_v_phrase, __pyx_v_phrase_location, __pyx_v_suffix_link);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_phrase, PyObject *__pyx_v_phrase_location, PyObject *__pyx_v_suffix_link) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":44
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":44
  * 
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase             # <<<<<<<<<<<<<<
@@ -34504,11 +32602,11 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
  */
   __Pyx_INCREF(__pyx_v_phrase);
   __Pyx_GIVEREF(__pyx_v_phrase);
-  __Pyx_GOTREF(__pyx_v_self->phrase);
-  __Pyx_DECREF(__pyx_v_self->phrase);
-  __pyx_v_self->phrase = __pyx_v_phrase;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = __pyx_v_phrase;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":45
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":45
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location             # <<<<<<<<<<<<<<
@@ -34517,11 +32615,11 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
  */
   __Pyx_INCREF(__pyx_v_phrase_location);
   __Pyx_GIVEREF(__pyx_v_phrase_location);
-  __Pyx_GOTREF(__pyx_v_self->phrase_location);
-  __Pyx_DECREF(__pyx_v_self->phrase_location);
-  __pyx_v_self->phrase_location = __pyx_v_phrase_location;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = __pyx_v_phrase_location;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":46
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":46
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location
  *         self.suffix_link = suffix_link             # <<<<<<<<<<<<<<
@@ -34530,27 +32628,16 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
  */
   __Pyx_INCREF(__pyx_v_suffix_link);
   __Pyx_GIVEREF(__pyx_v_suffix_link);
-  __Pyx_GOTREF(__pyx_v_self->suffix_link);
-  __Pyx_DECREF(__pyx_v_self->suffix_link);
-  __pyx_v_self->suffix_link = __pyx_v_suffix_link;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = __pyx_v_suffix_link;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":39
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":39
  * 
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase             # <<<<<<<<<<<<<<
@@ -34558,13 +32645,14 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__p
  *     cdef public suffix_link
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->phrase);
-  __pyx_r = __pyx_v_self->phrase;
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -34574,70 +32662,39 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_o
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->phrase);
-  __Pyx_DECREF(__pyx_v_self->phrase);
-  __pyx_v_self->phrase = __pyx_v_value;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__del__");
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->phrase);
-  __Pyx_DECREF(__pyx_v_self->phrase);
-  __pyx_v_self->phrase = Py_None;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":40
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":40
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase
  *     cdef public phrase_location             # <<<<<<<<<<<<<<
@@ -34645,13 +32702,14 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->phrase_location);
-  __pyx_r = __pyx_v_self->phrase_location;
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -34661,70 +32719,39 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(stru
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->phrase_location);
-  __Pyx_DECREF(__pyx_v_self->phrase_location);
-  __pyx_v_self->phrase_location = __pyx_v_value;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(PyObject *__pyx_v_self) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__del__");
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->phrase_location);
-  __Pyx_DECREF(__pyx_v_self->phrase_location);
-  __pyx_v_self->phrase_location = Py_None;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":41
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":41
  *     cdef public phrase
  *     cdef public phrase_location
  *     cdef public suffix_link             # <<<<<<<<<<<<<<
@@ -34732,13 +32759,14 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObjec
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->suffix_link);
-  __pyx_r = __pyx_v_self->suffix_link;
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -34748,79 +32776,71 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct _
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->suffix_link);
-  __Pyx_DECREF(__pyx_v_self->suffix_link);
-  __pyx_v_self->suffix_link = __pyx_v_value;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__del__");
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->suffix_link);
-  __Pyx_DECREF(__pyx_v_self->suffix_link);
-  __pyx_v_self->suffix_link = Py_None;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":53
+ *     cdef public int count
+ *     cdef public root
+ *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
+ *         self.count = 0
+ *         self.extended = extended
+ */
+
+static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_extended = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
     PyObject* values[1] = {0};
     values[0] = __pyx_k_99;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__extended);
@@ -34828,7 +32848,7 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -34847,40 +32867,17 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9TrieTable___cinit__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), __pyx_v_extended);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":53
- *     cdef public int count
- *     cdef public root
- *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
- *         self.count = 0
- *         self.extended = extended
- */
-
-static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_extended) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":54
  *     cdef public root
  *     def __cinit__(self, extended=False):
  *         self.count = 0             # <<<<<<<<<<<<<<
  *         self.extended = extended
  *         if extended:
  */
-  __pyx_v_self->count = 0;
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":55
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":55
  *     def __cinit__(self, extended=False):
  *         self.count = 0
  *         self.extended = extended             # <<<<<<<<<<<<<<
@@ -34888,9 +32885,9 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
  *             self.root = ExtendedTrieNode()
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_extended); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->extended = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":56
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":56
  *         self.count = 0
  *         self.extended = extended
  *         if extended:             # <<<<<<<<<<<<<<
@@ -34900,7 +32897,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_extended); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":57
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":57
  *         self.extended = extended
  *         if extended:
  *             self.root = ExtendedTrieNode()             # <<<<<<<<<<<<<<
@@ -34910,15 +32907,15 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
     __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    __Pyx_GOTREF(__pyx_v_self->root);
-    __Pyx_DECREF(__pyx_v_self->root);
-    __pyx_v_self->root = __pyx_t_3;
+    __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+    __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+    ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_t_3;
     __pyx_t_3 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":59
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":59
  *             self.root = ExtendedTrieNode()
  *         else:
  *             self.root = TrieNode()             # <<<<<<<<<<<<<<
@@ -34928,12 +32925,12 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
     __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    __Pyx_GOTREF(__pyx_v_self->root);
-    __Pyx_DECREF(__pyx_v_self->root);
-    __pyx_v_self->root = __pyx_t_3;
+    __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+    __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+    ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_t_3;
     __pyx_t_3 = 0;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -34946,18 +32943,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_8extended___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":50
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":50
  * 
  * cdef class TrieTable:
  *     cdef public int extended             # <<<<<<<<<<<<<<
@@ -34965,16 +32951,17 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_s
  *     cdef public root
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -34992,27 +32979,17 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9TrieTable_8extended_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_9TrieTable_8extended_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_8extended_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->extended = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended = __pyx_t_1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -35024,18 +33001,7 @@ static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_Tri
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_5count___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":51
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":51
  * cdef class TrieTable:
  *     cdef public int extended
  *     cdef public int count             # <<<<<<<<<<<<<<
@@ -35043,16 +33009,17 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self
  *     def __cinit__(self, extended=False):
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -35070,27 +33037,17 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_T
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9TrieTable_5count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_9TrieTable_5count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_5count_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->count = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count = __pyx_t_1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -35102,18 +33059,7 @@ static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":52
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":52
  *     cdef public int extended
  *     cdef public int count
  *     cdef public root             # <<<<<<<<<<<<<<
@@ -35121,13 +33067,14 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self)
  *         self.count = 0
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->root);
-  __pyx_r = __pyx_v_self->root;
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+  __pyx_r = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -35137,59 +33084,39 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_Tr
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9TrieTable_4root_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_9TrieTable_4root_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_9TrieTable_4root_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_9TrieTable_4root_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9TrieTable_4root_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->root);
-  __Pyx_DECREF(__pyx_v_self->root);
-  __pyx_v_self->root = __pyx_v_value;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9TrieTable_4root_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_3_sa_9TrieTable_4root_5__del__(PyObject *__pyx_v_self) {
+static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root_4__del__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__del__");
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->root);
-  __Pyx_DECREF(__pyx_v_self->root);
-  __pyx_v_self->root = Py_None;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":79
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":79
  * 
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -35197,12 +33124,12 @@ static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTab
  * 
  */
 
-static int __pyx_f_3_sa_14PhraseLocation_contains(CYTHON_UNUSED struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, CYTHON_UNUSED int __pyx_v_sent_id) {
+static int __pyx_f_3_sa_14PhraseLocation_contains(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sent_id) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("contains", 0);
+  __Pyx_RefNannySetupContext("contains");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":80
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":80
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):
  *         return 1             # <<<<<<<<<<<<<<
@@ -35218,9 +33145,16 @@ static int __pyx_f_3_sa_14PhraseLocation_contains(CYTHON_UNUSED struct __pyx_obj
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":82
+ *         return 1
+ * 
+ *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
+ *             arr=None, int num_subpatterns=1):
+ *         self.sa_low = sa_low
+ */
+
+static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_sa_low;
   int __pyx_v_sa_high;
   int __pyx_v_arr_low;
@@ -35229,12 +33163,15 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
   int __pyx_v_num_subpatterns;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
     PyObject* values[6] = {0,0,0,0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":83
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":83
  * 
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):             # <<<<<<<<<<<<<<
@@ -35244,8 +33181,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
     values[4] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -35256,7 +33192,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa_low);
@@ -35289,7 +33225,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -35338,64 +33274,44 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_14PhraseLocation___cinit__(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self), __pyx_v_sa_low, __pyx_v_sa_high, __pyx_v_arr_low, __pyx_v_arr_high, __pyx_v_arr, __pyx_v_num_subpatterns);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":82
- *         return 1
- * 
- *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
- *             arr=None, int num_subpatterns=1):
- *         self.sa_low = sa_low
- */
-
-static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sa_low, int __pyx_v_sa_high, int __pyx_v_arr_low, int __pyx_v_arr_high, PyObject *__pyx_v_arr, int __pyx_v_num_subpatterns) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":84
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":84
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low             # <<<<<<<<<<<<<<
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  */
-  __pyx_v_self->sa_low = __pyx_v_sa_low;
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->sa_low = __pyx_v_sa_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":85
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":85
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high             # <<<<<<<<<<<<<<
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  */
-  __pyx_v_self->sa_high = __pyx_v_sa_high;
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->sa_high = __pyx_v_sa_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":86
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":86
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low             # <<<<<<<<<<<<<<
  *         self.arr_high = arr_high
  *         self.arr = arr
  */
-  __pyx_v_self->arr_low = __pyx_v_arr_low;
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr_low = __pyx_v_arr_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":87
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high             # <<<<<<<<<<<<<<
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns
  */
-  __pyx_v_self->arr_high = __pyx_v_arr_high;
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr_high = __pyx_v_arr_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":88
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  *         self.arr = arr             # <<<<<<<<<<<<<<
@@ -35405,18 +33321,18 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
   if (!(likely(((__pyx_v_arr) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_arr, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_arr);
   __Pyx_GIVEREF(__pyx_v_arr);
-  __Pyx_GOTREF(__pyx_v_self->arr);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->arr));
-  __pyx_v_self->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr));
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":89
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":89
  *         self.arr_high = arr_high
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_v_self->num_subpatterns = __pyx_v_num_subpatterns;
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->num_subpatterns = __pyx_v_num_subpatterns;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -35428,39 +33344,54 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":99
+ *     cdef IntList sa
+ * 
+ *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
+ *         self.sample_size = sample_size
+ *         self.sa = fsarray.sa
+ */
+
+static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_sample_size;
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_size)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_size);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -35480,45 +33411,17 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_7Sampler___cinit__(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), __pyx_v_sample_size, __pyx_v_fsarray);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":99
- *     cdef IntList sa
- * 
- *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
- *         self.sample_size = sample_size
- *         self.sa = fsarray.sa
- */
-
-static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, int __pyx_v_sample_size, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":100
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":100
  * 
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size             # <<<<<<<<<<<<<<
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  */
-  __pyx_v_self->sample_size = __pyx_v_sample_size;
+  ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size = __pyx_v_sample_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":101
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":101
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa             # <<<<<<<<<<<<<<
@@ -35527,11 +33430,11 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray->sa));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray->sa));
-  __Pyx_GOTREF(__pyx_v_self->sa);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
-  __pyx_v_self->sa = __pyx_v_fsarray->sa;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa));
+  ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa = __pyx_v_fsarray->sa;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":102
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":102
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa
  *         if sample_size > 0:             # <<<<<<<<<<<<<<
@@ -35541,7 +33444,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   __pyx_t_1 = (__pyx_v_sample_size > 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":103
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":103
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)             # <<<<<<<<<<<<<<
@@ -35556,7 +33459,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
     __pyx_t_2 = PyInt_FromLong(__pyx_v_sample_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_100));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_100));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_100));
@@ -35568,11 +33471,11 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":105
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":105
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
@@ -35589,7 +33492,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -35604,24 +33507,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location); /*proto*/
-static char __pyx_doc_3_sa_7Sampler_2sample[] = "Returns a sample of the locations for\n        the phrase.    If there are less than self.sample_size\n        locations, return all of them; otherwise, return\n        up to self.sample_size locations.    In the latter case,\n        we choose to sample UNIFORMLY -- that is, the locations\n        are chosen at uniform intervals over the entire set, rather\n        than randomly.    This makes the algorithm deterministic, which\n        is good for things like MERT";
-static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sample (wrapper)", 0);
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_7Sampler_2sample(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location));
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":107
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":107
  *             logger.info("Sampling strategy: no sampling")
  * 
  *     def sample(self, PhraseLocation phrase_location):             # <<<<<<<<<<<<<<
@@ -35629,7 +33515,9 @@ static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject
  *         the phrase.    If there are less than self.sample_size
  */
 
-static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location) {
+static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location); /*proto*/
+static char __pyx_doc_3_sa_7Sampler_1sample[] = "Returns a sample of the locations for\n        the phrase.    If there are less than self.sample_size\n        locations, return all of them; otherwise, return\n        up to self.sample_size locations.    In the latter case,\n        we choose to sample UNIFORMLY -- that is, the locations\n        are chosen at uniform intervals over the entire set, rather\n        than randomly.    This makes the algorithm deterministic, which\n        is good for things like MERT";
+static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location) {
   struct __pyx_obj_3_sa_IntList *__pyx_v_sample = 0;
   double __pyx_v_i;
   double __pyx_v_stepsize;
@@ -35646,9 +33534,10 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sample", 0);
+  __Pyx_RefNannySetupContext("sample");
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":120
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":120
  *         cdef int num_locations, val, j
  * 
  *         sample = IntList()             # <<<<<<<<<<<<<<
@@ -35660,76 +33549,76 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   __pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":121
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":121
  * 
  *         sample = IntList()
  *         if phrase_location.arr is None:             # <<<<<<<<<<<<<<
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  */
-  __pyx_t_2 = (((PyObject *)__pyx_v_phrase_location->arr) == Py_None);
+  __pyx_t_2 = (((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr) == Py_None);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":122
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":122
  *         sample = IntList()
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low             # <<<<<<<<<<<<<<
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  */
-    __pyx_v_num_locations = (__pyx_v_phrase_location->sa_high - __pyx_v_phrase_location->sa_low);
+    __pyx_v_num_locations = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_high - ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":123
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":123
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  */
-    __pyx_t_2 = (__pyx_v_self->sample_size == -1);
+    __pyx_t_2 = (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size == -1);
     if (!__pyx_t_2) {
-      __pyx_t_3 = (__pyx_v_num_locations <= __pyx_v_self->sample_size);
+      __pyx_t_3 = (__pyx_v_num_locations <= ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
       __pyx_t_4 = __pyx_t_3;
     } else {
       __pyx_t_4 = __pyx_t_2;
     }
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":124
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":124
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)             # <<<<<<<<<<<<<<
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  */
-      ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_self->sa->arr + __pyx_v_phrase_location->sa_low), __pyx_v_num_locations);
-      goto __pyx_L4;
+      ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa->arr + ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low), __pyx_v_num_locations);
+      goto __pyx_L6;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":126
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":126
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:
  */
-      if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
+      if (unlikely(((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
+      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":127
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":127
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low             # <<<<<<<<<<<<<<
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:
  *                     '''Note: int(i) not guaranteed to have the desired
  */
-      __pyx_v_i = __pyx_v_phrase_location->sa_low;
+      __pyx_v_i = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":128
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":128
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:             # <<<<<<<<<<<<<<
@@ -35737,16 +33626,16 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                     effect, according to the python documentation'''
  */
       while (1) {
-        __pyx_t_4 = (__pyx_v_i < __pyx_v_phrase_location->sa_high);
+        __pyx_t_4 = (__pyx_v_i < ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_high);
         if (__pyx_t_4) {
-          __pyx_t_2 = (__pyx_v_sample->len < __pyx_v_self->sample_size);
+          __pyx_t_2 = (__pyx_v_sample->len < ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
           __pyx_t_3 = __pyx_t_2;
         } else {
           __pyx_t_3 = __pyx_t_4;
         }
         if (!__pyx_t_3) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":131
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":131
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -35756,7 +33645,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         __pyx_t_3 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":132
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":132
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -35764,11 +33653,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                         val = int(floor(i))
  */
           __pyx_v_val = ((int)ceil(__pyx_v_i));
-          goto __pyx_L7;
+          goto __pyx_L9;
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":134
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":134
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -35777,18 +33666,18 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
           __pyx_v_val = ((int)floor(__pyx_v_i));
         }
-        __pyx_L7:;
+        __pyx_L9:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":135
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":135
  *                     else:
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])             # <<<<<<<<<<<<<<
  *                     i = i + stepsize
  *         else:
  */
-        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (__pyx_v_self->sa->arr[__pyx_v_val]));
+        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa->arr[__pyx_v_val]));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":136
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":136
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -35798,82 +33687,82 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         __pyx_v_i = (__pyx_v_i + __pyx_v_stepsize);
       }
     }
-    __pyx_L4:;
-    goto __pyx_L3;
+    __pyx_L6:;
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":138
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":138
  *                     i = i + stepsize
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns             # <<<<<<<<<<<<<<
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr
  */
-    __pyx_t_5 = (__pyx_v_phrase_location->arr_high - __pyx_v_phrase_location->arr_low);
-    if (unlikely(__pyx_v_phrase_location->num_subpatterns == 0)) {
+    __pyx_t_5 = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_high - ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low);
+    if (unlikely(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns == 0)) {
       PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_phrase_location->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
+    else if (sizeof(int) == sizeof(long) && unlikely(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
       PyErr_Format(PyExc_OverflowError, "value too large to perform division");
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, __pyx_v_phrase_location->num_subpatterns);
+    __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":139
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":139
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
  *                 sample = phrase_location.arr
  *             else:
  */
-    __pyx_t_3 = (__pyx_v_self->sample_size == -1);
+    __pyx_t_3 = (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size == -1);
     if (!__pyx_t_3) {
-      __pyx_t_4 = (__pyx_v_num_locations <= __pyx_v_self->sample_size);
+      __pyx_t_4 = (__pyx_v_num_locations <= ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
       __pyx_t_2 = __pyx_t_4;
     } else {
       __pyx_t_2 = __pyx_t_3;
     }
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":140
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":140
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr             # <<<<<<<<<<<<<<
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  */
-      __Pyx_INCREF(((PyObject *)__pyx_v_phrase_location->arr));
+      __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr));
       __Pyx_DECREF(((PyObject *)__pyx_v_sample));
-      __pyx_v_sample = __pyx_v_phrase_location->arr;
-      goto __pyx_L8;
+      __pyx_v_sample = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr;
+      goto __pyx_L10;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":142
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":142
  *                 sample = phrase_location.arr
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:
  */
-      if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
+      if (unlikely(((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
+      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":143
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":143
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low             # <<<<<<<<<<<<<<
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:
  *                     '''Note: int(i) not guaranteed to have the desired
  */
-      __pyx_v_i = __pyx_v_phrase_location->arr_low;
+      __pyx_v_i = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":144
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":144
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -35883,14 +33772,14 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
       while (1) {
         __pyx_t_2 = (__pyx_v_i < __pyx_v_num_locations);
         if (__pyx_t_2) {
-          __pyx_t_3 = (__pyx_v_sample->len < (__pyx_v_self->sample_size * __pyx_v_phrase_location->num_subpatterns));
+          __pyx_t_3 = (__pyx_v_sample->len < (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size * ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns));
           __pyx_t_4 = __pyx_t_3;
         } else {
           __pyx_t_4 = __pyx_t_2;
         }
         if (!__pyx_t_4) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":147
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":147
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -35900,7 +33789,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         __pyx_t_4 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":148
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":148
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -35908,11 +33797,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                         val = int(floor(i))
  */
           __pyx_v_val = ((int)ceil(__pyx_v_i));
-          goto __pyx_L11;
+          goto __pyx_L13;
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":150
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":150
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -35921,27 +33810,27 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
           __pyx_v_val = ((int)floor(__pyx_v_i));
         }
-        __pyx_L11:;
+        __pyx_L13:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":151
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":151
  *                     else:
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  */
-        __pyx_v_j = (__pyx_v_phrase_location->arr_low + (__pyx_v_val * __pyx_v_phrase_location->num_subpatterns));
+        __pyx_v_j = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low + (__pyx_v_val * ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":152
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":152
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
  *                     i = i + stepsize
  *         return sample
  */
-        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_phrase_location->arr->arr + __pyx_v_j), __pyx_v_phrase_location->num_subpatterns);
+        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr->arr + __pyx_v_j), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":153
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":153
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -35951,11 +33840,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         __pyx_v_i = (__pyx_v_i + __pyx_v_stepsize);
       }
     }
-    __pyx_L8:;
+    __pyx_L10:;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":154
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":154
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  *         return sample             # <<<<<<<<<<<<<<
@@ -35980,7 +33869,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":166
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":166
  * 
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):             # <<<<<<<<<<<<<<
@@ -35990,9 +33879,9 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
 
 static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m, int *__pyx_v_arr, int __pyx_v_start, int __pyx_v_step, int *__pyx_v_sent_id_arr) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("assign_matching", 0);
+  __Pyx_RefNannySetupContext("assign_matching");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":167
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":167
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr             # <<<<<<<<<<<<<<
@@ -36001,7 +33890,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->arr = __pyx_v_arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":168
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":168
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr
  *     m.start = start             # <<<<<<<<<<<<<<
@@ -36010,7 +33899,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->start = __pyx_v_start;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":169
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":169
  *     m.arr = arr
  *     m.start = start
  *     m.end = start + step             # <<<<<<<<<<<<<<
@@ -36019,7 +33908,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->end = (__pyx_v_start + __pyx_v_step);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":170
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":170
  *     m.start = start
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]             # <<<<<<<<<<<<<<
@@ -36028,7 +33917,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->sent_id = (__pyx_v_sent_id_arr[(__pyx_v_arr[__pyx_v_start])]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":171
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":171
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]
  *     m.size = step             # <<<<<<<<<<<<<<
@@ -36040,7 +33929,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":174
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":174
  * 
  * 
  * cdef int* append_combined_matching(int* arr, Matching* loc1, Matching* loc2,             # <<<<<<<<<<<<<<
@@ -36048,16 +33937,16 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  *     cdef int i, new_len
  */
 
-static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx_t_3_sa_Matching *__pyx_v_loc1, struct __pyx_t_3_sa_Matching *__pyx_v_loc2, CYTHON_UNUSED int __pyx_v_offset_by_one, int __pyx_v_num_subpatterns, int *__pyx_v_result_len) {
+static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx_t_3_sa_Matching *__pyx_v_loc1, struct __pyx_t_3_sa_Matching *__pyx_v_loc2, int __pyx_v_offset_by_one, int __pyx_v_num_subpatterns, int *__pyx_v_result_len) {
   int __pyx_v_i;
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("append_combined_matching", 0);
+  __Pyx_RefNannySetupContext("append_combined_matching");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":178
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":178
  *     cdef int i, new_len
  * 
  *     new_len = result_len[0] + num_subpatterns             # <<<<<<<<<<<<<<
@@ -36066,7 +33955,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_new_len = ((__pyx_v_result_len[0]) + __pyx_v_num_subpatterns);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":179
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":179
  * 
  *     new_len = result_len[0] + num_subpatterns
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -36075,7 +33964,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":181
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  * 
  *     for i from 0 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -36085,7 +33974,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_1 = __pyx_v_loc1->size;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":182
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":182
  * 
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]             # <<<<<<<<<<<<<<
@@ -36095,7 +33984,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
     (__pyx_v_arr[((__pyx_v_result_len[0]) + __pyx_v_i)]) = (__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":183
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:             # <<<<<<<<<<<<<<
@@ -36105,7 +33994,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_2 = (__pyx_v_num_subpatterns > __pyx_v_loc1->size);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":184
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":184
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]             # <<<<<<<<<<<<<<
@@ -36117,7 +34006,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":185
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -36126,7 +34015,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   (__pyx_v_result_len[0]) = __pyx_v_new_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":186
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":186
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -36142,7 +34031,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":189
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":189
  * 
  * 
  * cdef int* extend_arr(int* arr, int* arr_len, int* appendix, int appendix_len):             # <<<<<<<<<<<<<<
@@ -36154,9 +34043,9 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("extend_arr", 0);
+  __Pyx_RefNannySetupContext("extend_arr");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":192
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":192
  *     cdef int new_len
  * 
  *     new_len = arr_len[0] + appendix_len             # <<<<<<<<<<<<<<
@@ -36165,7 +34054,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_appendix_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":193
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":193
  * 
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -36174,7 +34063,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":194
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":194
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -36183,7 +34072,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_appendix, (__pyx_v_appendix_len * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":195
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":195
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -36192,7 +34081,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":196
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":196
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -36208,7 +34097,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":198
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":198
  *     return arr
  * 
  * cdef int median(int low, int high, int step):             # <<<<<<<<<<<<<<
@@ -36223,9 +34112,9 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("median", 0);
+  __Pyx_RefNannySetupContext("median");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":199
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":199
  * 
  * cdef int median(int low, int high, int step):
  *     return low + (((high - low)/step)/2)*step             # <<<<<<<<<<<<<<
@@ -36254,7 +34143,7 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":202
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":202
  * 
  * 
  * cdef void find_comparable_matchings(int low, int high, int* arr, int step, int loc, int* loc_minus, int* loc_plus):             # <<<<<<<<<<<<<<
@@ -36267,9 +34156,9 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("find_comparable_matchings", 0);
+  __Pyx_RefNannySetupContext("find_comparable_matchings");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":206
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":206
  *     # in which all matchings have the same first index as the one
  *     # starting at loc
  *     loc_plus[0] = loc + step             # <<<<<<<<<<<<<<
@@ -36278,7 +34167,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_plus[0]) = (__pyx_v_loc + __pyx_v_step);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":207
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":207
  *     # starting at loc
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -36295,7 +34184,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":208
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":208
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step             # <<<<<<<<<<<<<<
@@ -36305,7 +34194,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     (__pyx_v_loc_plus[0]) = ((__pyx_v_loc_plus[0]) + __pyx_v_step);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":209
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":209
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc             # <<<<<<<<<<<<<<
@@ -36314,7 +34203,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_minus[0]) = __pyx_v_loc;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":210
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":210
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -36331,7 +34220,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_2) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":211
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":211
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:
  *         loc_minus[0] = loc_minus[0] - step             # <<<<<<<<<<<<<<
@@ -36344,9 +34233,16 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":263
+ *     cdef IntList findexes1
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *             # compiled alignment object (REQUIRED)
+ *             Alignment alignment,
+ */
+
+static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment = 0;
   float __pyx_v_by_slack_factor;
   char *__pyx_v_category;
@@ -36370,12 +34266,21 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
   int __pyx_v_use_index;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_103,&__pyx_n_s_104,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_103,&__pyx_n_s_104,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
     PyObject* values[21] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":271
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":271
  *             char* category="[X]",
  *             # maximum number of contiguous chunks of terminal symbols in RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_chunks=None,             # <<<<<<<<<<<<<<
@@ -36384,7 +34289,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[3] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":279
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":279
  *             unsigned max_nonterminals=2,
  *             # maximum number of contiguous chunks of terminal symbols in target-side RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_target_chunks=None,             # <<<<<<<<<<<<<<
@@ -36393,7 +34298,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[7] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":281
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":281
  *             max_target_chunks=None,
  *             # maximum number of target side symbols (both T and NT) allowed in a rule. If None, defaults to max_initial_size
  *             max_target_length=None,             # <<<<<<<<<<<<<<
@@ -36402,7 +34307,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[8] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":285
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":285
  *             unsigned min_gap_size=2,
  *             # filename of file containing precomputed collocations
  *             precompute_file=None,             # <<<<<<<<<<<<<<
@@ -36412,8 +34317,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
     values[10] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case 21: values[20] = PyTuple_GET_ITEM(__pyx_args, 20);
         case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);
         case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
@@ -36439,9 +34343,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
         if (kw_args > 0) {
@@ -36545,7 +34450,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -36576,10 +34481,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
     }
     __pyx_v_alignment = ((struct __pyx_obj_3_sa_Alignment *)values[0]);
     if (values[1]) {
-      __pyx_v_by_slack_factor = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_by_slack_factor = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":267
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":267
  *             Alignment alignment,
  *             # parameter for double-binary search; doesn't seem to matter much
  *             float by_slack_factor=1.0,             # <<<<<<<<<<<<<<
@@ -36631,7 +34536,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_require_aligned_terminal = __Pyx_PyObject_IsTrue(values[13]); if (unlikely((__pyx_v_require_aligned_terminal == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":291
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":291
  *             unsigned precompute_rank=100,
  *             # require extracted rules to have at least one aligned word
  *             bint require_aligned_terminal=True,             # <<<<<<<<<<<<<<
@@ -36644,7 +34549,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_require_aligned_chunks = __Pyx_PyObject_IsTrue(values[14]); if (unlikely((__pyx_v_require_aligned_chunks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":293
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":293
  *             bint require_aligned_terminal=True,
  *             # require each contiguous chunk of extracted rules to have at least one aligned word
  *             bint require_aligned_chunks=False,             # <<<<<<<<<<<<<<
@@ -36667,7 +34572,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_tight_phrases = __Pyx_PyObject_IsTrue(values[17]); if (unlikely((__pyx_v_tight_phrases == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":299
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":299
  *             unsigned train_min_gap_size=2,
  *             # True if phrases should be tight, False otherwise (False == slower but better results)
  *             bint tight_phrases=False,             # <<<<<<<<<<<<<<
@@ -36680,7 +34585,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_use_baeza_yates = __Pyx_PyObject_IsTrue(values[18]); if (unlikely((__pyx_v_use_baeza_yates == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":301
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":301
  *             bint tight_phrases=False,
  *             # True to require use of double-binary alg, false otherwise
  *             bint use_baeza_yates=True,             # <<<<<<<<<<<<<<
@@ -36693,7 +34598,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_use_collocations = __Pyx_PyObject_IsTrue(values[19]); if (unlikely((__pyx_v_use_collocations == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":303
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":303
  *             bint use_baeza_yates=True,
  *             # True to enable used of precomputed collocations
  *             bint use_collocations=True,             # <<<<<<<<<<<<<<
@@ -36706,7 +34611,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_use_index = __Pyx_PyObject_IsTrue(values[20]); if (unlikely((__pyx_v_use_index == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":305
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":305
  *             bint use_collocations=True,
  *             # True to enable use of precomputed inverted indices
  *             bint use_index=True):             # <<<<<<<<<<<<<<
@@ -36725,38 +34630,8 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_alignment), __pyx_ptype_3_sa_Alignment, 1, "alignment", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_alignment, __pyx_v_by_slack_factor, __pyx_v_category, __pyx_v_max_chunks, __pyx_v_max_initial_size, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_max_target_chunks, __pyx_v_max_target_length, __pyx_v_min_gap_size, __pyx_v_precompute_file, __pyx_v_precompute_secondary_rank, __pyx_v_precompute_rank, __pyx_v_require_aligned_terminal, __pyx_v_require_aligned_chunks, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size, __pyx_v_tight_phrases, __pyx_v_use_baeza_yates, __pyx_v_use_collocations, __pyx_v_use_index);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":263
- *     cdef IntList findexes1
- * 
- *     def __cinit__(self,             # <<<<<<<<<<<<<<
- *             # compiled alignment object (REQUIRED)
- *             Alignment alignment,
- */
-
-static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment, float __pyx_v_by_slack_factor, char *__pyx_v_category, PyObject *__pyx_v_max_chunks, unsigned int __pyx_v_max_initial_size, unsigned int __pyx_v_max_length, unsigned int __pyx_v_max_nonterminals, PyObject *__pyx_v_max_target_chunks, PyObject *__pyx_v_max_target_length, unsigned int __pyx_v_min_gap_size, PyObject *__pyx_v_precompute_file, unsigned int __pyx_v_precompute_secondary_rank, unsigned int __pyx_v_precompute_rank, int __pyx_v_require_aligned_terminal, int __pyx_v_require_aligned_chunks, unsigned int __pyx_v_train_max_initial_size, unsigned int __pyx_v_train_min_gap_size, int __pyx_v_tight_phrases, int __pyx_v_use_baeza_yates, int __pyx_v_use_collocations, int __pyx_v_use_index) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":311
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":311
  *         respectively.    This is because Chiang's model does not require
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache             # <<<<<<<<<<<<<<
@@ -36766,7 +34641,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -36774,12 +34649,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->rules);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->rules));
-  __pyx_v_self->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":312
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":312
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
@@ -36792,16 +34667,16 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->rules->root);
-  __Pyx_DECREF(__pyx_v_self->rules->root);
-  __pyx_v_self->rules->root = __pyx_t_2;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":313
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":313
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:             # <<<<<<<<<<<<<<
@@ -36811,7 +34686,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (((PyObject *)__pyx_v_alignment) == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":314
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":314
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
@@ -36823,11 +34698,11 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":315
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":315
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")
  *         self.alignment = alignment             # <<<<<<<<<<<<<<
@@ -36836,65 +34711,65 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_alignment));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_alignment));
-  __Pyx_GOTREF(__pyx_v_self->alignment);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->alignment));
-  __pyx_v_self->alignment = __pyx_v_alignment;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment = __pyx_v_alignment;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":319
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":319
  *         # grammar parameters and settings
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  */
-  __pyx_v_self->max_length = __pyx_v_max_length;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length = __pyx_v_max_length;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":320
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":320
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  */
-  __pyx_v_self->max_nonterminals = __pyx_v_max_nonterminals;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals = __pyx_v_max_nonterminals;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":321
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":321
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size             # <<<<<<<<<<<<<<
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  */
-  __pyx_v_self->max_initial_size = __pyx_v_max_initial_size;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size = __pyx_v_max_initial_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":322
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":322
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  */
-  __pyx_v_self->train_max_initial_size = __pyx_v_train_max_initial_size;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size = __pyx_v_train_max_initial_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":323
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":323
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size             # <<<<<<<<<<<<<<
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)
  */
-  __pyx_v_self->min_gap_size = __pyx_v_min_gap_size;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->min_gap_size = __pyx_v_min_gap_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":324
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":324
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size             # <<<<<<<<<<<<<<
  *         self.category = sym_fromstring(category, False)
  * 
  */
-  __pyx_v_self->train_min_gap_size = __pyx_v_train_min_gap_size;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size = __pyx_v_train_min_gap_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":325
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":325
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)             # <<<<<<<<<<<<<<
@@ -36908,7 +34783,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_4 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4);
@@ -36921,9 +34796,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
   __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_v_self->category = __pyx_t_6;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category = __pyx_t_6;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":327
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":327
  *         self.category = sym_fromstring(category, False)
  * 
  *         if max_chunks is None:             # <<<<<<<<<<<<<<
@@ -36933,19 +34808,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (__pyx_v_max_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":328
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":328
  * 
  *         if max_chunks is None:
  *             self.max_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_chunks = max_chunks
  */
-    __pyx_v_self->max_chunks = (__pyx_v_self->max_nonterminals + 1);
-    goto __pyx_L4;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_chunks = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals + 1);
+    goto __pyx_L7;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":330
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":330
  *             self.max_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_chunks = max_chunks             # <<<<<<<<<<<<<<
@@ -36953,11 +34828,11 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         if max_target_chunks is None:
  */
     __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_self->max_chunks = __pyx_t_6;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_chunks = __pyx_t_6;
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":332
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":332
  *             self.max_chunks = max_chunks
  * 
  *         if max_target_chunks is None:             # <<<<<<<<<<<<<<
@@ -36967,19 +34842,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (__pyx_v_max_target_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":333
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":333
  * 
  *         if max_target_chunks is None:
  *             self.max_target_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_target_chunks = max_target_chunks
  */
-    __pyx_v_self->max_target_chunks = (__pyx_v_self->max_nonterminals + 1);
-    goto __pyx_L5;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_chunks = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals + 1);
+    goto __pyx_L8;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":335
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":335
  *             self.max_target_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_target_chunks = max_target_chunks             # <<<<<<<<<<<<<<
@@ -36987,11 +34862,11 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         if max_target_length is None:
  */
     __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_self->max_target_chunks = __pyx_t_6;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_chunks = __pyx_t_6;
   }
-  __pyx_L5:;
+  __pyx_L8:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":337
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":337
  *             self.max_target_chunks = max_target_chunks
  * 
  *         if max_target_length is None:             # <<<<<<<<<<<<<<
@@ -37001,19 +34876,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (__pyx_v_max_target_length == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":338
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":338
  * 
  *         if max_target_length is None:
  *             self.max_target_length = max_initial_size             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_target_length = max_target_length
  */
-    __pyx_v_self->max_target_length = __pyx_v_max_initial_size;
-    goto __pyx_L6;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_length = __pyx_v_max_initial_size;
+    goto __pyx_L9;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":340
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":340
  *             self.max_target_length = max_initial_size
  *         else:
  *             self.max_target_length = max_target_length             # <<<<<<<<<<<<<<
@@ -37021,11 +34896,11 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         # algorithmic parameters and settings
  */
     __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_self->max_target_length = __pyx_t_6;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_length = __pyx_t_6;
   }
-  __pyx_L6:;
+  __pyx_L9:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":343
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":343
  * 
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}             # <<<<<<<<<<<<<<
@@ -37035,12 +34910,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
-  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
-  __pyx_v_self->precomputed_collocations = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":344
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":344
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}             # <<<<<<<<<<<<<<
@@ -37050,30 +34925,30 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
-  __Pyx_DECREF(__pyx_v_self->precomputed_index);
-  __pyx_v_self->precomputed_index = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":345
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":345
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}
  *         self.use_index = use_index             # <<<<<<<<<<<<<<
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  */
-  __pyx_v_self->use_index = __pyx_v_use_index;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_index = __pyx_v_use_index;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":346
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":346
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations             # <<<<<<<<<<<<<<
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  */
-  __pyx_v_self->use_collocations = __pyx_v_use_collocations;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_collocations = __pyx_v_use_collocations;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":347
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":347
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}             # <<<<<<<<<<<<<<
@@ -37083,12 +34958,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(__pyx_v_self->max_rank);
-  __Pyx_DECREF(__pyx_v_self->max_rank);
-  __pyx_v_self->max_rank = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":348
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":348
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file             # <<<<<<<<<<<<<<
@@ -37097,47 +34972,47 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __Pyx_INCREF(__pyx_v_precompute_file);
   __Pyx_GIVEREF(__pyx_v_precompute_file);
-  __Pyx_GOTREF(__pyx_v_self->precompute_file);
-  __Pyx_DECREF(__pyx_v_self->precompute_file);
-  __pyx_v_self->precompute_file = __pyx_v_precompute_file;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file = __pyx_v_precompute_file;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":349
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":349
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  */
-  __pyx_v_self->precompute_rank = __pyx_v_precompute_rank;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_rank = __pyx_v_precompute_rank;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":350
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":350
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  */
-  __pyx_v_self->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":351
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":351
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates             # <<<<<<<<<<<<<<
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  */
-  __pyx_v_self->use_baeza_yates = __pyx_v_use_baeza_yates;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_baeza_yates = __pyx_v_use_baeza_yates;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":352
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":352
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor             # <<<<<<<<<<<<<<
  *         if tight_phrases:
  *             self.tight_phrases = 1
  */
-  __pyx_v_self->by_slack_factor = __pyx_v_by_slack_factor;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->by_slack_factor = __pyx_v_by_slack_factor;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":353
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":353
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:             # <<<<<<<<<<<<<<
@@ -37146,30 +35021,30 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_tight_phrases) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":354
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":354
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  *             self.tight_phrases = 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.tight_phrases = 0
  */
-    __pyx_v_self->tight_phrases = 1;
-    goto __pyx_L7;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->tight_phrases = 1;
+    goto __pyx_L10;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":356
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":356
  *             self.tight_phrases = 1
  *         else:
  *             self.tight_phrases = 0             # <<<<<<<<<<<<<<
  * 
  *         if require_aligned_chunks:
  */
-    __pyx_v_self->tight_phrases = 0;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->tight_phrases = 0;
   }
-  __pyx_L7:;
+  __pyx_L10:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":358
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":358
  *             self.tight_phrases = 0
  * 
  *         if require_aligned_chunks:             # <<<<<<<<<<<<<<
@@ -37178,27 +35053,27 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_require_aligned_chunks) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":360
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":360
  *         if require_aligned_chunks:
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  */
-    __pyx_v_self->require_aligned_chunks = 1;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":361
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":361
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  */
-    __pyx_v_self->require_aligned_terminal = 1;
-    goto __pyx_L8;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 1;
+    goto __pyx_L11;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":362
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":362
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -37207,48 +35082,48 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_require_aligned_terminal) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":363
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":363
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 1
  *         else:
  */
-    __pyx_v_self->require_aligned_chunks = 0;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":364
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":364
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.require_aligned_chunks = 0
  */
-    __pyx_v_self->require_aligned_terminal = 1;
-    goto __pyx_L8;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 1;
+    goto __pyx_L11;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":366
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":366
  *             self.require_aligned_terminal = 1
  *         else:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 0
  * 
  */
-    __pyx_v_self->require_aligned_chunks = 0;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":367
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":367
  *         else:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 0             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_v_self->require_aligned_terminal = 0;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 0;
   }
-  __pyx_L8:;
+  __pyx_L11:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":371
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":371
  * 
  *         # diagnostics
  *         self.prev_norm_prefix = ()             # <<<<<<<<<<<<<<
@@ -37257,11 +35132,11 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __Pyx_GOTREF(__pyx_v_self->prev_norm_prefix);
-  __Pyx_DECREF(__pyx_v_self->prev_norm_prefix);
-  __pyx_v_self->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":373
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":373
  *         self.prev_norm_prefix = ()
  * 
  *         self.findexes = IntList(initial_len=10)             # <<<<<<<<<<<<<<
@@ -37271,16 +35146,16 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
   __Pyx_GIVEREF(__pyx_t_5);
-  __Pyx_GOTREF(__pyx_v_self->findexes);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->findexes));
-  __pyx_v_self->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
   __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":374
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":374
  * 
  *         self.findexes = IntList(initial_len=10)
  *         self.findexes1 = IntList(initial_len=10)             # <<<<<<<<<<<<<<
@@ -37290,13 +35165,13 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_5));
   if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
   __Pyx_GIVEREF(__pyx_t_4);
-  __Pyx_GOTREF(__pyx_v_self->findexes1);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->findexes1));
-  __pyx_v_self->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_4);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_4);
   __pyx_t_4 = 0;
 
   __pyx_r = 0;
@@ -37313,24 +35188,35 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_23HieroCachingRuleFactory_2configure[] = "This gives the RuleFactory access to the Context object.\n        Here we also use it to precompute the most expensive intersections\n        in the corpus quickly.";
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":376
+ *         self.findexes1 = IntList(initial_len=10)
+ * 
+ *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
+ *             Sampler sampler, Scorer scorer):
+ *         '''This gives the RuleFactory access to the Context object.
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_23HieroCachingRuleFactory_1configure[] = "This gives the RuleFactory access to the Context object.\n        Here we also use it to precompute the most expensive intersections\n        in the corpus quickly.";
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray = 0;
   struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray = 0;
   struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler = 0;
   struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("configure (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
+  __Pyx_RefNannySetupContext("configure");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
     PyObject* values[4] = {0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -37339,28 +35225,32 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer);
+        if (likely(values[3])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -37387,34 +35277,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_edarray), __pyx_ptype_3_sa_DataArray, 1, "edarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sampler), __pyx_ptype_3_sa_Sampler, 1, "sampler", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_scorer), __pyx_ptype_3_sa_Scorer, 1, "scorer", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_edarray, __pyx_v_sampler, __pyx_v_scorer);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":376
- *         self.findexes1 = IntList(initial_len=10)
- * 
- *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
- *             Sampler sampler, Scorer scorer):
- *         '''This gives the RuleFactory access to the Context object.
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray, struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray, struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler, struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("configure", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":381
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":381
  *         Here we also use it to precompute the most expensive intersections
  *         in the corpus quickly.'''
  *         self.fsa = fsarray             # <<<<<<<<<<<<<<
@@ -37423,11 +35287,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray));
-  __Pyx_GOTREF(__pyx_v_self->fsa);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->fsa));
-  __pyx_v_self->fsa = __pyx_v_fsarray;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa = __pyx_v_fsarray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":382
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":382
  *         in the corpus quickly.'''
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray             # <<<<<<<<<<<<<<
@@ -37436,11 +35300,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray->darray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray->darray));
-  __Pyx_GOTREF(__pyx_v_self->fda);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->fda));
-  __pyx_v_self->fda = __pyx_v_fsarray->darray;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda = __pyx_v_fsarray->darray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":383
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":383
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray
  *         self.eda = edarray             # <<<<<<<<<<<<<<
@@ -37449,63 +35313,63 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_edarray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_edarray));
-  __Pyx_GOTREF(__pyx_v_self->eda);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->eda));
-  __pyx_v_self->eda = __pyx_v_edarray;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda = __pyx_v_edarray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":384
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":384
  *         self.fda = fsarray.darray
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)             # <<<<<<<<<<<<<<
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  */
-  __pyx_t_1 = ((PyObject *)__pyx_v_self->fda);
+  __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda);
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->__pyx_vtab)->set_idmap(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->fid2symid);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->fid2symid));
-  __pyx_v_self->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":385
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":385
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)             # <<<<<<<<<<<<<<
  *         self.precompute()
  *         self.sampler = sampler
  */
-  __pyx_t_2 = ((PyObject *)__pyx_v_self->eda);
+  __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda);
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->__pyx_vtab)->set_idmap(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->eid2symid);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->eid2symid));
-  __pyx_v_self->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":386
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":386
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()             # <<<<<<<<<<<<<<
  *         self.sampler = sampler
  *         self.scorer = scorer
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":387
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":387
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  *         self.sampler = sampler             # <<<<<<<<<<<<<<
@@ -37514,11 +35378,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_sampler));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_sampler));
-  __Pyx_GOTREF(__pyx_v_self->sampler);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sampler));
-  __pyx_v_self->sampler = __pyx_v_sampler;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler = __pyx_v_sampler;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":388
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":388
  *         self.precompute()
  *         self.sampler = sampler
  *         self.scorer = scorer             # <<<<<<<<<<<<<<
@@ -37527,9 +35391,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_scorer));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_scorer));
-  __Pyx_GOTREF(__pyx_v_self->scorer);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->scorer));
-  __pyx_v_self->scorer = __pyx_v_scorer;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer = __pyx_v_scorer;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -37544,7 +35408,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":390
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":390
  *         self.scorer = scorer
  * 
  *     cdef set_idmap(self, DataArray darray):             # <<<<<<<<<<<<<<
@@ -37552,7 +35416,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  *         cdef IntList idmap
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_DataArray *__pyx_v_darray) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_DataArray *__pyx_v_darray) {
   int __pyx_v_word_id;
   int __pyx_v_new_word_id;
   int __pyx_v_N;
@@ -37569,9 +35433,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set_idmap", 0);
+  __Pyx_RefNannySetupContext("set_idmap");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":394
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":394
  *         cdef IntList idmap
  * 
  *         N = len(darray.id2word)             # <<<<<<<<<<<<<<
@@ -37584,7 +35448,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_N = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":395
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":395
  * 
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -37597,13 +35461,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_idmap = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":396
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":396
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:             # <<<<<<<<<<<<<<
@@ -37613,7 +35477,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_word_id = 0; __pyx_v_word_id < __pyx_t_4; __pyx_v_word_id++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":397
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":397
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)             # <<<<<<<<<<<<<<
@@ -37627,7 +35491,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
     __pyx_t_5 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -37642,7 +35506,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_v_new_word_id = __pyx_t_7;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":398
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":398
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id             # <<<<<<<<<<<<<<
@@ -37652,7 +35516,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
     (__pyx_v_idmap->arr[__pyx_v_word_id]) = __pyx_v_new_word_id;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":399
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":399
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id
  *         return idmap             # <<<<<<<<<<<<<<
@@ -37680,18 +35544,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("pattern2phrase (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":402
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":402
  * 
  * 
  *     def pattern2phrase(self, pattern):             # <<<<<<<<<<<<<<
@@ -37699,7 +35552,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObjec
  *         result = ()
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_arity = NULL;
   PyObject *__pyx_v_word_id = NULL;
@@ -37718,9 +35572,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("pattern2phrase", 0);
+  __Pyx_RefNannySetupContext("pattern2phrase");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":404
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":404
  *     def pattern2phrase(self, pattern):
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()             # <<<<<<<<<<<<<<
@@ -37730,7 +35584,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":405
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":405
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -37740,7 +35594,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":406
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":406
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -37756,20 +35610,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -37785,19 +35631,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":407
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":407
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":408
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":408
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
@@ -37810,7 +35657,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":409
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":409
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
@@ -37818,16 +35665,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_XDECREF(__pyx_v_new_id);
       __pyx_v_new_id = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":411
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":411
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
@@ -37836,12 +35683,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  */
       __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
       __Pyx_GIVEREF(__pyx_t_7);
       PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
@@ -37856,9 +35703,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
       __pyx_v_new_id = __pyx_t_8;
       __pyx_t_8 = 0;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":412
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":412
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
@@ -37866,7 +35713,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  * 
  */
     __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
     __Pyx_INCREF(__pyx_v_new_id);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_new_id);
     __Pyx_GIVEREF(__pyx_v_new_id);
@@ -37879,7 +35726,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":413
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":413
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         return Phrase(result)             # <<<<<<<<<<<<<<
@@ -37888,7 +35735,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
@@ -37919,18 +35766,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("pattern2phrase_plus (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":415
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":415
  *         return Phrase(result)
  * 
  *     def pattern2phrase_plus(self, pattern):             # <<<<<<<<<<<<<<
@@ -37938,7 +35774,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(Py
  *         # suffixed/prefixed with the NT category.
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
   PyObject *__pyx_v_patterns = NULL;
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_arity = NULL;
@@ -37959,9 +35796,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("pattern2phrase_plus", 0);
+  __Pyx_RefNannySetupContext("pattern2phrase_plus");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":418
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":418
  *         # returns a list containing both the pattern, and pattern
  *         # suffixed/prefixed with the NT category.
  *         patterns = []             # <<<<<<<<<<<<<<
@@ -37969,11 +35806,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  *         arity = 0
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_patterns = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":419
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":419
  *         # suffixed/prefixed with the NT category.
  *         patterns = []
  *         result = ()             # <<<<<<<<<<<<<<
@@ -37983,7 +35820,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":420
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":420
  *         patterns = []
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -37993,7 +35830,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":421
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":421
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -38009,20 +35846,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -38038,19 +35867,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":422
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":422
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":423
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":423
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
@@ -38063,7 +35893,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":424
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":424
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
@@ -38071,16 +35901,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_XDECREF(__pyx_v_new_id);
       __pyx_v_new_id = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":426
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":426
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
@@ -38089,12 +35919,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  */
       __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
       __Pyx_GIVEREF(__pyx_t_7);
       PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
@@ -38109,9 +35939,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
       __pyx_v_new_id = __pyx_t_8;
       __pyx_t_8 = 0;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":427
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":427
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
@@ -38119,7 +35949,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  */
     __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
     __Pyx_INCREF(__pyx_v_new_id);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_new_id);
     __Pyx_GIVEREF(__pyx_v_new_id);
@@ -38132,15 +35962,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":428
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":428
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  */
+  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
@@ -38150,17 +35983,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":429
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":429
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns
  */
-  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
+  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9);
   __Pyx_GIVEREF(__pyx_t_9);
   __pyx_t_9 = 0;
@@ -38168,7 +36004,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_GOTREF(((PyObject *)__pyx_t_9));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_9));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
   __pyx_t_9 = 0;
@@ -38178,17 +36014,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":430
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":430
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))             # <<<<<<<<<<<<<<
  *         return patterns
  * 
  */
-  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
+  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9);
   __Pyx_GIVEREF(__pyx_t_9);
   __pyx_t_9 = 0;
@@ -38196,7 +36035,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_GOTREF(((PyObject *)__pyx_t_9));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_9));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
   __pyx_t_9 = 0;
@@ -38206,7 +36045,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":431
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":431
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns             # <<<<<<<<<<<<<<
@@ -38239,18 +36078,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("precompute (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":433
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":433
  *         return patterns
  * 
  *     def precompute(self):             # <<<<<<<<<<<<<<
@@ -38258,7 +36086,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   struct __pyx_obj_3_sa_Precomputation *__pyx_v_pre = 0;
   PyObject *__pyx_v_start_time = NULL;
   PyObject *__pyx_v_pattern = NULL;
@@ -38274,27 +36103,27 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   Py_ssize_t __pyx_t_6;
-  Py_ssize_t __pyx_t_7;
-  int __pyx_t_8;
-  int __pyx_t_9;
+  PyObject *(*__pyx_t_7)(PyObject *);
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *(*__pyx_t_9)(PyObject *);
   Py_ssize_t __pyx_t_10;
   PyObject *(*__pyx_t_11)(PyObject *);
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("precompute", 0);
+  __Pyx_RefNannySetupContext("precompute");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":436
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":436
  *         cdef Precomputation pre
  * 
  *         if self.precompute_file is not None:             # <<<<<<<<<<<<<<
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  */
-  __pyx_t_1 = (__pyx_v_self->precompute_file != Py_None);
+  __pyx_t_1 = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file != Py_None);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":437
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":437
  * 
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -38306,7 +36135,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_v_start_time = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":438
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":438
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)             # <<<<<<<<<<<<<<
@@ -38319,20 +36148,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_108));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_108));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_108));
-    __Pyx_INCREF(__pyx_v_self->precompute_file);
-    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->precompute_file);
-    __Pyx_GIVEREF(__pyx_v_self->precompute_file);
+    __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
+    PyTuple_SET_ITEM(__pyx_t_2, 1, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
+    __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
     __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":439
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":439
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  *             pre = Precomputation(from_binary=self.precompute_file)             # <<<<<<<<<<<<<<
@@ -38341,24 +36170,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
     __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), __pyx_v_self->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_v_pre = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_t_2);
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":441
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":441
  *             pre = Precomputation(from_binary=self.precompute_file)
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:             # <<<<<<<<<<<<<<
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  */
-    __pyx_t_1 = (__pyx_v_pre->max_nonterminals != __pyx_v_self->max_nonterminals);
+    __pyx_t_1 = (__pyx_v_pre->max_nonterminals != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":442
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":442
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)             # <<<<<<<<<<<<<<
@@ -38372,10 +36201,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_109));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_s_109));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_109));
@@ -38390,21 +36219,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L4;
+      goto __pyx_L6;
     }
-    __pyx_L4:;
+    __pyx_L6:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":443
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":443
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:             # <<<<<<<<<<<<<<
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  */
-    __pyx_t_1 = (__pyx_v_pre->max_length != __pyx_v_self->max_length);
+    __pyx_t_1 = (__pyx_v_pre->max_length != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":444
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":444
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)             # <<<<<<<<<<<<<<
@@ -38418,10 +36247,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyInt_FromLong(__pyx_v_self->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_110));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_110));
@@ -38436,21 +36265,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":445
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":445
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:             # <<<<<<<<<<<<<<
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  */
-    __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != __pyx_v_self->train_max_initial_size);
+    __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":446
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":446
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))             # <<<<<<<<<<<<<<
@@ -38459,10 +36288,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
       __pyx_t_4 = PyInt_FromLong(__pyx_v_pre->train_max_initial_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
@@ -38473,7 +36302,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       __pyx_t_2 = 0;
@@ -38483,21 +36312,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_Raise(__pyx_t_2, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L6;
+      goto __pyx_L8;
     }
-    __pyx_L6:;
+    __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":447
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":447
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:             # <<<<<<<<<<<<<<
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  */
-    __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != __pyx_v_self->train_min_gap_size);
+    __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":448
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":448
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))             # <<<<<<<<<<<<<<
@@ -38506,10 +36335,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
       __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyInt_FromLong(__pyx_v_self->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5);
@@ -38520,7 +36349,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_5));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
       __pyx_t_5 = 0;
@@ -38530,20 +36359,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_Raise(__pyx_t_5, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L7;
+      goto __pyx_L9;
     }
-    __pyx_L7:;
+    __pyx_L9:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":449
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":449
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:             # <<<<<<<<<<<<<<
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  */
-    if (__pyx_v_self->use_index) {
+    if (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_index) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":450
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":450
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))             # <<<<<<<<<<<<<<
@@ -38562,7 +36391,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_113));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_113));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_113));
@@ -38575,59 +36404,117 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":451
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":451
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():             # <<<<<<<<<<<<<<
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  */
-      __pyx_t_6 = 0;
-      if (unlikely(__pyx_v_pre->precomputed_index == Py_None)) {
-        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_index, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_v_pre->precomputed_index, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_2 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_XDECREF(__pyx_t_5);
-      __pyx_t_5 = __pyx_t_2;
-      __pyx_t_2 = 0;
-      while (1) {
-        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_7, &__pyx_t_6, &__pyx_t_2, &__pyx_t_4, NULL, __pyx_t_8);
-        if (unlikely(__pyx_t_9 == 0)) break;
-        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
+        __pyx_t_5 = __pyx_t_2; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0;
+        __pyx_t_7 = NULL;
+      } else {
+        __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
+      }
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      for (;;) {
+        if (PyList_CheckExact(__pyx_t_5)) {
+          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
+          __pyx_t_2 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++;
+        } else if (PyTuple_CheckExact(__pyx_t_5)) {
+          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
+          __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++;
+        } else {
+          __pyx_t_2 = __pyx_t_7(__pyx_t_5);
+          if (unlikely(!__pyx_t_2)) {
+            if (PyErr_Occurred()) {
+              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            break;
+          }
+          __Pyx_GOTREF(__pyx_t_2);
+        }
+        if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
+          PyObject* sequence = __pyx_t_2;
+          if (likely(PyTuple_CheckExact(sequence))) {
+            if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+              if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+              else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
+            __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
+          } else {
+            if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+              if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+              else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
+            __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
+          }
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        } else {
+          Py_ssize_t index = -1;
+          __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
+          index = 0; __pyx_t_4 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L13_unpacking_failed;
+          __Pyx_GOTREF(__pyx_t_4);
+          index = 1; __pyx_t_3 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_3)) goto __pyx_L13_unpacking_failed;
+          __Pyx_GOTREF(__pyx_t_3);
+          if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          goto __pyx_L14_unpacking_done;
+          __pyx_L13_unpacking_failed:;
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+          if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_L14_unpacking_done:;
+        }
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_2;
-        __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_4;
+        __pyx_v_pattern = __pyx_t_4;
         __pyx_t_4 = 0;
+        __Pyx_XDECREF(__pyx_v_arr);
+        __pyx_v_arr = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":452
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":452
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)             # <<<<<<<<<<<<<<
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  */
-        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_3));
         __Pyx_INCREF(__pyx_v_pattern);
-        PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
+        PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
-        __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+        __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
         __Pyx_XDECREF(__pyx_v_phrases);
-        __pyx_v_phrases = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_phrases = __pyx_t_4;
+        __pyx_t_4 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":453
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":453
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:             # <<<<<<<<<<<<<<
@@ -38635,69 +36522,61 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *             if self.use_collocations:
  */
         if (PyList_CheckExact(__pyx_v_phrases) || PyTuple_CheckExact(__pyx_v_phrases)) {
-          __pyx_t_3 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
+          __pyx_t_4 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_4); __pyx_t_10 = 0;
           __pyx_t_11 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
+          __pyx_t_10 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_11 = Py_TYPE(__pyx_t_4)->tp_iternext;
         }
         for (;;) {
-          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_3)) {
-            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
-          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_3)) {
-            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
+          if (PyList_CheckExact(__pyx_t_4)) {
+            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_4)) break;
+            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
+          } else if (PyTuple_CheckExact(__pyx_t_4)) {
+            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
           } else {
-            __pyx_t_2 = __pyx_t_11(__pyx_t_3);
-            if (unlikely(!__pyx_t_2)) {
+            __pyx_t_3 = __pyx_t_11(__pyx_t_4);
+            if (unlikely(!__pyx_t_3)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
                 else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
-            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_GOTREF(__pyx_t_3);
           }
           __Pyx_XDECREF(__pyx_v_phrase);
-          __pyx_v_phrase = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_v_phrase = __pyx_t_3;
+          __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":454
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":454
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr             # <<<<<<<<<<<<<<
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  */
-          if (PyObject_SetItem(__pyx_v_self->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyObject_SetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L8;
+      goto __pyx_L10;
     }
-    __pyx_L8:;
+    __pyx_L10:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":455
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":455
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:             # <<<<<<<<<<<<<<
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  */
-    if (__pyx_v_self->use_collocations) {
+    if (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_collocations) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":456
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":456
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))             # <<<<<<<<<<<<<<
@@ -38706,70 +36585,128 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
       __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_5 = __pyx_v_pre->precomputed_collocations;
       __Pyx_INCREF(__pyx_t_5);
-      __pyx_t_7 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_114));
-      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_114));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_114));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_114));
-      PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":457
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":457
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():             # <<<<<<<<<<<<<<
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  */
-      __pyx_t_7 = 0;
-      if (unlikely(__pyx_v_pre->precomputed_collocations == Py_None)) {
-        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_v_pre->precomputed_collocations, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+        __pyx_t_5 = __pyx_t_3; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0;
+        __pyx_t_7 = NULL;
+      } else {
+        __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
       }
-      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_6), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_XDECREF(__pyx_t_5);
-      __pyx_t_5 = __pyx_t_2;
-      __pyx_t_2 = 0;
-      while (1) {
-        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_6, &__pyx_t_7, &__pyx_t_2, &__pyx_t_3, NULL, __pyx_t_8);
-        if (unlikely(__pyx_t_9 == 0)) break;
-        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      for (;;) {
+        if (PyList_CheckExact(__pyx_t_5)) {
+          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
+          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
+        } else if (PyTuple_CheckExact(__pyx_t_5)) {
+          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
+          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
+        } else {
+          __pyx_t_3 = __pyx_t_7(__pyx_t_5);
+          if (unlikely(!__pyx_t_3)) {
+            if (PyErr_Occurred()) {
+              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            break;
+          }
+          __Pyx_GOTREF(__pyx_t_3);
+        }
+        if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+          PyObject* sequence = __pyx_t_3;
+          if (likely(PyTuple_CheckExact(sequence))) {
+            if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+              if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+              else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
+            __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
+          } else {
+            if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+              if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+              else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
+            __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
+          }
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        } else {
+          Py_ssize_t index = -1;
+          __pyx_t_8 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
+          index = 0; __pyx_t_4 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L20_unpacking_failed;
+          __Pyx_GOTREF(__pyx_t_4);
+          index = 1; __pyx_t_2 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_2)) goto __pyx_L20_unpacking_failed;
+          __Pyx_GOTREF(__pyx_t_2);
+          if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          goto __pyx_L21_unpacking_done;
+          __pyx_L20_unpacking_failed:;
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+          if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_L21_unpacking_done:;
+        }
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_2;
-        __pyx_t_2 = 0;
+        __pyx_v_pattern = __pyx_t_4;
+        __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_arr = __pyx_t_2;
+        __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":458
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":458
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)             # <<<<<<<<<<<<<<
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  */
-        __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
         __Pyx_INCREF(__pyx_v_pattern);
         PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
@@ -38781,21 +36718,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
         __pyx_v_phrase = __pyx_t_4;
         __pyx_t_4 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":459
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":459
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr             # <<<<<<<<<<<<<<
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)
  */
-        if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyObject_SetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L13;
+      goto __pyx_L17;
     }
-    __pyx_L13:;
+    __pyx_L17:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":460
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":460
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -38807,7 +36744,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_v_stop_time = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":461
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":461
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)             # <<<<<<<<<<<<<<
@@ -38822,7 +36759,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_t_5 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_115));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_115));
@@ -38834,9 +36771,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -38845,6 +36782,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -38860,18 +36798,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_precomputed_collocation (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_phrase));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":464
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":464
  * 
  * 
  *     def get_precomputed_collocation(self, phrase):             # <<<<<<<<<<<<<<
@@ -38879,7 +36806,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collo
  *             arr = self.precomputed_collocations[phrase]
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_phrase) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase) {
   PyObject *__pyx_v_arr = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -38891,31 +36819,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_precomputed_collocation", 0);
+  __Pyx_RefNannySetupContext("get_precomputed_collocation");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":465
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":465
  * 
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:             # <<<<<<<<<<<<<<
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_phrase, __pyx_v_self->precomputed_collocations, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":466
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":466
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]             # <<<<<<<<<<<<<<
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_arr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":467
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":467
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)             # <<<<<<<<<<<<<<
@@ -38942,17 +36870,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":468
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":468
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None             # <<<<<<<<<<<<<<
@@ -38979,7 +36907,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":471
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":471
  * 
  * 
  *     cdef int* baeza_yates_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -39023,9 +36951,9 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("baeza_yates_helper", 0);
+  __Pyx_RefNannySetupContext("baeza_yates_helper");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":484
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":484
  *         cdef Matching loc1, loc2
  * 
  *         result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -39034,7 +36962,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":486
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":486
  *         result = <int*> malloc(0*sizeof(int*))
  * 
  *         d_first = 0             # <<<<<<<<<<<<<<
@@ -39043,7 +36971,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_d_first = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":487
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":487
  * 
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:             # <<<<<<<<<<<<<<
@@ -39053,7 +36981,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_1 = ((__pyx_v_high1 - __pyx_v_low1) > (__pyx_v_high2 - __pyx_v_low2));
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":488
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":488
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:
  *             d_first = 1             # <<<<<<<<<<<<<<
@@ -39065,7 +36993,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":492
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":492
  *         # First, check to see if we are at any of the recursive base cases
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:             # <<<<<<<<<<<<<<
@@ -39081,7 +37009,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":493
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":493
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:
  *             return result             # <<<<<<<<<<<<<<
@@ -39094,7 +37022,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":496
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":496
  * 
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -39103,7 +37031,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, (__pyx_v_high1 - __pyx_v_step1), __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":497
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":497
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -39112,7 +37040,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_low2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":498
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":498
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:             # <<<<<<<<<<<<<<
@@ -39122,7 +37050,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == -1);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":499
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":499
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:
  *             return result             # <<<<<<<<<<<<<<
@@ -39135,7 +37063,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":501
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":501
  *             return result
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -39144,7 +37072,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_low1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":502
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":502
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -39153,7 +37081,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_high2 - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":503
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":503
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -39163,7 +37091,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":504
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":504
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *             return result             # <<<<<<<<<<<<<<
@@ -39176,7 +37104,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":508
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":508
  *         # Case 3: query set and data set do not meet size mismatch constraints;
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1             # <<<<<<<<<<<<<<
@@ -39194,7 +37122,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_v_qsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":509
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":509
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2             # <<<<<<<<<<<<<<
@@ -39212,7 +37140,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_v_dsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":510
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":510
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -39221,7 +37149,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":511
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":511
  *         dsetsize = (high2-low2) / step2
  *         if d_first:
  *             tmp = qsetsize             # <<<<<<<<<<<<<<
@@ -39230,7 +37158,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_qsetsize;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":512
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":512
  *         if d_first:
  *             tmp = qsetsize
  *             qsetsize = dsetsize             # <<<<<<<<<<<<<<
@@ -39239,7 +37167,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_qsetsize = __pyx_v_dsetsize;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":513
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":513
  *             tmp = qsetsize
  *             qsetsize = dsetsize
  *             dsetsize = tmp             # <<<<<<<<<<<<<<
@@ -39251,7 +37179,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":515
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":515
  *             dsetsize = tmp
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:             # <<<<<<<<<<<<<<
@@ -39267,7 +37195,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = ((__pyx_t_5 / __pyx_t_6) > __pyx_v_dsetsize);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":516
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":516
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)             # <<<<<<<<<<<<<<
@@ -39276,7 +37204,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     free(__pyx_v_result);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":517
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":517
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)
  *             return self.merge_helper(low1, high1, arr1, step1, low2, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -39289,7 +37217,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L8:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":521
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":521
  *         # binary search.    There are two flavors, depending on
  *         # whether the queryset or dataset is first
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -39298,7 +37226,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":522
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":522
  *         # whether the queryset or dataset is first
  *         if d_first:
  *             med2 = median(low2, high2, step2)             # <<<<<<<<<<<<<<
@@ -39307,7 +37235,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_low2, __pyx_v_high2, __pyx_v_step2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":523
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":523
  *         if d_first:
  *             med2 = median(low2, high2, step2)
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -39316,7 +37244,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":525
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":525
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  * 
  *             search_low = low1             # <<<<<<<<<<<<<<
@@ -39325,7 +37253,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":526
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":526
  * 
  *             search_low = low1
  *             search_high = high1             # <<<<<<<<<<<<<<
@@ -39334,7 +37262,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":527
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":527
  *             search_low = low1
  *             search_high = high1
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -39345,7 +37273,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":528
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":528
  *             search_high = high1
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)             # <<<<<<<<<<<<<<
@@ -39354,7 +37282,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":529
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":529
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -39363,7 +37291,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":530
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":530
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -39372,7 +37300,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":533
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":533
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -39381,7 +37309,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":531
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":531
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -39390,7 +37318,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":532
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":532
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_low = med1_plus             # <<<<<<<<<<<<<<
@@ -39400,7 +37328,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_low = __pyx_v_med1_plus;
         break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":533
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":533
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -39409,7 +37337,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":534
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":534
  *                     search_low = med1_plus
  *                 elif comparison == 1:
  *                     search_high = med1_minus             # <<<<<<<<<<<<<<
@@ -39420,7 +37348,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":536
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":536
  *                     search_high = med1_minus
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -39436,7 +37364,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":538
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":538
  *                     break
  *         else:
  *             med1 = median(low1, high1, step1)             # <<<<<<<<<<<<<<
@@ -39445,7 +37373,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_low1, __pyx_v_high1, __pyx_v_step1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":539
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":539
  *         else:
  *             med1 = median(low1, high1, step1)
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -39454,7 +37382,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":541
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":541
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  * 
  *             search_low = low2             # <<<<<<<<<<<<<<
@@ -39463,7 +37391,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":542
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":542
  * 
  *             search_low = low2
  *             search_high = high2             # <<<<<<<<<<<<<<
@@ -39472,7 +37400,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":543
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":543
  *             search_low = low2
  *             search_high = high2
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -39483,7 +37411,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":544
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":544
  *             search_high = high2
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)             # <<<<<<<<<<<<<<
@@ -39492,7 +37420,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step2);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":545
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":545
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -39501,7 +37429,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":546
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":546
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -39510,7 +37438,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":549
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":549
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -39519,7 +37447,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":547
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":547
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -39528,7 +37456,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":548
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":548
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_high = med2             # <<<<<<<<<<<<<<
@@ -39538,7 +37466,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_high = __pyx_v_med2;
         break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":549
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":549
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -39547,7 +37475,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":550
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":550
  *                     search_high = med2
  *                 elif comparison == 1:
  *                     search_low = med2 + step2             # <<<<<<<<<<<<<<
@@ -39558,7 +37486,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":552
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":552
  *                     search_low = med2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -39573,7 +37501,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L9:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":554
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":554
  *                     break
  * 
  *         med_result_len = 0             # <<<<<<<<<<<<<<
@@ -39582,7 +37510,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":555
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":555
  * 
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -39591,7 +37519,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":556
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":556
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))
  *         if search_high > search_low:             # <<<<<<<<<<<<<<
@@ -39601,7 +37529,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (__pyx_v_search_high > __pyx_v_search_low);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":562
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":562
  *             # want to store the bindings for all of those elements.    We can
  *             # subsequently throw all of them away.
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -39610,7 +37538,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":563
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":563
  *             # subsequently throw all of them away.
  *             med2_minus = med2
  *             med2_plus = med2 + step2             # <<<<<<<<<<<<<<
@@ -39619,7 +37547,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = (__pyx_v_med2 + __pyx_v_step2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":564
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":564
  *             med2_minus = med2
  *             med2_plus = med2 + step2
  *             i1 = med1_minus             # <<<<<<<<<<<<<<
@@ -39628,7 +37556,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_i1 = __pyx_v_med1_minus;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":565
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":565
  *             med2_plus = med2 + step2
  *             i1 = med1_minus
  *             while i1 < med1_plus:             # <<<<<<<<<<<<<<
@@ -39639,7 +37567,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i1 < __pyx_v_med1_plus);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":566
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":566
  *             i1 = med1_minus
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -39648,7 +37576,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":567
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":567
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:             # <<<<<<<<<<<<<<
@@ -39659,7 +37587,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = ((__pyx_v_med2_minus - __pyx_v_step2) >= __pyx_v_low2);
         if (!__pyx_t_3) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":568
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":568
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -39668,7 +37596,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_med2_minus - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":569
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":569
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:             # <<<<<<<<<<<<<<
@@ -39678,7 +37606,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) < 1);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":570
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":570
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:
  *                         med2_minus = med2_minus - step2             # <<<<<<<<<<<<<<
@@ -39690,7 +37618,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":572
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":572
  *                         med2_minus = med2_minus - step2
  *                     else:
  *                         break             # <<<<<<<<<<<<<<
@@ -39703,7 +37631,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L18_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":573
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":573
  *                     else:
  *                         break
  *                 i2 = med2_minus             # <<<<<<<<<<<<<<
@@ -39712,7 +37640,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_i2 = __pyx_v_med2_minus;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":574
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":574
  *                         break
  *                 i2 = med2_minus
  *                 while i2 < high2:             # <<<<<<<<<<<<<<
@@ -39723,7 +37651,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
         if (!__pyx_t_3) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":575
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":575
  *                 i2 = med2_minus
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -39732,7 +37660,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":576
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":576
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -39741,7 +37669,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":577
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":577
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -39751,7 +37679,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == 0);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":579
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":579
  *                     if comparison == 0:
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)             # <<<<<<<<<<<<<<
@@ -39763,7 +37691,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L22:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":580
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":580
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -39773,7 +37701,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == -1);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":581
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":581
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -39785,7 +37713,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L23:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":582
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":582
  *                     if comparison == -1:
  *                         break
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -39796,7 +37724,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L21_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":583
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":583
  *                         break
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:             # <<<<<<<<<<<<<<
@@ -39806,7 +37734,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i2 > __pyx_v_med2_plus);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":584
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":584
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:
  *                     med2_plus = i2             # <<<<<<<<<<<<<<
@@ -39818,7 +37746,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L24:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":585
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":585
  *                 if i2 > med2_plus:
  *                     med2_plus = i2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -39828,7 +37756,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_v_i1 = (__pyx_v_i1 + __pyx_v_step1);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":587
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":587
  *                 i1 = i1 + step1
  * 
  *             tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -39837,7 +37765,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_med1_minus;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":588
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":588
  * 
  *             tmp = med1_minus
  *             med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -39846,7 +37774,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":589
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":589
  *             tmp = med1_minus
  *             med1_minus = med1_plus
  *             med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -39858,7 +37786,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":592
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":592
  *         else:
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -39867,7 +37795,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":593
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":593
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2
  *             med2_plus = med2             # <<<<<<<<<<<<<<
@@ -39876,7 +37804,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = __pyx_v_med2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":594
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":594
  *             med2_minus = med2
  *             med2_plus = med2
  *             if d_first:             # <<<<<<<<<<<<<<
@@ -39885,7 +37813,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     if (__pyx_v_d_first) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":595
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":595
  *             med2_plus = med2
  *             if d_first:
  *                 med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -39894,7 +37822,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":596
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":596
  *             if d_first:
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -39904,7 +37832,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == -1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":597
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":597
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:
  *                     med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -39916,7 +37844,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L26:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":598
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":598
  *                 if comparison == -1:
  *                     med1_minus = med1_plus
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -39926,7 +37854,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":599
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":599
  *                     med1_minus = med1_plus
  *                 if comparison == 1:
  *                     med1_plus = med1_minus             # <<<<<<<<<<<<<<
@@ -39941,7 +37869,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":601
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":601
  *                     med1_plus = med1_minus
  *             else:
  *                 tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -39950,7 +37878,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_tmp = __pyx_v_med1_minus;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":602
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":602
  *             else:
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -39959,7 +37887,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":603
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":603
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -39968,7 +37896,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_plus = __pyx_v_tmp;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":604
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":604
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -39978,7 +37906,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":605
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":605
  *                 med1_plus = tmp
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -39987,7 +37915,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":606
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":606
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2
  *                     med2_plus = med2_plus + step2             # <<<<<<<<<<<<<<
@@ -40003,7 +37931,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L14:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":608
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":608
  *                     med2_plus = med2_plus + step2
  * 
  *         low_result_len = 0             # <<<<<<<<<<<<<<
@@ -40012,7 +37940,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":609
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":609
  * 
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)             # <<<<<<<<<<<<<<
@@ -40021,7 +37949,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_low1, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, __pyx_v_low2, __pyx_v_med2_plus, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_low_result_len));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":610
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":610
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0             # <<<<<<<<<<<<<<
@@ -40030,7 +37958,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":611
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":611
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)             # <<<<<<<<<<<<<<
@@ -40039,7 +37967,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med2_minus, __pyx_v_high2, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_high_result_len));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":613
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":613
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)             # <<<<<<<<<<<<<<
@@ -40048,7 +37976,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_low_result, __pyx_v_low_result_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":614
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":614
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)             # <<<<<<<<<<<<<<
@@ -40057,7 +37985,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_med_result, __pyx_v_med_result_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":615
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":615
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)             # <<<<<<<<<<<<<<
@@ -40066,7 +37994,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_high_result, __pyx_v_high_result_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":616
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":616
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)             # <<<<<<<<<<<<<<
@@ -40075,7 +38003,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_low_result);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":617
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":617
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)
  *         free(med_result)             # <<<<<<<<<<<<<<
@@ -40084,7 +38012,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_med_result);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":618
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":618
  *         free(low_result)
  *         free(med_result)
  *         free(high_result)             # <<<<<<<<<<<<<<
@@ -40093,7 +38021,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_high_result);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":620
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":620
  *         free(high_result)
  * 
  *         return result             # <<<<<<<<<<<<<<
@@ -40113,7 +38041,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":624
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":624
  * 
  * 
  *     cdef long compare_matchings_set(self, int i1_minus, int i1_plus, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -40130,9 +38058,9 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   long __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("compare_matchings_set", 0);
+  __Pyx_RefNannySetupContext("compare_matchings_set");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":635
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":635
  *         cdef Matching* loc1
  * 
  *         loc1 = &l1_stack             # <<<<<<<<<<<<<<
@@ -40141,7 +38069,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_loc1 = (&__pyx_v_l1_stack);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":637
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":637
  *         loc1 = &l1_stack
  * 
  *         i1 = i1_minus             # <<<<<<<<<<<<<<
@@ -40150,7 +38078,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_i1 = __pyx_v_i1_minus;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":638
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":638
  * 
  *         i1 = i1_minus
  *         while i1 < i1_plus:             # <<<<<<<<<<<<<<
@@ -40161,7 +38089,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 < __pyx_v_i1_plus);
     if (!__pyx_t_1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":639
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":639
  *         i1 = i1_minus
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40170,7 +38098,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_f_3_sa_assign_matching(__pyx_v_loc1, __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":640
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":640
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -40179,7 +38107,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, __pyx_v_loc1, __pyx_v_loc2, __pyx_v_offset_by_one, __pyx_v_len_last);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":641
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":641
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:             # <<<<<<<<<<<<<<
@@ -40189,7 +38117,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_comparison == 0);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":642
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":642
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:
  *                 prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -40198,7 +38126,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
       __pyx_v_prev_comparison = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":643
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":643
  *             if comparison == 0:
  *                 prev_comparison = 0
  *                 break             # <<<<<<<<<<<<<<
@@ -40209,7 +38137,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       goto __pyx_L5;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":644
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":644
  *                 prev_comparison = 0
  *                 break
  *             elif i1 == i1_minus:             # <<<<<<<<<<<<<<
@@ -40219,7 +38147,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 == __pyx_v_i1_minus);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":645
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":645
  *                 break
  *             elif i1 == i1_minus:
  *                 prev_comparison = comparison             # <<<<<<<<<<<<<<
@@ -40231,7 +38159,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":647
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":647
  *                 prev_comparison = comparison
  *             else:
  *                 if comparison != prev_comparison:             # <<<<<<<<<<<<<<
@@ -40241,7 +38169,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       __pyx_t_1 = (__pyx_v_comparison != __pyx_v_prev_comparison);
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":648
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":648
  *             else:
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -40250,7 +38178,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
         __pyx_v_prev_comparison = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":649
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":649
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -40264,7 +38192,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":650
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":650
  *                     prev_comparison = 0
  *                     break
  *             i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -40275,7 +38203,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   }
   __pyx_L4_break:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":651
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":651
  *                     break
  *             i1 = i1 + step1
  *         return prev_comparison             # <<<<<<<<<<<<<<
@@ -40291,7 +38219,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":654
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":654
  * 
  * 
  *     cdef long compare_matchings(self, Matching* loc1, Matching* loc2, int offset_by_one, int len_last):             # <<<<<<<<<<<<<<
@@ -40307,9 +38235,9 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("compare_matchings", 0);
+  __Pyx_RefNannySetupContext("compare_matchings");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":657
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":657
  *         cdef int i
  * 
  *         if loc1.sent_id > loc2.sent_id:             # <<<<<<<<<<<<<<
@@ -40319,7 +38247,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc1->sent_id > __pyx_v_loc2->sent_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":658
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":658
  * 
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1             # <<<<<<<<<<<<<<
@@ -40332,7 +38260,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":659
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":659
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:             # <<<<<<<<<<<<<<
@@ -40342,7 +38270,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc2->sent_id > __pyx_v_loc1->sent_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":660
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":660
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:
  *             return -1             # <<<<<<<<<<<<<<
@@ -40355,7 +38283,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":662
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":662
  *             return -1
  * 
  *         if loc1.size == 1 and loc2.size == 1:             # <<<<<<<<<<<<<<
@@ -40371,7 +38299,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":663
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":663
  * 
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:             # <<<<<<<<<<<<<<
@@ -40381,7 +38309,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc2->arr[__pyx_v_loc2->start]) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) <= __pyx_v_self->train_min_gap_size);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":664
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":664
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -40396,7 +38324,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     goto __pyx_L5;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":666
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":666
  *                 return 1
  * 
  *         elif offset_by_one:             # <<<<<<<<<<<<<<
@@ -40405,7 +38333,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
  */
   if (__pyx_v_offset_by_one) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":667
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":667
  * 
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -40415,7 +38343,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":668
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":668
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -40425,7 +38353,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":669
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":669
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -40438,7 +38366,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L9:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":670
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":670
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -40448,7 +38376,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":671
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":671
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -40465,7 +38393,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":674
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":674
  * 
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -40475,7 +38403,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) > (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":675
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":675
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -40488,7 +38416,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L11:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":676
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":676
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -40498,7 +38426,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) < (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":677
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":677
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -40511,7 +38439,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L12:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":679
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":679
  *                 return -1
  * 
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -40521,7 +38449,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":680
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":680
  * 
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -40531,7 +38459,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":681
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":681
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -40544,7 +38472,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L15:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":682
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":682
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -40554,7 +38482,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":683
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":683
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -40570,7 +38498,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":685
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":685
  *                     return -1
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -40580,7 +38508,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_3 = ((((__pyx_v_loc2->arr[(__pyx_v_loc2->end - 1)]) + __pyx_v_len_last) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) > __pyx_v_self->train_max_initial_size);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":686
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":686
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1             # <<<<<<<<<<<<<<
@@ -40593,7 +38521,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L17:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":687
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":687
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1
  *         return 0             # <<<<<<<<<<<<<<
@@ -40609,7 +38537,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":690
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":690
  * 
  * 
  *     cdef int* merge_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -40631,9 +38559,9 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("merge_helper", 0);
+  __Pyx_RefNannySetupContext("merge_helper");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":698
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":698
  *         cdef Matching loc1, loc2
  * 
  *         result_len[0] = 0             # <<<<<<<<<<<<<<
@@ -40642,7 +38570,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   (__pyx_v_result_len[0]) = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":699
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":699
  * 
  *         result_len[0] = 0
  *         result = <int*> malloc(0*sizeof(int))             # <<<<<<<<<<<<<<
@@ -40651,7 +38579,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":701
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":701
  *         result = <int*> malloc(0*sizeof(int))
  * 
  *         i1 = low1             # <<<<<<<<<<<<<<
@@ -40660,7 +38588,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i1 = __pyx_v_low1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":702
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":702
  * 
  *         i1 = low1
  *         i2 = low2             # <<<<<<<<<<<<<<
@@ -40669,7 +38597,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i2 = __pyx_v_low2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":703
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":703
  *         i1 = low1
  *         i2 = low2
  *         while i1 < high1 and i2 < high2:             # <<<<<<<<<<<<<<
@@ -40686,7 +38614,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":706
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":706
  * 
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40695,7 +38623,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":707
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":707
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:             # <<<<<<<<<<<<<<
@@ -40706,7 +38634,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":708
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":708
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40715,7 +38643,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":709
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":709
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -40725,7 +38653,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":710
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":710
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -40737,7 +38665,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":712
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":712
  *                     i2 = i2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -40750,7 +38678,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     __pyx_L6_break:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":715
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":715
  * 
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1             # <<<<<<<<<<<<<<
@@ -40759,7 +38687,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_v_j1 = __pyx_v_i1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":716
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":716
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:             # <<<<<<<<<<<<<<
@@ -40776,7 +38704,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       if (!__pyx_t_2) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":717
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":717
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40785,7 +38713,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":718
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":718
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2             # <<<<<<<<<<<<<<
@@ -40794,7 +38722,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_v_j2 = __pyx_v_i2;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":719
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":719
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2
  *                 while j2 < high2:             # <<<<<<<<<<<<<<
@@ -40805,7 +38733,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_j2 < __pyx_v_high2);
         if (!__pyx_t_2) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":720
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":720
  *                 j2 = i2
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40814,7 +38742,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_j2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":721
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":721
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -40823,7 +38751,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":722
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":722
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -40833,7 +38761,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == 0);
         if (__pyx_t_2) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":723
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":723
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -40845,7 +38773,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L12:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":724
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":724
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)
  *                     if comparison == 1:             # <<<<<<<<<<<<<<
@@ -40858,7 +38786,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L13:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":726
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":726
  *                     if comparison == 1:
  *                         pass
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -40868,7 +38796,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == -1);
         if (__pyx_t_2) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":727
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":727
  *                         pass
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -40880,7 +38808,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":729
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":729
  *                         break
  *                     else:
  *                         j2 = j2 + step2             # <<<<<<<<<<<<<<
@@ -40893,7 +38821,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       __pyx_L11_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":730
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":730
  *                     else:
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -40904,7 +38832,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":731
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":731
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1
  *         return result             # <<<<<<<<<<<<<<
@@ -40920,7 +38848,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":734
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":734
  * 
  * 
  *     cdef void sort_phrase_loc(self, IntList arr, PhraseLocation loc, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -40940,19 +38868,19 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sort_phrase_loc", 0);
+  __Pyx_RefNannySetupContext("sort_phrase_loc");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":739
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":739
  *         cdef IntList result
  * 
  *         if phrase in self.precomputed_index:             # <<<<<<<<<<<<<<
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_phrase), __pyx_v_self->precomputed_index, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 739; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 739; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":740
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":740
  * 
  *         if phrase in self.precomputed_index:
  *             loc.arr = self.precomputed_index[phrase]             # <<<<<<<<<<<<<<
@@ -40971,7 +38899,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":742
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":742
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)             # <<<<<<<<<<<<<<
@@ -40984,7 +38912,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __Pyx_GOTREF(__pyx_t_3);
     if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_GIVEREF(__pyx_t_3);
@@ -40993,7 +38921,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_v_loc->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":743
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":743
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)             # <<<<<<<<<<<<<<
@@ -41003,7 +38931,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_3 = PyInt_FromLong(__pyx_v_arr->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
@@ -41013,7 +38941,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":744
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":744
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:             # <<<<<<<<<<<<<<
@@ -41023,7 +38951,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = __pyx_v_loc->sa_high;
     for (__pyx_v_i = __pyx_v_loc->sa_low; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":745
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":745
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])             # <<<<<<<<<<<<<<
@@ -41033,7 +38961,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
       ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_v_veb->__pyx_vtab)->_insert(__pyx_v_veb, (__pyx_v_arr->arr[__pyx_v_i]));
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":746
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":746
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -41042,7 +38970,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
     __pyx_v_i = __pyx_v_veb->veb->min_val;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":747
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":747
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:             # <<<<<<<<<<<<<<
@@ -41052,7 +38980,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = (__pyx_v_loc->sa_high - __pyx_v_loc->sa_low);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":748
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":748
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i             # <<<<<<<<<<<<<<
@@ -41061,7 +38989,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
       (__pyx_v_loc->arr->arr[__pyx_v_j]) = __pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":749
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":749
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -41073,7 +39001,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":750
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":750
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0             # <<<<<<<<<<<<<<
@@ -41082,7 +39010,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
   __pyx_v_loc->arr_low = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":751
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":751
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0
  *         loc.arr_high = loc.arr.len             # <<<<<<<<<<<<<<
@@ -41101,7 +39029,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":754
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":754
  * 
  * 
  *     cdef intersect_helper(self, Phrase prefix, Phrase suffix,             # <<<<<<<<<<<<<<
@@ -41136,9 +39064,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("intersect_helper", 0);
+  __Pyx_RefNannySetupContext("intersect_helper");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":761
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":761
  *         cdef int* result_ptr
  * 
  *         result_len = 0             # <<<<<<<<<<<<<<
@@ -41147,7 +39075,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":763
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":763
  *         result_len = 0
  * 
  *         if sym_isvar(suffix[0]):             # <<<<<<<<<<<<<<
@@ -41161,7 +39089,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_t_2);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":764
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":764
  * 
  *         if sym_isvar(suffix[0]):
  *             offset_by_one = 1             # <<<<<<<<<<<<<<
@@ -41173,7 +39101,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":766
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":766
  *             offset_by_one = 1
  *         else:
  *             offset_by_one = 0             # <<<<<<<<<<<<<<
@@ -41184,7 +39112,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":768
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":768
  *             offset_by_one = 0
  * 
  *         len_last = len(suffix.getchunk(suffix.arity()))             # <<<<<<<<<<<<<<
@@ -41199,7 +39127,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
   __Pyx_GIVEREF(__pyx_t_5);
   __pyx_t_5 = 0;
@@ -41211,7 +39139,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_len_last = __pyx_t_6;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":770
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":770
  *         len_last = len(suffix.getchunk(suffix.arity()))
  * 
  *         if prefix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -41221,7 +39149,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_prefix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":771
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":771
  * 
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)             # <<<<<<<<<<<<<<
@@ -41236,7 +39164,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":772
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":772
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr             # <<<<<<<<<<<<<<
@@ -41246,7 +39174,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_prefix_loc->arr));
   __pyx_v_arr1 = __pyx_v_prefix_loc->arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":773
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":773
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -41255,7 +39183,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low1 = __pyx_v_prefix_loc->arr_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":774
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":774
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -41264,7 +39192,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high1 = __pyx_v_prefix_loc->arr_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":775
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":775
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high
  *         step1 = prefix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -41273,7 +39201,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step1 = __pyx_v_prefix_loc->num_subpatterns;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":777
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":777
  *         step1 = prefix_loc.num_subpatterns
  * 
  *         if suffix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -41283,7 +39211,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_suffix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":778
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":778
  * 
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)             # <<<<<<<<<<<<<<
@@ -41298,7 +39226,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":779
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":779
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr             # <<<<<<<<<<<<<<
@@ -41308,7 +39236,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_suffix_loc->arr));
   __pyx_v_arr2 = __pyx_v_suffix_loc->arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":780
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":780
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -41317,7 +39245,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low2 = __pyx_v_suffix_loc->arr_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":781
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":781
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -41326,7 +39254,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high2 = __pyx_v_suffix_loc->arr_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":782
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":782
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high
  *         step2 = suffix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -41335,7 +39263,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step2 = __pyx_v_suffix_loc->num_subpatterns;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":784
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":784
  *         step2 = suffix_loc.num_subpatterns
  * 
  *         num_subpatterns = prefix.arity()+1             # <<<<<<<<<<<<<<
@@ -41354,7 +39282,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_num_subpatterns = __pyx_t_3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":786
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":786
  *         num_subpatterns = prefix.arity()+1
  * 
  *         if algorithm == MERGE:             # <<<<<<<<<<<<<<
@@ -41364,7 +39292,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_algorithm == __pyx_v_3_sa_MERGE);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":789
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":789
  *             result_ptr = self.merge_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -41376,7 +39304,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":793
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":793
  *             result_ptr = self.baeza_yates_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -41387,7 +39315,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":795
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":795
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)
  * 
  *         if result_len == 0:             # <<<<<<<<<<<<<<
@@ -41397,7 +39325,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_result_len == 0);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":796
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":796
  * 
  *         if result_len == 0:
  *             free(result_ptr)             # <<<<<<<<<<<<<<
@@ -41406,7 +39334,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result_ptr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":797
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":797
  *         if result_len == 0:
  *             free(result_ptr)
  *             return None             # <<<<<<<<<<<<<<
@@ -41421,7 +39349,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":799
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":799
  *             return None
  *         else:
  *             result = IntList()             # <<<<<<<<<<<<<<
@@ -41433,7 +39361,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
     __pyx_v_result = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":800
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":800
  *         else:
  *             result = IntList()
  *             free(result.arr)             # <<<<<<<<<<<<<<
@@ -41442,7 +39370,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":801
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":801
  *             result = IntList()
  *             free(result.arr)
  *             result.arr = result_ptr             # <<<<<<<<<<<<<<
@@ -41451,7 +39379,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->arr = __pyx_v_result_ptr;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":802
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":802
  *             free(result.arr)
  *             result.arr = result_ptr
  *             result.len = result_len             # <<<<<<<<<<<<<<
@@ -41460,7 +39388,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->len = __pyx_v_result_len;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":803
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":803
  *             result.arr = result_ptr
  *             result.len = result_len
  *             result.size = result_len             # <<<<<<<<<<<<<<
@@ -41469,7 +39397,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->size = __pyx_v_result_len;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":804
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":804
  *             result.len = result_len
  *             result.size = result_len
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)             # <<<<<<<<<<<<<<
@@ -41489,7 +39417,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
     __Pyx_GOTREF(__pyx_t_4);
     if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_r = __pyx_t_4;
@@ -41515,7 +39443,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":806
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":806
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)
  * 
  *     cdef loc2str(self, PhraseLocation loc):             # <<<<<<<<<<<<<<
@@ -41523,7 +39451,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  *         result = "{"
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_loc) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_loc) {
   int __pyx_v_i;
   int __pyx_v_j;
   PyObject *__pyx_v_result = NULL;
@@ -41536,9 +39464,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("loc2str", 0);
+  __Pyx_RefNannySetupContext("loc2str");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":808
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":808
  *     cdef loc2str(self, PhraseLocation loc):
  *         cdef int i, j
  *         result = "{"             # <<<<<<<<<<<<<<
@@ -41548,7 +39476,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_116));
   __pyx_v_result = ((PyObject *)__pyx_kp_s_116);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":809
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":809
  *         cdef int i, j
  *         result = "{"
  *         i = 0             # <<<<<<<<<<<<<<
@@ -41557,7 +39485,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":810
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":810
  *         result = "{"
  *         i = 0
  *         while i < loc.arr_high:             # <<<<<<<<<<<<<<
@@ -41568,7 +39496,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_t_1 = (__pyx_v_i < __pyx_v_loc->arr_high);
     if (!__pyx_t_1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":811
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":811
  *         i = 0
  *         while i < loc.arr_high:
  *             result = result + "("             # <<<<<<<<<<<<<<
@@ -41581,7 +39509,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":812
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":812
  *         while i < loc.arr_high:
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -41591,7 +39519,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_t_3 = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
     for (__pyx_v_j = __pyx_v_i; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":813
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":813
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])             # <<<<<<<<<<<<<<
@@ -41611,7 +39539,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
       __pyx_t_2 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":814
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":814
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"             # <<<<<<<<<<<<<<
@@ -41624,7 +39552,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":815
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":815
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"
  *             i = i + loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -41634,7 +39562,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_v_i = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":816
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":816
  *             result = result + ")"
  *             i = i + loc.num_subpatterns
  *         result = result + "}"             # <<<<<<<<<<<<<<
@@ -41647,7 +39575,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   __pyx_v_result = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":817
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":817
  *             i = i + loc.num_subpatterns
  *         result = result + "}"
  *         return result             # <<<<<<<<<<<<<<
@@ -41673,7 +39601,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":819
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":819
  *         return result
  * 
  *     cdef PhraseLocation intersect(self, prefix_node, suffix_node, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -41687,7 +39615,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_prefix_loc = 0;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_suffix_loc = 0;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_result = 0;
-  CYTHON_UNUSED PyObject *__pyx_v_intersect_method = NULL;
+  PyObject *__pyx_v_intersect_method = NULL;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -41697,9 +39625,9 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("intersect", 0);
+  __Pyx_RefNannySetupContext("intersect");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":823
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":823
  *         cdef PhraseLocation prefix_loc, suffix_loc, result
  * 
  *         prefix = prefix_node.phrase             # <<<<<<<<<<<<<<
@@ -41712,7 +39640,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_prefix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":824
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":824
  * 
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase             # <<<<<<<<<<<<<<
@@ -41725,7 +39653,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_suffix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":825
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":825
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location             # <<<<<<<<<<<<<<
@@ -41738,7 +39666,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_prefix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":826
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":826
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location
  *         suffix_loc = suffix_node.phrase_location             # <<<<<<<<<<<<<<
@@ -41751,7 +39679,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_suffix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":828
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":828
  *         suffix_loc = suffix_node.phrase_location
  * 
  *         result = self.get_precomputed_collocation(phrase)             # <<<<<<<<<<<<<<
@@ -41761,7 +39689,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_119); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(((PyObject *)__pyx_v_phrase));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_phrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_phrase));
@@ -41773,7 +39701,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":829
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":829
  * 
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:             # <<<<<<<<<<<<<<
@@ -41783,7 +39711,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) != Py_None);
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":830
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":830
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:
  *             intersect_method = "precomputed"             # <<<<<<<<<<<<<<
@@ -41796,7 +39724,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":832
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":832
  *             intersect_method = "precomputed"
  * 
  *         if result is None:             # <<<<<<<<<<<<<<
@@ -41806,7 +39734,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) == Py_None);
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":833
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":833
  * 
  *         if result is None:
  *             if self.use_baeza_yates:             # <<<<<<<<<<<<<<
@@ -41815,7 +39743,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
  */
     if (__pyx_v_self->use_baeza_yates) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":834
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":834
  *         if result is None:
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)             # <<<<<<<<<<<<<<
@@ -41829,7 +39757,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":835
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":835
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)
  *                 intersect_method="double binary"             # <<<<<<<<<<<<<<
@@ -41843,7 +39771,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":837
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":837
  *                 intersect_method="double binary"
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)             # <<<<<<<<<<<<<<
@@ -41857,7 +39785,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":838
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":838
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"             # <<<<<<<<<<<<<<
@@ -41873,7 +39801,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":839
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":839
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"
  *         return result             # <<<<<<<<<<<<<<
@@ -41905,22 +39833,56 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":841
+ *         return result
+ * 
+ *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
+ *         cdef unsigned na
+ *         nf = []
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_frontier = 0;
   PyObject *__pyx_v_res = 0;
   PyObject *__pyx_v_fwords = 0;
-  PyObject *__pyx_r = 0;
+  unsigned int __pyx_v_na;
+  PyObject *__pyx_v_nf = NULL;
+  PyObject *__pyx_v_toskip = NULL;
+  PyObject *__pyx_v_i = NULL;
+  PyObject *__pyx_v_alt = NULL;
+  PyObject *__pyx_v_pathlen = NULL;
+  PyObject *__pyx_v_spanlen = NULL;
+  PyObject *__pyx_v_ni = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  Py_ssize_t __pyx_t_13;
+  int __pyx_t_14;
+  int __pyx_t_15;
+  unsigned int __pyx_t_16;
+  int __pyx_t_17;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
+  __Pyx_RefNannySetupContext("advance");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -41928,23 +39890,26 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__frontier)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__frontier);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -41965,53 +39930,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_frontier, __pyx_v_res, __pyx_v_fwords);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":841
- *         return result
- * 
- *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
- *         cdef unsigned na
- *         nf = []
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_frontier, PyObject *__pyx_v_res, PyObject *__pyx_v_fwords) {
-  unsigned int __pyx_v_na;
-  PyObject *__pyx_v_nf = NULL;
-  PyObject *__pyx_v_toskip = NULL;
-  PyObject *__pyx_v_i = NULL;
-  PyObject *__pyx_v_alt = NULL;
-  PyObject *__pyx_v_pathlen = NULL;
-  PyObject *__pyx_v_spanlen = NULL;
-  PyObject *__pyx_v_ni = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *(*__pyx_t_3)(PyObject *);
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  int __pyx_t_12;
-  Py_ssize_t __pyx_t_13;
-  int __pyx_t_14;
-  int __pyx_t_15;
-  unsigned int __pyx_t_16;
-  int __pyx_t_17;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("advance", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":843
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":843
  *     def advance(self, frontier, res, fwords):
  *         cdef unsigned na
  *         nf = []             # <<<<<<<<<<<<<<
@@ -42019,11 +39939,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *             spanlen = fwords[i][alt][2]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_nf = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":844
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":844
  *         cdef unsigned na
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:             # <<<<<<<<<<<<<<
@@ -42039,20 +39959,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -42066,74 +39978,66 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
       PyObject* sequence = __pyx_t_4;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      Py_ssize_t size = Py_SIZE(sequence);
-      #else
-      Py_ssize_t size = PySequence_Size(sequence);
-      #endif
-      if (unlikely(size != 2)) {
-        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
       } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
-      #else
-      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    } else
-    {
+    } else {
       Py_ssize_t index = -1;
       __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
-      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
+      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L8_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_5);
-      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
+      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L6_unpacking_done;
-      __pyx_L5_unpacking_failed:;
+      goto __pyx_L9_unpacking_done;
+      __pyx_L8_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_8 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L6_unpacking_done:;
+      __pyx_L9_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_toskip);
     __pyx_v_toskip = __pyx_t_5;
     __pyx_t_5 = 0;
     if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) {
       PyObject* sequence = __pyx_t_6;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      Py_ssize_t size = Py_SIZE(sequence);
-      #else
-      Py_ssize_t size = PySequence_Size(sequence);
-      #endif
-      if (unlikely(size != 3)) {
-        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
+          if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_7 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_9 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
       } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
+          if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_7 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_9 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
@@ -42141,35 +40045,28 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_t_10);
-      #else
-      __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_10 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    } else
-    {
+    } else {
       Py_ssize_t index = -1;
       __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_11)->tp_iternext;
-      index = 0; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L7_unpacking_failed;
+      index = 0; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L10_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      index = 1; __pyx_t_9 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_9)) goto __pyx_L7_unpacking_failed;
+      index = 1; __pyx_t_9 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_9)) goto __pyx_L10_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_9);
-      index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L7_unpacking_failed;
+      index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L10_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_10);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      goto __pyx_L8_unpacking_done;
-      __pyx_L7_unpacking_failed:;
+      goto __pyx_L11_unpacking_done;
+      __pyx_L10_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      __pyx_t_8 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L8_unpacking_done:;
+      __pyx_L11_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_7;
@@ -42181,7 +40078,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_v_pathlen = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":845
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":845
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
@@ -42200,19 +40097,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_v_spanlen = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":846
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":846
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):             # <<<<<<<<<<<<<<
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":847
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":847
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))             # <<<<<<<<<<<<<<
@@ -42220,7 +40118,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  */
       __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       __Pyx_INCREF(__pyx_v_i);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
       __Pyx_GIVEREF(__pyx_v_i);
@@ -42234,11 +40132,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L9;
+      goto __pyx_L12;
     }
-    __pyx_L9:;
+    __pyx_L12:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":848
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":848
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen             # <<<<<<<<<<<<<<
@@ -42251,7 +40149,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_v_ni = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":849
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":849
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):             # <<<<<<<<<<<<<<
@@ -42261,16 +40159,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_t_13 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
       __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_6 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -42281,7 +40181,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     }
     if (__pyx_t_15) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":850
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":850
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):             # <<<<<<<<<<<<<<
@@ -42295,13 +40195,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_13; __pyx_t_16+=1) {
         __pyx_v_na = __pyx_t_16;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":851
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":851
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))             # <<<<<<<<<<<<<<
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)
  */
+        if (unlikely(((PyObject *)__pyx_v_nf) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_5 = PyNumber_Subtract(__pyx_v_toskip, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_na); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -42309,7 +40212,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
         __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_10);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_10));
         __Pyx_INCREF(__pyx_v_ni);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_ni);
         __Pyx_GIVEREF(__pyx_v_ni);
@@ -42320,7 +40223,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
         __pyx_t_6 = 0;
         __pyx_t_4 = 0;
         __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_4));
         PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_t_10));
@@ -42330,24 +40233,27 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
         __pyx_t_17 = PyList_Append(__pyx_v_nf, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       }
-      goto __pyx_L10;
+      goto __pyx_L13;
     }
-    __pyx_L10:;
+    __pyx_L13:;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":852
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":852
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):             # <<<<<<<<<<<<<<
  *             return self.advance(nf, res, fwords)
  *         else:
  */
-  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(((PyObject *)__pyx_v_nf) == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
+  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); 
   __pyx_t_15 = (__pyx_t_2 > 0);
   if (__pyx_t_15) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":853
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":853
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)             # <<<<<<<<<<<<<<
@@ -42355,10 +40261,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *             return res
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_INCREF(((PyObject *)__pyx_v_nf));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_nf));
     __Pyx_GIVEREF(((PyObject *)__pyx_v_nf));
@@ -42375,11 +40281,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_r = __pyx_t_10;
     __pyx_t_10 = 0;
     goto __pyx_L0;
-    goto __pyx_L13;
+    goto __pyx_L16;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":855
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":855
  *             return self.advance(nf, res, fwords)
  *         else:
  *             return res             # <<<<<<<<<<<<<<
@@ -42391,7 +40297,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_r = __pyx_v_res;
     goto __pyx_L0;
   }
-  __pyx_L13:;
+  __pyx_L16:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -42419,9 +40325,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":857
+ *             return res
+ * 
+ *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
+ *         cdef unsigned alt_it
+ *         frontier = []
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_skip = 0;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_spanlen = 0;
@@ -42429,16 +40342,39 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_next_states = 0;
   PyObject *__pyx_v_reachable_buffer = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_frontier = NULL;
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_v_reachable = NULL;
+  PyObject *__pyx_v_nextreachable = NULL;
+  PyObject *__pyx_v_next_id = NULL;
+  PyObject *__pyx_v_jump = NULL;
+  Py_ssize_t __pyx_v_alt_id;
+  PyObject *__pyx_v_newel = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  Py_ssize_t __pyx_t_11;
+  Py_ssize_t __pyx_t_12;
+  int __pyx_t_13;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__skip,&__pyx_n_s__i,&__pyx_n_s__spanlen,&__pyx_n_s__pathlen,&__pyx_n_s__fwords,&__pyx_n_s__next_states,&__pyx_n_s__reachable_buffer,0};
+  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__skip,&__pyx_n_s__i,&__pyx_n_s__spanlen,&__pyx_n_s__pathlen,&__pyx_n_s__fwords,&__pyx_n_s__next_states,&__pyx_n_s__reachable_buffer,0};
     PyObject* values[7] = {0,0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
@@ -42450,43 +40386,50 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__skip)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__skip);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen);
+        if (likely(values[3])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
-        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
+        values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
+        if (likely(values[4])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
-        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states)) != 0)) kw_args--;
+        values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states);
+        if (likely(values[5])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  6:
-        if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer)) != 0)) kw_args--;
+        values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer);
+        if (likely(values[6])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 7) {
       goto __pyx_L5_argtuple_error;
@@ -42515,50 +40458,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_skip, __pyx_v_i, __pyx_v_spanlen, __pyx_v_pathlen, __pyx_v_fwords, __pyx_v_next_states, __pyx_v_reachable_buffer);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":857
- *             return res
- * 
- *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
- *         cdef unsigned alt_it
- *         frontier = []
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_skip, PyObject *__pyx_v_i, PyObject *__pyx_v_spanlen, PyObject *__pyx_v_pathlen, PyObject *__pyx_v_fwords, PyObject *__pyx_v_next_states, PyObject *__pyx_v_reachable_buffer) {
-  PyObject *__pyx_v_frontier = NULL;
-  PyObject *__pyx_v_key = NULL;
-  PyObject *__pyx_v_reachable = NULL;
-  PyObject *__pyx_v_nextreachable = NULL;
-  PyObject *__pyx_v_next_id = NULL;
-  PyObject *__pyx_v_jump = NULL;
-  PyObject *__pyx_v_alt_id = NULL;
-  PyObject *__pyx_v_newel = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  PyObject *(*__pyx_t_6)(PyObject *);
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  Py_ssize_t __pyx_t_11;
-  PyObject *(*__pyx_t_12)(PyObject *);
-  PyObject *__pyx_t_13 = NULL;
-  int __pyx_t_14;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":859
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":859
  *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):
  *         cdef unsigned alt_it
  *         frontier = []             # <<<<<<<<<<<<<<
@@ -42566,11 +40467,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *             return frontier
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_frontier = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":860
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":860
  *         cdef unsigned alt_it
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):             # <<<<<<<<<<<<<<
@@ -42585,14 +40486,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   __pyx_t_3 = PyObject_Length(__pyx_v_next_states); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":861
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":861
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier             # <<<<<<<<<<<<<<
@@ -42603,11 +40505,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __Pyx_INCREF(((PyObject *)__pyx_v_frontier));
     __pyx_r = ((PyObject *)__pyx_v_frontier);
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":862
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":862
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier
  *         key = tuple([i,spanlen])             # <<<<<<<<<<<<<<
@@ -42615,7 +40517,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *         if (key in reachable_buffer):
  */
   __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_INCREF(__pyx_v_i);
   PyList_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -42628,7 +40530,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   __pyx_v_key = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":863
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":863
  *             return frontier
  *         key = tuple([i,spanlen])
  *         reachable = []             # <<<<<<<<<<<<<<
@@ -42636,21 +40538,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *             reachable = reachable_buffer[key]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_reachable = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":864
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":864
  *         key = tuple([i,spanlen])
  *         reachable = []
  *         if (key in reachable_buffer):             # <<<<<<<<<<<<<<
  *             reachable = reachable_buffer[key]
  *         else:
  */
-  __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_key), __pyx_v_reachable_buffer, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = ((PySequence_Contains(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":865
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":865
  *         reachable = []
  *         if (key in reachable_buffer):
  *             reachable = reachable_buffer[key]             # <<<<<<<<<<<<<<
@@ -42662,21 +40564,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __Pyx_DECREF(__pyx_v_reachable);
     __pyx_v_reachable = __pyx_t_1;
     __pyx_t_1 = 0;
-    goto __pyx_L4;
+    goto __pyx_L7;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":867
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":867
  *             reachable = reachable_buffer[key]
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)             # <<<<<<<<<<<<<<
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
@@ -42694,7 +40596,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_v_reachable = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":868
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":868
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable             # <<<<<<<<<<<<<<
@@ -42703,9 +40605,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  */
     if (PyObject_SetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key), __pyx_v_reachable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":869
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":869
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:             # <<<<<<<<<<<<<<
@@ -42721,20 +40623,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_6 && PyList_CheckExact(__pyx_t_2)) {
+    if (PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_6 && PyTuple_CheckExact(__pyx_t_2)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
+    } else if (PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
     } else {
       __pyx_t_4 = __pyx_t_6(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
@@ -42750,7 +40644,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_v_nextreachable = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":870
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":870
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:             # <<<<<<<<<<<<<<
@@ -42769,20 +40663,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     }
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     for (;;) {
-      if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_1)) {
+      if (PyList_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
-      } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_1)) {
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
+      } else if (PyTuple_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
       } else {
         __pyx_t_4 = __pyx_t_8(__pyx_t_1);
         if (unlikely(!__pyx_t_4)) {
@@ -42798,17 +40684,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       __pyx_v_next_id = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":871
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":871
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)             # <<<<<<<<<<<<<<
  *                 if jump < skip:
  *                     continue
  */
-      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_fwords);
       __Pyx_GIVEREF(__pyx_v_fwords);
@@ -42826,31 +40712,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       __pyx_v_jump = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":872
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":872
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:             # <<<<<<<<<<<<<<
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  */
-      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_10);
       __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":873
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":873
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:
  *                     continue             # <<<<<<<<<<<<<<
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  */
-        goto __pyx_L7_continue;
-        goto __pyx_L9;
+        goto __pyx_L10_continue;
+        goto __pyx_L12;
       }
-      __pyx_L9:;
+      __pyx_L12:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":874
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":874
  *                 if jump < skip:
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:             # <<<<<<<<<<<<<<
@@ -42859,16 +40746,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  */
       __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":875
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":875
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):             # <<<<<<<<<<<<<<
@@ -42879,56 +40767,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
         __Pyx_GOTREF(__pyx_t_4);
         __pyx_t_11 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
-        PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4);
-        __Pyx_GIVEREF(__pyx_t_4);
-        __pyx_t_4 = 0;
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-        if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
-          __pyx_t_9 = __pyx_t_4; __Pyx_INCREF(__pyx_t_9); __pyx_t_11 = 0;
-          __pyx_t_12 = NULL;
-        } else {
-          __pyx_t_11 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_12 = Py_TYPE(__pyx_t_9)->tp_iternext;
-        }
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        for (;;) {
-          if (!__pyx_t_12 && PyList_CheckExact(__pyx_t_9)) {
-            if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_9)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
-          } else if (!__pyx_t_12 && PyTuple_CheckExact(__pyx_t_9)) {
-            if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
-          } else {
-            __pyx_t_4 = __pyx_t_12(__pyx_t_9);
-            if (unlikely(!__pyx_t_4)) {
-              if (PyErr_Occurred()) {
-                if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              }
-              break;
-            }
-            __Pyx_GOTREF(__pyx_t_4);
-          }
-          __Pyx_XDECREF(__pyx_v_alt_id);
-          __pyx_v_alt_id = __pyx_t_4;
-          __pyx_t_4 = 0;
+        for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
+          __pyx_v_alt_id = __pyx_t_12;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":876
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":876
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
@@ -42937,95 +40779,102 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  */
           __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_10 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt_id); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_9, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_9 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_10 = PyObject_RichCompare(__pyx_t_4, __pyx_t_9, Py_NE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_13 = PyObject_RichCompare(__pyx_t_4, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
           if (__pyx_t_5) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":877
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":877
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)             # <<<<<<<<<<<<<<
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  */
-            __pyx_t_13 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_13);
-            __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromSsize_t(__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
+            __pyx_t_9 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_4));
             __Pyx_INCREF(__pyx_v_next_id);
-            PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_next_id);
             __Pyx_GIVEREF(__pyx_v_next_id);
-            __Pyx_INCREF(__pyx_v_alt_id);
-            PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_v_alt_id);
-            __Pyx_GIVEREF(__pyx_v_alt_id);
-            PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_13);
-            __Pyx_GIVEREF(__pyx_t_13);
-            __pyx_t_13 = 0;
-            __Pyx_XDECREF(((PyObject *)__pyx_v_newel));
-            __pyx_v_newel = __pyx_t_10;
+            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_10);
+            __Pyx_GIVEREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_9);
+            __Pyx_GIVEREF(__pyx_t_9);
             __pyx_t_10 = 0;
+            __pyx_t_9 = 0;
+            __Pyx_XDECREF(((PyObject *)__pyx_v_newel));
+            __pyx_v_newel = __pyx_t_4;
+            __pyx_t_4 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":878
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":878
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:             # <<<<<<<<<<<<<<
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier
  */
-            __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_newel), ((PyObject *)__pyx_v_frontier), Py_NE)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_frontier), ((PyObject *)__pyx_v_newel)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (__pyx_t_5) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":879
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":879
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))             # <<<<<<<<<<<<<<
  *         return frontier
  * 
  */
-              __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_13);
+              if (unlikely(((PyObject *)__pyx_v_frontier) == Py_None)) {
+                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+              }
+              __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_alt_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_9 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(((PyObject *)__pyx_t_10));
               __Pyx_INCREF(__pyx_v_next_id);
-              PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_v_next_id);
+              PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
               __Pyx_GIVEREF(__pyx_v_next_id);
-              __Pyx_INCREF(__pyx_v_alt_id);
-              PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_v_alt_id);
-              __Pyx_GIVEREF(__pyx_v_alt_id);
-              PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
-              __Pyx_GIVEREF(__pyx_t_10);
-              __pyx_t_10 = 0;
-              __pyx_t_14 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-              goto __pyx_L14;
+              PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_4);
+              __Pyx_GIVEREF(__pyx_t_4);
+              PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_9);
+              __Pyx_GIVEREF(__pyx_t_9);
+              __pyx_t_4 = 0;
+              __pyx_t_9 = 0;
+              __pyx_t_13 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_10)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+              goto __pyx_L17;
             }
-            __pyx_L14:;
-            goto __pyx_L13;
+            __pyx_L17:;
+            goto __pyx_L16;
           }
-          __pyx_L13:;
+          __pyx_L16:;
         }
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        goto __pyx_L10;
+        goto __pyx_L13;
       }
-      __pyx_L10:;
-      __pyx_L7_continue:;
+      __pyx_L13:;
+      __pyx_L10_continue:;
     }
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":880
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":880
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier             # <<<<<<<<<<<<<<
@@ -43045,7 +40894,6 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
-  __Pyx_XDECREF(__pyx_t_13);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_all_nodes_isteps_away", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -43055,29 +40903,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   __Pyx_XDECREF(__pyx_v_nextreachable);
   __Pyx_XDECREF(__pyx_v_next_id);
   __Pyx_XDECREF(__pyx_v_jump);
-  __Pyx_XDECREF(__pyx_v_alt_id);
   __Pyx_XDECREF(__pyx_v_newel);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":882
+ *         return frontier
+ * 
+ *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
+ *         ret = []
+ *         if (ifrom >= len(fwords)):
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_dist = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_ret = NULL;
+  Py_ssize_t __pyx_v_alt_id;
+  PyObject *__pyx_v_ifromchild = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("reachable (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  Py_ssize_t __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_t_8;
+  Py_ssize_t __pyx_t_9;
+  PyObject *(*__pyx_t_10)(PyObject *);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
+  __Pyx_RefNannySetupContext("reachable");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -43085,23 +40954,26 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -43122,42 +40994,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_ifrom, __pyx_v_dist);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":882
- *         return frontier
- * 
- *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
- *         ret = []
- *         if (ifrom >= len(fwords)):
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_dist) {
-  PyObject *__pyx_v_ret = NULL;
-  PyObject *__pyx_v_alt_id = NULL;
-  PyObject *__pyx_v_ifromchild = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  PyObject *(*__pyx_t_5)(PyObject *);
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *__pyx_t_8 = NULL;
-  int __pyx_t_9;
-  Py_ssize_t __pyx_t_10;
-  PyObject *(*__pyx_t_11)(PyObject *);
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("reachable", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":883
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":883
  * 
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []             # <<<<<<<<<<<<<<
@@ -43165,11 +41003,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  *             return ret
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_ret = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":884
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":884
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []
  *         if (ifrom >= len(fwords)):             # <<<<<<<<<<<<<<
@@ -43179,13 +41017,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   __pyx_t_2 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":885
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":885
  *         ret = []
  *         if (ifrom >= len(fwords)):
  *             return ret             # <<<<<<<<<<<<<<
@@ -43196,11 +41035,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
     __Pyx_INCREF(((PyObject *)__pyx_v_ret));
     __pyx_r = ((PyObject *)__pyx_v_ret);
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":886
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":886
  *         if (ifrom >= len(fwords)):
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
@@ -43211,56 +41050,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
-  __Pyx_GIVEREF(__pyx_t_3);
-  __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-    __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
-    __pyx_t_5 = NULL;
-  } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext;
-  }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (;;) {
-    if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_1)) {
-      if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_1)) {
-      if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else {
-      __pyx_t_3 = __pyx_t_5(__pyx_t_1);
-      if (unlikely(!__pyx_t_3)) {
-        if (PyErr_Occurred()) {
-          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        break;
-      }
-      __Pyx_GOTREF(__pyx_t_3);
-    }
-    __Pyx_XDECREF(__pyx_v_alt_id);
-    __pyx_v_alt_id = __pyx_t_3;
-    __pyx_t_3 = 0;
+  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_2; __pyx_t_5+=1) {
+    __pyx_v_alt_id = __pyx_t_5;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":887
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":887
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):             # <<<<<<<<<<<<<<
@@ -43269,172 +41062,169 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  */
     __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_6 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, __pyx_t_1, Py_EQ); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":888
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":888
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))             # <<<<<<<<<<<<<<
  *             else:
  *                 if (dist==0):
  */
-      __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_8 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_8, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fwords);
       __Pyx_GIVEREF(__pyx_v_fwords);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_8);
-      __Pyx_GIVEREF(__pyx_t_8);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7);
+      __Pyx_GIVEREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_v_dist);
       PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_dist);
       __Pyx_GIVEREF(__pyx_v_dist);
-      __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_7 = 0;
+      __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
       __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_8);
-      __Pyx_GIVEREF(__pyx_t_8);
-      __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7);
+      __Pyx_GIVEREF(__pyx_t_7);
+      __pyx_t_7 = 0;
+      __pyx_t_7 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      goto __pyx_L6;
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L9;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":890
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":890
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  *             else:
  *                 if (dist==0):             # <<<<<<<<<<<<<<
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)
  */
-      __pyx_t_8 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_7 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":891
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":891
  *             else:
  *                 if (dist==0):
  *                     if (ifrom not in ret):             # <<<<<<<<<<<<<<
  *                         ret.append(ifrom)
  *                 else:
  */
-        __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifrom, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_ret), __pyx_v_ifrom))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":892
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":892
  *                 if (dist==0):
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)             # <<<<<<<<<<<<<<
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  */
-          __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          goto __pyx_L8;
+          if (unlikely(((PyObject *)__pyx_v_ret) == Py_None)) {
+            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+          }
+          __pyx_t_8 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          goto __pyx_L11;
         }
-        __pyx_L8:;
-        goto __pyx_L7;
+        __pyx_L11:;
+        goto __pyx_L10;
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":894
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":894
  *                         ret.append(ifrom)
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):             # <<<<<<<<<<<<<<
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)
  */
-        __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_7 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_7 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __pyx_t_3 = PyNumber_Subtract(__pyx_v_dist, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_1));
         __Pyx_INCREF(__pyx_v_fwords);
-        PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_fwords);
+        PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fwords);
         __Pyx_GIVEREF(__pyx_v_fwords);
-        PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7);
-        __Pyx_GIVEREF(__pyx_t_7);
-        PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_3);
+        PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_6);
+        __Pyx_GIVEREF(__pyx_t_6);
+        PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
-        __pyx_t_7 = 0;
+        __pyx_t_6 = 0;
         __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
         if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-          __pyx_t_6 = __pyx_t_3; __Pyx_INCREF(__pyx_t_6); __pyx_t_10 = 0;
-          __pyx_t_11 = NULL;
+          __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_9 = 0;
+          __pyx_t_10 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_6);
-          __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext;
+          __pyx_t_9 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_10 = Py_TYPE(__pyx_t_1)->tp_iternext;
         }
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         for (;;) {
-          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_6)) {
-            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_6)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
-          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_6)) {
-            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
+          if (PyList_CheckExact(__pyx_t_1)) {
+            if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_1)) break;
+            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++;
+          } else if (PyTuple_CheckExact(__pyx_t_1)) {
+            if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++;
           } else {
-            __pyx_t_3 = __pyx_t_11(__pyx_t_6);
+            __pyx_t_3 = __pyx_t_10(__pyx_t_1);
             if (unlikely(!__pyx_t_3)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
@@ -43448,37 +41238,39 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
           __pyx_v_ifromchild = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":895
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":895
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):             # <<<<<<<<<<<<<<
  *                             ret.append(ifromchild)
  * 
  */
-          __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifromchild, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_ret), __pyx_v_ifromchild))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_4) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":896
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":896
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)             # <<<<<<<<<<<<<<
  * 
  *         return ret
  */
-            __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            goto __pyx_L11;
+            if (unlikely(((PyObject *)__pyx_v_ret) == Py_None)) {
+              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+            }
+            __pyx_t_8 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            goto __pyx_L14;
           }
-          __pyx_L11:;
+          __pyx_L14:;
         }
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       }
-      __pyx_L7:;
+      __pyx_L10:;
     }
-    __pyx_L6:;
+    __pyx_L9:;
   }
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":898
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":898
  *                             ret.append(ifromchild)
  * 
  *         return ret             # <<<<<<<<<<<<<<
@@ -43497,34 +41289,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_6);
   __Pyx_XDECREF(__pyx_t_7);
-  __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.reachable", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_v_ret);
-  __Pyx_XDECREF(__pyx_v_alt_id);
   __Pyx_XDECREF(__pyx_v_ifromchild);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":900
+ *         return ret
+ * 
+ *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
+ *         cdef unsigned alt_id
+ *         min = 1000
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_ito = 0;
-  PyObject *__pyx_r = 0;
+  unsigned int __pyx_v_alt_id;
+  PyObject *__pyx_v_min = NULL;
+  PyObject *__pyx_v_currmin = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("shortest (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  Py_ssize_t __pyx_t_3;
+  unsigned int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
+  __Pyx_RefNannySetupContext("shortest");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -43532,23 +41340,26 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -43569,37 +41380,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_ifrom, __pyx_v_ito);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":900
- *         return ret
- * 
- *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
- *         cdef unsigned alt_id
- *         min = 1000
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_ito) {
-  unsigned int __pyx_v_alt_id;
-  PyObject *__pyx_v_min = NULL;
-  PyObject *__pyx_v_currmin = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  Py_ssize_t __pyx_t_3;
-  unsigned int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("shortest", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":902
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":902
  *     def shortest(self, fwords, ifrom, ito):
  *         cdef unsigned alt_id
  *         min = 1000             # <<<<<<<<<<<<<<
@@ -43609,19 +41391,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   __Pyx_INCREF(__pyx_int_1000);
   __pyx_v_min = __pyx_int_1000;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":903
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":903
  *         cdef unsigned alt_id
  *         min = 1000
  *         if (ifrom > ito):             # <<<<<<<<<<<<<<
  *             return min
  *         if (ifrom == ito):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":904
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":904
  *         min = 1000
  *         if (ifrom > ito):
  *             return min             # <<<<<<<<<<<<<<
@@ -43632,23 +41415,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __Pyx_INCREF(__pyx_v_min);
     __pyx_r = __pyx_v_min;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":905
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":905
  *         if (ifrom > ito):
  *             return min
  *         if (ifrom == ito):             # <<<<<<<<<<<<<<
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":906
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":906
  *             return min
  *         if (ifrom == ito):
  *             return 0             # <<<<<<<<<<<<<<
@@ -43659,11 +41443,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __Pyx_INCREF(__pyx_int_0);
     __pyx_r = __pyx_int_0;
     goto __pyx_L0;
-    goto __pyx_L4;
+    goto __pyx_L7;
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":907
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":907
  *         if (ifrom == ito):
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
@@ -43677,14 +41461,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_alt_id = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":908
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":908
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)             # <<<<<<<<<<<<<<
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
@@ -43698,7 +41482,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
@@ -43716,7 +41500,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __pyx_v_currmin = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":909
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":909
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
@@ -43733,14 +41517,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_5 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":910
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":910
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1             # <<<<<<<<<<<<<<
@@ -43752,23 +41537,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
       __Pyx_DECREF(__pyx_v_currmin);
       __pyx_v_currmin = __pyx_t_1;
       __pyx_t_1 = 0;
-      goto __pyx_L7;
+      goto __pyx_L10;
     }
-    __pyx_L7:;
+    __pyx_L10:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":911
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":911
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  *             if (currmin<min):             # <<<<<<<<<<<<<<
  *                 min = currmin
  *         return min
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":912
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":912
  *                 currmin += 1
  *             if (currmin<min):
  *                 min = currmin             # <<<<<<<<<<<<<<
@@ -43778,12 +41564,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
       __Pyx_INCREF(__pyx_v_currmin);
       __Pyx_DECREF(__pyx_v_min);
       __pyx_v_min = __pyx_v_currmin;
-      goto __pyx_L8;
+      goto __pyx_L11;
     }
-    __pyx_L8:;
+    __pyx_L11:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":913
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":913
  *             if (currmin<min):
  *                 min = currmin
  *         return min             # <<<<<<<<<<<<<<
@@ -43811,23 +41597,49 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":915
+ *         return min
+ * 
+ *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
+ *         result = []
+ *         candidate = [[curr_idx,0]]
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v__columns = 0;
   PyObject *__pyx_v_curr_idx = 0;
   PyObject *__pyx_v_min_dist = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_result = NULL;
+  PyObject *__pyx_v_candidate = NULL;
+  PyObject *__pyx_v_curr = NULL;
+  PyObject *__pyx_v_curr_col = NULL;
+  PyObject *__pyx_v_alt = NULL;
+  PyObject *__pyx_v_next_id = NULL;
+  PyObject *__pyx_v_jump = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_next_states (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__min_dist,0};
+  __Pyx_RefNannySetupContext("get_next_states");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__min_dist,0};
     PyObject* values[3] = {0,0,0};
     values[2] = ((PyObject *)__pyx_int_2);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -43835,12 +41647,14 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s___columns)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s___columns);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -43851,7 +41665,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -43874,45 +41688,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v__columns, __pyx_v_curr_idx, __pyx_v_min_dist);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":915
- *         return min
- * 
- *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
- *         result = []
- *         candidate = [[curr_idx,0]]
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v__columns, PyObject *__pyx_v_curr_idx, PyObject *__pyx_v_min_dist) {
-  PyObject *__pyx_v_result = NULL;
-  PyObject *__pyx_v_candidate = NULL;
-  PyObject *__pyx_v_curr = NULL;
-  PyObject *__pyx_v_curr_col = NULL;
-  PyObject *__pyx_v_alt = NULL;
-  PyObject *__pyx_v_next_id = NULL;
-  PyObject *__pyx_v_jump = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
-  PyObject *__pyx_t_10 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_next_states", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":916
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":916
  * 
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []             # <<<<<<<<<<<<<<
@@ -43920,11 +41697,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 916; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":917
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":917
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []
  *         candidate = [[curr_idx,0]]             # <<<<<<<<<<<<<<
@@ -43932,7 +41709,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *         while len(candidate) > 0:
  */
   __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(__pyx_v_curr_idx);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_curr_idx);
   __Pyx_GIVEREF(__pyx_v_curr_idx);
@@ -43940,14 +41717,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   PyList_SET_ITEM(__pyx_t_1, 1, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
   __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_t_1 = 0;
   __pyx_v_candidate = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":919
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":919
  *         candidate = [[curr_idx,0]]
  * 
  *         while len(candidate) > 0:             # <<<<<<<<<<<<<<
@@ -43955,11 +41732,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *             if curr[0] >= len(_columns):
  */
   while (1) {
-    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_v_candidate) == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); 
     __pyx_t_4 = (__pyx_t_3 > 0);
     if (!__pyx_t_4) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":920
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":920
  * 
  *         while len(candidate) > 0:
  *             curr = candidate.pop()             # <<<<<<<<<<<<<<
@@ -43972,7 +41752,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     __pyx_v_curr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":921
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":921
  *         while len(candidate) > 0:
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):             # <<<<<<<<<<<<<<
@@ -43984,26 +41764,27 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     __pyx_t_3 = PyObject_Length(__pyx_v__columns); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":922
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":922
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):
  *                 continue             # <<<<<<<<<<<<<<
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  */
-      goto __pyx_L3_continue;
-      goto __pyx_L5;
+      goto __pyx_L6_continue;
+      goto __pyx_L8;
     }
-    __pyx_L5:;
+    __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":923
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":923
  *             if curr[0] >= len(_columns):
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:             # <<<<<<<<<<<<<<
@@ -44012,17 +41793,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  */
     __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_t_5, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_result), __pyx_t_5))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
       __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
         __Pyx_DECREF(__pyx_t_1);
-        __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -44034,22 +41817,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":924
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":924
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);             # <<<<<<<<<<<<<<
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  */
+      if (unlikely(((PyObject *)__pyx_v_result) == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+      }
       __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_8 = PyList_Append(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L6;
+      goto __pyx_L9;
     }
-    __pyx_L6:;
+    __pyx_L9:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":925
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":925
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]             # <<<<<<<<<<<<<<
@@ -44065,7 +41851,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     __pyx_v_curr_col = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":926
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":926
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:             # <<<<<<<<<<<<<<
@@ -44081,20 +41867,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_t_9 = Py_TYPE(__pyx_t_5)->tp_iternext;
     }
     for (;;) {
-      if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_5)) {
+      if (PyList_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_5)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
-      } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_5)) {
+        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
+      } else if (PyTuple_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
       } else {
         __pyx_t_1 = __pyx_t_9(__pyx_t_5);
         if (unlikely(!__pyx_t_1)) {
@@ -44110,7 +41888,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_v_alt = __pyx_t_1;
       __pyx_t_1 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":927
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":927
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]             # <<<<<<<<<<<<<<
@@ -44129,7 +41907,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_v_next_id = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":928
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":928
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1             # <<<<<<<<<<<<<<
@@ -44140,7 +41918,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __Pyx_XDECREF(__pyx_v_jump);
       __pyx_v_jump = __pyx_int_1;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":929
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":929
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1
  *                 if (alt[0] == EPSILON):             # <<<<<<<<<<<<<<
@@ -44151,14 +41929,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __Pyx_GOTREF(__pyx_t_10);
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":930
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":930
  *                 jump = 1
  *                 if (alt[0] == EPSILON):
  *                     jump = 0             # <<<<<<<<<<<<<<
@@ -44168,30 +41947,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
         __Pyx_INCREF(__pyx_int_0);
         __Pyx_DECREF(__pyx_v_jump);
         __pyx_v_jump = __pyx_int_0;
-        goto __pyx_L9;
+        goto __pyx_L12;
       }
-      __pyx_L9:;
+      __pyx_L12:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":931
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":931
  *                 if (alt[0] == EPSILON):
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:             # <<<<<<<<<<<<<<
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);
  */
-      __pyx_t_7 = (__Pyx_PySequence_Contains(__pyx_v_next_id, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_result), __pyx_v_next_id))); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_7) {
         __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
         if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
           __Pyx_DECREF(__pyx_t_1);
-          __pyx_t_10 = PyInt_FromLong((__pyx_v_self->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -44203,20 +41984,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       }
       if (__pyx_t_6) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":932
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":932
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])             # <<<<<<<<<<<<<<
  *         return sorted(result);
  * 
  */
+        if (unlikely(((PyObject *)__pyx_v_candidate) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_1));
         __Pyx_INCREF(__pyx_v_next_id);
         PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_next_id);
         __Pyx_GIVEREF(__pyx_v_next_id);
@@ -44225,15 +42009,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
         __pyx_t_2 = 0;
         __pyx_t_8 = PyList_Append(__pyx_v_candidate, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-        goto __pyx_L10;
+        goto __pyx_L13;
       }
-      __pyx_L10:;
+      __pyx_L13:;
     }
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_L3_continue:;
+    __pyx_L6_continue:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":933
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":933
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);             # <<<<<<<<<<<<<<
@@ -44242,7 +42026,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
@@ -44274,45 +42058,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
-static char __pyx_doc_3_sa_23HieroCachingRuleFactory_22input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("input (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_22input(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_fwords));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1 = {__Pyx_NAMESTR("lambda1"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1, METH_NOARGS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("lambda1 (wrapper)", 0);
-  __pyx_r = __pyx_lambda_funcdef_lambda1(__pyx_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2 = {__Pyx_NAMESTR("lambda2"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, METH_NOARGS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("lambda2 (wrapper)", 0);
-  __pyx_r = __pyx_lambda_funcdef_lambda2(__pyx_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1095
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1095
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
@@ -44320,7 +42068,9 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2
  *                                 fcount[f] += count
  */
 
-static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self) {
+static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_lambda_methdef_lambda2 = {__Pyx_NAMESTR("lambda2"), (PyCFunction)__pyx_lambda_funcdef_lambda2, METH_NOARGS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -44329,12 +42079,13 @@ static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda2", 0);
+  __Pyx_RefNannySetupContext("lambda2");
+  __pyx_self = __pyx_self;
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyList_Type))));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)(&PyList_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyList_Type))));
@@ -44352,7 +42103,7 @@ static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda1.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.input.lambda1.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -44360,7 +42111,9 @@ static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self) {
+static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_lambda_methdef_lambda1 = {__Pyx_NAMESTR("lambda1"), (PyCFunction)__pyx_lambda_funcdef_lambda1, METH_NOARGS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -44369,14 +42122,15 @@ static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda1", 0);
+  __Pyx_RefNannySetupContext("lambda1");
+  __pyx_self = __pyx_self;
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda2, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -44394,7 +42148,7 @@ static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.input.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -44402,19 +42156,7 @@ static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3 = {__Pyx_NAMESTR("lambda3"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3, METH_O, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("lambda3 (wrapper)", 0);
-  __pyx_r = __pyx_lambda_funcdef_lambda3(__pyx_self, ((PyObject *)__pyx_v_x));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1101
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1101
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]             # <<<<<<<<<<<<<<
@@ -44422,7 +42164,9 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObjec
  *                                     count = len(locs)
  */
 
-static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x) {
+static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x); /*proto*/
+static PyMethodDef __pyx_lambda_methdef_lambda3 = {__Pyx_NAMESTR("lambda3"), (PyCFunction)__pyx_lambda_funcdef_lambda3, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -44430,7 +42174,8 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda3", 0);
+  __Pyx_RefNannySetupContext("lambda3");
+  __pyx_self = __pyx_self;
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
@@ -44446,7 +42191,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.input.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -44454,7 +42199,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":935
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":935
  *         return sorted(result);
  * 
  *     def input(self, fwords):             # <<<<<<<<<<<<<<
@@ -44462,48 +42207,40 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
  *         it looks up all of the rules that can be used to translate
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_11input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
+static char __pyx_doc_3_sa_23HieroCachingRuleFactory_11input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_11input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("input", 0);
+  __Pyx_RefNannySetupContext("input");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)__pyx_ptype_3_sa___pyx_scope_struct_8_input->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_8_input, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_INCREF(__pyx_v_fwords);
   __pyx_cur_scope->__pyx_v_fwords = __pyx_v_fwords;
-  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
@@ -44527,16 +42264,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   PyObject *(*__pyx_t_20)(PyObject *);
   float __pyx_t_21;
   Py_ssize_t __pyx_t_22;
-  Py_ssize_t __pyx_t_23;
+  PyObject *(*__pyx_t_23)(PyObject *);
   Py_ssize_t __pyx_t_24;
-  Py_ssize_t __pyx_t_25;
+  int __pyx_t_25;
   int __pyx_t_26;
-  int __pyx_t_27;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
-    case 1: goto __pyx_L58_resume_from_yield;
+    case 1: goto __pyx_L62_resume_from_yield;
     default: /* CPython raises the right error here */
     __Pyx_RefNannyFinishContext();
     return NULL;
@@ -44544,7 +42280,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":946
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":946
  *         cdef Phrase hiero_phrase
  * 
  *         flen = len(fwords)             # <<<<<<<<<<<<<<
@@ -44554,7 +42290,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_cur_scope->__pyx_v_flen = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":947
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":947
  * 
  *         flen = len(fwords)
  *         start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -44563,16 +42299,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":948
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":948
  *         flen = len(fwords)
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0             # <<<<<<<<<<<<<<
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  */
-  __pyx_cur_scope->__pyx_v_self->extract_time = 0.0;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time = 0.0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":949
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":949
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}             # <<<<<<<<<<<<<<
@@ -44585,7 +42321,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":950
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":950
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}
  *         hit = 0             # <<<<<<<<<<<<<<
@@ -44594,7 +42330,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_hit = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":951
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":951
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  *         reachable_buffer = {}             # <<<<<<<<<<<<<<
@@ -44607,7 +42343,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __pyx_cur_scope->__pyx_v_reachable_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":954
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":954
  * 
  *         # Do not cache between sentences
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
@@ -44620,16 +42356,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
-  __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_self->rules->root);
-  __Pyx_DECREF(__pyx_cur_scope->__pyx_v_self->rules->root);
-  __pyx_cur_scope->__pyx_v_self->rules->root = __pyx_t_3;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":956
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":956
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  * 
  *         frontier = []             # <<<<<<<<<<<<<<
@@ -44637,12 +42373,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *             for alt in range(0, len(fwords[i])):
  */
   __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
   __pyx_cur_scope->__pyx_v_frontier = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":957
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":957
  * 
  *         frontier = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
@@ -44653,7 +42389,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":958
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":958
  *         frontier = []
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
@@ -44667,7 +42403,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":959
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":959
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
@@ -44684,20 +42420,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":960
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":960
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))             # <<<<<<<<<<<<<<
  * 
  *         xroot = None
  */
+        if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -44707,7 +42447,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_9 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __pyx_t_10 = PyTuple_New(7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_10);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_10));
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
@@ -44717,9 +42457,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_INCREF(__pyx_int_0);
         PyTuple_SET_ITEM(__pyx_t_10, 3, __pyx_int_0);
         __Pyx_GIVEREF(__pyx_int_0);
-        __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
-        PyTuple_SET_ITEM(__pyx_t_10, 4, __pyx_cur_scope->__pyx_v_self->rules->root);
-        __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+        __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+        PyTuple_SET_ITEM(__pyx_t_10, 4, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+        __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
         __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
         PyTuple_SET_ITEM(__pyx_t_10, 5, ((PyObject *)__pyx_empty_tuple));
         __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
@@ -44737,7 +42477,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":962
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":962
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
  * 
  *         xroot = None             # <<<<<<<<<<<<<<
@@ -44748,16 +42488,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_GIVEREF(Py_None);
   __pyx_cur_scope->__pyx_v_xroot = Py_None;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":963
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":963
  * 
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)             # <<<<<<<<<<<<<<
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]
  */
-  __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, 1);
+  __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":964
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":964
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:             # <<<<<<<<<<<<<<
@@ -44766,21 +42506,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_t_10, __pyx_t_9, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = ((PySequence_Contains(__pyx_t_9, __pyx_t_10))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   if (__pyx_t_8) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":965
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":965
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]             # <<<<<<<<<<<<<<
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  */
-    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
@@ -44794,7 +42534,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":967
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":967
  *             xroot = self.rules.root.children[x1]
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
@@ -44803,12 +42543,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
     __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
@@ -44817,21 +42557,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_cur_scope->__pyx_v_xroot = __pyx_t_9;
     __pyx_t_9 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":968
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":968
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  *             self.rules.root.children[x1] = xroot             # <<<<<<<<<<<<<<
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  */
-    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     if (__Pyx_SetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   }
   __pyx_L9:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":970
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":970
  *             self.rules.root.children[x1] = xroot
  * 
  *         for i in range(self.min_gap_size, len(fwords)):             # <<<<<<<<<<<<<<
@@ -44839,10 +42579,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                 if fwords[i][alt][0] != EPSILON:
  */
   __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  for (__pyx_t_4 = __pyx_cur_scope->__pyx_v_self->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
+  for (__pyx_t_4 = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":971
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":971
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
@@ -44856,7 +42596,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":972
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":972
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
@@ -44873,39 +42613,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":973
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":973
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))             # <<<<<<<<<<<<<<
  * 
  *         next_states = []
  */
-        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
+        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_12);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_12));
         PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         __pyx_t_7 = 0;
         __pyx_t_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_13);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
         PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_10);
@@ -44935,7 +42679,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":975
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":975
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
  * 
  *         next_states = []             # <<<<<<<<<<<<<<
@@ -44943,12 +42687,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  */
   __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_13));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
   __pyx_cur_scope->__pyx_v_next_states = __pyx_t_13;
   __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":976
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":976
  * 
  *         next_states = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
@@ -44959,21 +42703,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":977
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":977
  *         next_states = []
  *         for i in range(len(fwords)):
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))             # <<<<<<<<<<<<<<
  * 
  *         while len(frontier) > 0:
  */
-    __pyx_t_13 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_next_states) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self, __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
     __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
     __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
@@ -44991,7 +42738,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":979
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":979
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  * 
  *         while len(frontier) > 0:             # <<<<<<<<<<<<<<
@@ -44999,11 +42746,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  */
   while (1) {
-    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); 
     __pyx_t_8 = (__pyx_t_1 > 0);
     if (!__pyx_t_8) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":980
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":980
  * 
  *         while len(frontier) > 0:
  *             new_frontier = []             # <<<<<<<<<<<<<<
@@ -45011,42 +42761,35 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                 word_id = fwords[i][alt][0]
  */
     __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_12);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_12));
     __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
     __pyx_cur_scope->__pyx_v_new_frontier = __pyx_t_12;
     __pyx_t_12 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":981
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":981
  *         while len(frontier) > 0:
  *             new_frontier = []
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:             # <<<<<<<<<<<<<<
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]
  */
+    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_12 = ((PyObject *)__pyx_cur_scope->__pyx_v_frontier); __Pyx_INCREF(__pyx_t_12); __pyx_t_1 = 0;
     for (;;) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_12)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_12, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++;
       if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
         PyObject* sequence = __pyx_t_2;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        Py_ssize_t size = Py_SIZE(sequence);
-        #else
-        Py_ssize_t size = PySequence_Size(sequence);
-        #endif
-        if (unlikely(size != 7)) {
-          if (size > 7) __Pyx_RaiseTooManyValuesError(7);
-          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        #if CYTHON_COMPILING_IN_CPYTHON
         if (likely(PyTuple_CheckExact(sequence))) {
+          if (unlikely(PyTuple_GET_SIZE(sequence) != 7)) {
+            if (PyTuple_GET_SIZE(sequence) > 7) __Pyx_RaiseTooManyValuesError(7);
+            else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
           __pyx_t_13 = PyTuple_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
           __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
@@ -45055,6 +42798,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_14 = PyTuple_GET_ITEM(sequence, 5); 
           __pyx_t_15 = PyTuple_GET_ITEM(sequence, 6); 
         } else {
+          if (unlikely(PyList_GET_SIZE(sequence) != 7)) {
+            if (PyList_GET_SIZE(sequence) > 7) __Pyx_RaiseTooManyValuesError(7);
+            else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
           __pyx_t_13 = PyList_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
           __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
@@ -45070,36 +42818,34 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_INCREF(__pyx_t_3);
         __Pyx_INCREF(__pyx_t_14);
         __Pyx_INCREF(__pyx_t_15);
-        #else
-        Py_ssize_t i;
-        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
-        for (i=0; i < 7; i++) {
-          PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          *(temps[i]) = item;
-        }
-        #endif
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      } else
-      {
+      } else {
         Py_ssize_t index = -1;
-        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
         __pyx_t_16 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_16);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-        for (index=0; index < 7; index++) {
-          PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L21_unpacking_failed;
-          __Pyx_GOTREF(item);
-          *(temps[index]) = item;
-        }
+        index = 0; __pyx_t_13 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_13)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_13);
+        index = 1; __pyx_t_7 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_7)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_7);
+        index = 2; __pyx_t_9 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_9)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_9);
+        index = 3; __pyx_t_10 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_10);
+        index = 4; __pyx_t_3 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_3)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_3);
+        index = 5; __pyx_t_14 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_14)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_14);
+        index = 6; __pyx_t_15 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_15);
         if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 7) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_17 = NULL;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         goto __pyx_L22_unpacking_done;
         __pyx_L21_unpacking_failed:;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-        __pyx_t_17 = NULL;
-        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+        if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+        if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_L22_unpacking_done:;
       }
@@ -45133,7 +42879,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_is_shadow_path = __pyx_t_15;
       __pyx_t_15 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":982
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":982
  *             new_frontier = []
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]             # <<<<<<<<<<<<<<
@@ -45154,7 +42900,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_word_id = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":983
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":983
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
@@ -45175,7 +42921,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":985
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":985
  *                 spanlen = fwords[i][alt][2]
  *                 # TODO get rid of k -- pathlen is replacing it
  *                 if word_id == EPSILON:             # <<<<<<<<<<<<<<
@@ -45184,13 +42930,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":987
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":987
  *                 if word_id == EPSILON:
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):             # <<<<<<<<<<<<<<
@@ -45205,14 +42952,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_15 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_14);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":988
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":988
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):
  *                         continue             # <<<<<<<<<<<<<<
@@ -45224,7 +42972,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         __pyx_L24:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":989
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":989
  *                     if i+spanlen >= len(fwords):
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
@@ -45244,13 +42992,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_nualt = __pyx_t_18;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":990
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":990
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     continue
  * 
  */
+          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
+            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+          }
           __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -45261,7 +43012,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_14);
           __Pyx_GIVEREF(__pyx_t_14);
           PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -45287,7 +43038,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":991
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":991
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue             # <<<<<<<<<<<<<<
@@ -45299,7 +43050,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L23:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":993
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":993
  *                     continue
  * 
  *                 phrase = prefix + (word_id,)             # <<<<<<<<<<<<<<
@@ -45307,7 +43058,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                 arity = hiero_phrase.arity()
  */
       __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_word_id);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_word_id);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_word_id);
@@ -45320,7 +43071,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_phrase = __pyx_t_15;
       __pyx_t_15 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":994
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":994
  * 
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)             # <<<<<<<<<<<<<<
@@ -45328,7 +43079,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  * 
  */
       __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_15));
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
@@ -45341,7 +43092,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_hiero_phrase = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":995
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":995
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()             # <<<<<<<<<<<<<<
@@ -45357,7 +43108,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       __pyx_cur_scope->__pyx_v_arity = __pyx_t_18;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":997
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":997
  *                 arity = hiero_phrase.arity()
  * 
  *                 lookup_required = False             # <<<<<<<<<<<<<<
@@ -45366,7 +43117,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       __pyx_cur_scope->__pyx_v_lookup_required = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":998
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":998
  * 
  *                 lookup_required = False
  *                 if word_id in node.children:             # <<<<<<<<<<<<<<
@@ -45375,11 +43126,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_15, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = ((PySequence_Contains(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":999
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":999
  *                 lookup_required = False
  *                 if word_id in node.children:
  *                     if node.children[word_id] is None:             # <<<<<<<<<<<<<<
@@ -45395,7 +43146,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1001
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1001
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  *                         continue             # <<<<<<<<<<<<<<
@@ -45407,7 +43158,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1004
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1004
  *                     else:
  *                         # Path continues at this node
  *                         node = node.children[word_id]             # <<<<<<<<<<<<<<
@@ -45430,7 +43181,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1006
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1006
  *                         node = node.children[word_id]
  *                 else:
  *                     if node.suffix_link is None:             # <<<<<<<<<<<<<<
@@ -45443,7 +43194,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1008
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1008
  *                     if node.suffix_link is None:
  *                         # Current node is root; lookup required
  *                         lookup_required = True             # <<<<<<<<<<<<<<
@@ -45455,7 +43206,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1010
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1010
  *                         lookup_required = True
  *                     else:
  *                         if word_id in node.suffix_link.children:             # <<<<<<<<<<<<<<
@@ -45467,11 +43218,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_3 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = ((PySequence_Contains(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1011
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1011
  *                     else:
  *                         if word_id in node.suffix_link.children:
  *                             if node.suffix_link.children[word_id] is None:             # <<<<<<<<<<<<<<
@@ -45490,7 +43241,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             if (__pyx_t_8) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1013
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1013
  *                             if node.suffix_link.children[word_id] is None:
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None             # <<<<<<<<<<<<<<
@@ -45502,7 +43253,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               if (PyObject_SetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1014
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1014
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None
  *                                 continue             # <<<<<<<<<<<<<<
@@ -45514,7 +43265,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             /*else*/ {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1017
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1017
  *                             else:
  *                                 # Suffix link indicates lookup is reqired
  *                                 lookup_required = True             # <<<<<<<<<<<<<<
@@ -45528,7 +43279,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1020
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1020
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
@@ -45547,7 +43298,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L27:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1022
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1022
  *                             raise Exception("Keyword trie error")
  *                 # checking whether lookup_required
  *                 if lookup_required:             # <<<<<<<<<<<<<<
@@ -45556,7 +43307,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       if (__pyx_cur_scope->__pyx_v_lookup_required) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1023
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1023
  *                 # checking whether lookup_required
  *                 if lookup_required:
  *                     new_node = None             # <<<<<<<<<<<<<<
@@ -45569,7 +43320,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_GIVEREF(Py_None);
         __pyx_cur_scope->__pyx_v_new_node = Py_None;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1024
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1024
  *                 if lookup_required:
  *                     new_node = None
  *                     if is_shadow_path:             # <<<<<<<<<<<<<<
@@ -45579,7 +43330,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1027
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1027
  *                         # Extending shadow path
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,             # <<<<<<<<<<<<<<
@@ -45602,7 +43353,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1028
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1028
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],             # <<<<<<<<<<<<<<
@@ -45620,7 +43371,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1029
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1029
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
@@ -45628,7 +43379,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         if arity > 0:
  */
           if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -45640,7 +43391,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1031
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1031
  *                                 phrase=hiero_phrase)
  *                     else:
  *                         if arity > 0:             # <<<<<<<<<<<<<<
@@ -45650,7 +43401,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity > 0);
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1033
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1033
  *                         if arity > 0:
  *                             # Intersecting because of arity > 0
  *                             phrase_location = self.intersect(node, node.suffix_link.children[word_id], hiero_phrase)             # <<<<<<<<<<<<<<
@@ -45665,7 +43416,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_2 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->intersect(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->__pyx_vtab)->intersect(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -45677,7 +43428,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1036
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1036
  *                         else:
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location             # <<<<<<<<<<<<<<
@@ -45693,14 +43444,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_phrase_location = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1037
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1037
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)             # <<<<<<<<<<<<<<
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
@@ -45716,7 +43467,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_2));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
             PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_15);
@@ -45739,7 +43490,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_sa_range = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1038
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1038
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:             # <<<<<<<<<<<<<<
@@ -45749,7 +43500,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_8 = (__pyx_cur_scope->__pyx_v_sa_range != Py_None);
             if (__pyx_t_8) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1039
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1039
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])             # <<<<<<<<<<<<<<
@@ -45766,7 +43517,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_GOTREF(__pyx_t_9);
               if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
               __Pyx_GOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -45778,7 +43529,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             /*else*/ {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1041
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1041
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  *                             else:
  *                                 phrase_location = None             # <<<<<<<<<<<<<<
@@ -45795,7 +43546,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L34:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1043
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1043
  *                                 phrase_location = None
  * 
  *                         if phrase_location is None:             # <<<<<<<<<<<<<<
@@ -45805,7 +43556,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_8 = (((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location) == Py_None);
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1044
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1044
  * 
  *                         if phrase_location is None:
  *                             node.children[word_id] = None             # <<<<<<<<<<<<<<
@@ -45817,7 +43568,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             if (PyObject_SetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1046
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1046
  *                             node.children[word_id] = None
  *                             # Search failed
  *                             continue             # <<<<<<<<<<<<<<
@@ -45829,20 +43580,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L36:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1048
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1048
  *                             continue
  *                         # Search succeeded
  *                         suffix_link = self.rules.root             # <<<<<<<<<<<<<<
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  */
-          __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+          __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_suffix_link);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_suffix_link);
-          __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
-          __pyx_cur_scope->__pyx_v_suffix_link = __pyx_cur_scope->__pyx_v_self->rules->root;
+          __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+          __pyx_cur_scope->__pyx_v_suffix_link = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1049
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1049
  *                         # Search succeeded
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:             # <<<<<<<<<<<<<<
@@ -45855,7 +43606,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1050
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1050
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]             # <<<<<<<<<<<<<<
@@ -45879,7 +43630,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L37:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1051
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1051
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,             # <<<<<<<<<<<<<<
@@ -45890,7 +43641,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GOTREF(((PyObject *)__pyx_t_9));
           if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1052
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1052
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,             # <<<<<<<<<<<<<<
@@ -45899,7 +43650,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
           if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1053
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1053
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
@@ -45907,7 +43658,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                     node = new_node
  */
           if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -45918,7 +43669,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         __pyx_L33:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1054
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1054
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node             # <<<<<<<<<<<<<<
@@ -45930,7 +43681,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         if (PyObject_SetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1055
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1055
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node
  *                     node = new_node             # <<<<<<<<<<<<<<
@@ -45943,17 +43694,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_new_node);
         __pyx_cur_scope->__pyx_v_node = __pyx_cur_scope->__pyx_v_new_node;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1060
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1060
  *                     This should happen before we get to extraction (so that
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:             # <<<<<<<<<<<<<<
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  */
-        __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
+        __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_nonterminals);
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1061
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1061
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1             # <<<<<<<<<<<<<<
@@ -45968,7 +43719,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_xcat_index = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1062
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1062
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)             # <<<<<<<<<<<<<<
@@ -45976,9 +43727,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         if is_shadow_path:
  */
           __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1062; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, __pyx_t_18);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1063
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1063
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index             # <<<<<<<<<<<<<<
@@ -45991,7 +43742,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xcat_index);
           __pyx_cur_scope->__pyx_v_suffix_link_xcat_index = __pyx_cur_scope->__pyx_v_xcat_index;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1064
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1064
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:             # <<<<<<<<<<<<<<
@@ -46001,7 +43752,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1065
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1065
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1             # <<<<<<<<<<<<<<
@@ -46019,7 +43770,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L39:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1066
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1066
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)             # <<<<<<<<<<<<<<
@@ -46027,9 +43778,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  */
           __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
+          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, __pyx_t_18);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1067
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1067
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
@@ -46043,7 +43794,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1068
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1068
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],             # <<<<<<<<<<<<<<
@@ -46061,7 +43812,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1069
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1069
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))             # <<<<<<<<<<<<<<
@@ -46071,7 +43822,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
@@ -46079,7 +43830,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
@@ -46088,11 +43839,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1067
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1067
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
@@ -46108,7 +43859,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         __pyx_L38:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1072
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1072
  * 
  *                     # sample from range
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
@@ -46119,19 +43870,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1073
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1073
  *                     # sample from range
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)             # <<<<<<<<<<<<<<
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  */
-          __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_t_10 = 0;
@@ -46146,7 +43897,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_10);
           __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1074
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1074
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns             # <<<<<<<<<<<<<<
@@ -46158,7 +43909,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_num_subpatterns = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_10)->num_subpatterns;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1075
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1075
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)             # <<<<<<<<<<<<<<
@@ -46171,7 +43922,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GOTREF(__pyx_t_3);
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_chunklen));
@@ -46180,7 +43931,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_chunklen = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1076
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1076
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:             # <<<<<<<<<<<<<<
@@ -46190,7 +43941,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_18 = __pyx_cur_scope->__pyx_v_num_subpatterns;
           for (__pyx_cur_scope->__pyx_v_j = 0; __pyx_cur_scope->__pyx_v_j < __pyx_t_18; __pyx_cur_scope->__pyx_v_j++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1077
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1077
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)             # <<<<<<<<<<<<<<
@@ -46200,7 +43951,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             (__pyx_cur_scope->__pyx_v_chunklen->arr[__pyx_cur_scope->__pyx_v_j]) = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_hiero_phrase->__pyx_vtab)->chunklen(__pyx_cur_scope->__pyx_v_hiero_phrase, __pyx_cur_scope->__pyx_v_j);
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1078
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1078
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []             # <<<<<<<<<<<<<<
@@ -46208,14 +43959,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         extract_start = monitor_cpu()
  */
           __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
           __pyx_cur_scope->__pyx_v_extracts = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1079
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1079
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []
  *                         j = 0             # <<<<<<<<<<<<<<
@@ -46224,7 +43975,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
           __pyx_cur_scope->__pyx_v_j = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1080
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1080
  *                         extracts = []
  *                         j = 0
  *                         extract_start = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -46239,7 +43990,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_extract_start = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1081
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1081
  *                         j = 0
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:             # <<<<<<<<<<<<<<
@@ -46250,7 +44001,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_19 = (__pyx_cur_scope->__pyx_v_j < __pyx_cur_scope->__pyx_v_sample->len);
             if (!__pyx_t_19) break;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1082
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1082
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:
  *                             extract = []             # <<<<<<<<<<<<<<
@@ -46258,23 +44009,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  */
             __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
             __pyx_cur_scope->__pyx_v_extract = ((PyObject *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1084
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1084
  *                             extract = []
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  */
-            __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, __pyx_cur_scope->__pyx_v_self->fda->sent_id->arr);
+            __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda->sent_id->arr);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1085
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1085
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])             # <<<<<<<<<<<<<<
@@ -46284,7 +44035,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_3 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1085; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1085; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
             PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_t_3 = 0;
@@ -46297,14 +44048,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_loc = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1086
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1086
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)             # <<<<<<<<<<<<<<
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns
  */
-            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->extract(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->__pyx_vtab)->extract(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -46312,7 +44063,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_extract = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1087
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1087
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])             # <<<<<<<<<<<<<<
@@ -46322,7 +44073,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_10 = PyList_New(0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
             if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_extract) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_extract)) {
               __pyx_t_9 = __pyx_cur_scope->__pyx_v_extract; __Pyx_INCREF(__pyx_t_9); __pyx_t_5 = 0;
               __pyx_t_20 = NULL;
@@ -46332,20 +44083,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_t_20 = Py_TYPE(__pyx_t_9)->tp_iternext;
             }
             for (;;) {
-              if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_9)) {
+              if (PyList_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_9)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #else
-                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
-              } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_9)) {
+                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++;
+              } else if (PyTuple_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #else
-                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
+                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++;
               } else {
                 __pyx_t_14 = __pyx_t_20(__pyx_t_9);
                 if (unlikely(!__pyx_t_14)) {
@@ -46363,19 +44106,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_cur_scope->__pyx_v_e = __pyx_t_14;
               __pyx_t_14 = 0;
               __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
               PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_cur_scope->__pyx_v_e);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loc);
               PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_cur_scope->__pyx_v_loc);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loc);
-              if (unlikely(__Pyx_PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (unlikely(PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
             }
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
             __Pyx_INCREF(((PyObject *)__pyx_t_10));
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
@@ -46386,7 +44129,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1088
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1088
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns             # <<<<<<<<<<<<<<
@@ -46396,7 +44139,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns);
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1090
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1090
  *                             j = j + num_subpatterns
  * 
  *                         num_samples = sample.len/num_subpatterns             # <<<<<<<<<<<<<<
@@ -46413,7 +44156,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_cur_scope->__pyx_v_num_samples = __Pyx_div_int(__pyx_cur_scope->__pyx_v_sample->len, __pyx_cur_scope->__pyx_v_num_subpatterns);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1091
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1091
  * 
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -46428,14 +44171,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_extract_stop = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1092
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1092
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start             # <<<<<<<<<<<<<<
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  */
-          __pyx_t_10 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
@@ -46443,22 +44186,25 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_10 = PyNumber_Subtract(__pyx_t_9, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_21 = __pyx_PyFloat_AsFloat(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_21 = __pyx_PyFloat_AsDouble(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_cur_scope->__pyx_v_self->extract_time = __pyx_t_21;
+          ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time = __pyx_t_21;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1093
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1093
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:             # <<<<<<<<<<<<<<
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  */
-          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_extracts) == Py_None)) {
+            PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+          }
+          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); 
           __pyx_t_19 = (__pyx_t_5 > 0);
           if (__pyx_t_19) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1094
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1094
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:
  *                             fcount = Counter()             # <<<<<<<<<<<<<<
@@ -46476,7 +44222,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_fcount = __pyx_t_9;
             __pyx_t_9 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1095
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1095
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
@@ -46485,10 +44231,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
             __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda1, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
             PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __pyx_t_10 = 0;
@@ -46502,50 +44248,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_fphrases = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1096
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1096
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:             # <<<<<<<<<<<<<<
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  */
+            if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_extracts) == Py_None)) {
+              PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+            }
             __pyx_t_10 = ((PyObject *)__pyx_cur_scope->__pyx_v_extracts); __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
             for (;;) {
               if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_3 = PySequence_ITEM(__pyx_t_10, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++;
               if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
                 PyObject* sequence = __pyx_t_3;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                Py_ssize_t size = Py_SIZE(sequence);
-                #else
-                Py_ssize_t size = PySequence_Size(sequence);
-                #endif
-                if (unlikely(size != 2)) {
-                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
-                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
+                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
                   __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
+                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
                   __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
                 }
                 __Pyx_INCREF(__pyx_t_9);
                 __Pyx_INCREF(__pyx_t_14);
-                #else
-                __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
                 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              } else
-              {
+              } else {
                 Py_ssize_t index = -1;
                 __pyx_t_15 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
@@ -46556,35 +44295,33 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_15); if (unlikely(!__pyx_t_14)) goto __pyx_L50_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_14);
                 if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_15), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 goto __pyx_L51_unpacking_done;
                 __pyx_L50_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                __pyx_t_17 = NULL;
-                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                 {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L51_unpacking_done:;
               }
               if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
                 PyObject* sequence = __pyx_t_9;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                Py_ssize_t size = Py_SIZE(sequence);
-                #else
-                Py_ssize_t size = PySequence_Size(sequence);
-                #endif
-                if (unlikely(size != 4)) {
-                  if (size > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
-                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
+                  if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
+                    if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
                   __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   __pyx_t_7 = PyTuple_GET_ITEM(sequence, 2); 
                   __pyx_t_13 = PyTuple_GET_ITEM(sequence, 3); 
                 } else {
+                  if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
+                    if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
                   __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   __pyx_t_7 = PyList_GET_ITEM(sequence, 2); 
@@ -46594,36 +44331,28 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(__pyx_t_2);
                 __Pyx_INCREF(__pyx_t_7);
                 __Pyx_INCREF(__pyx_t_13);
-                #else
-                Py_ssize_t i;
-                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
-                for (i=0; i < 4; i++) {
-                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  *(temps[i]) = item;
-                }
-                #endif
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              } else
-              {
+              } else {
                 Py_ssize_t index = -1;
-                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
                 __pyx_t_16 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
                 __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-                for (index=0; index < 4; index++) {
-                  PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L52_unpacking_failed;
-                  __Pyx_GOTREF(item);
-                  *(temps[index]) = item;
-                }
+                index = 0; __pyx_t_15 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_15);
+                index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_2)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_2);
+                index = 2; __pyx_t_7 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_7)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_7);
+                index = 3; __pyx_t_13 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_13)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_13);
                 if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
                 goto __pyx_L53_unpacking_done;
                 __pyx_L52_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-                __pyx_t_17 = NULL;
-                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                 {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L53_unpacking_done:;
               }
@@ -46653,7 +44382,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_cur_scope->__pyx_v_loc = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1097
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1097
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count             # <<<<<<<<<<<<<<
@@ -46671,7 +44400,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1098
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1098
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)             # <<<<<<<<<<<<<<
@@ -46693,75 +44422,191 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1099
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1099
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():             # <<<<<<<<<<<<<<
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
  */
-            __pyx_t_5 = 0;
-            if (unlikely(__pyx_cur_scope->__pyx_v_fphrases == Py_None)) {
-              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_fphrases, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_22), (&__pyx_t_18)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_fphrases, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_XDECREF(__pyx_t_10);
-            __pyx_t_10 = __pyx_t_9;
-            __pyx_t_9 = 0;
-            while (1) {
-              __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_10, __pyx_t_22, &__pyx_t_5, &__pyx_t_9, &__pyx_t_3, NULL, __pyx_t_18);
-              if (unlikely(__pyx_t_6 == 0)) break;
-              if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_9);
-              __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            if (PyList_CheckExact(__pyx_t_9) || PyTuple_CheckExact(__pyx_t_9)) {
+              __pyx_t_10 = __pyx_t_9; __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
+              __pyx_t_20 = NULL;
+            } else {
+              __pyx_t_5 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_10);
+              __pyx_t_20 = Py_TYPE(__pyx_t_10)->tp_iternext;
+            }
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            for (;;) {
+              if (PyList_CheckExact(__pyx_t_10)) {
+                if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
+                __pyx_t_9 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_9); __pyx_t_5++;
+              } else if (PyTuple_CheckExact(__pyx_t_10)) {
+                if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_10)) break;
+                __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_9); __pyx_t_5++;
+              } else {
+                __pyx_t_9 = __pyx_t_20(__pyx_t_10);
+                if (unlikely(!__pyx_t_9)) {
+                  if (PyErr_Occurred()) {
+                    if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  break;
+                }
+                __Pyx_GOTREF(__pyx_t_9);
+              }
+              if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
+                PyObject* sequence = __pyx_t_9;
+                if (likely(PyTuple_CheckExact(sequence))) {
+                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+                  __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
+                } else {
+                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
+                  __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
+                }
+                __Pyx_INCREF(__pyx_t_3);
+                __Pyx_INCREF(__pyx_t_14);
+                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              } else {
+                Py_ssize_t index = -1;
+                __pyx_t_13 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
+                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+                __pyx_t_17 = Py_TYPE(__pyx_t_13)->tp_iternext;
+                index = 0; __pyx_t_3 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L56_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_3);
+                index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_14)) goto __pyx_L56_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_14);
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                goto __pyx_L57_unpacking_done;
+                __pyx_L56_unpacking_failed:;
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_L57_unpacking_done:;
+              }
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_f);
-              __Pyx_GIVEREF(__pyx_t_9);
-              __pyx_cur_scope->__pyx_v_f = __pyx_t_9;
-              __pyx_t_9 = 0;
-              __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_elist);
-              __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_elist);
               __Pyx_GIVEREF(__pyx_t_3);
-              __pyx_cur_scope->__pyx_v_elist = __pyx_t_3;
+              __pyx_cur_scope->__pyx_v_f = __pyx_t_3;
               __pyx_t_3 = 0;
+              __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_elist);
+              __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_elist);
+              __Pyx_GIVEREF(__pyx_t_14);
+              __pyx_cur_scope->__pyx_v_elist = __pyx_t_14;
+              __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1100
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1100
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():             # <<<<<<<<<<<<<<
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  */
-              __pyx_t_23 = 0;
-              if (unlikely(__pyx_cur_scope->__pyx_v_elist == Py_None)) {
-                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              }
-              __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_elist, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_24), (&__pyx_t_6)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_elist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              __Pyx_XDECREF(__pyx_t_3);
-              __pyx_t_3 = __pyx_t_9;
-              __pyx_t_9 = 0;
-              while (1) {
-                __pyx_t_4 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_24, &__pyx_t_23, &__pyx_t_9, &__pyx_t_14, NULL, __pyx_t_6);
-                if (unlikely(__pyx_t_4 == 0)) break;
-                if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_14);
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              if (PyList_CheckExact(__pyx_t_14) || PyTuple_CheckExact(__pyx_t_14)) {
+                __pyx_t_9 = __pyx_t_14; __Pyx_INCREF(__pyx_t_9); __pyx_t_22 = 0;
+                __pyx_t_23 = NULL;
+              } else {
+                __pyx_t_22 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_GOTREF(__pyx_t_14);
+                __pyx_t_23 = Py_TYPE(__pyx_t_9)->tp_iternext;
+              }
+              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+              for (;;) {
+                if (PyList_CheckExact(__pyx_t_9)) {
+                  if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_9)) break;
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_22); __Pyx_INCREF(__pyx_t_14); __pyx_t_22++;
+                } else if (PyTuple_CheckExact(__pyx_t_9)) {
+                  if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_22); __Pyx_INCREF(__pyx_t_14); __pyx_t_22++;
+                } else {
+                  __pyx_t_14 = __pyx_t_23(__pyx_t_9);
+                  if (unlikely(!__pyx_t_14)) {
+                    if (PyErr_Occurred()) {
+                      if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    break;
+                  }
+                  __Pyx_GOTREF(__pyx_t_14);
+                }
+                if ((likely(PyTuple_CheckExact(__pyx_t_14))) || (PyList_CheckExact(__pyx_t_14))) {
+                  PyObject* sequence = __pyx_t_14;
+                  if (likely(PyTuple_CheckExact(sequence))) {
+                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+                    __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
+                  } else {
+                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
+                    __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
+                  }
+                  __Pyx_INCREF(__pyx_t_3);
+                  __Pyx_INCREF(__pyx_t_13);
+                  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+                } else {
+                  Py_ssize_t index = -1;
+                  __pyx_t_7 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __Pyx_GOTREF(__pyx_t_7);
+                  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+                  __pyx_t_17 = Py_TYPE(__pyx_t_7)->tp_iternext;
+                  index = 0; __pyx_t_3 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L60_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_3);
+                  index = 1; __pyx_t_13 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_13)) goto __pyx_L60_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_13);
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+                  goto __pyx_L61_unpacking_done;
+                  __pyx_L60_unpacking_failed:;
+                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_L61_unpacking_done:;
+                }
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
-                __Pyx_GIVEREF(__pyx_t_9);
-                __pyx_cur_scope->__pyx_v_e = __pyx_t_9;
-                __pyx_t_9 = 0;
+                __Pyx_GIVEREF(__pyx_t_3);
+                __pyx_cur_scope->__pyx_v_e = __pyx_t_3;
+                __pyx_t_3 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alslist);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alslist);
-                __Pyx_GIVEREF(__pyx_t_14);
-                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_14;
-                __pyx_t_14 = 0;
+                __Pyx_GIVEREF(__pyx_t_13);
+                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_13;
+                __pyx_t_13 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1101
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1101
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]             # <<<<<<<<<<<<<<
@@ -46770,82 +44615,85 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
                 __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
+                __pyx_t_13 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
-                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
-                __Pyx_GIVEREF(__pyx_t_9);
-                __pyx_t_9 = 0;
-                __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-                __pyx_t_13 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__key), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13);
+                __Pyx_GIVEREF(__pyx_t_13);
+                __pyx_t_13 = 0;
+                __pyx_t_13 = PyDict_New(); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+                __pyx_t_3 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda3, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
+                if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__key), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __pyx_t_3 = PyEval_CallObjectWithKeywords(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-                __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_13, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+                __pyx_t_13 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alignment);
-                __Pyx_GIVEREF(__pyx_t_9);
-                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_9;
-                __pyx_t_9 = 0;
+                __Pyx_GIVEREF(__pyx_t_13);
+                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_13;
+                __pyx_t_13 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1102
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1102
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))             # <<<<<<<<<<<<<<
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  */
-                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
-                __pyx_t_13 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__chain); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-                __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
-                __pyx_t_14 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_3 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__chain); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
+                __pyx_t_14 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-                __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
-                PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_14);
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_14);
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_t_14 = 0;
-                __pyx_t_14 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-                __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
-                PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_14);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+                __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_14);
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_t_14 = 0;
-                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_14);
                 __pyx_t_14 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1103
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1103
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  *                                     count = len(locs)             # <<<<<<<<<<<<<<
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  */
-                __pyx_t_25 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); if (unlikely(__pyx_t_25 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_14 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_locs) == Py_None)) {
+                  PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+                }
+                __pyx_t_24 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); 
+                __pyx_t_14 = PyInt_FromSsize_t(__pyx_t_24); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
@@ -46853,41 +44701,41 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_count = __pyx_t_14;
                 __pyx_t_14 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1104
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1104
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(             # <<<<<<<<<<<<<<
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (i,k), locs, fwords
+ *                                                (k,i), locs, fwords
  */
                 __pyx_t_14 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1105
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1105
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,             # <<<<<<<<<<<<<<
- *                                                (i,k), locs, fwords
+ *                                                (k,i), locs, fwords
  *                                                ))
  */
-                __pyx_t_9 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
-                __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
+                __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1106
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1106
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (i,k), locs, fwords             # <<<<<<<<<<<<<<
+ *                                                (k,i), locs, fwords             # <<<<<<<<<<<<<<
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)
  */
-                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_7);
-                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_7);
                 __Pyx_GIVEREF(__pyx_t_7);
                 PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
@@ -46895,15 +44743,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_t_7 = 0;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1107
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1107
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (i,k), locs, fwords
+ *                                                (k,i), locs, fwords
  *                                                ))             # <<<<<<<<<<<<<<
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  */
                 __pyx_t_2 = PyTuple_New(8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_2);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_f);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f);
@@ -46913,10 +44761,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_count);
                 PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_cur_scope->__pyx_v_count);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_count);
-                PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_9);
-                __Pyx_GIVEREF(__pyx_t_9);
-                PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_t_13);
+                PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_13);
                 __Pyx_GIVEREF(__pyx_t_13);
+                PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_t_3);
+                __Pyx_GIVEREF(__pyx_t_3);
                 PyTuple_SET_ITEM(__pyx_t_2, 5, ((PyObject *)__pyx_t_15));
                 __Pyx_GIVEREF(((PyObject *)__pyx_t_15));
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
@@ -46925,14 +44773,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
                 PyTuple_SET_ITEM(__pyx_t_2, 7, __pyx_cur_scope->__pyx_v_fwords);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
-                __pyx_t_9 = 0;
                 __pyx_t_13 = 0;
+                __pyx_t_3 = 0;
                 __pyx_t_15 = 0;
                 __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_15)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer->__pyx_vtab)->score(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer, __pyx_t_15)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
@@ -46941,17 +44789,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1108
- *                                                (i,k), locs, fwords
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1108
+ *                                                (k,i), locs, fwords
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)             # <<<<<<<<<<<<<<
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  */
-                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_15 = PyTuple_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_2);
                 __Pyx_GIVEREF(__pyx_t_2);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
@@ -46973,43 +44821,39 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_r = __pyx_t_2;
                 __pyx_t_2 = 0;
                 __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
-                __Pyx_XGIVEREF(__pyx_t_3);
-                __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
-                __pyx_cur_scope->__pyx_t_2 = __pyx_t_5;
-                __pyx_cur_scope->__pyx_t_3 = __pyx_t_6;
+                __pyx_cur_scope->__pyx_t_1 = __pyx_t_5;
+                __Pyx_XGIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_t_2 = __pyx_t_9;
                 __Pyx_XGIVEREF(__pyx_t_10);
-                __pyx_cur_scope->__pyx_t_4 = __pyx_t_10;
+                __pyx_cur_scope->__pyx_t_3 = __pyx_t_10;
                 __Pyx_XGIVEREF(__pyx_t_12);
-                __pyx_cur_scope->__pyx_t_5 = __pyx_t_12;
-                __pyx_cur_scope->__pyx_t_6 = __pyx_t_18;
-                __pyx_cur_scope->__pyx_t_7 = __pyx_t_22;
-                __pyx_cur_scope->__pyx_t_8 = __pyx_t_23;
-                __pyx_cur_scope->__pyx_t_9 = __pyx_t_24;
+                __pyx_cur_scope->__pyx_t_4 = __pyx_t_12;
+                __pyx_cur_scope->__pyx_t_5 = __pyx_t_20;
+                __pyx_cur_scope->__pyx_t_6 = __pyx_t_22;
+                __pyx_cur_scope->__pyx_t_7 = __pyx_t_23;
                 __Pyx_XGIVEREF(__pyx_r);
                 __Pyx_RefNannyFinishContext();
                 /* return from generator, yielding value */
-                __pyx_generator->resume_label = 1;
+                __pyx_cur_scope->__pyx_base.resume_label = 1;
                 return __pyx_r;
-                __pyx_L58_resume_from_yield:;
+                __pyx_L62_resume_from_yield:;
                 __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
-                __pyx_t_3 = __pyx_cur_scope->__pyx_t_1;
-                __pyx_cur_scope->__pyx_t_1 = 0;
-                __Pyx_XGOTREF(__pyx_t_3);
-                __pyx_t_5 = __pyx_cur_scope->__pyx_t_2;
-                __pyx_t_6 = __pyx_cur_scope->__pyx_t_3;
-                __pyx_t_10 = __pyx_cur_scope->__pyx_t_4;
-                __pyx_cur_scope->__pyx_t_4 = 0;
+                __pyx_t_5 = __pyx_cur_scope->__pyx_t_1;
+                __pyx_t_9 = __pyx_cur_scope->__pyx_t_2;
+                __pyx_cur_scope->__pyx_t_2 = 0;
+                __Pyx_XGOTREF(__pyx_t_9);
+                __pyx_t_10 = __pyx_cur_scope->__pyx_t_3;
+                __pyx_cur_scope->__pyx_t_3 = 0;
                 __Pyx_XGOTREF(__pyx_t_10);
-                __pyx_t_12 = __pyx_cur_scope->__pyx_t_5;
-                __pyx_cur_scope->__pyx_t_5 = 0;
+                __pyx_t_12 = __pyx_cur_scope->__pyx_t_4;
+                __pyx_cur_scope->__pyx_t_4 = 0;
                 __Pyx_XGOTREF(__pyx_t_12);
-                __pyx_t_18 = __pyx_cur_scope->__pyx_t_6;
-                __pyx_t_22 = __pyx_cur_scope->__pyx_t_7;
-                __pyx_t_23 = __pyx_cur_scope->__pyx_t_8;
-                __pyx_t_24 = __pyx_cur_scope->__pyx_t_9;
+                __pyx_t_20 = __pyx_cur_scope->__pyx_t_5;
+                __pyx_t_22 = __pyx_cur_scope->__pyx_t_6;
+                __pyx_t_23 = __pyx_cur_scope->__pyx_t_7;
                 if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             goto __pyx_L47;
@@ -47022,78 +44866,83 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L32:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1110
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1110
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  */
-      __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (__pyx_t_22 < __pyx_cur_scope->__pyx_v_self->max_length);
+      __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = (__pyx_t_5 < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_length);
       if (__pyx_t_19) {
         __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_3 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_22); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_2 = PyObject_RichCompare(__pyx_t_3, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_2 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         if (__pyx_t_8) {
           __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_3 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_27 = __pyx_t_26;
+          __pyx_t_25 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_25 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_26 = __pyx_t_25;
         } else {
-          __pyx_t_27 = __pyx_t_8;
+          __pyx_t_26 = __pyx_t_8;
         }
-        __pyx_t_8 = __pyx_t_27;
+        __pyx_t_8 = __pyx_t_26;
       } else {
         __pyx_t_8 = __pyx_t_19;
       }
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1111
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1111
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  */
-        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_10 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_10 = PyNumber_Add(__pyx_t_9, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __pyx_t_9 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_22 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_22; __pyx_t_18+=1) {
+        __pyx_t_5 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_alt_id = __pyx_t_18;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1112
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1112
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  */
-          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
+            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+          }
+          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_2 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -47104,9 +44953,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_14 = PyTuple_New(7); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_14);
-          PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_3);
-          __Pyx_GIVEREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+          PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
+          __Pyx_GIVEREF(__pyx_t_9);
           PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_t_10);
@@ -47122,7 +44971,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
           PyTuple_SET_ITEM(__pyx_t_14, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          __pyx_t_3 = 0;
+          __pyx_t_9 = 0;
           __pyx_t_2 = 0;
           __pyx_t_10 = 0;
           __pyx_t_15 = 0;
@@ -47130,7 +44979,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1113
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1113
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity             # <<<<<<<<<<<<<<
@@ -47139,7 +44988,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
         __pyx_cur_scope->__pyx_v_num_subpatterns = __pyx_cur_scope->__pyx_v_arity;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1114
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1114
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
@@ -47150,7 +44999,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1115
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1115
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1             # <<<<<<<<<<<<<<
@@ -47158,43 +45007,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         xcat = sym_setindex(self.category, arity+1)
  */
           __pyx_cur_scope->__pyx_v_num_subpatterns = (__pyx_cur_scope->__pyx_v_num_subpatterns + 1);
-          goto __pyx_L62;
+          goto __pyx_L66;
         }
-        __pyx_L62:;
+        __pyx_L66:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1116
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1116
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:             # <<<<<<<<<<<<<<
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]
  */
-        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = ((__pyx_t_22 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
+        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = ((__pyx_t_5 + 1) < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_length);
         if (__pyx_t_19) {
-          __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
+          __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_nonterminals);
           if (__pyx_t_8) {
-            __pyx_t_27 = (__pyx_cur_scope->__pyx_v_num_subpatterns < __pyx_cur_scope->__pyx_v_self->max_chunks);
-            __pyx_t_26 = __pyx_t_27;
+            __pyx_t_26 = (__pyx_cur_scope->__pyx_v_num_subpatterns < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_chunks);
+            __pyx_t_25 = __pyx_t_26;
           } else {
-            __pyx_t_26 = __pyx_t_8;
+            __pyx_t_25 = __pyx_t_8;
           }
-          __pyx_t_8 = __pyx_t_26;
+          __pyx_t_8 = __pyx_t_25;
         } else {
           __pyx_t_8 = __pyx_t_19;
         }
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1117
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1117
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)             # <<<<<<<<<<<<<<
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  */
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, (__pyx_cur_scope->__pyx_v_arity + 1));
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, (__pyx_cur_scope->__pyx_v_arity + 1));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1118
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1118
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]             # <<<<<<<<<<<<<<
@@ -47212,19 +45061,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_xnode = __pyx_t_15;
           __pyx_t_15 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1120
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1120
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])             # <<<<<<<<<<<<<<
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  */
-          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
           PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_15);
           __Pyx_GIVEREF(__pyx_t_15);
           PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_14);
@@ -47246,7 +45095,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_key = __pyx_t_14;
           __pyx_t_14 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1121
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1121
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []             # <<<<<<<<<<<<<<
@@ -47254,24 +45103,27 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  */
           __pyx_t_14 = PyList_New(0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_14);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_14));
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_GIVEREF(((PyObject *)__pyx_t_14));
           __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_14);
           __pyx_t_14 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1122
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1122
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):             # <<<<<<<<<<<<<<
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  */
-          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer) == Py_None)) {
+            PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+          }
+          __pyx_t_8 = ((PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1123
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1123
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]             # <<<<<<<<<<<<<<
@@ -47285,25 +45137,25 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __Pyx_GIVEREF(__pyx_t_14);
             __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_14;
             __pyx_t_14 = 0;
-            goto __pyx_L64;
+            goto __pyx_L68;
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1125
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1125
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)             # <<<<<<<<<<<<<<
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  */
-            __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_123); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self, __pyx_n_s_123); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
             PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_15);
@@ -47335,7 +45187,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_15;
             __pyx_t_15 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1126
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1126
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  *                             nodes_isteps_away_buffer[key] = frontier_nodes             # <<<<<<<<<<<<<<
@@ -47344,9 +45196,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
             if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
-          __pyx_L64:;
+          __pyx_L68:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1128
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1128
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:             # <<<<<<<<<<<<<<
@@ -47354,28 +45206,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *             frontier = new_frontier
  */
           if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes)) {
-            __pyx_t_15 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_15); __pyx_t_22 = 0;
+            __pyx_t_15 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_15); __pyx_t_5 = 0;
             __pyx_t_20 = NULL;
           } else {
-            __pyx_t_22 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __pyx_t_20 = Py_TYPE(__pyx_t_15)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_15)) {
-              if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_15)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_22); __Pyx_INCREF(__pyx_t_2); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_15, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
-            } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_15)) {
-              if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_22); __Pyx_INCREF(__pyx_t_2); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_15, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_15)) {
+              if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_15)) break;
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++;
+            } else if (PyTuple_CheckExact(__pyx_t_15)) {
+              if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++;
             } else {
               __pyx_t_2 = __pyx_t_20(__pyx_t_15);
               if (unlikely(!__pyx_t_2)) {
@@ -47389,58 +45233,50 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
               PyObject* sequence = __pyx_t_2;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              Py_ssize_t size = Py_SIZE(sequence);
-              #else
-              Py_ssize_t size = PySequence_Size(sequence);
-              #endif
-              if (unlikely(size != 3)) {
-                if (size > 3) __Pyx_RaiseTooManyValuesError(3);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              }
-              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
+                if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
+                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
                 __pyx_t_14 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
-                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2); 
+                __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
+                if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
+                  if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
                 __pyx_t_14 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
-                __pyx_t_3 = PyList_GET_ITEM(sequence, 2); 
+                __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
               }
               __Pyx_INCREF(__pyx_t_14);
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_3);
-              #else
-              __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              __Pyx_INCREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            } else
-            {
+            } else {
               Py_ssize_t index = -1;
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_13);
+              __pyx_t_3 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_3);
               __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-              __pyx_t_17 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              index = 0; __pyx_t_14 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_14)) goto __pyx_L67_unpacking_failed;
+              __pyx_t_17 = Py_TYPE(__pyx_t_3)->tp_iternext;
+              index = 0; __pyx_t_14 = __pyx_t_17(__pyx_t_3); if (unlikely(!__pyx_t_14)) goto __pyx_L71_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_14);
-              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L67_unpacking_failed;
+              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_3); if (unlikely(!__pyx_t_10)) goto __pyx_L71_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_3 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L67_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_3);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_17 = NULL;
-              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L68_unpacking_done;
-              __pyx_L67_unpacking_failed:;
-              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              __pyx_t_17 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              index = 2; __pyx_t_9 = __pyx_t_17(__pyx_t_3); if (unlikely(!__pyx_t_9)) goto __pyx_L71_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_9);
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_3), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              goto __pyx_L72_unpacking_done;
+              __pyx_L71_unpacking_failed:;
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
               {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_L68_unpacking_done:;
+              __pyx_L72_unpacking_done:;
             }
             __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_14); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
@@ -47450,71 +45286,74 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_pathlen);
-            __Pyx_GIVEREF(__pyx_t_3);
-            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __Pyx_GIVEREF(__pyx_t_9);
+            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_9;
+            __pyx_t_9 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1129
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1129
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))             # <<<<<<<<<<<<<<
  *             frontier = new_frontier
  * 
  */
+            if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
+              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+            }
             __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_13);
-            PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_14);
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_14);
             __Pyx_GIVEREF(__pyx_t_14);
             __pyx_t_14 = 0;
-            __pyx_t_14 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-            __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_13);
-            PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_2);
+            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_2);
-            PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_3);
-            __Pyx_GIVEREF(__pyx_t_3);
-            PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_9);
+            __Pyx_GIVEREF(__pyx_t_9);
+            PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
-            PyTuple_SET_ITEM(__pyx_t_13, 3, __pyx_cur_scope->__pyx_v_pathlen);
+            PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_13, 4, __pyx_cur_scope->__pyx_v_xnode);
+            PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_cur_scope->__pyx_v_xnode);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_13, 5, __pyx_t_14);
+            PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_t_14);
             __Pyx_GIVEREF(__pyx_t_14);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-            PyTuple_SET_ITEM(__pyx_t_13, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
+            PyTuple_SET_ITEM(__pyx_t_3, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
             __pyx_t_2 = 0;
-            __pyx_t_3 = 0;
+            __pyx_t_9 = 0;
             __pyx_t_10 = 0;
             __pyx_t_14 = 0;
-            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           }
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          goto __pyx_L63;
+          goto __pyx_L67;
         }
-        __pyx_L63:;
-        goto __pyx_L59;
+        __pyx_L67:;
+        goto __pyx_L63;
       }
-      __pyx_L59:;
+      __pyx_L63:;
       __pyx_L19_continue:;
     }
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1130
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1130
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
  *             frontier = new_frontier             # <<<<<<<<<<<<<<
@@ -47528,7 +45367,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_cur_scope->__pyx_v_frontier = __pyx_cur_scope->__pyx_v_new_frontier;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1132
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1132
  *             frontier = new_frontier
  * 
  *         stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -47541,7 +45380,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __pyx_cur_scope->__pyx_v_stop_time = __pyx_t_12;
   __pyx_t_12 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1133
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1133
  * 
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
@@ -47555,68 +45394,68 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_13 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_t_3 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_12);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_12));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_124));
   PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_124));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_124));
-  PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_13);
-  __Pyx_GIVEREF(__pyx_t_13);
-  __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
+  PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1134
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1134
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()             # <<<<<<<<<<<<<<
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  * 
  */
-  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1135
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1135
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_15);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_15));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
   PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_kp_s_125));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_13);
-  __Pyx_GIVEREF(__pyx_t_13);
-  __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
+  PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  PyErr_SetNone(PyExc_StopIteration);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
@@ -47632,13 +45471,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_AddTraceback("input", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1138
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1138
  * 
  * 
  *     cdef int find_fixpoint(self,             # <<<<<<<<<<<<<<
@@ -47646,7 +45484,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         int* f_links_low, int* f_links_high,
  */
 
-static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_f_low, PyObject *__pyx_v_f_high, int *__pyx_v_f_links_low, int *__pyx_v_f_links_high, int *__pyx_v_e_links_low, int *__pyx_v_e_links_high, int __pyx_v_e_in_low, int __pyx_v_e_in_high, int *__pyx_v_e_low, int *__pyx_v_e_high, int *__pyx_v_f_back_low, int *__pyx_v_f_back_high, int __pyx_v_f_sent_len, int __pyx_v_e_sent_len, int __pyx_v_max_f_len, int __pyx_v_max_e_len, int __pyx_v_min_fx_size, int __pyx_v_min_ex_size, int __pyx_v_max_new_x, int __pyx_v_allow_low_x, int __pyx_v_allow_high_x, int __pyx_v_allow_arbitrary_x, CYTHON_UNUSED int __pyx_v_write_log) {
+static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_f_low, PyObject *__pyx_v_f_high, int *__pyx_v_f_links_low, int *__pyx_v_f_links_high, int *__pyx_v_e_links_low, int *__pyx_v_e_links_high, int __pyx_v_e_in_low, int __pyx_v_e_in_high, int *__pyx_v_e_low, int *__pyx_v_e_high, int *__pyx_v_f_back_low, int *__pyx_v_f_back_high, int __pyx_v_f_sent_len, int __pyx_v_e_sent_len, int __pyx_v_max_f_len, int __pyx_v_max_e_len, int __pyx_v_min_fx_size, int __pyx_v_min_ex_size, int __pyx_v_max_new_x, int __pyx_v_allow_low_x, int __pyx_v_allow_high_x, int __pyx_v_allow_arbitrary_x, int __pyx_v_write_log) {
   int __pyx_v_e_low_prev;
   int __pyx_v_e_high_prev;
   int __pyx_v_f_low_prev;
@@ -47666,9 +45504,9 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("find_fixpoint", 0);
+  __Pyx_RefNannySetupContext("find_fixpoint");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1153
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1153
  *         cdef int e_low_prev, e_high_prev, f_low_prev, f_high_prev, new_x, new_low_x, new_high_x
  * 
  *         e_low[0] = e_in_low             # <<<<<<<<<<<<<<
@@ -47677,7 +45515,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_low[0]) = __pyx_v_e_in_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1154
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1154
  * 
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high             # <<<<<<<<<<<<<<
@@ -47686,7 +45524,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_high[0]) = __pyx_v_e_in_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1155
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1155
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
@@ -47698,7 +45536,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1156
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1156
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)
  *         if e_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -47708,7 +45546,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_3 = ((__pyx_v_e_low[0]) == -1);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1162
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1162
  *             # rule X -> X_1 w X_2 / X_1 X_2.    This is probably
  *             # not worth the bother, though.
  *             return 0             # <<<<<<<<<<<<<<
@@ -47720,7 +45558,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1163
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1163
  *             # not worth the bother, though.
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:             # <<<<<<<<<<<<<<
@@ -47736,7 +45574,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1164
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1164
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:             # <<<<<<<<<<<<<<
@@ -47746,7 +45584,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = ((__pyx_v_e_in_low - (__pyx_v_e_low[0])) < __pyx_v_min_ex_size);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1165
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1165
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size             # <<<<<<<<<<<<<<
@@ -47755,7 +45593,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_low[0]) = (__pyx_v_e_in_low - __pyx_v_min_ex_size);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1166
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1166
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -47765,7 +45603,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_5 = ((__pyx_v_e_low[0]) < 0);
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1167
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1167
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -47784,7 +45622,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1169
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1169
  *                     return 0
  * 
  *         if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -47794,7 +45632,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_5 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1170
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1170
  * 
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0             # <<<<<<<<<<<<<<
@@ -47806,7 +45644,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L6;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1171
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1171
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:             # <<<<<<<<<<<<<<
@@ -47822,7 +45660,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1172
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1172
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:             # <<<<<<<<<<<<<<
@@ -47832,7 +45670,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (((__pyx_v_e_high[0]) - __pyx_v_e_in_high) < __pyx_v_min_ex_size);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1173
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1173
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size             # <<<<<<<<<<<<<<
@@ -47841,7 +45679,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_high[0]) = (__pyx_v_e_in_high + __pyx_v_min_ex_size);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1174
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1174
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:             # <<<<<<<<<<<<<<
@@ -47851,7 +45689,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_e_high[0]) > __pyx_v_e_sent_len);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1175
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1175
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -47870,7 +45708,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1177
  *                     return 0
  * 
  *         f_back_low[0] = -1             # <<<<<<<<<<<<<<
@@ -47879,7 +45717,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_low[0]) = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1178
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1178
  * 
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1             # <<<<<<<<<<<<<<
@@ -47888,7 +45726,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_high[0]) = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1179
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1179
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1
  *         f_low_prev = f_low             # <<<<<<<<<<<<<<
@@ -47897,7 +45735,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_f_low_prev = __pyx_v_f_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1180
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1180
  *         f_back_high[0] = -1
  *         f_low_prev = f_low
  *         f_high_prev = f_high             # <<<<<<<<<<<<<<
@@ -47907,7 +45745,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_f_high_prev = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1181
  *         f_low_prev = f_low
  *         f_high_prev = f_high
  *         new_x = 0             # <<<<<<<<<<<<<<
@@ -47916,7 +45754,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1182
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1182
  *         f_high_prev = f_high
  *         new_x = 0
  *         new_low_x = 0             # <<<<<<<<<<<<<<
@@ -47925,7 +45763,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_low_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1183
  *         new_x = 0
  *         new_low_x = 0
  *         new_high_x = 0             # <<<<<<<<<<<<<<
@@ -47934,7 +45772,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_high_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1185
  *         new_high_x = 0
  * 
  *         while True:             # <<<<<<<<<<<<<<
@@ -47944,7 +45782,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   while (1) {
     if (!1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1187
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1187
  *         while True:
  * 
  *             if f_back_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -47954,7 +45792,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) == -1);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1188
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1188
  * 
  *             if f_back_low[0] == -1:
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
@@ -47968,7 +45806,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1190
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1190
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
@@ -47979,7 +45817,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1191
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1191
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
@@ -47992,7 +45830,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L11:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1193
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1193
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  *             if f_back_low[0] > f_low:             # <<<<<<<<<<<<<<
@@ -48002,7 +45840,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) > __pyx_v_f_low);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1194
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1194
  * 
  *             if f_back_low[0] > f_low:
  *                 f_back_low[0] = f_low             # <<<<<<<<<<<<<<
@@ -48014,7 +45852,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L12:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1196
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1196
  *                 f_back_low[0] = f_low
  * 
  *             if f_back_high[0] < f_high:             # <<<<<<<<<<<<<<
@@ -48023,13 +45861,14 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1197
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1197
  * 
  *             if f_back_high[0] < f_high:
  *                 f_back_high[0] = f_high             # <<<<<<<<<<<<<<
@@ -48042,7 +45881,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L13:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1199
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1199
  *                 f_back_high[0] = f_high
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:             # <<<<<<<<<<<<<<
@@ -48058,7 +45897,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1200
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1200
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -48071,7 +45910,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1202
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1202
  *                 return 1
  * 
  *             if allow_low_x == 0 and f_back_low[0] < f_low:             # <<<<<<<<<<<<<<
@@ -48087,7 +45926,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1204
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1204
  *             if allow_low_x == 0 and f_back_low[0] < f_low:
  *                 # FAIL: f phrase is not tight
  *                 return 0             # <<<<<<<<<<<<<<
@@ -48100,7 +45939,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1206
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1206
  *                 return 0
  * 
  *             if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -48110,7 +45949,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1208
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1208
  *             if f_back_high[0] - f_back_low[0] > max_f_len:
  *                 # FAIL: f back projection is too wide
  *                 return 0             # <<<<<<<<<<<<<<
@@ -48123,7 +45962,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1210
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1210
  *                 return 0
  * 
  *             if allow_high_x == 0 and f_back_high[0] > f_high:             # <<<<<<<<<<<<<<
@@ -48134,7 +45973,8 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     if (__pyx_t_5) {
       __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -48144,7 +45984,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1212
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1212
  *             if allow_high_x == 0 and f_back_high[0] > f_high:
  *                 # FAIL: extension on high side not allowed
  *                 return 0             # <<<<<<<<<<<<<<
@@ -48157,7 +45997,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1214
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1214
  *                 return 0
  * 
  *             if f_low != f_back_low[0]:             # <<<<<<<<<<<<<<
@@ -48167,7 +46007,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (__pyx_v_f_low != (__pyx_v_f_back_low[0]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1215
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1215
  * 
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:             # <<<<<<<<<<<<<<
@@ -48177,7 +46017,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_low_x == 0);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1216
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1216
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -48187,7 +46027,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1218
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1218
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on low side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -48200,7 +46040,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1220
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1220
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -48209,7 +46049,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1221
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1221
  *                     else:
  *                         new_x = new_x + 1
  *                         new_low_x = 1             # <<<<<<<<<<<<<<
@@ -48223,7 +46063,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L19:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1222
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1222
  *                         new_x = new_x + 1
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:             # <<<<<<<<<<<<<<
@@ -48233,7 +46073,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_f_low - (__pyx_v_f_back_low[0])) < __pyx_v_min_fx_size);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1223
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1223
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size             # <<<<<<<<<<<<<<
@@ -48242,7 +46082,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
         (__pyx_v_f_back_low[0]) = (__pyx_v_f_low - __pyx_v_min_fx_size);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1224
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1224
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -48252,7 +46092,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1226
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1226
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -48265,7 +46105,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L22:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1227
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1227
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0
  *                     if f_back_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -48275,7 +46115,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_low[0]) < 0);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1229
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1229
  *                     if f_back_low[0] < 0:
  *                         # FAIL: extension required on low side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -48294,7 +46134,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L18:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1231
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1231
  *                         return 0
  * 
  *             if f_high != f_back_high[0]:             # <<<<<<<<<<<<<<
@@ -48303,13 +46143,14 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1232
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1232
  * 
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:             # <<<<<<<<<<<<<<
@@ -48319,7 +46160,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_high_x == 0);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1233
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1233
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -48329,7 +46170,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1235
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1235
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on high side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -48342,7 +46183,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1237
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1237
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -48351,7 +46192,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1238
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1238
  *                     else:
  *                         new_x = new_x + 1
  *                         new_high_x = 1             # <<<<<<<<<<<<<<
@@ -48365,7 +46206,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L25:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1239
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1239
  *                         new_x = new_x + 1
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:             # <<<<<<<<<<<<<<
@@ -48379,14 +46220,15 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1240
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1240
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size             # <<<<<<<<<<<<<<
@@ -48402,7 +46244,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         (__pyx_v_f_back_high[0]) = __pyx_t_1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1241
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1241
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -48412,7 +46254,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1243
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1243
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -48425,7 +46267,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L28:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1244
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1244
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0
  *                     if f_back_high[0] > f_sent_len:             # <<<<<<<<<<<<<<
@@ -48435,7 +46277,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_high[0]) > __pyx_v_f_sent_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1246
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1246
  *                     if f_back_high[0] > f_sent_len:
  *                         # FAIL: extension required on high side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -48454,7 +46296,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L24:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1248
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1248
  *                         return 0
  * 
  *             e_low_prev = e_low[0]             # <<<<<<<<<<<<<<
@@ -48463,7 +46305,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_low_prev = (__pyx_v_e_low[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1249
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1249
  * 
  *             e_low_prev = e_low[0]
  *             e_high_prev = e_high[0]             # <<<<<<<<<<<<<<
@@ -48472,7 +46314,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_high_prev = (__pyx_v_e_high[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1251
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1251
  *             e_high_prev = e_high[0]
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
@@ -48483,7 +46325,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1252
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1252
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
@@ -48494,7 +46336,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1253
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1253
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:             # <<<<<<<<<<<<<<
@@ -48510,7 +46352,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1254
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1254
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -48523,7 +46365,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L30:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1255
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1255
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  *             if allow_arbitrary_x == 0:             # <<<<<<<<<<<<<<
@@ -48533,7 +46375,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (__pyx_v_allow_arbitrary_x == 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1257
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1257
  *             if allow_arbitrary_x == 0:
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0             # <<<<<<<<<<<<<<
@@ -48546,7 +46388,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L31:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1258
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1258
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0
  *             if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -48556,7 +46398,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1260
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1260
  *             if e_high[0] - e_low[0] > max_e_len:
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0             # <<<<<<<<<<<<<<
@@ -48569,7 +46411,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L32:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1261
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1261
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0
  *             f_low_prev = f_back_low[0]             # <<<<<<<<<<<<<<
@@ -48578,7 +46420,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_f_low_prev = (__pyx_v_f_back_low[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1262
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1262
  *                 return 0
  *             f_low_prev = f_back_low[0]
  *             f_high_prev = f_back_high[0]             # <<<<<<<<<<<<<<
@@ -48601,7 +46443,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1265
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1265
  * 
  * 
  *     cdef find_projection(self, int in_low, int in_high, int* in_links_low, int* in_links_high,             # <<<<<<<<<<<<<<
@@ -48609,7 +46451,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  *         cdef int i
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_in_low, int __pyx_v_in_high, int *__pyx_v_in_links_low, int *__pyx_v_in_links_high, int *__pyx_v_out_low, int *__pyx_v_out_high) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_in_low, int __pyx_v_in_high, int *__pyx_v_in_links_low, int *__pyx_v_in_links_high, int *__pyx_v_out_low, int *__pyx_v_out_high) {
   int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -48617,9 +46459,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("find_projection", 0);
+  __Pyx_RefNannySetupContext("find_projection");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1268
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1268
  *                         int* out_low, int* out_high):
  *         cdef int i
  *         for i from in_low <= i < in_high:             # <<<<<<<<<<<<<<
@@ -48629,7 +46471,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   __pyx_t_1 = __pyx_v_in_high;
   for (__pyx_v_i = __pyx_v_in_low; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1269
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1269
  *         cdef int i
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:             # <<<<<<<<<<<<<<
@@ -48639,7 +46481,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
     __pyx_t_2 = ((__pyx_v_in_links_low[__pyx_v_i]) != -1);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1270
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1270
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:             # <<<<<<<<<<<<<<
@@ -48655,7 +46497,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1271
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1271
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]             # <<<<<<<<<<<<<<
@@ -48667,7 +46509,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       __pyx_L6:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1272
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1272
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:             # <<<<<<<<<<<<<<
@@ -48683,7 +46525,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1273
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1273
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:
  *                     out_high[0] = in_links_high[i]             # <<<<<<<<<<<<<<
@@ -48705,7 +46547,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1276
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1276
  * 
  * 
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):             # <<<<<<<<<<<<<<
@@ -48713,13 +46555,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
  *         new_len = arr_len[0] + data_len
  */
 
-static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_arr, int *__pyx_v_arr_len, int *__pyx_v_data, int __pyx_v_data_len) {
+static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_arr, int *__pyx_v_arr_len, int *__pyx_v_data, int __pyx_v_data_len) {
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("int_arr_extend", 0);
+  __Pyx_RefNannySetupContext("int_arr_extend");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1278
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1278
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len             # <<<<<<<<<<<<<<
@@ -48728,7 +46570,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_data_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1279
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1279
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48737,7 +46579,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1280
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1280
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48746,7 +46588,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_data, (__pyx_v_data_len * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1281
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1281
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -48755,7 +46597,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1282
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1282
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len
  *         return arr             # <<<<<<<<<<<<<<
@@ -48771,7 +46613,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1285
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1285
  * 
  * 
  *     cdef extract_phrases(self, int e_low, int e_high, int* e_gap_low, int* e_gap_high, int* e_links_low, int num_gaps,             # <<<<<<<<<<<<<<
@@ -48779,7 +46621,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  *                         int sent_id, int e_sent_len, int e_sent_start):
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_e_low, int __pyx_v_e_high, int *__pyx_v_e_gap_low, int *__pyx_v_e_gap_high, int *__pyx_v_e_links_low, int __pyx_v_num_gaps, CYTHON_UNUSED int __pyx_v_f_low, CYTHON_UNUSED int __pyx_v_f_high, CYTHON_UNUSED int *__pyx_v_f_gap_low, CYTHON_UNUSED int *__pyx_v_f_gap_high, CYTHON_UNUSED int *__pyx_v_f_links_low, CYTHON_UNUSED int __pyx_v_sent_id, int __pyx_v_e_sent_len, int __pyx_v_e_sent_start) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_e_low, int __pyx_v_e_high, int *__pyx_v_e_gap_low, int *__pyx_v_e_gap_high, int *__pyx_v_e_links_low, int __pyx_v_num_gaps, int __pyx_v_f_low, int __pyx_v_f_high, int *__pyx_v_f_gap_low, int *__pyx_v_f_gap_high, int *__pyx_v_f_links_low, int __pyx_v_sent_id, int __pyx_v_e_sent_len, int __pyx_v_e_sent_start) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -48815,9 +46657,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extract_phrases", 0);
+  __Pyx_RefNannySetupContext("extract_phrases");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1293
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1293
  *         cdef result
  * 
  *         result = []             # <<<<<<<<<<<<<<
@@ -48825,11 +46667,11 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         e_gaps1 = <int*> malloc(0)
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_result = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1294
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1294
  * 
  *         result = []
  *         len1 = 0             # <<<<<<<<<<<<<<
@@ -48838,7 +46680,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1295
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1295
  *         result = []
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -48847,7 +46689,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = ((int *)malloc(0));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1296
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1296
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  *         ephr_arr = IntList()             # <<<<<<<<<<<<<<
@@ -48859,7 +46701,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_v_ephr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1298
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1298
  *         ephr_arr = IntList()
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48868,7 +46710,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gap_order = ((int *)malloc((__pyx_v_num_gaps * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1299
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1299
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:             # <<<<<<<<<<<<<<
@@ -48878,7 +46720,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_num_gaps > 0);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1300
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1300
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0             # <<<<<<<<<<<<<<
@@ -48887,7 +46729,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     (__pyx_v_e_gap_order[0]) = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1301
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1301
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -48897,7 +46739,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_3 = __pyx_v_num_gaps;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1302
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1302
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:             # <<<<<<<<<<<<<<
@@ -48907,7 +46749,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = __pyx_v_i;
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1303
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1303
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -48917,7 +46759,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_2 = ((__pyx_v_e_gap_low[__pyx_v_i]) < (__pyx_v_e_gap_low[__pyx_v_j]));
         if (__pyx_t_2) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1304
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1304
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:             # <<<<<<<<<<<<<<
@@ -48927,7 +46769,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_i;
           for (__pyx_v_k = __pyx_v_j; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1305
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1305
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]             # <<<<<<<<<<<<<<
@@ -48937,7 +46779,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             (__pyx_v_e_gap_order[(__pyx_v_k + 1)]) = (__pyx_v_e_gap_order[__pyx_v_k]);
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1306
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1306
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i             # <<<<<<<<<<<<<<
@@ -48946,7 +46788,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
           (__pyx_v_e_gap_order[__pyx_v_j]) = __pyx_v_i;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1307
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1307
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i
  *                         break             # <<<<<<<<<<<<<<
@@ -48960,7 +46802,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1309
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1309
  *                         break
  *                 else:
  *                     e_gap_order[i] = i             # <<<<<<<<<<<<<<
@@ -48975,7 +46817,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1311
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1311
  *                     e_gap_order[i] = i
  * 
  *         e_x_low = e_low             # <<<<<<<<<<<<<<
@@ -48984,7 +46826,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_low = __pyx_v_e_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1312
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1312
  * 
  *         e_x_low = e_low
  *         e_x_high = e_high             # <<<<<<<<<<<<<<
@@ -48993,7 +46835,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_high = __pyx_v_e_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1313
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1313
  *         e_x_low = e_low
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -49003,7 +46845,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1314
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1314
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -49026,7 +46868,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1315
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1315
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1             # <<<<<<<<<<<<<<
@@ -49036,7 +46878,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_e_x_low = (__pyx_v_e_x_low - 1);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1316
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1316
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:             # <<<<<<<<<<<<<<
@@ -49059,7 +46901,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_2) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1317
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1317
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:
  *                 e_x_high = e_x_high + 1             # <<<<<<<<<<<<<<
@@ -49072,7 +46914,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L11:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1319
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1319
  *                 e_x_high = e_x_high + 1
  * 
  *         for i from e_x_low <= i <= e_low:             # <<<<<<<<<<<<<<
@@ -49082,7 +46924,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_low;
   for (__pyx_v_i = __pyx_v_e_x_low; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1320
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1320
  * 
  *         for i from e_x_low <= i <= e_low:
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)             # <<<<<<<<<<<<<<
@@ -49092,7 +46934,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_e_gaps1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps1, (&__pyx_v_len1), (&__pyx_v_i), 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1322
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1322
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)
  * 
  *         for i from 0 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -49102,7 +46944,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_num_gaps;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1323
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1323
  * 
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -49111,7 +46953,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1324
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1324
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)
  *             len2 = 0             # <<<<<<<<<<<<<<
@@ -49120,7 +46962,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_len2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1326
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1326
  *             len2 = 0
  * 
  *             j = e_gap_order[i]             # <<<<<<<<<<<<<<
@@ -49129,7 +46971,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = (__pyx_v_e_gap_order[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1327
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1327
  * 
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]             # <<<<<<<<<<<<<<
@@ -49138,7 +46980,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_low = (__pyx_v_e_gap_low[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1328
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1328
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]             # <<<<<<<<<<<<<<
@@ -49147,7 +46989,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_high = (__pyx_v_e_gap_high[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1329
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1329
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -49157,7 +46999,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1330
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1330
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -49174,7 +47016,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_7) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1331
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1331
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1             # <<<<<<<<<<<<<<
@@ -49184,7 +47026,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_v_e_x_gap_low = (__pyx_v_e_x_gap_low - 1);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1332
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1332
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:             # <<<<<<<<<<<<<<
@@ -49201,7 +47043,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_6) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1333
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1333
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:
  *                     e_x_gap_high = e_x_gap_high + 1             # <<<<<<<<<<<<<<
@@ -49214,7 +47056,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     __pyx_L20:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1335
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1335
  *                     e_x_gap_high = e_x_gap_high + 1
  * 
  *             k = 0             # <<<<<<<<<<<<<<
@@ -49223,7 +47065,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_k = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1336
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1336
  * 
  *             k = 0
  *             step = 1+(i*2)             # <<<<<<<<<<<<<<
@@ -49232,7 +47074,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_step = (1 + (__pyx_v_i * 2));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1337
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1337
  *             k = 0
  *             step = 1+(i*2)
  *             while k < len1:             # <<<<<<<<<<<<<<
@@ -49243,7 +47085,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_k < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1338
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1338
  *             step = 1+(i*2)
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -49253,7 +47095,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = (__pyx_v_e_gap_low[__pyx_v_j]);
       for (__pyx_v_m = __pyx_v_e_x_gap_low; __pyx_v_m <= __pyx_t_4; __pyx_v_m++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1339
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1339
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:             # <<<<<<<<<<<<<<
@@ -49263,7 +47105,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_6 = (__pyx_v_m >= (__pyx_v_e_gaps1[((__pyx_v_k + __pyx_v_step) - 1)]));
         if (__pyx_t_6) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1340
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1340
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:             # <<<<<<<<<<<<<<
@@ -49273,7 +47115,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_e_x_gap_high;
           for (__pyx_v_n = (__pyx_v_e_gap_high[__pyx_v_j]); __pyx_v_n <= __pyx_t_5; __pyx_v_n++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1341
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1341
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length             # <<<<<<<<<<<<<<
@@ -49283,7 +47125,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             __pyx_t_6 = ((__pyx_v_n - __pyx_v_m) >= 1);
             if (__pyx_t_6) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1342
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1342
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)             # <<<<<<<<<<<<<<
@@ -49292,7 +47134,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_k), __pyx_v_step);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1343
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1343
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)             # <<<<<<<<<<<<<<
@@ -49301,7 +47143,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (&__pyx_v_m), 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1344
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1344
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)             # <<<<<<<<<<<<<<
@@ -49318,7 +47160,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_L29:;
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1345
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1345
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step             # <<<<<<<<<<<<<<
@@ -49328,7 +47170,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_k = (__pyx_v_k + __pyx_v_step);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1346
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1346
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step
  *             free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -49337,7 +47179,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     free(__pyx_v_e_gaps1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1347
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1347
  *                 k = k + step
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -49346,7 +47188,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1348
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1348
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2
  *             len1 = len2             # <<<<<<<<<<<<<<
@@ -49356,7 +47198,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_len1 = __pyx_v_len2;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1350
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1350
  *             len1 = len2
  * 
  *         step = 1+(num_gaps*2)             # <<<<<<<<<<<<<<
@@ -49365,7 +47207,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = (1 + (__pyx_v_num_gaps * 2));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1351
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1351
  * 
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -49374,7 +47216,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1352
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1352
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0             # <<<<<<<<<<<<<<
@@ -49383,7 +47225,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1353
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1353
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:             # <<<<<<<<<<<<<<
@@ -49393,7 +47235,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_x_high;
   for (__pyx_v_i = __pyx_v_e_high; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1354
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1354
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:
  *             j = 0             # <<<<<<<<<<<<<<
@@ -49402,7 +47244,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1355
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1355
  *         for i from e_high <= i <= e_x_high:
  *             j = 0
  *             while j < len1:             # <<<<<<<<<<<<<<
@@ -49413,7 +47255,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_j < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1356
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1356
  *             j = 0
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:             # <<<<<<<<<<<<<<
@@ -49429,7 +47271,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1357
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1357
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)             # <<<<<<<<<<<<<<
@@ -49438,7 +47280,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
         __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_j), __pyx_v_step);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1358
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1358
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)             # <<<<<<<<<<<<<<
@@ -49450,7 +47292,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L37:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1359
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1359
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step             # <<<<<<<<<<<<<<
@@ -49461,7 +47303,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1360
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1360
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -49470,7 +47312,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1361
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1361
  *                 j = j + step
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -49479,7 +47321,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1362
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1362
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2
  *         len1 = len2             # <<<<<<<<<<<<<<
@@ -49488,7 +47330,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = __pyx_v_len2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1364
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1364
  *         len1 = len2
  * 
  *         step = (num_gaps+1)*2             # <<<<<<<<<<<<<<
@@ -49497,7 +47339,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = ((__pyx_v_num_gaps + 1) * 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1365
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1365
  * 
  *         step = (num_gaps+1)*2
  *         i = 0             # <<<<<<<<<<<<<<
@@ -49506,7 +47348,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1367
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1367
  *         i = 0
  * 
  *         while i < len1:             # <<<<<<<<<<<<<<
@@ -49517,7 +47359,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_i < __pyx_v_len1);
     if (!__pyx_t_2) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1368
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1368
  * 
  *         while i < len1:
  *             ephr_arr._clear()             # <<<<<<<<<<<<<<
@@ -49526,7 +47368,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_clear(__pyx_v_ephr_arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1369
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1369
  *         while i < len1:
  *             ephr_arr._clear()
  *             num_chunks = 0             # <<<<<<<<<<<<<<
@@ -49535,7 +47377,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_num_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1370
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1370
  *             ephr_arr._clear()
  *             num_chunks = 0
  *             indexes = []             # <<<<<<<<<<<<<<
@@ -49543,12 +47385,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  */
     __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1370; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_XDECREF(((PyObject *)__pyx_v_indexes));
     __pyx_v_indexes = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1371
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1371
  *             num_chunks = 0
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:             # <<<<<<<<<<<<<<
@@ -49558,7 +47400,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_9 = (__pyx_v_num_gaps + 1);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_9; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1372
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1372
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -49568,7 +47410,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = ((__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]) < (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]));
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1373
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1373
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1             # <<<<<<<<<<<<<<
@@ -49580,7 +47422,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L42:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1374
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1374
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -49590,19 +47432,22 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_3 = (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]);
       for (__pyx_v_k = (__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1375
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1375
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  */
+        if (unlikely(((PyObject *)__pyx_v_indexes) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1376
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1376
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])             # <<<<<<<<<<<<<<
@@ -49617,7 +47462,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_append(__pyx_v_ephr_arr, __pyx_t_4);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1377
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1377
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:             # <<<<<<<<<<<<<<
@@ -49627,19 +47472,22 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = (__pyx_v_j < __pyx_v_num_gaps);
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1378
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1378
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  */
+        if (unlikely(((PyObject *)__pyx_v_indexes) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1379
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1379
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
@@ -49652,7 +47500,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_L45:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1380
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1380
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step             # <<<<<<<<<<<<<<
@@ -49661,7 +47509,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_i = (__pyx_v_i + __pyx_v_step);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1381
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1381
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:             # <<<<<<<<<<<<<<
@@ -49677,7 +47525,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1382
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1382
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:
  *                 result.append((Phrase(ephr_arr),indexes))             # <<<<<<<<<<<<<<
@@ -49685,7 +47533,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         free(e_gaps1)
  */
       __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_INCREF(((PyObject *)__pyx_v_ephr_arr));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_ephr_arr));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_ephr_arr));
@@ -49693,7 +47541,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
       __Pyx_GIVEREF(__pyx_t_11);
       __Pyx_INCREF(((PyObject *)__pyx_v_indexes));
@@ -49709,7 +47557,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_L46:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1384
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1384
  *                 result.append((Phrase(ephr_arr),indexes))
  * 
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -49718,7 +47566,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1385
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1385
  * 
  *         free(e_gaps1)
  *         free(e_gap_order)             # <<<<<<<<<<<<<<
@@ -49727,7 +47575,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gap_order);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1386
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1386
  *         free(e_gaps1)
  *         free(e_gap_order)
  *         return result             # <<<<<<<<<<<<<<
@@ -49755,7 +47603,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1388
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1388
  *         return result
  * 
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):             # <<<<<<<<<<<<<<
@@ -49763,7 +47611,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         cdef IntList ret = IntList()
  */
 
-static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_sent_links, int __pyx_v_num_links, PyObject *__pyx_v_findexes, PyObject *__pyx_v_eindexes) {
+static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_sent_links, int __pyx_v_num_links, PyObject *__pyx_v_findexes, PyObject *__pyx_v_eindexes) {
   unsigned int __pyx_v_i;
   struct __pyx_obj_3_sa_IntList *__pyx_v_ret = 0;
   PyObject *__pyx_v_s = NULL;
@@ -49781,9 +47629,9 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("create_alignments", 0);
+  __Pyx_RefNannySetupContext("create_alignments");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1390
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1390
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):
  *         cdef unsigned i
  *         cdef IntList ret = IntList()             # <<<<<<<<<<<<<<
@@ -49795,7 +47643,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   __pyx_v_ret = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1391
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1391
  *         cdef unsigned i
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):             # <<<<<<<<<<<<<<
@@ -49806,7 +47654,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
     __pyx_v_i = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1392
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1392
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):
  *             s = findexes[i]             # <<<<<<<<<<<<<<
@@ -49819,19 +47667,20 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __pyx_v_s = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1393
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1393
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  *             if (s<0):             # <<<<<<<<<<<<<<
  *                 continue
  *             idx = 0
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1394
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1394
  *             s = findexes[i]
  *             if (s<0):
  *                 continue             # <<<<<<<<<<<<<<
@@ -49843,7 +47692,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1395
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1395
  *             if (s<0):
  *                 continue
  *             idx = 0             # <<<<<<<<<<<<<<
@@ -49854,7 +47703,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __Pyx_XDECREF(__pyx_v_idx);
     __pyx_v_idx = __pyx_int_0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1396
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1396
  *                 continue
  *             idx = 0
  *             while (idx < num_links*2):             # <<<<<<<<<<<<<<
@@ -49864,13 +47713,14 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     while (1) {
       __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (!__pyx_t_4) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1397
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1397
  *             idx = 0
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):             # <<<<<<<<<<<<<<
@@ -49880,13 +47730,14 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1398
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1398
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])             # <<<<<<<<<<<<<<
@@ -49902,7 +47753,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
         __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_7));
         PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         __pyx_t_5 = 0;
@@ -49914,7 +47765,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
         __pyx_v_j = __pyx_t_5;
         __pyx_t_5 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1399
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1399
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)             # <<<<<<<<<<<<<<
@@ -49934,7 +47785,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       }
       __pyx_L8:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1400
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1400
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  *                 idx += 2             # <<<<<<<<<<<<<<
@@ -49950,7 +47801,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __pyx_L3_continue:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1401
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1401
  *                     ret.append(i*65536+j)
  *                 idx += 2
  *         return ret             # <<<<<<<<<<<<<<
@@ -49980,7 +47831,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1403
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1403
  *         return ret
  * 
  *     cdef extract(self, Phrase phrase, Matching* matching, int* chunklen, int num_chunks):             # <<<<<<<<<<<<<<
@@ -50020,7 +47871,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_v_f_sent_end;
   int __pyx_v_e_sent_len;
   int __pyx_v_f_sent_len;
-  CYTHON_UNUSED int __pyx_v_e_word_count;
+  int __pyx_v_e_word_count;
   int __pyx_v_f_x_low;
   int __pyx_v_f_x_high;
   int __pyx_v_e_x_low;
@@ -50031,7 +47882,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   PyObject *__pyx_v_phrase_list = 0;
   struct __pyx_obj_3_sa_IntList *__pyx_v_fphr_arr = 0;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_fphr = 0;
-  CYTHON_UNUSED PyObject *__pyx_v_reason_for_failure = 0;
+  PyObject *__pyx_v_reason_for_failure = 0;
   PyObject *__pyx_v_sofar = NULL;
   PyObject *__pyx_v_als = NULL;
   PyObject *__pyx_v_al = NULL;
@@ -50072,9 +47923,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extract", 0);
+  __Pyx_RefNannySetupContext("extract");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1416
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1416
  *         cdef reason_for_failure
  * 
  *         fphr_arr = IntList()             # <<<<<<<<<<<<<<
@@ -50086,7 +47937,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_v_fphr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1417
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1417
  * 
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n             # <<<<<<<<<<<<<<
@@ -50095,7 +47946,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_phrase_len = __pyx_v_phrase->n;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1418
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1418
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n
  *         extracts = []             # <<<<<<<<<<<<<<
@@ -50103,11 +47954,11 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_extracts = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1419
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1419
  *         phrase_len = phrase.n
  *         extracts = []
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -50116,7 +47967,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_sent_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->alignment->__pyx_vtab)->_get_sent_links(__pyx_v_self->alignment, __pyx_v_matching->sent_id, (&__pyx_v_num_links));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1421
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1421
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -50125,7 +47976,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_start = (__pyx_v_self->eda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1422
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1422
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -50134,7 +47985,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_end = (__pyx_v_self->eda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1423
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1423
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1             # <<<<<<<<<<<<<<
@@ -50143,7 +47994,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_len = ((__pyx_v_e_sent_end - __pyx_v_e_sent_start) - 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1424
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1424
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -50152,7 +48003,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_start = (__pyx_v_self->fda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1425
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1425
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -50161,7 +48012,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_end = (__pyx_v_self->fda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1426
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1426
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]
  *         f_sent_len = f_sent_end - f_sent_start - 1             # <<<<<<<<<<<<<<
@@ -50170,7 +48021,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_len = ((__pyx_v_f_sent_end - __pyx_v_f_sent_start) - 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1428
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1428
  *         f_sent_len = f_sent_end - f_sent_start - 1
  * 
  *         self.findexes1.reset()             # <<<<<<<<<<<<<<
@@ -50184,7 +48035,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1429
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1429
  * 
  *         self.findexes1.reset()
  *         sofar = 0             # <<<<<<<<<<<<<<
@@ -50194,7 +48045,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_sofar = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1430
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1430
  *         self.findexes1.reset()
  *         sofar = 0
  *         for i in range(num_chunks):             # <<<<<<<<<<<<<<
@@ -50205,7 +48056,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1431
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1431
  *         sofar = 0
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):             # <<<<<<<<<<<<<<
@@ -50216,7 +48067,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_v_j = __pyx_t_6;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1432
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1432
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);             # <<<<<<<<<<<<<<
@@ -50230,7 +48081,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1433
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1433
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1             # <<<<<<<<<<<<<<
@@ -50244,7 +48095,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_1 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1434
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1434
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1
  *             if (i+1<num_chunks):             # <<<<<<<<<<<<<<
@@ -50254,7 +48105,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = ((__pyx_v_i + 1) < __pyx_v_num_chunks);
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1435
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1435
  *                 sofar += 1
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])             # <<<<<<<<<<<<<<
@@ -50268,7 +48119,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1436
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1436
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  *                 sofar += 1             # <<<<<<<<<<<<<<
@@ -50285,7 +48136,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1439
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1439
  * 
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50294,7 +48145,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_low = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1440
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1440
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50303,7 +48154,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_high = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1441
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1441
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50312,7 +48163,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_low = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1442
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1442
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50321,7 +48172,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_high = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1443
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1443
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50330,7 +48181,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1444
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1444
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50339,7 +48190,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1445
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1445
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50348,7 +48199,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1446
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1446
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50357,7 +48208,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1447
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1447
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50366,7 +48217,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1448
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1448
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50375,7 +48226,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1449
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1449
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50384,7 +48235,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1450
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1450
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50393,7 +48244,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1452
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1452
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))
  * 
  *         reason_for_failure = ""             # <<<<<<<<<<<<<<
@@ -50403,7 +48254,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_45);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1454
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1454
  *         reason_for_failure = ""
  * 
  *         for i from 0 <= i < e_sent_len:             # <<<<<<<<<<<<<<
@@ -50413,7 +48264,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_e_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1455
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1455
  * 
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -50422,7 +48273,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_e_links_low[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1456
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1456
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -50432,7 +48283,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_e_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1457
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1457
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:             # <<<<<<<<<<<<<<
@@ -50442,7 +48293,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_f_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1458
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1458
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -50451,7 +48302,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_f_links_low[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1459
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1459
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1
  *             f_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -50461,7 +48312,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_f_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1465
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1465
  *         # links that we care about (but then how to look up
  *         # when we want to check something on the e side?)
  *         i = 0             # <<<<<<<<<<<<<<
@@ -50470,7 +48321,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1466
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1466
  *         # when we want to check something on the e side?)
  *         i = 0
  *         while i < num_links*2:             # <<<<<<<<<<<<<<
@@ -50481,7 +48332,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = (__pyx_v_i < (__pyx_v_num_links * 2));
     if (!__pyx_t_7) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1467
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1467
  *         i = 0
  *         while i < num_links*2:
  *             f_i = sent_links[i]             # <<<<<<<<<<<<<<
@@ -50490,7 +48341,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_f_i = (__pyx_v_sent_links[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1468
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1468
  *         while i < num_links*2:
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]             # <<<<<<<<<<<<<<
@@ -50499,7 +48350,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_e_i = (__pyx_v_sent_links[(__pyx_v_i + 1)]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1469
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1469
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:             # <<<<<<<<<<<<<<
@@ -50515,7 +48366,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1470
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1470
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i             # <<<<<<<<<<<<<<
@@ -50527,7 +48378,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1471
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1471
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:             # <<<<<<<<<<<<<<
@@ -50543,7 +48394,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_8) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1472
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1472
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1             # <<<<<<<<<<<<<<
@@ -50555,7 +48406,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1473
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1473
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:             # <<<<<<<<<<<<<<
@@ -50571,7 +48422,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1474
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1474
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i             # <<<<<<<<<<<<<<
@@ -50583,7 +48434,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1475
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1475
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:             # <<<<<<<<<<<<<<
@@ -50599,7 +48450,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1476
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1476
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1             # <<<<<<<<<<<<<<
@@ -50611,7 +48462,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1477
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1477
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1
  *             i = i + 2             # <<<<<<<<<<<<<<
@@ -50621,7 +48472,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + 2);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1479
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1479
  *             i = i + 2
  * 
  *         als = []             # <<<<<<<<<<<<<<
@@ -50629,11 +48480,11 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  */
   __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __pyx_v_als = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1480
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1480
  * 
  *         als = []
  *         for x in range(matching.start,matching.end):             # <<<<<<<<<<<<<<
@@ -50644,7 +48495,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = __pyx_v_matching->start; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_x = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1481
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1481
  *         als = []
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])             # <<<<<<<<<<<<<<
@@ -50656,7 +48507,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_10);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
     PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
@@ -50667,17 +48518,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_al = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1482
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1482
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  *             als.append(al)             # <<<<<<<<<<<<<<
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  */
+    if (unlikely(((PyObject *)__pyx_v_als) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1484
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1484
  *             als.append(al)
  *         # check all source-side alignment constraints
  *         met_constraints = 1             # <<<<<<<<<<<<<<
@@ -50686,7 +48540,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_met_constraints = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1485
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1485
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  *         if self.require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -50695,7 +48549,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_self->require_aligned_terminal) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1486
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1486
  *         met_constraints = 1
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -50704,7 +48558,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_num_aligned_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1487
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1487
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:             # <<<<<<<<<<<<<<
@@ -50714,7 +48568,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_3 = __pyx_v_num_chunks;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1488
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1488
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:             # <<<<<<<<<<<<<<
@@ -50724,7 +48578,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_chunklen[__pyx_v_i]);
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1489
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1489
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:             # <<<<<<<<<<<<<<
@@ -50734,7 +48588,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_9 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)]) > -1);
         if (__pyx_t_9) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1490
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1490
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1             # <<<<<<<<<<<<<<
@@ -50743,7 +48597,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_num_aligned_chunks = (__pyx_v_num_aligned_chunks + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1491
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1491
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break             # <<<<<<<<<<<<<<
@@ -50758,7 +48612,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_L24_break:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1492
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1492
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break
  *             if num_aligned_chunks == 0:             # <<<<<<<<<<<<<<
@@ -50768,7 +48622,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_9 = (__pyx_v_num_aligned_chunks == 0);
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1493
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1493
  *                         break
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"             # <<<<<<<<<<<<<<
@@ -50779,7 +48633,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_126);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1494
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1494
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -50791,7 +48645,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L26:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1495
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1495
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:             # <<<<<<<<<<<<<<
@@ -50806,7 +48660,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1496
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1496
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"             # <<<<<<<<<<<<<<
@@ -50817,7 +48671,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_127);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1497
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1497
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -50832,7 +48686,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L20:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1499
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1499
  *                 met_constraints = 0
  * 
  *         if met_constraints and self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -50846,7 +48700,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1501
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1501
  *         if met_constraints and self.tight_phrases:
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:             # <<<<<<<<<<<<<<
@@ -50856,7 +48710,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_12 = (__pyx_v_num_chunks - 1);
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1502
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1502
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -50866,7 +48720,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1503
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1503
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -50877,7 +48731,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1504
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1504
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -50886,7 +48740,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1505
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1505
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -50898,7 +48752,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L31:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1506
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1506
  *                     met_constraints = 0
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -50908,7 +48762,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - 1) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1507
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1507
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -50919,7 +48773,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1508
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1508
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -50928,7 +48782,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1509
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1509
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -50945,7 +48799,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L28:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1511
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1511
  *                     break
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start             # <<<<<<<<<<<<<<
@@ -50954,7 +48808,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_low = ((__pyx_v_matching->arr[__pyx_v_matching->start]) - __pyx_v_f_sent_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1512
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1512
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -50963,7 +48817,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_high = (((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_matching->size) - 1)]) + (__pyx_v_chunklen[(__pyx_v_num_chunks - 1)])) - __pyx_v_f_sent_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1513
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1513
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start
  *         if met_constraints:             # <<<<<<<<<<<<<<
@@ -50972,7 +48826,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_met_constraints) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1515
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1515
  *         if met_constraints:
  * 
  *             if self.find_fixpoint(f_low, f_high, f_links_low, f_links_high, e_links_low, e_links_high,             # <<<<<<<<<<<<<<
@@ -50982,7 +48836,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1519
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1519
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):             # <<<<<<<<<<<<<<
@@ -50993,7 +48847,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1520
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1520
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0             # <<<<<<<<<<<<<<
@@ -51002,7 +48856,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_gap_error = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1521
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1521
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0
  *                 num_gaps = 0             # <<<<<<<<<<<<<<
@@ -51011,7 +48865,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_num_gaps = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1523
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1523
  *                 num_gaps = 0
  * 
  *                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -51021,7 +48875,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1524
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1524
  * 
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low             # <<<<<<<<<<<<<<
@@ -51030,7 +48884,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[0]) = __pyx_v_f_back_low;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1525
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1525
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low             # <<<<<<<<<<<<<<
@@ -51039,7 +48893,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[0]) = __pyx_v_f_low;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1526
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1526
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1             # <<<<<<<<<<<<<<
@@ -51048,7 +48902,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1527
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1527
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1
  *                     gap_start = 0             # <<<<<<<<<<<<<<
@@ -51057,7 +48911,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1528
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1528
  *                     num_gaps = 1
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -51066,7 +48920,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1529
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1529
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -51076,7 +48930,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1530
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1530
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -51088,7 +48942,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L36:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1531
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1531
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -51097,7 +48951,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1532
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1532
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -51113,7 +48967,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1533
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1533
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -51122,7 +48976,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1534
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1534
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -51142,7 +48996,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1536
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1536
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"
  *                 else:
  *                     gap_start = 1             # <<<<<<<<<<<<<<
@@ -51151,7 +49005,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1537
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1537
  *                 else:
  *                     gap_start = 1
  *                     if self.tight_phrases and f_links_low[f_low] == -1:             # <<<<<<<<<<<<<<
@@ -51166,7 +49020,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1540
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1540
  *                         # this is not a hard error.    we can't extract this phrase
  *                         # but we still might be able to extract a superphrase
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -51180,7 +49034,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L35:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1542
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1542
  *                         met_constraints = 0
  * 
  *                 for i from 0 <= i < matching.size - 1:             # <<<<<<<<<<<<<<
@@ -51190,7 +49044,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_12 = (__pyx_v_matching->size - 1);
       for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1543
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1543
  * 
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start             # <<<<<<<<<<<<<<
@@ -51199,7 +49053,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(1 + __pyx_v_i)]) = (((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1544
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1544
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -51208,7 +49062,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(1 + __pyx_v_i)]) = ((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - __pyx_v_f_sent_start);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1545
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1545
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -51218,7 +49072,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1547
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1547
  *                     num_gaps = num_gaps + 1
  * 
  *                 if f_high < f_back_high:             # <<<<<<<<<<<<<<
@@ -51228,7 +49082,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_high < __pyx_v_f_back_high);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1548
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1548
  * 
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high             # <<<<<<<<<<<<<<
@@ -51237,7 +49091,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_high;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1549
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1549
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high             # <<<<<<<<<<<<<<
@@ -51246,7 +49100,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_back_high;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1550
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1550
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -51255,7 +49109,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1551
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1551
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -51264,7 +49118,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1552
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1552
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -51274,7 +49128,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1553
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1553
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -51286,7 +49140,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L43:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1554
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1554
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -51295,7 +49149,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1555
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1555
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:             # <<<<<<<<<<<<<<
@@ -51311,7 +49165,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1556
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1556
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -51320,7 +49174,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1557
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1557
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -51340,7 +49194,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1559
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1559
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -51355,7 +49209,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1560
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1560
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -51369,7 +49223,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L42:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1562
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1562
  *                         met_constraints = 0
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -51379,7 +49233,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1563
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1563
  * 
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low             # <<<<<<<<<<<<<<
@@ -51388,7 +49242,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_e_word_count = (__pyx_v_e_high - __pyx_v_e_low);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1564
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1564
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases             # <<<<<<<<<<<<<<
@@ -51398,7 +49252,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_num_gaps;
         for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1565
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1565
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases
  *                         if self.find_fixpoint(f_gap_low[gap_start+i], f_gap_high[gap_start+i],             # <<<<<<<<<<<<<<
@@ -51408,7 +49262,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1570
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1570
  *                                             f_gap_low+gap_start+i, f_gap_high+gap_start+i,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -51419,7 +49273,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1572
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1572
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -51428,7 +49282,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1573
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1573
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])             # <<<<<<<<<<<<<<
@@ -51440,7 +49294,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
             PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
@@ -51454,7 +49308,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_reason_for_failure = ((PyObject *)__pyx_t_1);
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1574
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1574
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])
  *                             break             # <<<<<<<<<<<<<<
@@ -51471,7 +49325,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L47:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1576
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1576
  *                             break
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -51481,7 +49335,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1577
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1577
  * 
  *                 if gap_error == 0:
  *                     i = 1             # <<<<<<<<<<<<<<
@@ -51490,7 +49344,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_i = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1578
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1578
  *                 if gap_error == 0:
  *                     i = 1
  *                     self.findexes.reset()             # <<<<<<<<<<<<<<
@@ -51504,7 +49358,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1579
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1579
  *                     i = 1
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -51514,7 +49368,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1580
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1580
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51523,7 +49377,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1581
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1581
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1             # <<<<<<<<<<<<<<
@@ -51532,7 +49386,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_i = (__pyx_v_i + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1582
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1582
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51549,7 +49403,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L52:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1583
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1583
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
@@ -51559,7 +49413,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
         __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->findexes1));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -51569,7 +49423,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1584
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1584
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -51579,7 +49433,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_phrase->n;
         for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1585
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1585
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -51589,7 +49443,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
           if (__pyx_t_4) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1586
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1586
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51598,7 +49452,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1587
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1587
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))
  *                             i = i + 1             # <<<<<<<<<<<<<<
@@ -51610,7 +49464,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1589
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1589
  *                             i = i + 1
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -51622,7 +49476,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_L55:;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1590
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1590
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -51632,7 +49486,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_high > __pyx_v_f_high);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1591
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1591
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51641,7 +49495,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1592
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1592
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51658,7 +49512,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L56:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1594
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1594
  *                         self.findexes.append(sym_setindex(self.category, i))
  * 
  *                     fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
@@ -51666,7 +49520,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  */
         __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
         __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_fphr_arr));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -51676,7 +49530,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_10);
         __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1595
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1595
  * 
  *                     fphr = Phrase(fphr_arr)
  *                     if met_constraints:             # <<<<<<<<<<<<<<
@@ -51685,7 +49539,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_met_constraints) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1598
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1598
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
@@ -51697,7 +49551,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_v_phrase_list = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1599
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1599
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
@@ -51708,7 +49562,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_7 = (__pyx_t_13 > 0);
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1600
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1600
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
@@ -51725,7 +49579,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1602
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1602
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  *                             pair_count = 0             # <<<<<<<<<<<<<<
@@ -51734,7 +49588,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_pair_count = 0.0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1603
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1603
  *                         else:
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)             # <<<<<<<<<<<<<<
@@ -51750,7 +49604,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
             __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
@@ -51772,7 +49626,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L58:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1604
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1604
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:             # <<<<<<<<<<<<<<
@@ -51788,20 +49642,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
+            if (PyList_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
-            } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
+            } else if (PyTuple_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
             } else {
               __pyx_t_15 = __pyx_t_16(__pyx_t_14);
               if (unlikely(!__pyx_t_15)) {
@@ -51815,33 +49661,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
               PyObject* sequence = __pyx_t_15;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              Py_ssize_t size = Py_SIZE(sequence);
-              #else
-              Py_ssize_t size = PySequence_Size(sequence);
-              #endif
-              if (unlikely(size != 2)) {
-                if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              }
-              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
+                if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                  if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
                 __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
               } else {
+                if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                  if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
                 __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
               }
               __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_2);
-              #else
-              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-            } else
-            {
+            } else {
               Py_ssize_t index = -1;
               __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
@@ -51852,13 +49692,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L61_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_2);
               if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               goto __pyx_L62_unpacking_done;
               __pyx_L61_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              __pyx_t_17 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
               {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L62_unpacking_done:;
             }
@@ -51869,7 +49708,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_eindexes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1605
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1605
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -51885,7 +49724,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_als1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1606
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1606
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))             # <<<<<<<<<<<<<<
@@ -51895,7 +49734,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
             __Pyx_INCREF(((PyObject *)__pyx_v_als1));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als1));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_als1));
@@ -51903,7 +49742,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
             __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -51926,7 +49765,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L57:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1608
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1608
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))
  * 
  *                     if (num_gaps < self.max_nonterminals and             # <<<<<<<<<<<<<<
@@ -51936,7 +49775,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_num_gaps < __pyx_v_self->max_nonterminals);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1609
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1609
  * 
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and             # <<<<<<<<<<<<<<
@@ -51946,7 +49785,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_phrase_len < __pyx_v_self->max_length);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1610
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1610
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):             # <<<<<<<<<<<<<<
@@ -51964,7 +49803,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_9) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1611
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1611
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -51974,7 +49813,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_low == __pyx_v_f_low);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1612
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1612
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -51984,7 +49823,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1613
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1613
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):             # <<<<<<<<<<<<<<
@@ -52014,7 +49853,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1614
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1614
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -52023,7 +49862,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1615
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1615
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -52032,7 +49871,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1616
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1616
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52041,7 +49880,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1617
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1617
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -52058,7 +49897,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1618
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1618
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -52071,7 +49910,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L65:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1619
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1619
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -52087,7 +49926,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1620
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1620
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52099,7 +49938,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L68:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1622
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1622
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -52108,7 +49947,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1623
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1623
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_back_high,             # <<<<<<<<<<<<<<
@@ -52118,7 +49957,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1627
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1627
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -52128,7 +49967,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_14, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 1, 0, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1629
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1629
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and             # <<<<<<<<<<<<<<
@@ -52144,7 +49983,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1630
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1630
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and
  *                                 self.find_fixpoint(f_x_low, f_low,    # check integrity of new subphrase             # <<<<<<<<<<<<<<
@@ -52154,7 +49993,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_1);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1634
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1634
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -52177,7 +50016,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1636
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1636
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -52186,7 +50025,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1637
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1637
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -52195,7 +50034,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1638
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1638
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
@@ -52209,7 +50048,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1639
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1639
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52223,7 +50062,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1640
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1640
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52232,7 +50071,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1641
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1641
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -52241,7 +50080,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1642
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1642
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
@@ -52251,7 +50090,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -52261,7 +50100,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1643
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1643
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -52271,7 +50110,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1644
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1644
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -52281,7 +50120,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1645
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1645
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52290,7 +50129,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1646
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1646
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -52302,7 +50141,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1648
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1648
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -52314,7 +50153,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L72:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1649
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1649
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -52324,7 +50163,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_high > __pyx_v_f_high);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1650
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1650
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52333,7 +50172,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1651
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1651
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52350,7 +50189,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L73:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1652
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1652
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
@@ -52358,7 +50197,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  */
               __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -52369,7 +50208,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_15);
               __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1655
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1655
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
@@ -52382,7 +50221,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_phrase_list = __pyx_t_15;
               __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1656
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1656
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
@@ -52393,7 +50232,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1657
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1657
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
@@ -52410,7 +50249,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1659
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1659
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -52421,7 +50260,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L74:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1660
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1660
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -52437,20 +50276,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_16 = Py_TYPE(__pyx_t_15)->tp_iternext;
               }
               for (;;) {
-                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_15)) {
+                if (PyList_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_15)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
-                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_15)) {
+                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
+                } else if (PyTuple_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
+                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
                 } else {
                   __pyx_t_1 = __pyx_t_16(__pyx_t_15);
                   if (unlikely(!__pyx_t_1)) {
@@ -52464,33 +50295,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
                   PyObject* sequence = __pyx_t_1;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  Py_ssize_t size = Py_SIZE(sequence);
-                  #else
-                  Py_ssize_t size = PySequence_Size(sequence);
-                  #endif
-                  if (unlikely(size != 2)) {
-                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
+                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_14 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
+                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_14 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_14);
                   __Pyx_INCREF(__pyx_t_2);
-                  #else
-                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-                } else
-                {
+                } else {
                   Py_ssize_t index = -1;
                   __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
@@ -52501,13 +50326,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L77_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L78_unpacking_done;
                   __pyx_L77_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  __pyx_t_17 = NULL;
-                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L78_unpacking_done:;
                 }
@@ -52518,7 +50342,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1661
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1661
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -52534,7 +50358,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_als2 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1662
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1662
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))             # <<<<<<<<<<<<<<
@@ -52544,7 +50368,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_1);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_1));
                 __Pyx_INCREF(((PyObject *)__pyx_v_als2));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_als2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als2));
@@ -52552,7 +50376,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
                 __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_1);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_1));
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -52578,7 +50402,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L64:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1664
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1664
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))
  * 
  *                         if (f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -52588,7 +50412,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_high == __pyx_v_f_high);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1665
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1665
  * 
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -52598,7 +50422,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_f_sent_len - __pyx_v_f_high) >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1666
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1666
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):             # <<<<<<<<<<<<<<
@@ -52628,7 +50452,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1667
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1667
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -52637,7 +50461,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1668
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1668
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -52646,7 +50470,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1669
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1669
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52655,7 +50479,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1670
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1670
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -52672,7 +50496,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1671
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1671
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -52685,7 +50509,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L80:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1672
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1672
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -52701,7 +50525,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1673
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1673
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52713,7 +50537,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L83:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1675
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1675
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -52722,7 +50546,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1676
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1676
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_back_low, f_x_high,             # <<<<<<<<<<<<<<
@@ -52732,7 +50556,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1680
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1680
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -52742,7 +50566,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_back_low, __pyx_t_15, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 0, 1, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1682
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1682
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and             # <<<<<<<<<<<<<<
@@ -52758,7 +50582,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1683
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1683
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
@@ -52768,7 +50592,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1683; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_14);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1688
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1688
  *                                             f_gap_low+gap_start+num_gaps, f_gap_high+gap_start+num_gaps,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -52791,7 +50615,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1690
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1690
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -52800,7 +50624,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1691
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1691
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -52809,7 +50633,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1692
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1692
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
@@ -52823,7 +50647,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1693
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1693
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -52833,7 +50657,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_low < __pyx_v_f_low);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1694
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1694
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52842,7 +50666,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1695
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1695
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1             # <<<<<<<<<<<<<<
@@ -52851,7 +50675,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_v_i = (__pyx_v_i + 1);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1696
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1696
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52868,7 +50692,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L85:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1697
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1697
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
@@ -52878,7 +50702,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -52888,7 +50712,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1698
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1698
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -52898,7 +50722,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1699
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1699
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -52908,7 +50732,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1700
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1700
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52917,7 +50741,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1701
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1701
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -52929,7 +50753,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1703
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1703
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -52941,7 +50765,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L88:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1704
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1704
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52950,7 +50774,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1705
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1705
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52964,7 +50788,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1706
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1706
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
@@ -52972,7 +50796,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  */
               __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1706; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -52983,7 +50807,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
               __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1709
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1709
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
@@ -52996,7 +50820,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_phrase_list = __pyx_t_1;
               __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1710
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1710
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
@@ -53007,7 +50831,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1711
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1711
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
@@ -53024,7 +50848,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1713
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1713
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -53035,7 +50859,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L89:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1714
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1714
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -53051,20 +50875,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_16 = Py_TYPE(__pyx_t_1)->tp_iternext;
               }
               for (;;) {
-                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_1)) {
+                if (PyList_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_1)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
-                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_1)) {
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
+                } else if (PyTuple_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
+                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
                 } else {
                   __pyx_t_14 = __pyx_t_16(__pyx_t_1);
                   if (unlikely(!__pyx_t_14)) {
@@ -53078,33 +50894,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_14))) || (PyList_CheckExact(__pyx_t_14))) {
                   PyObject* sequence = __pyx_t_14;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  Py_ssize_t size = Py_SIZE(sequence);
-                  #else
-                  Py_ssize_t size = PySequence_Size(sequence);
-                  #endif
-                  if (unlikely(size != 2)) {
-                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
+                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
+                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_15);
                   __Pyx_INCREF(__pyx_t_2);
-                  #else
-                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                } else
-                {
+                } else {
                   Py_ssize_t index = -1;
                   __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
@@ -53115,13 +50925,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L92_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L93_unpacking_done;
                   __pyx_L92_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  __pyx_t_17 = NULL;
-                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L93_unpacking_done:;
                 }
@@ -53132,7 +50941,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1715
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1715
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -53148,7 +50957,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_als3 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1716
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1716
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))             # <<<<<<<<<<<<<<
@@ -53158,7 +50967,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
                 __Pyx_INCREF(((PyObject *)__pyx_v_als3));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_als3));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als3));
@@ -53166,7 +50975,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -53192,7 +51001,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L79:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1717
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1717
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and             # <<<<<<<<<<<<<<
@@ -53202,7 +51011,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_num_gaps < (__pyx_v_self->max_nonterminals - 1));
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1718
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1718
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and             # <<<<<<<<<<<<<<
@@ -53212,7 +51021,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_phrase_len + 1) < __pyx_v_self->max_length);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1719
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1719
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -53222,7 +51031,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_18 = (__pyx_v_f_back_high == __pyx_v_f_high);
               if (__pyx_t_18) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1720
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1720
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -53232,7 +51041,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_8 = (__pyx_v_f_back_low == __pyx_v_f_low);
                 if (__pyx_t_8) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1721
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1721
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
@@ -53242,7 +51051,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_19 = (((__pyx_v_f_back_high - __pyx_v_f_back_low) + (2 * __pyx_v_self->train_min_gap_size)) <= __pyx_v_self->train_max_initial_size);
                   if (__pyx_t_19) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1722
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1722
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -53252,7 +51061,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                     __pyx_t_20 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
                     if (__pyx_t_20) {
 
-                      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1723
+                      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1723
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -53262,7 +51071,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                       __pyx_t_21 = (__pyx_v_f_high <= (__pyx_v_f_sent_len - __pyx_v_self->train_min_gap_size));
                       if (__pyx_t_21) {
 
-                        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1724
+                        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1724
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):             # <<<<<<<<<<<<<<
@@ -53312,7 +51121,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1726
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1726
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):
  * 
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -53321,7 +51130,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1727
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1727
  * 
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -53330,7 +51139,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1728
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1728
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -53339,7 +51148,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1729
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1729
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -53356,7 +51165,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1730
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1730
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -53369,7 +51178,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L95:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1731
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1731
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:             # <<<<<<<<<<<<<<
@@ -53379,7 +51188,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_18 = (__pyx_v_f_x_low < 0);
             if (__pyx_t_18) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1732
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1732
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -53391,7 +51200,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L98:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1734
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1734
  *                                 met_constraints = 0
  * 
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -53400,7 +51209,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1735
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1735
  * 
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -53409,7 +51218,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1736
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1736
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -53426,7 +51235,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_9) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1737
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1737
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -53439,7 +51248,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L99:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1738
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1738
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -53455,7 +51264,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1739
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1739
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -53467,7 +51276,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L102:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1741
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1741
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -53476,7 +51285,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1742
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1742
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_x_high,             # <<<<<<<<<<<<<<
@@ -53486,7 +51295,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1746
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1746
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -53496,7 +51305,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 2, 1, 1, 1, 1)) {
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1748
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1748
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and             # <<<<<<<<<<<<<<
@@ -53518,7 +51327,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_9) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1749
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1749
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and
  *                                 self.find_fixpoint(f_x_low, f_low,             # <<<<<<<<<<<<<<
@@ -53528,7 +51337,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1749; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_15);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1753
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1753
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -53539,7 +51348,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   if (__pyx_t_3) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1755
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1755
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
@@ -53549,7 +51358,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                     __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1755; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     __Pyx_GOTREF(__pyx_t_15);
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1760
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1760
  *                                                 f_gap_low+1+num_gaps, f_gap_high+1+num_gaps,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -53577,7 +51386,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_8) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1762
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1762
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -53586,7 +51395,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1763
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1763
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -53595,7 +51404,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1764
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1764
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
@@ -53609,7 +51418,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1765
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1765
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53623,7 +51432,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1766
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1766
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53632,7 +51441,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1767
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1767
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -53641,7 +51450,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1768
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1768
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
@@ -53651,7 +51460,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_15);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_15));
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -53661,7 +51470,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1769
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1769
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -53671,7 +51480,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1770
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1770
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -53681,7 +51490,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1771
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1771
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53690,7 +51499,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1772
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1772
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -53702,7 +51511,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1774
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1774
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -53714,7 +51523,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L106:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1775
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1775
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53723,7 +51532,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1776
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1776
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53737,7 +51546,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1777
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1777
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
@@ -53745,7 +51554,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  */
               __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_15);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_15));
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -53756,7 +51565,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_14);
               __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1780
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1780
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
@@ -53769,7 +51578,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_phrase_list = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1781
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1781
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
@@ -53780,7 +51589,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_8 = (__pyx_t_13 > 0);
               if (__pyx_t_8) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1782
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1782
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
@@ -53797,7 +51606,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1784
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1784
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -53808,7 +51617,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L107:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1785
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1785
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -53824,20 +51633,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
               }
               for (;;) {
-                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
+                if (PyList_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
-                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
+                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
+                } else if (PyTuple_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
+                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
                 } else {
                   __pyx_t_15 = __pyx_t_16(__pyx_t_14);
                   if (unlikely(!__pyx_t_15)) {
@@ -53851,33 +51652,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
                   PyObject* sequence = __pyx_t_15;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  Py_ssize_t size = Py_SIZE(sequence);
-                  #else
-                  Py_ssize_t size = PySequence_Size(sequence);
-                  #endif
-                  if (unlikely(size != 2)) {
-                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
+                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
+                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_1);
                   __Pyx_INCREF(__pyx_t_2);
-                  #else
-                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                } else
-                {
+                } else {
                   Py_ssize_t index = -1;
                   __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
@@ -53888,13 +51683,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L110_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L111_unpacking_done;
                   __pyx_L110_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  __pyx_t_17 = NULL;
-                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L111_unpacking_done:;
                 }
@@ -53905,7 +51699,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1786
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1786
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -53921,7 +51715,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_als4 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1787
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1787
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))             # <<<<<<<<<<<<<<
@@ -53931,7 +51725,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
                 __Pyx_INCREF(((PyObject *)__pyx_v_als4));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als4));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als4));
@@ -53939,7 +51733,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -53974,7 +51768,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1789
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1789
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"             # <<<<<<<<<<<<<<
@@ -53990,7 +51784,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L33:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1791
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1791
  *                 reason_for_failure = "Unable to extract basic phrase"
  * 
  *         free(sent_links)             # <<<<<<<<<<<<<<
@@ -53999,7 +51793,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_sent_links);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1792
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1792
  * 
  *         free(sent_links)
  *         free(f_links_low)             # <<<<<<<<<<<<<<
@@ -54008,7 +51802,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1793
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1793
  *         free(sent_links)
  *         free(f_links_low)
  *         free(f_links_high)             # <<<<<<<<<<<<<<
@@ -54017,7 +51811,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1794
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1794
  *         free(f_links_low)
  *         free(f_links_high)
  *         free(e_links_low)             # <<<<<<<<<<<<<<
@@ -54026,7 +51820,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1795
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1795
  *         free(f_links_high)
  *         free(e_links_low)
  *         free(e_links_high)             # <<<<<<<<<<<<<<
@@ -54035,7 +51829,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1796
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1796
  *         free(e_links_low)
  *         free(e_links_high)
  *         free(f_gap_low)             # <<<<<<<<<<<<<<
@@ -54044,7 +51838,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1797
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1797
  *         free(e_links_high)
  *         free(f_gap_low)
  *         free(f_gap_high)             # <<<<<<<<<<<<<<
@@ -54053,7 +51847,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1798
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1798
  *         free(f_gap_low)
  *         free(f_gap_high)
  *         free(e_gap_low)             # <<<<<<<<<<<<<<
@@ -54062,7 +51856,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1799
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1799
  *         free(f_gap_high)
  *         free(e_gap_low)
  *         free(e_gap_high)             # <<<<<<<<<<<<<<
@@ -54071,7 +51865,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1801
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1801
  *         free(e_gap_high)
  * 
  *         return extracts             # <<<<<<<<<<<<<<
@@ -54111,21 +51905,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
-  __pyx_r = __pyx_pf_3_sa_13FeatureVector___cinit__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":7
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":7
  * 
  * cdef class FeatureVector:
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -54133,7 +51913,8 @@ static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyOb
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
  */
 
-static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
+static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -54142,9 +51923,12 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_RefNannySetupContext("__cinit__");
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":8
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":8
  * cdef class FeatureVector:
  *     def __cinit__(self):
  *         self.names = IntList(INITIAL_CAPACITY, INCREMENT)             # <<<<<<<<<<<<<<
@@ -54156,7 +51940,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__INCREMENT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -54167,12 +51951,12 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->names);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->names));
-  __pyx_v_self->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names));
+  ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":9
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":9
  *     def __cinit__(self):
  *         self.names = IntList(INITIAL_CAPACITY, INCREMENT)
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)             # <<<<<<<<<<<<<<
@@ -54184,7 +51968,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__INCREMENT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3);
@@ -54195,9 +51979,9 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
-  __Pyx_GOTREF(__pyx_v_self->values);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->values));
-  __pyx_v_self->values = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_3);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values));
+  ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
   __pyx_r = 0;
@@ -54213,39 +51997,52 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":11
+ *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
+ * 
+ *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
+ *         self.names.append(name)
+ *         self.values.append(value)
+ */
+
+static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   unsigned int __pyx_v_name;
   float __pyx_v_value;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("set (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
+  __Pyx_RefNannySetupContext("set");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__name)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__name);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("set", 1, 2, 2, 1); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set") < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "set") < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -54254,7 +52051,7 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyOb
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
     __pyx_v_name = __Pyx_PyInt_AsUnsignedInt(values[0]); if (unlikely((__pyx_v_name == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_value = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_value == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_value = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_value == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -54264,30 +52061,8 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_13FeatureVector_2set(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self), __pyx_v_name, __pyx_v_value);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":11
- *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
- * 
- *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
- *         self.names.append(name)
- *         self.values.append(value)
- */
-
-static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":12
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":12
  * 
  *     def set(self, unsigned name, float value):
  *         self.names.append(name)             # <<<<<<<<<<<<<<
@@ -54296,12 +52071,12 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_Featur
  */
   __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->names), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":13
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":13
  *     def set(self, unsigned name, float value):
  *         self.names.append(name)
  *         self.values.append(value)             # <<<<<<<<<<<<<<
@@ -54310,7 +52085,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_Featur
  */
   __pyx_t_2 = PyFloat_FromDouble(__pyx_v_value); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->values), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -54327,20 +52102,9 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_Featur
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_13FeatureVector_4__iter__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":15
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -54348,45 +52112,36 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self)
  *         for i in range(self.names.len):
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_13FeatureVector_2__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_13FeatureVector_2__iter__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__", 0);
+  __Pyx_RefNannySetupContext("__iter__");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_9___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_9___iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_6generator5, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_3generator5;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.FeatureVector.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   unsigned int __pyx_t_2;
@@ -54395,8 +52150,8 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -54406,34 +52161,34 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":17
  *     def __iter__(self):
  *         cdef unsigned i
  *         for i in range(self.names.len):             # <<<<<<<<<<<<<<
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  */
-  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->names->len;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->names->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":18
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":18
  *         cdef unsigned i
  *         for i in range(self.names.len):
  *             yield (FD.word(self.names[i]), self.values[i])             # <<<<<<<<<<<<<<
  * 
  *     def __str__(self):
  */
-    __pyx_t_3 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_self->names), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->names), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = PyBytes_FromString(((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_3_sa_FD->__pyx_vtab)->word(__pyx_v_3_sa_FD, __pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_self->values), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->values), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -54447,14 +52202,14 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
@@ -54463,25 +52218,13 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
+static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_13FeatureVector_7__str__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -54489,53 +52232,45 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
  * cdef class Scorer:
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str___genexpr(PyObject *__pyx_self) {
+static PyObject *__pyx_pf_3_sa_7__str___2genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_7__str___2genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("genexpr", 0);
+  __Pyx_RefNannySetupContext("genexpr");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *) __pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)__pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_7__str___2generator8, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_self = __pyx_self;
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7__str___3generator8;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.FeatureVector.__str__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
   PyObject *(*__pyx_t_3)(PyObject *);
   PyObject *__pyx_t_4 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -54544,30 +52279,21 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  if (PyList_CheckExact(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) || PyTuple_CheckExact(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self))) {
-    __pyx_t_1 = ((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) {
+    __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -54595,7 +52321,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -54606,7 +52332,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -54614,13 +52340,12 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":20
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -54628,7 +52353,8 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -54638,18 +52364,18 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_Fe
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__", 0);
+  __Pyx_RefNannySetupContext("__str__");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_10___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_10___str__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -54659,10 +52385,10 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_Fe
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_pf_3_sa_13FeatureVector_7__str___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __pyx_pf_3_sa_7__str___2genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -54689,23 +52415,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_Fe
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_models = 0;
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
-  __Pyx_INCREF(__pyx_args);
-  __pyx_v_models = __pyx_args;
-  __pyx_r = __pyx_pf_3_sa_6Scorer___init__(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self), __pyx_v_models);
-  __Pyx_XDECREF(__pyx_v_models);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":25
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":25
  * cdef class Scorer:
  *     cdef models
  *     def __init__(self, *models):             # <<<<<<<<<<<<<<
@@ -54713,7 +52423,9 @@ static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__p
  *         self.models = zip(names, models)
  */
 
-static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_self, PyObject *__pyx_v_models) {
+static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_models = 0;
   PyObject *__pyx_v_names = NULL;
   PyObject *__pyx_v_model = NULL;
   int __pyx_r;
@@ -54726,9 +52438,12 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__init__", 0);
+  __Pyx_RefNannySetupContext("__init__");
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
+  __Pyx_INCREF(__pyx_args);
+  __pyx_v_models = __pyx_args;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":26
  *     cdef models
  *     def __init__(self, *models):
  *         names = [FD.index(<char *>model.__name__) for model in models]             # <<<<<<<<<<<<<<
@@ -54736,15 +52451,14 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  if (unlikely(((PyObject *)__pyx_v_models) == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
   __pyx_t_2 = ((PyObject *)__pyx_v_models); __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
   for (;;) {
     if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-    #if CYTHON_COMPILING_IN_CPYTHON
-    __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #else
-    __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #endif
+    __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
     __Pyx_XDECREF(__pyx_v_model);
     __pyx_v_model = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -54754,7 +52468,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __pyx_t_4 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_3_sa_FD->__pyx_vtab)->index(__pyx_v_3_sa_FD, ((char *)__pyx_t_5))); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -54762,7 +52476,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   __pyx_v_names = __pyx_t_1;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":27
  *     def __init__(self, *models):
  *         names = [FD.index(<char *>model.__name__) for model in models]
  *         self.models = zip(names, models)             # <<<<<<<<<<<<<<
@@ -54770,7 +52484,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
  *     cdef FeatureVector score(self, ctx):
  */
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_v_names));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_names));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_names));
@@ -54781,9 +52495,9 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->models);
-  __Pyx_DECREF(__pyx_v_self->models);
-  __pyx_v_self->models = __pyx_t_2;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models);
+  ((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models = __pyx_t_2;
   __pyx_t_2 = 0;
 
   __pyx_r = 0;
@@ -54795,13 +52509,14 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   __Pyx_AddTraceback("_sa.Scorer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_models);
   __Pyx_XDECREF(__pyx_v_names);
   __Pyx_XDECREF(__pyx_v_model);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":29
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":29
  *         self.models = zip(names, models)
  * 
  *     cdef FeatureVector score(self, ctx):             # <<<<<<<<<<<<<<
@@ -54826,9 +52541,9 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("score", 0);
+  __Pyx_RefNannySetupContext("score");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":30
  * 
  *     cdef FeatureVector score(self, ctx):
  *         cdef FeatureVector scores = FeatureVector()             # <<<<<<<<<<<<<<
@@ -54840,7 +52555,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   __pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":31
  *     cdef FeatureVector score(self, ctx):
  *         cdef FeatureVector scores = FeatureVector()
  *         for name, model in self.models:             # <<<<<<<<<<<<<<
@@ -54856,20 +52571,12 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -54883,33 +52590,27 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
       PyObject* sequence = __pyx_t_4;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      Py_ssize_t size = Py_SIZE(sequence);
-      #else
-      Py_ssize_t size = PySequence_Size(sequence);
-      #endif
-      if (unlikely(size != 2)) {
-        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
       } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
-      #else
-      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    } else
-    {
+    } else {
       Py_ssize_t index = -1;
       __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
@@ -54920,13 +52621,12 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
       index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L6_unpacking_done;
       __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_8 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L6_unpacking_done:;
     }
@@ -54937,7 +52637,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_v_model = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":32
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":32
  *         cdef FeatureVector scores = FeatureVector()
  *         for name, model in self.models:
  *             scores.set(name, model(ctx))             # <<<<<<<<<<<<<<
@@ -54946,7 +52646,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_scores), __pyx_n_s__set); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     __Pyx_INCREF(__pyx_v_ctx);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_ctx);
     __Pyx_GIVEREF(__pyx_v_ctx);
@@ -54954,7 +52654,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     __Pyx_INCREF(__pyx_v_name);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_name);
     __Pyx_GIVEREF(__pyx_v_name);
@@ -54969,7 +52669,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":33
  *         for name, model in self.models:
  *             scores.set(name, model(ctx))
  *         return scores             # <<<<<<<<<<<<<<
@@ -55005,7 +52705,7 @@ static PyObject *__pyx_tp_new_3_sa_FloatList(PyTypeObject *t, PyObject *a, PyObj
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_FloatList *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_FloatList;
-  if (__pyx_pw_3_sa_9FloatList_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_9FloatList___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55016,7 +52716,7 @@ static void __pyx_tp_dealloc_3_sa_FloatList(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_9FloatList_3__dealloc__(o);
+    __pyx_pf_3_sa_9FloatList_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -55033,7 +52733,7 @@ static PyObject *__pyx_sq_item_3_sa_FloatList(PyObject *o, Py_ssize_t i) {
 
 static int __pyx_mp_ass_subscript_3_sa_FloatList(PyObject *o, PyObject *i, PyObject *v) {
   if (v) {
-    return __pyx_pw_3_sa_9FloatList_7__setitem__(o, i, v);
+    return __pyx_pf_3_sa_9FloatList_3__setitem__(o, i, v);
   }
   else {
     PyErr_Format(PyExc_NotImplementedError,
@@ -55043,9 +52743,9 @@ static int __pyx_mp_ass_subscript_3_sa_FloatList(PyObject *o, PyObject *i, PyObj
 }
 
 static PyMethodDef __pyx_methods_3_sa_FloatList[] = {
-  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pw_3_sa_9FloatList_11append, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pw_3_sa_9FloatList_13write, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pw_3_sa_9FloatList_15read, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pf_3_sa_9FloatList_5append, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pf_3_sa_9FloatList_6write, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pf_3_sa_9FloatList_7read, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55108,7 +52808,7 @@ static PyNumberMethods __pyx_tp_as_number_FloatList = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
-  __pyx_pw_3_sa_9FloatList_9__len__, /*sq_length*/
+  __pyx_pf_3_sa_9FloatList_4__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_FloatList, /*sq_item*/
@@ -55121,8 +52821,8 @@ static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_FloatList = {
-  __pyx_pw_3_sa_9FloatList_9__len__, /*mp_length*/
-  __pyx_pw_3_sa_9FloatList_5__getitem__, /*mp_subscript*/
+  __pyx_pf_3_sa_9FloatList_4__len__, /*mp_length*/
+  __pyx_pf_3_sa_9FloatList_2__getitem__, /*mp_subscript*/
   __pyx_mp_ass_subscript_3_sa_FloatList, /*mp_ass_subscript*/
 };
 
@@ -55210,7 +52910,7 @@ static PyObject *__pyx_tp_new_3_sa_IntList(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_IntList *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_IntList;
-  if (__pyx_pw_3_sa_7IntList_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_7IntList___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55221,7 +52921,7 @@ static void __pyx_tp_dealloc_3_sa_IntList(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_7IntList_15__dealloc__(o);
+    __pyx_pf_3_sa_7IntList_7__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -55238,7 +52938,7 @@ static PyObject *__pyx_sq_item_3_sa_IntList(PyObject *o, Py_ssize_t i) {
 
 static int __pyx_mp_ass_subscript_3_sa_IntList(PyObject *o, PyObject *i, PyObject *v) {
   if (v) {
-    return __pyx_pw_3_sa_7IntList_22__setitem__(o, i, v);
+    return __pyx_pf_3_sa_7IntList_11__setitem__(o, i, v);
   }
   else {
     PyErr_Format(PyExc_NotImplementedError,
@@ -55248,16 +52948,16 @@ static int __pyx_mp_ass_subscript_3_sa_IntList(PyObject *o, PyObject *i, PyObjec
 }
 
 static PyMethodDef __pyx_methods_3_sa_IntList[] = {
-  {__Pyx_NAMESTR("index"), (PyCFunction)__pyx_pw_3_sa_7IntList_5index, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("partition"), (PyCFunction)__pyx_pw_3_sa_7IntList_7partition, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("_doquicksort"), (PyCFunction)__pyx_pw_3_sa_7IntList_9_doquicksort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("sort"), (PyCFunction)__pyx_pw_3_sa_7IntList_11sort, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pw_3_sa_7IntList_13reset, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSize"), (PyCFunction)__pyx_pw_3_sa_7IntList_26getSize, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pw_3_sa_7IntList_28append, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("extend"), (PyCFunction)__pyx_pw_3_sa_7IntList_30extend, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pw_3_sa_7IntList_32write, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pw_3_sa_7IntList_34read, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("index"), (PyCFunction)__pyx_pf_3_sa_7IntList_2index, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("partition"), (PyCFunction)__pyx_pf_3_sa_7IntList_3partition, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("_doquicksort"), (PyCFunction)__pyx_pf_3_sa_7IntList_4_doquicksort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("sort"), (PyCFunction)__pyx_pf_3_sa_7IntList_5sort, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pf_3_sa_7IntList_6reset, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSize"), (PyCFunction)__pyx_pf_3_sa_7IntList_13getSize, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pf_3_sa_7IntList_14append, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("extend"), (PyCFunction)__pyx_pf_3_sa_7IntList_15extend, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pf_3_sa_7IntList_16write, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pf_3_sa_7IntList_17read, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55320,7 +53020,7 @@ static PyNumberMethods __pyx_tp_as_number_IntList = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_IntList = {
-  __pyx_pw_3_sa_7IntList_24__len__, /*sq_length*/
+  __pyx_pf_3_sa_7IntList_12__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_IntList, /*sq_item*/
@@ -55333,8 +53033,8 @@ static PySequenceMethods __pyx_tp_as_sequence_IntList = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_IntList = {
-  __pyx_pw_3_sa_7IntList_24__len__, /*mp_length*/
-  __pyx_pw_3_sa_7IntList_20__getitem__, /*mp_subscript*/
+  __pyx_pf_3_sa_7IntList_12__len__, /*mp_length*/
+  __pyx_pf_3_sa_7IntList_10__getitem__, /*mp_subscript*/
   __pyx_mp_ass_subscript_3_sa_IntList, /*mp_ass_subscript*/
 };
 
@@ -55379,7 +53079,7 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   &__pyx_tp_as_mapping_IntList, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pw_3_sa_7IntList_3__str__, /*tp_str*/
+  __pyx_pf_3_sa_7IntList_1__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_IntList, /*tp_as_buffer*/
@@ -55389,7 +53089,7 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pw_3_sa_7IntList_17__iter__, /*tp_iter*/
+  __pyx_pf_3_sa_7IntList_8__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_IntList, /*tp_methods*/
   0, /*tp_members*/
@@ -55415,14 +53115,14 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa_FeatureVector *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_FeatureVector *)o);
   p->names = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->values = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_13FeatureVector_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pf_3_sa_13FeatureVector___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55430,8 +53130,8 @@ static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, CYTHON_UNUSED
 
 static void __pyx_tp_dealloc_3_sa_FeatureVector(PyObject *o) {
   struct __pyx_obj_3_sa_FeatureVector *p = (struct __pyx_obj_3_sa_FeatureVector *)o;
-  Py_CLEAR(p->names);
-  Py_CLEAR(p->values);
+  Py_XDECREF(((PyObject *)p->names));
+  Py_XDECREF(((PyObject *)p->values));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -55460,7 +53160,7 @@ static int __pyx_tp_clear_3_sa_FeatureVector(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_FeatureVector[] = {
-  {__Pyx_NAMESTR("set"), (PyCFunction)__pyx_pw_3_sa_13FeatureVector_3set, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("set"), (PyCFunction)__pyx_pf_3_sa_13FeatureVector_1set, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55582,7 +53282,7 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   &__pyx_tp_as_mapping_FeatureVector, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pw_3_sa_13FeatureVector_8__str__, /*tp_str*/
+  __pyx_pf_3_sa_13FeatureVector_4__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_FeatureVector, /*tp_as_buffer*/
@@ -55592,7 +53292,7 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   __pyx_tp_clear_3_sa_FeatureVector, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pw_3_sa_13FeatureVector_5__iter__, /*tp_iter*/
+  __pyx_pf_3_sa_13FeatureVector_2__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_FeatureVector, /*tp_methods*/
   0, /*tp_members*/
@@ -55625,7 +53325,7 @@ static PyObject *__pyx_tp_new_3_sa_Phrase(PyTypeObject *t, PyObject *a, PyObject
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_Phrase *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Phrase;
-  if (__pyx_pw_3_sa_6Phrase_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_6Phrase___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55636,7 +53336,7 @@ static void __pyx_tp_dealloc_3_sa_Phrase(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_6Phrase_3__dealloc__(o);
+    __pyx_pf_3_sa_6Phrase_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -55651,19 +53351,19 @@ static PyObject *__pyx_sq_item_3_sa_Phrase(PyObject *o, Py_ssize_t i) {
   return r;
 }
 
-static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_6Phrase_5words_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_6Phrase_5words___get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Phrase[] = {
-  {__Pyx_NAMESTR("handle"), (PyCFunction)__pyx_pw_3_sa_6Phrase_7handle, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_3_sa_6Phrase_6handle)},
-  {__Pyx_NAMESTR("strhandle"), (PyCFunction)__pyx_pw_3_sa_6Phrase_9strhandle, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pw_3_sa_6Phrase_11arity, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getvarpos"), (PyCFunction)__pyx_pw_3_sa_6Phrase_13getvarpos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getvar"), (PyCFunction)__pyx_pw_3_sa_6Phrase_15getvar, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("clen"), (PyCFunction)__pyx_pw_3_sa_6Phrase_17clen, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getchunk"), (PyCFunction)__pyx_pw_3_sa_6Phrase_19getchunk, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("subst"), (PyCFunction)__pyx_pw_3_sa_6Phrase_32subst, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("handle"), (PyCFunction)__pyx_pf_3_sa_6Phrase_3handle, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_3_sa_6Phrase_3handle)},
+  {__Pyx_NAMESTR("strhandle"), (PyCFunction)__pyx_pf_3_sa_6Phrase_4strhandle, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pf_3_sa_6Phrase_5arity, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getvarpos"), (PyCFunction)__pyx_pf_3_sa_6Phrase_6getvarpos, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getvar"), (PyCFunction)__pyx_pf_3_sa_6Phrase_7getvar, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("clen"), (PyCFunction)__pyx_pf_3_sa_6Phrase_8clen, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getchunk"), (PyCFunction)__pyx_pf_3_sa_6Phrase_9getchunk, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("subst"), (PyCFunction)__pyx_pf_3_sa_6Phrase_16subst, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55731,7 +53431,7 @@ static PyNumberMethods __pyx_tp_as_number_Phrase = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
-  __pyx_pw_3_sa_6Phrase_25__len__, /*sq_length*/
+  __pyx_pf_3_sa_6Phrase_12__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_Phrase, /*sq_item*/
@@ -55744,8 +53444,8 @@ static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_Phrase = {
-  __pyx_pw_3_sa_6Phrase_25__len__, /*mp_length*/
-  __pyx_pw_3_sa_6Phrase_27__getitem__, /*mp_subscript*/
+  __pyx_pf_3_sa_6Phrase_12__len__, /*mp_length*/
+  __pyx_pf_3_sa_6Phrase_13__getitem__, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
@@ -55780,7 +53480,7 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   0, /*tp_getattr*/
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_pw_3_sa_6Phrase_21__cmp__, /*tp_compare*/
+  __pyx_pf_3_sa_6Phrase_10__cmp__, /*tp_compare*/
   #else
   0, /*reserved*/
   #endif
@@ -55788,9 +53488,9 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   &__pyx_tp_as_number_Phrase, /*tp_as_number*/
   &__pyx_tp_as_sequence_Phrase, /*tp_as_sequence*/
   &__pyx_tp_as_mapping_Phrase, /*tp_as_mapping*/
-  __pyx_pw_3_sa_6Phrase_23__hash__, /*tp_hash*/
+  __pyx_pf_3_sa_6Phrase_11__hash__, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pw_3_sa_6Phrase_5__str__, /*tp_str*/
+  __pyx_pf_3_sa_6Phrase_2__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Phrase, /*tp_as_buffer*/
@@ -55800,7 +53500,7 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pw_3_sa_6Phrase_29__iter__, /*tp_iter*/
+  __pyx_pf_3_sa_6Phrase_14__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_Phrase, /*tp_methods*/
   0, /*tp_members*/
@@ -55835,7 +53535,7 @@ static PyObject *__pyx_tp_new_3_sa_Rule(PyTypeObject *t, PyObject *a, PyObject *
   p->e = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
   p->scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   p->word_alignments = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_4Rule_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_4Rule___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55843,10 +53543,10 @@ static PyObject *__pyx_tp_new_3_sa_Rule(PyTypeObject *t, PyObject *a, PyObject *
 
 static void __pyx_tp_dealloc_3_sa_Rule(PyObject *o) {
   struct __pyx_obj_3_sa_Rule *p = (struct __pyx_obj_3_sa_Rule *)o;
-  Py_CLEAR(p->f);
-  Py_CLEAR(p->e);
-  Py_CLEAR(p->scores);
-  Py_CLEAR(p->word_alignments);
+  Py_XDECREF(((PyObject *)p->f));
+  Py_XDECREF(((PyObject *)p->e));
+  Py_XDECREF(((PyObject *)p->scores));
+  Py_XDECREF(p->word_alignments);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -55886,18 +53586,18 @@ static int __pyx_tp_clear_3_sa_Rule(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_4Rule_1f_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_4Rule_1f___get__(o);
 }
 
-static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_4Rule_1e_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_4Rule_1e___get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Rule[] = {
-  {__Pyx_NAMESTR("fmerge"), (PyCFunction)__pyx_pw_3_sa_4Rule_7fmerge, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pw_3_sa_4Rule_9arity, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("alignments"), (PyCFunction)__pyx_pw_3_sa_4Rule_13alignments, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("fmerge"), (PyCFunction)__pyx_pf_3_sa_4Rule_3fmerge, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pf_3_sa_4Rule_4arity, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("alignments"), (PyCFunction)__pyx_pf_3_sa_4Rule_6alignments, METH_NOARGS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -56015,7 +53715,7 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
   0, /*tp_getattr*/
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_pw_3_sa_4Rule_5__cmp__, /*tp_compare*/
+  __pyx_pf_3_sa_4Rule_2__cmp__, /*tp_compare*/
   #else
   0, /*reserved*/
   #endif
@@ -56023,9 +53723,9 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
   &__pyx_tp_as_number_Rule, /*tp_as_number*/
   &__pyx_tp_as_sequence_Rule, /*tp_as_sequence*/
   &__pyx_tp_as_mapping_Rule, /*tp_as_mapping*/
-  __pyx_pw_3_sa_4Rule_3__hash__, /*tp_hash*/
+  __pyx_pf_3_sa_4Rule_1__hash__, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pw_3_sa_4Rule_11__str__, /*tp_str*/
+  __pyx_pf_3_sa_4Rule_5__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Rule, /*tp_as_buffer*/
@@ -56062,13 +53762,13 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
 };
 static struct __pyx_vtabstruct_3_sa_StringMap __pyx_vtable_3_sa_StringMap;
 
-static PyObject *__pyx_tp_new_3_sa_StringMap(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_StringMap(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa_StringMap *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_StringMap *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_StringMap;
-  if (__pyx_pw_3_sa_9StringMap_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pf_3_sa_9StringMap___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56079,7 +53779,7 @@ static void __pyx_tp_dealloc_3_sa_StringMap(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_9StringMap_3__dealloc__(o);
+    __pyx_pf_3_sa_9StringMap_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -56257,7 +53957,7 @@ static PyObject *__pyx_tp_new_3_sa_DataArray(PyTypeObject *t, PyObject *a, PyObj
   p->data = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_id = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_9DataArray_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_9DataArray___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56265,11 +53965,11 @@ static PyObject *__pyx_tp_new_3_sa_DataArray(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_DataArray(PyObject *o) {
   struct __pyx_obj_3_sa_DataArray *p = (struct __pyx_obj_3_sa_DataArray *)o;
-  Py_CLEAR(p->word2id);
-  Py_CLEAR(p->id2word);
-  Py_CLEAR(p->data);
-  Py_CLEAR(p->sent_id);
-  Py_CLEAR(p->sent_index);
+  Py_XDECREF(p->word2id);
+  Py_XDECREF(p->id2word);
+  Py_XDECREF(((PyObject *)p->data));
+  Py_XDECREF(((PyObject *)p->sent_id));
+  Py_XDECREF(((PyObject *)p->sent_index));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56316,19 +54016,19 @@ static int __pyx_tp_clear_3_sa_DataArray(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_DataArray[] = {
-  {__Pyx_NAMESTR("getSentId"), (PyCFunction)__pyx_pw_3_sa_9DataArray_5getSentId, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSent"), (PyCFunction)__pyx_pw_3_sa_9DataArray_7getSent, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSentPos"), (PyCFunction)__pyx_pw_3_sa_9DataArray_9getSentPos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_11get_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pw_3_sa_9DataArray_13get_word, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_17read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pw_3_sa_9DataArray_19read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pw_3_sa_9DataArray_21read_text_data, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_23read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_25write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pw_3_sa_9DataArray_27write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9DataArray_29write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSentId"), (PyCFunction)__pyx_pf_3_sa_9DataArray_2getSentId, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSent"), (PyCFunction)__pyx_pf_3_sa_9DataArray_3getSent, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSentPos"), (PyCFunction)__pyx_pf_3_sa_9DataArray_4getSentPos, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pf_3_sa_9DataArray_5get_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pf_3_sa_9DataArray_6get_word, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_9DataArray_7write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_9DataArray_8read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pf_3_sa_9DataArray_9read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pf_3_sa_9DataArray_10read_text_data, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_9DataArray_11read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_9DataArray_12write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pf_3_sa_9DataArray_13write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_9DataArray_14write_enhanced, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -56391,7 +54091,7 @@ static PyNumberMethods __pyx_tp_as_number_DataArray = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
-  __pyx_pw_3_sa_9DataArray_3__len__, /*sq_length*/
+  __pyx_pf_3_sa_9DataArray_1__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
@@ -56404,7 +54104,7 @@ static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_DataArray = {
-  __pyx_pw_3_sa_9DataArray_3__len__, /*mp_length*/
+  __pyx_pf_3_sa_9DataArray_1__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -56495,7 +54195,7 @@ static PyObject *__pyx_tp_new_3_sa_Alignment(PyTypeObject *t, PyObject *a, PyObj
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Alignment;
   p->links = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_9Alignment_5__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_9Alignment_2__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56503,8 +54203,8 @@ static PyObject *__pyx_tp_new_3_sa_Alignment(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_Alignment(PyObject *o) {
   struct __pyx_obj_3_sa_Alignment *p = (struct __pyx_obj_3_sa_Alignment *)o;
-  Py_CLEAR(p->links);
-  Py_CLEAR(p->sent_index);
+  Py_XDECREF(((PyObject *)p->links));
+  Py_XDECREF(((PyObject *)p->sent_index));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56533,14 +54233,14 @@ static int __pyx_tp_clear_3_sa_Alignment(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Alignment[] = {
-  {__Pyx_NAMESTR("unlink"), (PyCFunction)__pyx_pw_3_sa_9Alignment_1unlink, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_unlink)},
-  {__Pyx_NAMESTR("get_sent_links"), (PyCFunction)__pyx_pw_3_sa_9Alignment_3get_sent_links, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9Alignment_7read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9Alignment_9read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9Alignment_11write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9Alignment_13write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9Alignment_15write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("alignment"), (PyCFunction)__pyx_pw_3_sa_9Alignment_17alignment, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_16alignment)},
+  {__Pyx_NAMESTR("unlink"), (PyCFunction)__pyx_pf_3_sa_9Alignment_unlink, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_unlink)},
+  {__Pyx_NAMESTR("get_sent_links"), (PyCFunction)__pyx_pf_3_sa_9Alignment_1get_sent_links, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_9Alignment_3read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_9Alignment_4read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_9Alignment_5write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_9Alignment_6write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_9Alignment_7write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("alignment"), (PyCFunction)__pyx_pf_3_sa_9Alignment_8alignment, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_8alignment)},
   {0, 0, 0, 0}
 };
 
@@ -56713,7 +54413,7 @@ static PyObject *__pyx_tp_new_3_sa_BiLex(PyTypeObject *t, PyObject *a, PyObject
   p->id2fword = Py_None; Py_INCREF(Py_None);
   p->eword2id = Py_None; Py_INCREF(Py_None);
   p->fword2id = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_5BiLex_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_5BiLex___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56721,14 +54421,14 @@ static PyObject *__pyx_tp_new_3_sa_BiLex(PyTypeObject *t, PyObject *a, PyObject
 
 static void __pyx_tp_dealloc_3_sa_BiLex(PyObject *o) {
   struct __pyx_obj_3_sa_BiLex *p = (struct __pyx_obj_3_sa_BiLex *)o;
-  Py_CLEAR(p->col1);
-  Py_CLEAR(p->col2);
-  Py_CLEAR(p->f_index);
-  Py_CLEAR(p->e_index);
-  Py_CLEAR(p->id2eword);
-  Py_CLEAR(p->id2fword);
-  Py_CLEAR(p->eword2id);
-  Py_CLEAR(p->fword2id);
+  Py_XDECREF(((PyObject *)p->col1));
+  Py_XDECREF(((PyObject *)p->col2));
+  Py_XDECREF(((PyObject *)p->f_index));
+  Py_XDECREF(((PyObject *)p->e_index));
+  Py_XDECREF(p->id2eword);
+  Py_XDECREF(p->id2fword);
+  Py_XDECREF(p->eword2id);
+  Py_XDECREF(p->fword2id);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56793,14 +54493,14 @@ static int __pyx_tp_clear_3_sa_BiLex(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BiLex[] = {
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_5BiLex_3write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_5BiLex_5read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_e_id"), (PyCFunction)__pyx_pw_3_sa_5BiLex_7get_e_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_f_id"), (PyCFunction)__pyx_pw_3_sa_5BiLex_9get_f_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_5BiLex_11read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_5BiLex_13write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_score"), (PyCFunction)__pyx_pw_3_sa_5BiLex_15get_score, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_5BiLex_17write_text, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_5BiLex_16write_text)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_5BiLex_1write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_5BiLex_2read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_e_id"), (PyCFunction)__pyx_pf_3_sa_5BiLex_3get_e_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_f_id"), (PyCFunction)__pyx_pf_3_sa_5BiLex_4get_f_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_5BiLex_5read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_5BiLex_6write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_score"), (PyCFunction)__pyx_pf_3_sa_5BiLex_7get_score, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_5BiLex_8write_text, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_5BiLex_8write_text)},
   {0, 0, 0, 0}
 };
 
@@ -56958,7 +54658,7 @@ static PyTypeObject __pyx_type_3_sa_BiLex = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_BitSetIterator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_BitSetIterator(PyTypeObject *t, PyObject *a, PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   return o;
@@ -56969,7 +54669,7 @@ static void __pyx_tp_dealloc_3_sa_BitSetIterator(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BitSetIterator[] = {
-  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pw_3_sa_14BitSetIterator_1__next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pf_3_sa_14BitSetIterator___next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -57102,7 +54802,7 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  __pyx_pw_3_sa_14BitSetIterator_1__next__, /*tp_iternext*/
+  __pyx_pf_3_sa_14BitSetIterator___next__, /*tp_iternext*/
   __pyx_methods_3_sa_BitSetIterator, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
@@ -57127,10 +54827,10 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_BitSet(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_BitSet(PyTypeObject *t, PyObject *a, PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  if (__pyx_pw_3_sa_6BitSet_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pf_3_sa_6BitSet___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57141,7 +54841,7 @@ static void __pyx_tp_dealloc_3_sa_BitSet(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_6BitSet_3__dealloc__(o);
+    __pyx_pf_3_sa_6BitSet_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -57150,10 +54850,10 @@ static void __pyx_tp_dealloc_3_sa_BitSet(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BitSet[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_6BitSet_7insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pw_3_sa_6BitSet_9findsucc, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("min"), (PyCFunction)__pyx_pw_3_sa_6BitSet_13min, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("max"), (PyCFunction)__pyx_pw_3_sa_6BitSet_15max, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_6BitSet_3insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pf_3_sa_6BitSet_4findsucc, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("min"), (PyCFunction)__pyx_pf_3_sa_6BitSet_6min, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("max"), (PyCFunction)__pyx_pf_3_sa_6BitSet_7max, METH_NOARGS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -57216,20 +54916,20 @@ static PyNumberMethods __pyx_tp_as_number_BitSet = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_BitSet = {
-  __pyx_pw_3_sa_6BitSet_17__len__, /*sq_length*/
+  __pyx_pf_3_sa_6BitSet_8__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  __pyx_pw_3_sa_6BitSet_19__contains__, /*sq_contains*/
+  __pyx_pf_3_sa_6BitSet_9__contains__, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_BitSet = {
-  __pyx_pw_3_sa_6BitSet_17__len__, /*mp_length*/
+  __pyx_pf_3_sa_6BitSet_8__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -57275,7 +54975,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   &__pyx_tp_as_mapping_BitSet, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pw_3_sa_6BitSet_11__str__, /*tp_str*/
+  __pyx_pf_3_sa_6BitSet_5__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_BitSet, /*tp_as_buffer*/
@@ -57285,7 +54985,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pw_3_sa_6BitSet_5__iter__, /*tp_iter*/
+  __pyx_pf_3_sa_6BitSet_2__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_BitSet, /*tp_methods*/
   0, /*tp_members*/
@@ -57311,7 +55011,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_VEBIterator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_VEBIterator(PyTypeObject *t, PyObject *a, PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   return o;
@@ -57322,7 +55022,7 @@ static void __pyx_tp_dealloc_3_sa_VEBIterator(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_VEBIterator[] = {
-  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pw_3_sa_11VEBIterator_1__next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pf_3_sa_11VEBIterator___next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -57455,7 +55155,7 @@ static PyTypeObject __pyx_type_3_sa_VEBIterator = {
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  __pyx_pw_3_sa_11VEBIterator_1__next__, /*tp_iternext*/
+  __pyx_pf_3_sa_11VEBIterator___next__, /*tp_iternext*/
   __pyx_methods_3_sa_VEBIterator, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
@@ -57487,7 +55187,7 @@ static PyObject *__pyx_tp_new_3_sa_VEB(PyTypeObject *t, PyObject *a, PyObject *k
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_VEB *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_VEB;
-  if (__pyx_pw_3_sa_3VEB_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_3VEB___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57498,7 +55198,7 @@ static void __pyx_tp_dealloc_3_sa_VEB(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_3VEB_3__dealloc__(o);
+    __pyx_pf_3_sa_3VEB_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -57507,8 +55207,8 @@ static void __pyx_tp_dealloc_3_sa_VEB(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_VEB[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_3VEB_7insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pw_3_sa_3VEB_9findsucc, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_3VEB_3insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pf_3_sa_3VEB_4findsucc, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -57571,20 +55271,20 @@ static PyNumberMethods __pyx_tp_as_number_VEB = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_VEB = {
-  __pyx_pw_3_sa_3VEB_11__len__, /*sq_length*/
+  __pyx_pf_3_sa_3VEB_5__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  __pyx_pw_3_sa_3VEB_13__contains__, /*sq_contains*/
+  __pyx_pf_3_sa_3VEB_6__contains__, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_VEB = {
-  __pyx_pw_3_sa_3VEB_11__len__, /*mp_length*/
+  __pyx_pf_3_sa_3VEB_5__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -57640,7 +55340,7 @@ static PyTypeObject __pyx_type_3_sa_VEB = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pw_3_sa_3VEB_5__iter__, /*tp_iter*/
+  __pyx_pf_3_sa_3VEB_2__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_VEB, /*tp_methods*/
   0, /*tp_members*/
@@ -57673,7 +55373,7 @@ static PyObject *__pyx_tp_new_3_sa_LCP(PyTypeObject *t, PyObject *a, PyObject *k
   p = ((struct __pyx_obj_3_sa_LCP *)o);
   p->sa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
   p->lcp = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_3LCP_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_3LCP___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57681,8 +55381,8 @@ static PyObject *__pyx_tp_new_3_sa_LCP(PyTypeObject *t, PyObject *a, PyObject *k
 
 static void __pyx_tp_dealloc_3_sa_LCP(PyObject *o) {
   struct __pyx_obj_3_sa_LCP *p = (struct __pyx_obj_3_sa_LCP *)o;
-  Py_CLEAR(p->sa);
-  Py_CLEAR(p->lcp);
+  Py_XDECREF(((PyObject *)p->sa));
+  Py_XDECREF(((PyObject *)p->lcp));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -57711,7 +55411,7 @@ static int __pyx_tp_clear_3_sa_LCP(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_LCP[] = {
-  {__Pyx_NAMESTR("compute_stats"), (PyCFunction)__pyx_pw_3_sa_3LCP_3compute_stats, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_3LCP_2compute_stats)},
+  {__Pyx_NAMESTR("compute_stats"), (PyCFunction)__pyx_pf_3_sa_3LCP_1compute_stats, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_3LCP_1compute_stats)},
   {0, 0, 0, 0}
 };
 
@@ -57870,7 +55570,7 @@ static PyTypeObject __pyx_type_3_sa_LCP = {
 };
 static struct __pyx_vtabstruct_3_sa_Alphabet __pyx_vtable_3_sa_Alphabet;
 
-static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa_Alphabet *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -57879,7 +55579,7 @@ static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, CYTHON_UNUSED PyObj
   p->terminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
   p->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
   p->id2sym = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_8Alphabet_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pf_3_sa_8Alphabet___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57891,14 +55591,14 @@ static void __pyx_tp_dealloc_3_sa_Alphabet(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_8Alphabet_3__dealloc__(o);
+    __pyx_pf_3_sa_8Alphabet_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
   }
-  Py_CLEAR(p->terminals);
-  Py_CLEAR(p->nonterminals);
-  Py_CLEAR(p->id2sym);
+  Py_XDECREF(((PyObject *)p->terminals));
+  Py_XDECREF(((PyObject *)p->nonterminals));
+  Py_XDECREF(((PyObject *)p->id2sym));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -57932,12 +55632,12 @@ static int __pyx_tp_clear_3_sa_Alphabet(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_8Alphabet_9terminals_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_8Alphabet_9terminals___get__(o);
 }
 
-static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_8Alphabet_12nonterminals___get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Alphabet[] = {
@@ -58111,7 +55811,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieMap(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieMap *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_TrieMap;
-  if (__pyx_pw_3_sa_7TrieMap_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_7TrieMap___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -58122,7 +55822,7 @@ static void __pyx_tp_dealloc_3_sa_TrieMap(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_7TrieMap_3__dealloc__(o);
+    __pyx_pf_3_sa_7TrieMap_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -58131,9 +55831,9 @@ static void __pyx_tp_dealloc_3_sa_TrieMap(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_TrieMap[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_5insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("contains"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_7contains, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("toMap"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_9toMap, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_2insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("contains"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_3contains, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("toMap"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_4toMap, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -58300,7 +56000,7 @@ static PyObject *__pyx_tp_new_3_sa_Precomputation(PyTypeObject *t, PyObject *a,
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Precomputation;
   p->precomputed_index = Py_None; Py_INCREF(Py_None);
   p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_14Precomputation_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_14Precomputation___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -58308,8 +56008,8 @@ static PyObject *__pyx_tp_new_3_sa_Precomputation(PyTypeObject *t, PyObject *a,
 
 static void __pyx_tp_dealloc_3_sa_Precomputation(PyObject *o) {
   struct __pyx_obj_3_sa_Precomputation *p = (struct __pyx_obj_3_sa_Precomputation *)o;
-  Py_CLEAR(p->precomputed_index);
-  Py_CLEAR(p->precomputed_collocations);
+  Py_XDECREF(p->precomputed_index);
+  Py_XDECREF(p->precomputed_collocations);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -58338,9 +56038,9 @@ static int __pyx_tp_clear_3_sa_Precomputation(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Precomputation[] = {
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_3read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_5write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_7precompute, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_1read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_2write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_3precompute, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -58508,7 +56208,7 @@ static PyObject *__pyx_tp_new_3_sa_SuffixArray(PyTypeObject *t, PyObject *a, PyO
   p->darray = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
   p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->ha = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_11SuffixArray_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_11SuffixArray___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -58516,9 +56216,9 @@ static PyObject *__pyx_tp_new_3_sa_SuffixArray(PyTypeObject *t, PyObject *a, PyO
 
 static void __pyx_tp_dealloc_3_sa_SuffixArray(PyObject *o) {
   struct __pyx_obj_3_sa_SuffixArray *p = (struct __pyx_obj_3_sa_SuffixArray *)o;
-  Py_CLEAR(p->darray);
-  Py_CLEAR(p->sa);
-  Py_CLEAR(p->ha);
+  Py_XDECREF(((PyObject *)p->darray));
+  Py_XDECREF(((PyObject *)p->sa));
+  Py_XDECREF(((PyObject *)p->ha));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -58560,16 +56260,16 @@ static PyObject *__pyx_sq_item_3_sa_SuffixArray(PyObject *o, Py_ssize_t i) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_SuffixArray[] = {
-  {__Pyx_NAMESTR("getSentId"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_5getSentId, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSent"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_7getSent, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSentPos"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_9getSentPos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_11read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_10read_text)},
-  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_13q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_12q3sort)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_17read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_19write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_21write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_23lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSentId"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_2getSentId, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSent"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_3getSent, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSentPos"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_4getSentPos, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_5read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_5read_text)},
+  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_6q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_6q3sort)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_7write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_8read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_9write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_10write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_11lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -58646,7 +56346,7 @@ static PySequenceMethods __pyx_tp_as_sequence_SuffixArray = {
 
 static PyMappingMethods __pyx_tp_as_mapping_SuffixArray = {
   0, /*mp_length*/
-  __pyx_pw_3_sa_11SuffixArray_3__getitem__, /*mp_subscript*/
+  __pyx_pf_3_sa_11SuffixArray_1__getitem__, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
@@ -58727,13 +56427,13 @@ static PyTypeObject __pyx_type_3_sa_SuffixArray = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa_TrieNode *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieNode *)o);
   p->children = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_8TrieNode_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pf_3_sa_8TrieNode___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -58741,7 +56441,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, CYTHON_UNUSED PyObj
 
 static void __pyx_tp_dealloc_3_sa_TrieNode(PyObject *o) {
   struct __pyx_obj_3_sa_TrieNode *p = (struct __pyx_obj_3_sa_TrieNode *)o;
-  Py_CLEAR(p->children);
+  Py_XDECREF(p->children);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -58763,16 +56463,16 @@ static int __pyx_tp_clear_3_sa_TrieNode(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_8TrieNode_8children_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_8TrieNode_8children___get__(o);
 }
 
-static int __pyx_setprop_3_sa_8TrieNode_children(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_8TrieNode_children(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_8TrieNode_8children_3__set__(o, v);
+    return __pyx_pf_3_sa_8TrieNode_8children_1__set__(o, v);
   }
   else {
-    return __pyx_pw_3_sa_8TrieNode_8children_5__del__(o);
+    return __pyx_pf_3_sa_8TrieNode_8children_2__del__(o);
   }
 }
 
@@ -58947,7 +56647,7 @@ static PyObject *__pyx_tp_new_3_sa_ExtendedTrieNode(PyTypeObject *t, PyObject *a
   p->phrase = Py_None; Py_INCREF(Py_None);
   p->phrase_location = Py_None; Py_INCREF(Py_None);
   p->suffix_link = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_16ExtendedTrieNode___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -58955,9 +56655,9 @@ static PyObject *__pyx_tp_new_3_sa_ExtendedTrieNode(PyTypeObject *t, PyObject *a
 
 static void __pyx_tp_dealloc_3_sa_ExtendedTrieNode(PyObject *o) {
   struct __pyx_obj_3_sa_ExtendedTrieNode *p = (struct __pyx_obj_3_sa_ExtendedTrieNode *)o;
-  Py_CLEAR(p->phrase);
-  Py_CLEAR(p->phrase_location);
-  Py_CLEAR(p->suffix_link);
+  Py_XDECREF(p->phrase);
+  Py_XDECREF(p->phrase_location);
+  Py_XDECREF(p->suffix_link);
   __pyx_tp_dealloc_3_sa_TrieNode(o);
 }
 
@@ -58993,42 +56693,42 @@ static int __pyx_tp_clear_3_sa_ExtendedTrieNode(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(o, v);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(o, v);
   }
   else {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(o);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(o, v);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(o, v);
   }
   else {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(o);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(o, v);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(o, v);
   }
   else {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(o);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(o);
   }
 }
 
@@ -59203,7 +56903,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieTable(PyTypeObject *t, PyObject *a, PyObj
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieTable *)o);
   p->root = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_9TrieTable_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_9TrieTable___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -59211,7 +56911,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieTable(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_TrieTable(PyObject *o) {
   struct __pyx_obj_3_sa_TrieTable *p = (struct __pyx_obj_3_sa_TrieTable *)o;
-  Py_CLEAR(p->root);
+  Py_XDECREF(p->root);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -59233,13 +56933,13 @@ static int __pyx_tp_clear_3_sa_TrieTable(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_9TrieTable_8extended_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_9TrieTable_8extended___get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_9TrieTable_8extended_3__set__(o, v);
+    return __pyx_pf_3_sa_9TrieTable_8extended_1__set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -59247,13 +56947,13 @@ static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, CYTH
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_9TrieTable_5count_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_9TrieTable_5count___get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_9TrieTable_5count_3__set__(o, v);
+    return __pyx_pf_3_sa_9TrieTable_5count_1__set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -59261,16 +56961,16 @@ static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, CYTHON_
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_9TrieTable_4root_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_9TrieTable_4root___get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_root(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_root(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_9TrieTable_4root_3__set__(o, v);
+    return __pyx_pf_3_sa_9TrieTable_4root_1__set__(o, v);
   }
   else {
-    return __pyx_pw_3_sa_9TrieTable_4root_5__del__(o);
+    return __pyx_pf_3_sa_9TrieTable_4root_2__del__(o);
   }
 }
 
@@ -59447,7 +57147,7 @@ static PyObject *__pyx_tp_new_3_sa_PhraseLocation(PyTypeObject *t, PyObject *a,
   p = ((struct __pyx_obj_3_sa_PhraseLocation *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_PhraseLocation;
   p->arr = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_14PhraseLocation_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_14PhraseLocation___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -59455,7 +57155,7 @@ static PyObject *__pyx_tp_new_3_sa_PhraseLocation(PyTypeObject *t, PyObject *a,
 
 static void __pyx_tp_dealloc_3_sa_PhraseLocation(PyObject *o) {
   struct __pyx_obj_3_sa_PhraseLocation *p = (struct __pyx_obj_3_sa_PhraseLocation *)o;
-  Py_CLEAR(p->arr);
+  Py_XDECREF(((PyObject *)p->arr));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -59641,7 +57341,7 @@ static PyObject *__pyx_tp_new_3_sa_Sampler(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_Sampler *)o);
   p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_7Sampler_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_7Sampler___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -59649,7 +57349,7 @@ static PyObject *__pyx_tp_new_3_sa_Sampler(PyTypeObject *t, PyObject *a, PyObjec
 
 static void __pyx_tp_dealloc_3_sa_Sampler(PyObject *o) {
   struct __pyx_obj_3_sa_Sampler *p = (struct __pyx_obj_3_sa_Sampler *)o;
-  Py_CLEAR(p->sa);
+  Py_XDECREF(((PyObject *)p->sa));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -59672,7 +57372,7 @@ static int __pyx_tp_clear_3_sa_Sampler(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Sampler[] = {
-  {__Pyx_NAMESTR("sample"), (PyCFunction)__pyx_pw_3_sa_7Sampler_3sample, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_7Sampler_2sample)},
+  {__Pyx_NAMESTR("sample"), (PyCFunction)__pyx_pf_3_sa_7Sampler_1sample, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_7Sampler_1sample)},
   {0, 0, 0, 0}
 };
 
@@ -59853,7 +57553,7 @@ static PyObject *__pyx_tp_new_3_sa_HieroCachingRuleFactory(PyTypeObject *t, PyOb
   p->fid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->findexes = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->findexes1 = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -59861,22 +57561,22 @@ static PyObject *__pyx_tp_new_3_sa_HieroCachingRuleFactory(PyTypeObject *t, PyOb
 
 static void __pyx_tp_dealloc_3_sa_HieroCachingRuleFactory(PyObject *o) {
   struct __pyx_obj_3_sa_HieroCachingRuleFactory *p = (struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o;
-  Py_CLEAR(p->rules);
-  Py_CLEAR(p->sampler);
-  Py_CLEAR(p->scorer);
-  Py_CLEAR(p->precomputed_index);
-  Py_CLEAR(p->precomputed_collocations);
-  Py_CLEAR(p->precompute_file);
-  Py_CLEAR(p->max_rank);
-  Py_CLEAR(p->prev_norm_prefix);
-  Py_CLEAR(p->fsa);
-  Py_CLEAR(p->fda);
-  Py_CLEAR(p->eda);
-  Py_CLEAR(p->alignment);
-  Py_CLEAR(p->eid2symid);
-  Py_CLEAR(p->fid2symid);
-  Py_CLEAR(p->findexes);
-  Py_CLEAR(p->findexes1);
+  Py_XDECREF(((PyObject *)p->rules));
+  Py_XDECREF(((PyObject *)p->sampler));
+  Py_XDECREF(((PyObject *)p->scorer));
+  Py_XDECREF(p->precomputed_index);
+  Py_XDECREF(p->precomputed_collocations);
+  Py_XDECREF(p->precompute_file);
+  Py_XDECREF(p->max_rank);
+  Py_XDECREF(p->prev_norm_prefix);
+  Py_XDECREF(((PyObject *)p->fsa));
+  Py_XDECREF(((PyObject *)p->fda));
+  Py_XDECREF(((PyObject *)p->eda));
+  Py_XDECREF(((PyObject *)p->alignment));
+  Py_XDECREF(((PyObject *)p->eid2symid));
+  Py_XDECREF(((PyObject *)p->fid2symid));
+  Py_XDECREF(((PyObject *)p->findexes));
+  Py_XDECREF(((PyObject *)p->findexes1));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -59989,17 +57689,17 @@ static int __pyx_tp_clear_3_sa_HieroCachingRuleFactory(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_HieroCachingRuleFactory[] = {
-  {__Pyx_NAMESTR("configure"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_2configure)},
-  {__Pyx_NAMESTR("pattern2phrase"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("pattern2phrase_plus"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_precomputed_collocation"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("advance"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_all_nodes_isteps_away"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_23input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_22input)},
+  {__Pyx_NAMESTR("configure"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_1configure)},
+  {__Pyx_NAMESTR("pattern2phrase"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("pattern2phrase_plus"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_precomputed_collocation"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("advance"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_all_nodes_isteps_away"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_11input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_11input)},
   {0, 0, 0, 0}
 };
 
@@ -60158,7 +57858,7 @@ static PyTypeObject __pyx_type_3_sa_HieroCachingRuleFactory = {
 };
 static struct __pyx_vtabstruct_3_sa_Scorer __pyx_vtable_3_sa_Scorer;
 
-static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa_Scorer *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -60170,7 +57870,7 @@ static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, CYTHON_UNUSED PyObjec
 
 static void __pyx_tp_dealloc_3_sa_Scorer(PyObject *o) {
   struct __pyx_obj_3_sa_Scorer *p = (struct __pyx_obj_3_sa_Scorer *)o;
-  Py_CLEAR(p->models);
+  Py_XDECREF(p->models);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -60334,7 +58034,7 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  __pyx_pw_3_sa_6Scorer_1__init__, /*tp_init*/
+  __pyx_pf_3_sa_6Scorer___init__, /*tp_init*/
   0, /*tp_alloc*/
   __pyx_tp_new_3_sa_Scorer, /*tp_new*/
   0, /*tp_free*/
@@ -60350,10 +58050,220 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_Generator(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_Generator_object *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
+  p = ((struct __pyx_Generator_object *)o);
+  p->exc_type = 0;
+  p->exc_value = 0;
+  p->exc_traceback = 0;
+  return o;
+}
+
+static void __pyx_tp_dealloc_3_sa___pyx_Generator(PyObject *o) {
+  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
+  Py_XDECREF(p->exc_type);
+  Py_XDECREF(p->exc_value);
+  Py_XDECREF(p->exc_traceback);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_3_sa___pyx_Generator(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
+  if (p->exc_type) {
+    e = (*v)(p->exc_type, a); if (e) return e;
+  }
+  if (p->exc_value) {
+    e = (*v)(p->exc_value, a); if (e) return e;
+  }
+  if (p->exc_traceback) {
+    e = (*v)(p->exc_traceback, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_3_sa___pyx_Generator(PyObject *o) {
+  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
+  PyObject* tmp;
+  tmp = ((PyObject*)p->exc_type);
+  p->exc_type = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->exc_value);
+  p->exc_value = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->exc_traceback);
+  p->exc_traceback = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_3_sa___pyx_Generator[] = {
+  {__Pyx_NAMESTR("send"), (PyCFunction)__Pyx_Generator_Send, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("close"), (PyCFunction)__Pyx_Generator_Close, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("throw"), (PyCFunction)__Pyx_Generator_Throw, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number___pyx_Generator = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_divide*/
+  #endif
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_nonzero*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_coerce*/
+  #endif
+  0, /*nb_int*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_long*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*nb_float*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_oct*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_hex*/
+  #endif
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_inplace_divide*/
+  #endif
+  0, /*nb_inplace_remainder*/
+  0, /*nb_inplace_power*/
+  0, /*nb_inplace_lshift*/
+  0, /*nb_inplace_rshift*/
+  0, /*nb_inplace_and*/
+  0, /*nb_inplace_xor*/
+  0, /*nb_inplace_or*/
+  0, /*nb_floor_divide*/
+  0, /*nb_true_divide*/
+  0, /*nb_inplace_floor_divide*/
+  0, /*nb_inplace_true_divide*/
+  #if PY_VERSION_HEX >= 0x02050000
+  0, /*nb_index*/
+  #endif
+};
+
+static PySequenceMethods __pyx_tp_as_sequence___pyx_Generator = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  0, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping___pyx_Generator = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyBufferProcs __pyx_tp_as_buffer___pyx_Generator = {
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getreadbuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getwritebuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getsegcount*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getcharbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_getbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_releasebuffer*/
+  #endif
+};
+
+static PyTypeObject __pyx_Generator_type = {
+  PyVarObject_HEAD_INIT(0, 0)
+  __Pyx_NAMESTR("_sa.__pyx_Generator"), /*tp_name*/
+  sizeof(struct __pyx_Generator_object), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_3_sa___pyx_Generator, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  &__pyx_tp_as_number___pyx_Generator, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_Generator, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_Generator, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  &__pyx_tp_as_buffer___pyx_Generator, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_3_sa___pyx_Generator, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_Generator, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  PyObject_SelfIter, /*tp_iter*/
+  __Pyx_Generator_Next, /*tp_iternext*/
+  __pyx_methods_3_sa___pyx_Generator, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_3_sa___pyx_Generator, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p;
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o);
   p->__pyx_v_self = 0;
   return o;
@@ -60361,13 +58271,14 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct____iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -60377,8 +58288,9 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct____iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -60541,7 +58453,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct____iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -60552,7 +58464,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_1_read_bitext(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o;
-  Py_CLEAR(p->__pyx_v_fp);
+  Py_XDECREF(p->__pyx_v_fp);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -60732,9 +58644,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_1_read_bitext = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -60745,15 +58657,16 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_line);
-  Py_CLEAR(p->__pyx_t_0);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_line);
+  Py_XDECREF(p->__pyx_t_0);
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -60769,6 +58682,7 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -60939,9 +58853,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_2_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o);
   p->__pyx_v_ngram = 0;
@@ -60955,18 +58869,19 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObje
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
-  Py_CLEAR(p->__pyx_v_ngram);
-  Py_CLEAR(p->__pyx_v_ngram_start);
-  Py_CLEAR(p->__pyx_v_ngram_starts);
-  Py_CLEAR(p->__pyx_v_run_start);
-  Py_CLEAR(p->__pyx_v_self);
-  Py_CLEAR(p->__pyx_v_veb);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_v_ngram));
+  Py_XDECREF(((PyObject *)p->__pyx_v_ngram_start));
+  Py_XDECREF(((PyObject *)p->__pyx_v_ngram_starts));
+  Py_XDECREF(((PyObject *)p->__pyx_v_run_start));
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_XDECREF(((PyObject *)p->__pyx_v_veb));
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_ngram) {
     e = (*v)(p->__pyx_v_ngram, a); if (e) return e;
   }
@@ -60991,6 +58906,7 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_ngram);
   p->__pyx_v_ngram = ((PyObject*)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -61004,7 +58920,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   p->__pyx_v_run_start = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_LCP *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_veb);
   p->__pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)Py_None); Py_INCREF(Py_None);
@@ -61170,9 +59086,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_3_compute_stats = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o);
   p->__pyx_v_self = 0;
@@ -61181,13 +59097,14 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_4___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_4___iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -61197,8 +59114,9 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_4___iter__(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_4___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -61361,7 +59279,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_4___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -61372,7 +59290,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_5___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -61389,7 +59307,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_5___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
   PyObject* tmp;
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Rule *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -61552,9 +59470,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_5___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -61565,15 +59483,16 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_a);
-  Py_CLEAR(p->__pyx_t_0);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_a);
+  Py_XDECREF(p->__pyx_t_0);
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -61589,6 +59508,7 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -61759,9 +59679,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_6_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o);
   p->__pyx_v_point = 0;
@@ -61772,15 +59692,16 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
-  Py_CLEAR(p->__pyx_v_point);
-  Py_CLEAR(p->__pyx_v_self);
-  Py_CLEAR(p->__pyx_t_0);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(p->__pyx_v_point);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_XDECREF(p->__pyx_t_0);
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_point) {
     e = (*v)(p->__pyx_v_point, a); if (e) return e;
   }
@@ -61796,11 +59717,12 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments(PyObject *o, v
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_point);
   p->__pyx_v_point = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Rule *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_t_0);
   p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
@@ -61966,9 +59888,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_7_alignments = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o);
   p->__pyx_v_alignment = 0;
@@ -62015,67 +59937,68 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, C
   p->__pyx_v_xcat_index = 0;
   p->__pyx_v_xnode = 0;
   p->__pyx_v_xroot = 0;
-  p->__pyx_t_1 = 0;
+  p->__pyx_t_2 = 0;
+  p->__pyx_t_3 = 0;
   p->__pyx_t_4 = 0;
-  p->__pyx_t_5 = 0;
   return o;
 }
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
-  Py_CLEAR(p->__pyx_v_alignment);
-  Py_CLEAR(p->__pyx_v_als);
-  Py_CLEAR(p->__pyx_v_alslist);
-  Py_CLEAR(p->__pyx_v_chunklen);
-  Py_CLEAR(p->__pyx_v_count);
-  Py_CLEAR(p->__pyx_v_e);
-  Py_CLEAR(p->__pyx_v_elist);
-  Py_CLEAR(p->__pyx_v_extract);
-  Py_CLEAR(p->__pyx_v_extract_start);
-  Py_CLEAR(p->__pyx_v_extract_stop);
-  Py_CLEAR(p->__pyx_v_extracts);
-  Py_CLEAR(p->__pyx_v_f);
-  Py_CLEAR(p->__pyx_v_fcount);
-  Py_CLEAR(p->__pyx_v_fphrases);
-  Py_CLEAR(p->__pyx_v_frontier);
-  Py_CLEAR(p->__pyx_v_frontier_nodes);
-  Py_CLEAR(p->__pyx_v_fwords);
-  Py_CLEAR(p->__pyx_v_hiero_phrase);
-  Py_CLEAR(p->__pyx_v_is_shadow_path);
-  Py_CLEAR(p->__pyx_v_key);
-  Py_CLEAR(p->__pyx_v_loc);
-  Py_CLEAR(p->__pyx_v_locs);
-  Py_CLEAR(p->__pyx_v_new_frontier);
-  Py_CLEAR(p->__pyx_v_new_node);
-  Py_CLEAR(p->__pyx_v_next_states);
-  Py_CLEAR(p->__pyx_v_node);
-  Py_CLEAR(p->__pyx_v_nodes_isteps_away_buffer);
-  Py_CLEAR(p->__pyx_v_pathlen);
-  Py_CLEAR(p->__pyx_v_phrase);
-  Py_CLEAR(p->__pyx_v_phrase_location);
-  Py_CLEAR(p->__pyx_v_prefix);
-  Py_CLEAR(p->__pyx_v_reachable_buffer);
-  Py_CLEAR(p->__pyx_v_sa_range);
-  Py_CLEAR(p->__pyx_v_sample);
-  Py_CLEAR(p->__pyx_v_scores);
-  Py_CLEAR(p->__pyx_v_self);
-  Py_CLEAR(p->__pyx_v_spanlen);
-  Py_CLEAR(p->__pyx_v_stop_time);
-  Py_CLEAR(p->__pyx_v_suffix_link);
-  Py_CLEAR(p->__pyx_v_suffix_link_xcat_index);
-  Py_CLEAR(p->__pyx_v_word_id);
-  Py_CLEAR(p->__pyx_v_xcat_index);
-  Py_CLEAR(p->__pyx_v_xnode);
-  Py_CLEAR(p->__pyx_v_xroot);
-  Py_CLEAR(p->__pyx_t_1);
-  Py_CLEAR(p->__pyx_t_4);
-  Py_CLEAR(p->__pyx_t_5);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(p->__pyx_v_alignment);
+  Py_XDECREF(p->__pyx_v_als);
+  Py_XDECREF(p->__pyx_v_alslist);
+  Py_XDECREF(((PyObject *)p->__pyx_v_chunklen));
+  Py_XDECREF(p->__pyx_v_count);
+  Py_XDECREF(p->__pyx_v_e);
+  Py_XDECREF(p->__pyx_v_elist);
+  Py_XDECREF(p->__pyx_v_extract);
+  Py_XDECREF(p->__pyx_v_extract_start);
+  Py_XDECREF(p->__pyx_v_extract_stop);
+  Py_XDECREF(((PyObject *)p->__pyx_v_extracts));
+  Py_XDECREF(p->__pyx_v_f);
+  Py_XDECREF(p->__pyx_v_fcount);
+  Py_XDECREF(p->__pyx_v_fphrases);
+  Py_XDECREF(((PyObject *)p->__pyx_v_frontier));
+  Py_XDECREF(p->__pyx_v_frontier_nodes);
+  Py_XDECREF(p->__pyx_v_fwords);
+  Py_XDECREF(((PyObject *)p->__pyx_v_hiero_phrase));
+  Py_XDECREF(p->__pyx_v_is_shadow_path);
+  Py_XDECREF(((PyObject *)p->__pyx_v_key));
+  Py_XDECREF(p->__pyx_v_loc);
+  Py_XDECREF(((PyObject *)p->__pyx_v_locs));
+  Py_XDECREF(((PyObject *)p->__pyx_v_new_frontier));
+  Py_XDECREF(p->__pyx_v_new_node);
+  Py_XDECREF(((PyObject *)p->__pyx_v_next_states));
+  Py_XDECREF(p->__pyx_v_node);
+  Py_XDECREF(((PyObject *)p->__pyx_v_nodes_isteps_away_buffer));
+  Py_XDECREF(p->__pyx_v_pathlen);
+  Py_XDECREF(p->__pyx_v_phrase);
+  Py_XDECREF(((PyObject *)p->__pyx_v_phrase_location));
+  Py_XDECREF(p->__pyx_v_prefix);
+  Py_XDECREF(((PyObject *)p->__pyx_v_reachable_buffer));
+  Py_XDECREF(p->__pyx_v_sa_range);
+  Py_XDECREF(((PyObject *)p->__pyx_v_sample));
+  Py_XDECREF(((PyObject *)p->__pyx_v_scores));
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_XDECREF(p->__pyx_v_spanlen);
+  Py_XDECREF(p->__pyx_v_stop_time);
+  Py_XDECREF(p->__pyx_v_suffix_link);
+  Py_XDECREF(p->__pyx_v_suffix_link_xcat_index);
+  Py_XDECREF(p->__pyx_v_word_id);
+  Py_XDECREF(p->__pyx_v_xcat_index);
+  Py_XDECREF(p->__pyx_v_xnode);
+  Py_XDECREF(p->__pyx_v_xroot);
+  Py_XDECREF(p->__pyx_t_2);
+  Py_XDECREF(p->__pyx_t_3);
+  Py_XDECREF(p->__pyx_t_4);
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_alignment) {
     e = (*v)(p->__pyx_v_alignment, a); if (e) return e;
   }
@@ -62208,21 +60131,22 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitp
   if (p->__pyx_v_xroot) {
     e = (*v)(p->__pyx_v_xroot, a); if (e) return e;
   }
-  if (p->__pyx_t_1) {
-    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  if (p->__pyx_t_3) {
+    e = (*v)(p->__pyx_t_3, a); if (e) return e;
   }
   if (p->__pyx_t_4) {
     e = (*v)(p->__pyx_t_4, a); if (e) return e;
   }
-  if (p->__pyx_t_5) {
-    e = (*v)(p->__pyx_t_5, a); if (e) return e;
-  }
   return 0;
 }
 
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_alignment);
   p->__pyx_v_alignment = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -62329,7 +60253,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   p->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_spanlen);
   p->__pyx_v_spanlen = Py_None; Py_INCREF(Py_None);
@@ -62355,15 +60279,15 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   tmp = ((PyObject*)p->__pyx_v_xroot);
   p->__pyx_v_xroot = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_1);
-  p->__pyx_t_1 = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_t_2);
+  p->__pyx_t_2 = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_3);
+  p->__pyx_t_3 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_t_4);
   p->__pyx_t_4 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_5);
-  p->__pyx_t_5 = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
   return 0;
 }
 
@@ -62525,9 +60449,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_8_input = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o);
   p->__pyx_v_self = 0;
@@ -62536,13 +60460,14 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_9___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_9___iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -62552,8 +60477,9 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_9___iter__(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_9___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -62716,7 +60642,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_9___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -62727,7 +60653,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_10___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -62744,7 +60670,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_10___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
   PyObject* tmp;
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -62907,9 +60833,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_10___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -62920,15 +60846,16 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_feat);
-  Py_CLEAR(p->__pyx_t_0);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_feat);
+  Py_XDECREF(p->__pyx_t_0);
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -62944,6 +60871,7 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -63166,11 +61094,9 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_132, __pyx_k_132, sizeof(__pyx_k_132), 0, 0, 1, 0},
   {&__pyx_kp_s_133, __pyx_k_133, sizeof(__pyx_k_133), 0, 0, 1, 0},
   {&__pyx_kp_s_134, __pyx_k_134, sizeof(__pyx_k_134), 0, 0, 1, 0},
+  {&__pyx_kp_s_135, __pyx_k_135, sizeof(__pyx_k_135), 0, 0, 1, 0},
   {&__pyx_kp_s_137, __pyx_k_137, sizeof(__pyx_k_137), 0, 0, 1, 0},
-  {&__pyx_kp_s_138, __pyx_k_138, sizeof(__pyx_k_138), 0, 0, 1, 0},
   {&__pyx_kp_s_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 0, 1, 0},
-  {&__pyx_kp_s_142, __pyx_k_142, sizeof(__pyx_k_142), 0, 0, 1, 0},
-  {&__pyx_kp_s_143, __pyx_k_143, sizeof(__pyx_k_143), 0, 0, 1, 0},
   {&__pyx_kp_s_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 1, 0},
   {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
   {&__pyx_kp_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 0},
@@ -63431,9 +61357,9 @@ static int __Pyx_InitCachedBuiltins(void) {
 
 static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
+  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants");
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":20
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -63441,7 +61367,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.sent_index = IntList(1000,1000)
  */
   __pyx_k_tuple_10 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_10);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_10));
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -63450,7 +61376,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":21
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -63458,7 +61384,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.use_sent_id = use_sent_id
  */
   __pyx_k_tuple_11 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_11);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_11));
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_11, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -63467,7 +61393,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_11));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":22
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -63475,7 +61401,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if from_binary:
  */
   __pyx_k_tuple_12 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_12);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_12));
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_12, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -63484,7 +61410,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":65
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -63492,13 +61418,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def read_text(self, char* filename):
  */
   __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_15);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_15));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -63506,7 +61432,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 if w_id > 1:
  */
   __pyx_k_tuple_16 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_16);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_16));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63518,7 +61444,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -63526,7 +61452,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_17 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_17);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_17));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63538,7 +61464,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -63546,13 +61472,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_19 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_19);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_19));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_18));
   PyTuple_SET_ITEM(__pyx_k_tuple_19, 0, ((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_19));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -63560,7 +61486,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.read_text_data(data)
  */
   __pyx_k_tuple_20 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_20);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_20));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_20, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63572,7 +61498,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_20));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":143
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -63580,13 +61506,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%d " %i)
  */
   __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_22);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_22));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_22, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_22));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -63594,13 +61520,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%d " %i)
  */
   __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_23);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_23));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_23, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_23));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -63608,13 +61534,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%s %d " % (word, self.word2id[word]))
  */
   __pyx_k_tuple_24 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_24);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_24));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_24, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_24));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -63622,20 +61548,20 @@ static int __Pyx_InitCachedConstants(void) {
  *     def write_enhanced(self, char* filename):
  */
   __pyx_k_tuple_26 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_26)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_26);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_26));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_26, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_26));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.write_enhanced_handle(self, f)
  */
   __pyx_k_tuple_28 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_28);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_28));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_28, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63647,7 +61573,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_28));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":46
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":46
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -63655,7 +61581,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if from_binary:
  */
   __pyx_k_tuple_29 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_29)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_29);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_29));
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_29, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -63664,7 +61590,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_29));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":47
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":47
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -63672,7 +61598,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.read_binary(from_binary)
  */
   __pyx_k_tuple_30 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_30)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_30);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_30));
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_30, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -63681,7 +61607,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_30));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":59
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))             # <<<<<<<<<<<<<<
@@ -63689,13 +61615,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.sent_index.append(len(self.links))
  */
   __pyx_k_tuple_32 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_32)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_32);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_32));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_31));
   PyTuple_SET_ITEM(__pyx_k_tuple_32, 0, ((PyObject *)__pyx_kp_s_31));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_31));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_32));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -63703,7 +61629,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 self.sent_index.append(len(self.links))
  */
   __pyx_k_tuple_33 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_33)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_33);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_33));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_33, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63715,7 +61641,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_33));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":75
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":75
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -63723,13 +61649,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d-%d " % self.unlink(link))
  */
   __pyx_k_tuple_34 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_34)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_34);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_34));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_34, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_34));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":78
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -63737,13 +61663,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def write_binary(self, char* filename):
  */
   __pyx_k_tuple_36 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_36)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_36);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_36));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_36, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_36));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -63751,7 +61677,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for i, link in enumerate(self.links):
  */
   __pyx_k_tuple_37 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_37)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_37);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_37));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_37, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63763,7 +61689,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_37));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":92
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
  *                 f.write("%d " % link)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -63771,13 +61697,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % i)
  */
   __pyx_k_tuple_38 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_38)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_38);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_38));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_38, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_38));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":95
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -63785,13 +61711,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def alignment(self, i):
  */
   __pyx_k_tuple_39 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_39)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_39);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_39));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_39, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_39));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -63799,7 +61725,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for link in self.links:
  */
   __pyx_k_tuple_40 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_40)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_40);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_40));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_40, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63811,7 +61737,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_40));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":297
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":297
  * 
  *             # Re-read file, placing words into buckets
  *             f.seek(0)             # <<<<<<<<<<<<<<
@@ -63819,13 +61745,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 (fword, eword, score1, score2) = line.split()
  */
   __pyx_k_tuple_43 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_43)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_43);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_43));
   __Pyx_INCREF(__pyx_int_0);
   PyTuple_SET_ITEM(__pyx_k_tuple_43, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_43));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -63833,7 +61759,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for line in f:
  */
   __pyx_k_tuple_44 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_44)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_44);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_44));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_44, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63845,7 +61771,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_44));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":339
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":339
  * 
  *         if i > j:
  *             raise Exception("Sort error in CLex")             # <<<<<<<<<<<<<<
@@ -63853,13 +61779,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             return
  */
   __pyx_k_tuple_47 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_47)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_47);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_47));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_46));
   PyTuple_SET_ITEM(__pyx_k_tuple_47, 0, ((PyObject *)__pyx_kp_s_46));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_46));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_47));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":362
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -63867,13 +61793,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %f %f " % (i, s1, s2))
  */
   __pyx_k_tuple_49 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_49)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_49);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_49));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_49, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_49));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":365
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":365
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -63881,13 +61807,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %s " % (i, w))
  */
   __pyx_k_tuple_51 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_51)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_51);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_51));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_51, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_51));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":368
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -63895,13 +61821,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %s " % (i, w))
  */
   __pyx_k_tuple_53 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_53)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_53);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_53));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_53, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_53));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":371
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -63909,13 +61835,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_54 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_54)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_54);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_54));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_54, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_54));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -63923,7 +61849,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % i)
  */
   __pyx_k_tuple_55 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_55)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_55);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_55));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_55, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63935,7 +61861,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_55));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -63943,7 +61869,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             f_id = 0
  */
   __pyx_k_tuple_57 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_57)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_57);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_57));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_57, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63955,7 +61881,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_57));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":13
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
  * 
  *         logger.info("Constructing LCP array")             # <<<<<<<<<<<<<<
@@ -63963,13 +61889,13 @@ static int __Pyx_InitCachedConstants(void) {
  *         n = self.sa.sa.len
  */
   __pyx_k_tuple_61 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_61)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_61);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_61));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_60));
   PyTuple_SET_ITEM(__pyx_k_tuple_61, 0, ((PyObject *)__pyx_kp_s_60));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_60));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_61));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":34
  *             if h > 0:
  *                 h = h-1
  *         logger.info("LCP array completed")             # <<<<<<<<<<<<<<
@@ -63977,13 +61903,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def compute_stats(self, int max_n):
  */
   __pyx_k_tuple_63 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_63)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_63);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_63));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_62));
   PyTuple_SET_ITEM(__pyx_k_tuple_63, 0, ((PyObject *)__pyx_kp_s_62));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_62));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_63));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":297
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":297
  *         pattern_rank = {}
  * 
  *         logger.info("Precomputing frequent intersections")             # <<<<<<<<<<<<<<
@@ -63991,13 +61917,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_73 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_73)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_73);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_73));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_72));
   PyTuple_SET_ITEM(__pyx_k_tuple_73, 0, ((PyObject *)__pyx_kp_s_72));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_72));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_73));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":314
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":314
  *         queue = IntList(increment=1000)
  * 
  *         logger.info("    Computing inverted indexes...")             # <<<<<<<<<<<<<<
@@ -64005,13 +61931,13 @@ static int __Pyx_InitCachedConstants(void) {
  *         for i from 0 <= i < N:
  */
   __pyx_k_tuple_75 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_75)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_75);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_75));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_74));
   PyTuple_SET_ITEM(__pyx_k_tuple_75, 0, ((PyObject *)__pyx_kp_s_74));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_74));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_75));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":329
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":329
  *                     trie_node_data_append(node, i)
  * 
  *         logger.info("    Computing collocations...")             # <<<<<<<<<<<<<<
@@ -64019,13 +61945,13 @@ static int __Pyx_InitCachedConstants(void) {
  *         ptr1 = 0
  */
   __pyx_k_tuple_77 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_77)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_77);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_77));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_76));
   PyTuple_SET_ITEM(__pyx_k_tuple_77, 0, ((PyObject *)__pyx_kp_s_76));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_76));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_77));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":393
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":393
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -64033,13 +61959,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_79 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_79)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_79);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_79));
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_79, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_79));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":400
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":400
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -64047,13 +61973,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_80 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_80)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_80);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_80));
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_80, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_80));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":407
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":407
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -64061,13 +61987,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  */
   __pyx_k_tuple_81 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_81)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_81);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_81));
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_81, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_81));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":409
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":409
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1             # <<<<<<<<<<<<<<
@@ -64075,13 +62001,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_82 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_82)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_82);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_82));
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_82, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_82));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":103
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":103
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
@@ -64089,13 +62015,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             j = isa.arr[i]
  */
   __pyx_k_tuple_93 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_93)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_93);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_93));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_92));
   PyTuple_SET_ITEM(__pyx_k_tuple_93, 0, ((PyObject *)__pyx_kp_s_92));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_92));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_93));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":202
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":202
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -64103,13 +62029,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % w_i)
  */
   __pyx_k_tuple_96 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_96)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_96);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_96));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_96, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_96));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":205
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":205
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -64117,13 +62043,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
   __pyx_k_tuple_97 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_97)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_97);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_97));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_97, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_97));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -64131,7 +62057,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for a_i in self.sa:
  */
   __pyx_k_tuple_98 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_98)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_98);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_98));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_98, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -64143,7 +62069,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_98));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":105
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
@@ -64151,13 +62077,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def sample(self, PhraseLocation phrase_location):
  */
   __pyx_k_tuple_102 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_102)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_102);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_102));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_101));
   PyTuple_SET_ITEM(__pyx_k_tuple_102, 0, ((PyObject *)__pyx_kp_s_101));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_101));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_102));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":314
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":314
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
@@ -64165,13 +62091,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_107 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_107)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_107);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_107));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_106));
   PyTuple_SET_ITEM(__pyx_k_tuple_107, 0, ((PyObject *)__pyx_kp_s_106));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_106));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_107));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1020
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1020
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
@@ -64179,30 +62105,12 @@ static int __Pyx_InitCachedConstants(void) {
  *                 if lookup_required:
  */
   __pyx_k_tuple_122 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_122)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_122);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_122));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_121));
   PyTuple_SET_ITEM(__pyx_k_tuple_122, 0, ((PyObject *)__pyx_kp_s_121));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_121));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_122));
 
-  /* "_sa.pyx":9
- *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
- * 
- * def gzip_or_text(char* filename):             # <<<<<<<<<<<<<<
- *     if filename.endswith('.gz'):
- *         return gzip.GzipFile(filename)
- */
-  __pyx_k_tuple_135 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_135)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_135);
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
-  PyTuple_SET_ITEM(__pyx_k_tuple_135, 0, ((PyObject *)__pyx_n_s__filename));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
-  PyTuple_SET_ITEM(__pyx_k_tuple_135, 1, ((PyObject *)__pyx_n_s__filename));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_135));
-  __pyx_k_codeobj_136 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_135, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_137, __pyx_n_s__gzip_or_text, 9, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_136)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
   /* "_sa.pyx":15
  *         return open(filename)
  * 
@@ -64210,29 +62118,12 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  * include "float_list.pxi"
  */
-  __pyx_k_tuple_139 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_139)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_139);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_138));
-  PyTuple_SET_ITEM(__pyx_k_tuple_139, 0, ((PyObject *)__pyx_kp_s_138));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_138));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_139));
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":104
- *     return ALPHABET.setindex(sym, id)
- * 
- * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
- *     return ALPHABET.fromstring(string, terminal)
- */
-  __pyx_k_tuple_140 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_140)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_140);
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__string));
-  PyTuple_SET_ITEM(__pyx_k_tuple_140, 0, ((PyObject *)__pyx_n_s__string));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__string));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__terminal));
-  PyTuple_SET_ITEM(__pyx_k_tuple_140, 1, ((PyObject *)__pyx_n_s__terminal));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__terminal));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_140));
-  __pyx_k_codeobj_141 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_140, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_142, __pyx_n_s__sym_fromstring, 104, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_141)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_136 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_136)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_136));
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_135));
+  PyTuple_SET_ITEM(__pyx_k_tuple_136, 0, ((PyObject *)__pyx_kp_s_135));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_135));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_136));
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -64241,6 +62132,9 @@ static int __Pyx_InitCachedConstants(void) {
 }
 
 static int __Pyx_InitGlobals(void) {
+  #if PY_VERSION_HEX < 0x02040000
+  if (unlikely(__Pyx_Py23SetsImport() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
   if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
@@ -64279,18 +62173,12 @@ PyMODINIT_FUNC PyInit__sa(void)
           Py_FatalError("failed to import 'refnanny' module");
   }
   #endif
-  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__sa(void)", 0);
+  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__sa(void)");
   if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #ifdef __Pyx_CyFunction_USED
-  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #endif
-  #ifdef __Pyx_FusedFunction_USED
-  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #endif
-  #ifdef __Pyx_Generator_USED
-  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #ifdef __pyx_binding_PyCFunctionType_USED
+  if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   /*--- Library function declarations ---*/
   /*--- Threads initialization code ---*/
@@ -64301,15 +62189,16 @@ PyMODINIT_FUNC PyInit__sa(void)
   #endif
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_sa"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
+  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_sa"), __pyx_methods, 0, 0, PYTHON_API_VERSION);
   #else
   __pyx_m = PyModule_Create(&__pyx_moduledef);
   #endif
-  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #if CYTHON_COMPILING_IN_PYPY
-  Py_INCREF(__pyx_b);
+  if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  #if PY_MAJOR_VERSION < 3
+  Py_INCREF(__pyx_m);
   #endif
+  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
+  if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   /*--- Initialize various global constants etc. ---*/
   if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -64446,10 +62335,10 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetAttrString(__pyx_m, "Precomputation", (PyObject *)&__pyx_type_3_sa_Precomputation) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Precomputation = &__pyx_type_3_sa_Precomputation;
   __pyx_vtabptr_3_sa_SuffixArray = &__pyx_vtable_3_sa_SuffixArray;
-  __pyx_vtable_3_sa_SuffixArray.__pyx___search_high = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_high;
-  __pyx_vtable_3_sa_SuffixArray.__pyx___search_low = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_low;
-  __pyx_vtable_3_sa_SuffixArray.__pyx___get_range = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int))__pyx_f_3_sa_11SuffixArray___get_range;
-  __pyx_vtable_3_sa_SuffixArray.__pyx___lookup_helper = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___lookup_helper;
+  __pyx_vtable_3_sa_SuffixArray.__search_high = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_high;
+  __pyx_vtable_3_sa_SuffixArray.__search_low = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_low;
+  __pyx_vtable_3_sa_SuffixArray.__get_range = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int))__pyx_f_3_sa_11SuffixArray___get_range;
+  __pyx_vtable_3_sa_SuffixArray.__lookup_helper = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___lookup_helper;
   if (PyType_Ready(&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetVtable(__pyx_type_3_sa_SuffixArray.tp_dict, __pyx_vtabptr_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "SuffixArray", (PyObject *)&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -64499,28 +62388,39 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetVtable(__pyx_type_3_sa_Scorer.tp_dict, __pyx_vtabptr_3_sa_Scorer) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "Scorer", (PyObject *)&__pyx_type_3_sa_Scorer) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Scorer = &__pyx_type_3_sa_Scorer;
+  if (PyType_Ready(&__pyx_Generator_type) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_Generator = &__pyx_Generator_type;
+  __pyx_type_3_sa___pyx_scope_struct____iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct____iter__) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct____iter__ = &__pyx_type_3_sa___pyx_scope_struct____iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_1_read_bitext) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = &__pyx_type_3_sa___pyx_scope_struct_1_read_bitext;
+  __pyx_type_3_sa___pyx_scope_struct_2_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = &__pyx_type_3_sa___pyx_scope_struct_2_genexpr;
+  __pyx_type_3_sa___pyx_scope_struct_3_compute_stats.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_3_compute_stats) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats = &__pyx_type_3_sa___pyx_scope_struct_3_compute_stats;
+  __pyx_type_3_sa___pyx_scope_struct_4___iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_4___iter__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_4___iter__ = &__pyx_type_3_sa___pyx_scope_struct_4___iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_5___str__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_5___str__ = &__pyx_type_3_sa___pyx_scope_struct_5___str__;
+  __pyx_type_3_sa___pyx_scope_struct_6_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_6_genexpr) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_6_genexpr = &__pyx_type_3_sa___pyx_scope_struct_6_genexpr;
+  __pyx_type_3_sa___pyx_scope_struct_7_alignments.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_7_alignments) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_7_alignments = &__pyx_type_3_sa___pyx_scope_struct_7_alignments;
+  __pyx_type_3_sa___pyx_scope_struct_8_input.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_8_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_8_input = &__pyx_type_3_sa___pyx_scope_struct_8_input;
+  __pyx_type_3_sa___pyx_scope_struct_9___iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_9___iter__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_9___iter__ = &__pyx_type_3_sa___pyx_scope_struct_9___iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_10___str__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_10___str__ = &__pyx_type_3_sa___pyx_scope_struct_10___str__;
+  __pyx_type_3_sa___pyx_scope_struct_11_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_11_genexpr) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_11_genexpr = &__pyx_type_3_sa___pyx_scope_struct_11_genexpr;
   /*--- Type import code ---*/
@@ -64568,7 +62468,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  *     if filename.endswith('.gz'):
  *         return gzip.GzipFile(filename)
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_1gzip_or_text, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_gzip_or_text, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gzip_or_text, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -64585,13 +62485,13 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__getLogger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_139), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_136), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__logger, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
  *     cdef id2eword, id2fword, eword2id, fword2id
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
@@ -64604,7 +62504,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":17
  * from libc.string cimport memset
  * 
  * cdef int MIN_BOTTOM_SIZE = 32             # <<<<<<<<<<<<<<
@@ -64613,7 +62513,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MIN_BOTTOM_SIZE = 32;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":18
  * 
  * cdef int MIN_BOTTOM_SIZE = 32
  * cdef int MIN_BOTTOM_BITS = 5             # <<<<<<<<<<<<<<
@@ -64622,7 +62522,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MIN_BOTTOM_BITS = 5;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":28
  *         LOWER_MASK[i] = mask
  * 
  * _init_lower_mask()             # <<<<<<<<<<<<<<
@@ -64631,7 +62531,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_f_3_sa__init_lower_mask();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":4
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":4
  * from libc.stdlib cimport malloc, realloc, strtol
  * 
  * cdef int INDEX_SHIFT = 3             # <<<<<<<<<<<<<<
@@ -64640,7 +62540,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_INDEX_SHIFT = 3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":5
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":5
  * 
  * cdef int INDEX_SHIFT = 3
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1             # <<<<<<<<<<<<<<
@@ -64649,7 +62549,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_INDEX_MASK = ((1 << __pyx_v_3_sa_INDEX_SHIFT) - 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":87
  *             return self.terminals.index(s)
  * 
  * cdef Alphabet ALPHABET = Alphabet()             # <<<<<<<<<<<<<<
@@ -64664,18 +62564,18 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_v_3_sa_ALPHABET = ((struct __pyx_obj_3_sa_Alphabet *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":104
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
  *     return ALPHABET.setindex(sym, id)
  * 
  * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
  *     return ALPHABET.fromstring(string, terminal)
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_3sym_fromstring, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_1sym_fromstring, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sym_fromstring, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":5
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":5
  * # Much faster than the Python numbers reported there.
  * # Note to reader: this code is closer to C than Python
  * import gc             # <<<<<<<<<<<<<<
@@ -64687,7 +62587,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gc, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":6
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":6
  * # Note to reader: this code is closer to C than Python
  * import gc
  * import itertools             # <<<<<<<<<<<<<<
@@ -64699,7 +62599,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__itertools, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":12
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":12
  * from libc.math cimport fmod, ceil, floor, log
  * 
  * from collections import defaultdict, Counter, namedtuple             # <<<<<<<<<<<<<<
@@ -64707,7 +62607,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  * FeatureContext = namedtuple('FeatureContext',
  */
   __pyx_t_1 = PyList_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__defaultdict));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__defaultdict));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__defaultdict));
@@ -64720,33 +62620,21 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__collections), ((PyObject *)__pyx_t_1), -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__defaultdict);
-  if (__pyx_t_1 == NULL) {
-    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__defaultdict);
-    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__defaultdict, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Counter);
-  if (__pyx_t_1 == NULL) {
-    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__Counter);
-    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Counter); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__Counter, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__namedtuple);
-  if (__pyx_t_1 == NULL) {
-    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__namedtuple);
-    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__namedtuple, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":14
  * from collections import defaultdict, Counter, namedtuple
  * 
  * FeatureContext = namedtuple('FeatureContext',             # <<<<<<<<<<<<<<
@@ -64756,7 +62644,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":15
  * 
  * FeatureContext = namedtuple('FeatureContext',
  *     ['fphrase',             # <<<<<<<<<<<<<<
@@ -64764,7 +62652,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  *      'paircount',
  */
   __pyx_t_1 = PyList_New(8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__fphrase));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__fphrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fphrase));
@@ -64790,7 +62678,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   PyList_SET_ITEM(__pyx_t_1, 7, ((PyObject *)__pyx_n_s__test_sentence));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__test_sentence));
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__FeatureContext));
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_n_s__FeatureContext));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__FeatureContext));
@@ -64804,7 +62692,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FeatureContext, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":25
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":25
  *     ])
  * 
  * cdef int PRECOMPUTE = 0             # <<<<<<<<<<<<<<
@@ -64813,7 +62701,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_PRECOMPUTE = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":26
  * 
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1             # <<<<<<<<<<<<<<
@@ -64822,7 +62710,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MERGE = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":27
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1
  * cdef int BAEZA_YATES = 2             # <<<<<<<<<<<<<<
@@ -64831,7 +62719,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_BAEZA_YATES = 2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":30
  * 
  * # NOTE: was encoded as a non-terminal in the previous version
  * cdef int EPSILON = sym_fromstring('*EPS*', True)             # <<<<<<<<<<<<<<
@@ -64843,10 +62731,10 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_3 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_143));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_143));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_143));
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_137));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_137));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_137));
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -64858,7 +62746,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_v_3_sa_EPSILON = __pyx_t_4;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":53
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":53
  *     cdef public int count
  *     cdef public root
  *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
@@ -64871,7 +62759,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":1
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":1
  * cdef StringMap FD = StringMap() # Feature name dictionary             # <<<<<<<<<<<<<<
  * 
  * INITIAL_CAPACITY = 7 # default number of features
@@ -64884,7 +62772,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_v_3_sa_FD = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":3
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":3
  * cdef StringMap FD = StringMap() # Feature name dictionary
  * 
  * INITIAL_CAPACITY = 7 # default number of features             # <<<<<<<<<<<<<<
@@ -64893,7 +62781,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__INITIAL_CAPACITY, __pyx_int_7) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 3; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":4
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":4
  * 
  * INITIAL_CAPACITY = 7 # default number of features
  * INCREMENT = INITIAL_CAPACITY # double size             # <<<<<<<<<<<<<<
@@ -64935,6 +62823,7 @@ PyMODINIT_FUNC PyInit__sa(void)
 }
 
 /* Runtime support code */
+
 #if CYTHON_REFNANNY
 static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
     PyObject *m = NULL, *p = NULL;
@@ -64966,6 +62855,92 @@ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
     return result;
 }
 
+static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
+                                         Py_ssize_t end, int direction)
+{
+    const char* self_ptr = PyBytes_AS_STRING(self);
+    Py_ssize_t self_len = PyBytes_GET_SIZE(self);
+    const char* sub_ptr;
+    Py_ssize_t sub_len;
+    int retval;
+
+#if PY_VERSION_HEX >= 0x02060000
+    Py_buffer view;
+    view.obj = NULL;
+#endif
+
+    if ( PyBytes_Check(arg) ) {
+        sub_ptr = PyBytes_AS_STRING(arg);
+        sub_len = PyBytes_GET_SIZE(arg);
+    }
+#if PY_MAJOR_VERSION < 3
+    // Python 2.x allows mixing unicode and str
+    else if ( PyUnicode_Check(arg) ) {
+        return PyUnicode_Tailmatch(self, arg, start, end, direction);
+    }
+#endif
+    else {
+#if PY_VERSION_HEX < 0x02060000
+        if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
+            return -1;
+#else
+        if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
+            return -1;
+        sub_ptr = (const char*) view.buf;
+        sub_len = view.len;
+#endif
+    }
+
+    if (end > self_len)
+        end = self_len;
+    else if (end < 0)
+        end += self_len;
+    if (end < 0)
+        end = 0;
+    if (start < 0)
+        start += self_len;
+    if (start < 0)
+        start = 0;
+
+    if (direction > 0) {
+        /* endswith */
+        if (end-sub_len > start)
+            start = end - sub_len;
+    }
+
+    if (start + sub_len <= end)
+        retval = !memcmp(self_ptr+start, sub_ptr, sub_len);
+    else
+        retval = 0;
+
+#if PY_VERSION_HEX >= 0x02060000
+    if (view.obj)
+        PyBuffer_Release(&view);
+#endif
+
+    return retval;
+}
+
+static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
+                                   Py_ssize_t end, int direction)
+{
+    if (unlikely(PyTuple_Check(substr))) {
+        int result;
+        Py_ssize_t i;
+        for (i = 0; i < PyTuple_GET_SIZE(substr); i++) {
+            result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
+                                                   start, end, direction);
+            if (result) {
+                return result;
+            }
+        }
+        return 0;
+    }
+
+    return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
+}
+
+
 static void __Pyx_RaiseDoubleKeywordsError(
     const char* func_name,
     PyObject* kw_name)
@@ -64975,7 +62950,7 @@ static void __Pyx_RaiseDoubleKeywordsError(
         "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
         #else
         "%s() got multiple values for keyword argument '%s'", func_name,
-        PyString_AsString(kw_name));
+        PyString_AS_STRING(kw_name));
         #endif
 }
 
@@ -64991,77 +62966,55 @@ static int __Pyx_ParseOptionalKeywords(
     Py_ssize_t pos = 0;
     PyObject*** name;
     PyObject*** first_kw_arg = argnames + num_pos_args;
+
     while (PyDict_Next(kwds, &pos, &key, &value)) {
         name = first_kw_arg;
         while (*name && (**name != key)) name++;
         if (*name) {
             values[name-argnames] = value;
-            continue;
-        }
-        name = first_kw_arg;
-        #if PY_MAJOR_VERSION < 3
-        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
-            while (*name) {
-                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
-                        && _PyString_Eq(**name, key)) {
-                    values[name-argnames] = value;
-                    break;
-                }
-                name++;
-            }
-            if (*name) continue;
-            else {
-                PyObject*** argname = argnames;
-                while (argname != first_kw_arg) {
-                    if ((**argname == key) || (
-                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
-                             && _PyString_Eq(**argname, key))) {
-                        goto arg_passed_twice;
-                    }
-                    argname++;
+        } else {
+            #if PY_MAJOR_VERSION < 3
+            if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) {
+            #else
+            if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) {
+            #endif
+                goto invalid_keyword_type;
+            } else {
+                for (name = first_kw_arg; *name; name++) {
+                    #if PY_MAJOR_VERSION >= 3
+                    if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
+                        PyUnicode_Compare(**name, key) == 0) break;
+                    #else
+                    if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
+                        _PyString_Eq(**name, key)) break;
+                    #endif
                 }
-            }
-        } else
-        #endif
-        if (likely(PyUnicode_Check(key))) {
-            while (*name) {
-                int cmp = (**name == key) ? 0 :
-                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
-                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
-                #endif
-                    PyUnicode_Compare(**name, key);
-                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
-                if (cmp == 0) {
+                if (*name) {
                     values[name-argnames] = value;
-                    break;
-                }
-                name++;
-            }
-            if (*name) continue;
-            else {
-                PyObject*** argname = argnames;
-                while (argname != first_kw_arg) {
-                    int cmp = (**argname == key) ? 0 :
-                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
-                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
-                    #endif
-                        PyUnicode_Compare(**argname, key);
-                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
-                    if (cmp == 0) goto arg_passed_twice;
-                    argname++;
+                } else {
+                    /* unexpected keyword found */
+                    for (name=argnames; name != first_kw_arg; name++) {
+                        if (**name == key) goto arg_passed_twice;
+                        #if PY_MAJOR_VERSION >= 3
+                        if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
+                            PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice;
+                        #else
+                        if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
+                            _PyString_Eq(**name, key)) goto arg_passed_twice;
+                        #endif
+                    }
+                    if (kwds2) {
+                        if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
+                    } else {
+                        goto invalid_keyword;
+                    }
                 }
             }
-        } else
-            goto invalid_keyword_type;
-        if (kwds2) {
-            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
-        } else {
-            goto invalid_keyword;
         }
     }
     return 0;
 arg_passed_twice:
-    __Pyx_RaiseDoubleKeywordsError(function_name, key);
+    __Pyx_RaiseDoubleKeywordsError(function_name, **name);
     goto bad;
 invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
@@ -65089,6 +63042,7 @@ static void __Pyx_RaiseArgtupleInvalid(
 {
     Py_ssize_t num_expected;
     const char *more_or_less;
+
     if (num_found < num_min) {
         num_expected = num_min;
         more_or_less = "at least";
@@ -65100,15 +63054,15 @@ static void __Pyx_RaiseArgtupleInvalid(
         more_or_less = "exactly";
     }
     PyErr_Format(PyExc_TypeError,
-                 "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)",
+                 "%s() takes %s %"PY_FORMAT_SIZE_T"d positional argument%s (%"PY_FORMAT_SIZE_T"d given)",
                  func_name, more_or_less, num_expected,
                  (num_expected == 1) ? "" : "s", num_found);
 }
 
 static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
+
     tmp_type = tstate->curexc_type;
     tmp_value = tstate->curexc_value;
     tmp_tb = tstate->curexc_traceback;
@@ -65118,60 +63072,55 @@ static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyOb
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
-#else
-    PyErr_Restore(type, value, tb);
-#endif
 }
+
 static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->curexc_type;
     *value = tstate->curexc_value;
     *tb = tstate->curexc_traceback;
+
     tstate->curexc_type = 0;
     tstate->curexc_value = 0;
     tstate->curexc_traceback = 0;
-#else
-    PyErr_Fetch(type, value, tb);
-#endif
 }
 
+
 #if PY_MAJOR_VERSION < 3
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
-                        CYTHON_UNUSED PyObject *cause) {
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
+    /* cause is unused */
     Py_XINCREF(type);
-    if (!value || value == Py_None)
-        value = NULL;
-    else
+    Py_XINCREF(value);
+    Py_XINCREF(tb);
+    /* First, check the traceback argument, replacing None with NULL. */
+    if (tb == Py_None) {
+        Py_DECREF(tb);
+        tb = 0;
+    }
+    else if (tb != NULL && !PyTraceBack_Check(tb)) {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: arg 3 must be a traceback or None");
+        goto raise_error;
+    }
+    /* Next, replace a missing value with None */
+    if (value == NULL) {
+        value = Py_None;
         Py_INCREF(value);
-    if (!tb || tb == Py_None)
-        tb = NULL;
-    else {
-        Py_INCREF(tb);
-        if (!PyTraceBack_Check(tb)) {
-            PyErr_SetString(PyExc_TypeError,
-                "raise: arg 3 must be a traceback or None");
-            goto raise_error;
-        }
     }
     #if PY_VERSION_HEX < 0x02050000
-    if (PyClass_Check(type)) {
+    if (!PyClass_Check(type))
     #else
-    if (PyType_Check(type)) {
+    if (!PyType_Check(type))
     #endif
-#if CYTHON_COMPILING_IN_PYPY
-        if (!value) {
-            Py_INCREF(Py_None);
-            value = Py_None;
-        }
-#endif
-        PyErr_NormalizeException(&type, &value, &tb);
-    } else {
-        if (value) {
+    {
+        /* Raising an instance.  The value should be a dummy. */
+        if (value != Py_None) {
             PyErr_SetString(PyExc_TypeError,
                 "instance exception may not have a separate value");
             goto raise_error;
         }
+        /* Normalize to raise <class>, <instance> */
+        Py_DECREF(value);
         value = type;
         #if PY_VERSION_HEX < 0x02050000
             if (PyInstance_Check(type)) {
@@ -65194,6 +63143,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
             }
         #endif
     }
+
     __Pyx_ErrRestore(type, value, tb);
     return;
 raise_error:
@@ -65202,9 +63152,10 @@ raise_error:
     Py_XDECREF(tb);
     return;
 }
+
 #else /* Python 3+ */
+
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
-    PyObject* owned_instance = NULL;
     if (tb == Py_None) {
         tb = 0;
     } else if (tb && !PyTraceBack_Check(tb)) {
@@ -65214,6 +63165,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
     }
     if (value == Py_None)
         value = 0;
+
     if (PyExceptionInstance_Check(type)) {
         if (value) {
             PyErr_SetString(PyExc_TypeError,
@@ -65222,36 +63174,13 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
         }
         value = type;
         type = (PyObject*) Py_TYPE(value);
-    } else if (PyExceptionClass_Check(type)) {
-        PyObject *args;
-        if (!value)
-            args = PyTuple_New(0);
-        else if (PyTuple_Check(value)) {
-            Py_INCREF(value);
-            args = value;
-        }
-        else
-            args = PyTuple_Pack(1, value);
-        if (!args)
-            goto bad;
-        owned_instance = PyEval_CallObject(type, args);
-        Py_DECREF(args);
-        if (!owned_instance)
-            goto bad;
-        value = owned_instance;
-        if (!PyExceptionInstance_Check(value)) {
-            PyErr_Format(PyExc_TypeError,
-                         "calling %R should have returned an instance of "
-                         "BaseException, not %R",
-                         type, Py_TYPE(value));
-            goto bad;
-        }
-    } else {
+    } else if (!PyExceptionClass_Check(type)) {
         PyErr_SetString(PyExc_TypeError,
             "raise: exception class must be a subclass of BaseException");
         goto bad;
     }
-    if (cause && cause != Py_None) {
+
+    if (cause) {
         PyObject *fixed_cause;
         if (PyExceptionClass_Check(cause)) {
             fixed_cause = PyObject_CallObject(cause, NULL);
@@ -65268,9 +63197,14 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
                             "BaseException");
             goto bad;
         }
+        if (!value) {
+            value = PyObject_CallObject(type, NULL);
+        }
         PyException_SetCause(value, fixed_cause);
     }
+
     PyErr_SetObject(type, value);
+
     if (tb) {
         PyThreadState *tstate = PyThreadState_GET();
         PyObject* tmp_tb = tstate->curexc_traceback;
@@ -65280,8 +63214,8 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             Py_XDECREF(tmp_tb);
         }
     }
+
 bad:
-    Py_XDECREF(owned_instance);
     return;
 }
 #endif
@@ -65305,17 +63239,13 @@ static CYTHON_INLINE int __Pyx_CheckKeywordStrings(
 {
     PyObject* key = 0;
     Py_ssize_t pos = 0;
-#if CPYTHON_COMPILING_IN_PYPY
-    if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0))
-        goto invalid_keyword;
-    return 1;
-#else
     while (PyDict_Next(kwdict, &pos, &key, 0)) {
         #if PY_MAJOR_VERSION < 3
         if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key)))
+        #else
+        if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key)))
         #endif
-            if (unlikely(!PyUnicode_Check(key)))
-                goto invalid_keyword_type;
+            goto invalid_keyword_type;
     }
     if ((!kw_allowed) && unlikely(key))
         goto invalid_keyword;
@@ -65324,7 +63254,6 @@ invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
         "%s() keywords must be strings", function_name);
     return 0;
-#endif
 invalid_keyword:
     PyErr_Format(PyExc_TypeError,
     #if PY_MAJOR_VERSION < 3
@@ -65337,9 +63266,9 @@ invalid_keyword:
     return 0;
 }
 
+
 static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *local_type, *local_value, *local_tb;
-#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
     local_type = tstate->curexc_type;
@@ -65348,27 +63277,19 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->curexc_type = 0;
     tstate->curexc_value = 0;
     tstate->curexc_traceback = 0;
-#else
-    PyErr_Fetch(&local_type, &local_value, &local_tb);
-#endif
     PyErr_NormalizeException(&local_type, &local_value, &local_tb);
-#if CYTHON_COMPILING_IN_CPYTHON
     if (unlikely(tstate->curexc_type))
-#else
-    if (unlikely(PyErr_Occurred()))
-#endif
         goto bad;
     #if PY_MAJOR_VERSION >= 3
     if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
         goto bad;
     #endif
-    Py_INCREF(local_type);
-    Py_INCREF(local_value);
-    Py_INCREF(local_tb);
     *type = local_type;
     *value = local_value;
     *tb = local_tb;
-#if CYTHON_COMPILING_IN_CPYTHON
+    Py_INCREF(local_type);
+    Py_INCREF(local_value);
+    Py_INCREF(local_tb);
     tmp_type = tstate->exc_type;
     tmp_value = tstate->exc_value;
     tmp_tb = tstate->exc_traceback;
@@ -65376,13 +63297,10 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->exc_value = local_value;
     tstate->exc_traceback = local_tb;
     /* Make sure tstate is in a consistent state when we XDECREF
-       these objects (DECREF may run arbitrary code). */
+       these objects (XDECREF may run arbitrary code). */
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
-#else
-    PyErr_SetExcInfo(local_type, local_value, local_tb);
-#endif
     return 0;
 bad:
     *type = 0;
@@ -65394,6 +63312,7 @@ bad:
     return -1;
 }
 
+
 static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
     PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
 }
@@ -65411,40 +63330,23 @@ static CYTHON_INLINE long __Pyx_mod_long(long a, long b) {
     return r;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
+static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
     PyErr_Format(PyExc_ValueError,
-                 "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected);
+                 "need more than %"PY_FORMAT_SIZE_T"d value%s to unpack",
+                 index, (index == 1) ? "" : "s");
 }
 
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
     PyErr_Format(PyExc_ValueError,
-                 "need more than %" CYTHON_FORMAT_SSIZE_T "d value%s to unpack",
-                 index, (index == 1) ? "" : "s");
+                 "too many values to unpack (expected %"PY_FORMAT_SIZE_T"d)", expected);
 }
 
-static CYTHON_INLINE int __Pyx_IterFinish(void) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    PyThreadState *tstate = PyThreadState_GET();
-    PyObject* exc_type = tstate->curexc_type;
-    if (unlikely(exc_type)) {
-        if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) {
-            PyObject *exc_value, *exc_tb;
-            exc_value = tstate->curexc_value;
-            exc_tb = tstate->curexc_traceback;
-            tstate->curexc_type = 0;
-            tstate->curexc_value = 0;
-            tstate->curexc_traceback = 0;
-            Py_DECREF(exc_type);
-            Py_XDECREF(exc_value);
-            Py_XDECREF(exc_tb);
-            return 0;
-        } else {
-            return -1;
-        }
-    }
-    return 0;
-#else
-    if (unlikely(PyErr_Occurred())) {
+static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
+    if (unlikely(retval)) {
+        Py_DECREF(retval);
+        __Pyx_RaiseTooManyValuesError(expected);
+        return -1;
+    } else if (PyErr_Occurred()) {
         if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) {
             PyErr_Clear();
             return 0;
@@ -65453,25 +63355,11 @@ static CYTHON_INLINE int __Pyx_IterFinish(void) {
         }
     }
     return 0;
-#endif
 }
 
-static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
-    if (unlikely(retval)) {
-        Py_DECREF(retval);
-        __Pyx_RaiseTooManyValuesError(expected);
-        return -1;
-    } else {
-        return __Pyx_IterFinish();
-    }
-    return 0;
-}
 
 static double __Pyx__PyObject_AsDouble(PyObject* obj) {
     PyObject* float_value;
-#if CYTHON_COMPILING_IN_PYPY
-    float_value = PyNumber_Float(obj);
-#else
     if (Py_TYPE(obj)->tp_as_number && Py_TYPE(obj)->tp_as_number->nb_float) {
         return PyFloat_AsDouble(obj);
     } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) {
@@ -65488,7 +63376,6 @@ static double __Pyx__PyObject_AsDouble(PyObject* obj) {
         PyTuple_SET_ITEM(args, 0, 0);
         Py_DECREF(args);
     }
-#endif
     if (likely(float_value)) {
         double value = PyFloat_AS_DOUBLE(float_value);
         Py_DECREF(float_value);
@@ -65522,158 +63409,8 @@ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed
     return 0;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
-}
-
-static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
-    if (t == Py_None) {
-      __Pyx_RaiseNoneNotIterableError();
-    } else if (PyTuple_GET_SIZE(t) < index) {
-      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
-    } else {
-      __Pyx_RaiseTooManyValuesError(index);
-    }
-}
-
-static CYTHON_INLINE int __Pyx_unpack_tuple2(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2,
-                                             int is_tuple, int has_known_size, int decref_tuple) {
-    Py_ssize_t index;
-    PyObject *value1 = NULL, *value2 = NULL, *iter = NULL;
-    if (!is_tuple && unlikely(!PyTuple_Check(tuple))) {
-        iternextfunc iternext;
-        iter = PyObject_GetIter(tuple);
-        if (unlikely(!iter)) goto bad;
-        if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; }
-        iternext = Py_TYPE(iter)->tp_iternext;
-        value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; }
-        value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; }
-        if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad;
-        Py_DECREF(iter);
-    } else {
-        if (!has_known_size && unlikely(PyTuple_GET_SIZE(tuple) != 2)) {
-            __Pyx_UnpackTupleError(tuple, 2);
-            goto bad;
-        }
-#if CYTHON_COMPILING_IN_PYPY
-        value1 = PySequence_ITEM(tuple, 0);
-        if (unlikely(!value1)) goto bad;
-        value2 = PySequence_ITEM(tuple, 1);
-        if (unlikely(!value2)) goto bad;
-#else
-        value1 = PyTuple_GET_ITEM(tuple, 0);
-        value2 = PyTuple_GET_ITEM(tuple, 1);
-        Py_INCREF(value1);
-        Py_INCREF(value2);
-#endif
-        if (decref_tuple) { Py_DECREF(tuple); }
-    }
-    *pvalue1 = value1;
-    *pvalue2 = value2;
-    return 0;
-unpacking_failed:
-    if (!has_known_size && __Pyx_IterFinish() == 0)
-        __Pyx_RaiseNeedMoreValuesError(index);
-bad:
-    Py_XDECREF(iter);
-    Py_XDECREF(value1);
-    Py_XDECREF(value2);
-    if (decref_tuple) { Py_XDECREF(tuple); }
-    return -1;
-}
-
-static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name,
-                                                   Py_ssize_t* p_orig_length, int* p_source_is_dict) {
-    is_dict = is_dict || likely(PyDict_CheckExact(iterable));
-    *p_source_is_dict = is_dict;
-#if !CYTHON_COMPILING_IN_PYPY
-    if (is_dict) {
-        *p_orig_length = PyDict_Size(iterable);
-        Py_INCREF(iterable);
-        return iterable;
-    }
-#endif
-    *p_orig_length = 0;
-    if (method_name) {
-        PyObject* iter;
-        iterable = PyObject_CallMethodObjArgs(iterable, method_name, NULL);
-        if (!iterable)
-            return NULL;
-#if !CYTHON_COMPILING_IN_PYPY
-        if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable))
-            return iterable;
-#endif
-        iter = PyObject_GetIter(iterable);
-        Py_DECREF(iterable);
-        return iter;
-    }
-    return PyObject_GetIter(iterable);
-}
-static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* iter_obj, Py_ssize_t orig_length, Py_ssize_t* ppos,
-                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) {
-    PyObject* next_item;
-#if !CYTHON_COMPILING_IN_PYPY
-    if (source_is_dict) {
-        PyObject *key, *value;
-        if (unlikely(orig_length != PyDict_Size(iter_obj))) {
-            PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration");
-            return -1;
-        }
-        if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) {
-            return 0;
-        }
-        if (pitem) {
-            PyObject* tuple = PyTuple_New(2);
-            if (unlikely(!tuple)) {
-                return -1;
-            }
-            Py_INCREF(key);
-            Py_INCREF(value);
-            PyTuple_SET_ITEM(tuple, 0, key);
-            PyTuple_SET_ITEM(tuple, 1, value);
-            *pitem = tuple;
-        } else {
-            if (pkey) {
-                Py_INCREF(key);
-                *pkey = key;
-            }
-            if (pvalue) {
-                Py_INCREF(value);
-                *pvalue = value;
-            }
-        }
-        return 1;
-    } else if (PyTuple_CheckExact(iter_obj)) {
-        Py_ssize_t pos = *ppos;
-        if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0;
-        *ppos = pos + 1;
-        next_item = PyTuple_GET_ITEM(iter_obj, pos);
-        Py_INCREF(next_item);
-    } else if (PyList_CheckExact(iter_obj)) {
-        Py_ssize_t pos = *ppos;
-        if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0;
-        *ppos = pos + 1;
-        next_item = PyList_GET_ITEM(iter_obj, pos);
-        Py_INCREF(next_item);
-    } else
-#endif
-    {
-        next_item = PyIter_Next(iter_obj);
-        if (unlikely(!next_item)) {
-            return __Pyx_IterFinish();
-        }
-    }
-    if (pitem) {
-        *pitem = next_item;
-    } else if (pkey && pvalue) {
-        if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1))
-            return -1;
-    } else if (pkey) {
-        *pkey = next_item;
-    } else {
-        *pvalue = next_item;
-    }
-    return 1;
+static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is unsubscriptable");
 }
 
 static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
@@ -65684,7 +63421,6 @@ static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
 }
 
 static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->exc_type;
     *value = tstate->exc_value;
@@ -65692,12 +63428,9 @@ static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value,
     Py_XINCREF(*type);
     Py_XINCREF(*value);
     Py_XINCREF(*tb);
-#else
-    PyErr_GetExcInfo(type, value, tb);
-#endif
 }
+
 static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
     tmp_type = tstate->exc_type;
@@ -65709,9 +63442,6 @@ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb)
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
-#else
-    PyErr_SetExcInfo(type, value, tb);
-#endif
 }
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {
@@ -65740,33 +63470,12 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {
         goto bad;
     #if PY_VERSION_HEX >= 0x02050000
     {
-        #if PY_MAJOR_VERSION >= 3
-        if (level == -1) {
-            if (strchr(__Pyx_MODULE_NAME, '.')) {
-                /* try package relative import first */
-                PyObject *py_level = PyInt_FromLong(1);
-                if (!py_level)
-                    goto bad;
-                module = PyObject_CallFunctionObjArgs(py_import,
-                    name, global_dict, empty_dict, list, py_level, NULL);
-                Py_DECREF(py_level);
-                if (!module) {
-                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
-                        goto bad;
-                    PyErr_Clear();
-                }
-            }
-            level = 0; /* try absolute import on failure */
-        }
-        #endif
-        if (!module) {
-            PyObject *py_level = PyInt_FromLong(level);
-            if (!py_level)
-                goto bad;
-            module = PyObject_CallFunctionObjArgs(py_import,
-                name, global_dict, empty_dict, list, py_level, NULL);
-            Py_DECREF(py_level);
-        }
+        PyObject *py_level = PyInt_FromLong(level);
+        if (!py_level)
+            goto bad;
+        module = PyObject_CallFunctionObjArgs(py_import,
+            name, global_dict, empty_dict, list, py_level, NULL);
+        Py_DECREF(py_level);
     }
     #else
     if (level>0) {
@@ -65783,422 +63492,106 @@ bad:
     return module;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) {
-#if PY_MAJOR_VERSION < 3
-    PyErr_Format(PyExc_ImportError, "cannot import name %.230s",
-                 PyString_AsString(name));
-#else
-    PyErr_Format(PyExc_ImportError, "cannot import name %S", name);
-#endif
-}
-
-static PyObject *
-__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure)
-{
-    if (op->func_doc == NULL && op->func.m_ml->ml_doc) {
-#if PY_MAJOR_VERSION >= 3
-        op->func_doc = PyUnicode_FromString(op->func.m_ml->ml_doc);
-#else
-        op->func_doc = PyString_FromString(op->func.m_ml->ml_doc);
-#endif
-    }
-    if (op->func_doc == 0) {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    Py_INCREF(op->func_doc);
-    return op->func_doc;
-}
-static int
-__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value)
-{
-    PyObject *tmp = op->func_doc;
-    if (value == NULL)
-        op->func_doc = Py_None; /* Mark as deleted */
-    else
-        op->func_doc = value;
-    Py_INCREF(op->func_doc);
-    Py_XDECREF(tmp);
-    return 0;
-}
-static PyObject *
-__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op)
-{
-    if (op->func_name == NULL) {
-#if PY_MAJOR_VERSION >= 3
-        op->func_name = PyUnicode_InternFromString(op->func.m_ml->ml_name);
-#else
-        op->func_name = PyString_InternFromString(op->func.m_ml->ml_name);
-#endif
-    }
-    Py_INCREF(op->func_name);
-    return op->func_name;
-}
-static int
-__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value)
-{
-    PyObject *tmp;
-#if PY_MAJOR_VERSION >= 3
-    if (value == NULL || !PyUnicode_Check(value)) {
-#else
-    if (value == NULL || !PyString_Check(value)) {
-#endif
-        PyErr_SetString(PyExc_TypeError,
-                        "__name__ must be set to a string object");
-        return -1;
-    }
-    tmp = op->func_name;
-    Py_INCREF(value);
-    op->func_name = value;
-    Py_XDECREF(tmp);
-    return 0;
-}
-static PyObject *
-__Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure)
-{
-    PyObject *self;
-    self = m->func_closure;
-    if (self == NULL)
-        self = Py_None;
-    Py_INCREF(self);
-    return self;
-}
-static PyObject *
-__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op)
-{
-    if (op->func_dict == NULL) {
-        op->func_dict = PyDict_New();
-        if (op->func_dict == NULL)
-            return NULL;
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
+    if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
+        return (equals == Py_EQ);
+    } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
+        if (PyBytes_GET_SIZE(s1) != PyBytes_GET_SIZE(s2)) {
+            return (equals == Py_NE);
+        } else if (PyBytes_GET_SIZE(s1) == 1) {
+            if (equals == Py_EQ)
+                return (PyBytes_AS_STRING(s1)[0] == PyBytes_AS_STRING(s2)[0]);
+            else
+                return (PyBytes_AS_STRING(s1)[0] != PyBytes_AS_STRING(s2)[0]);
+        } else {
+            int result = memcmp(PyBytes_AS_STRING(s1), PyBytes_AS_STRING(s2), (size_t)PyBytes_GET_SIZE(s1));
+            return (equals == Py_EQ) ? (result == 0) : (result != 0);
+        }
+    } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
+        return (equals == Py_NE);
+    } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
+        return (equals == Py_NE);
+    } else {
+        int result;
+        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
+        if (!py_result)
+            return -1;
+        result = __Pyx_PyObject_IsTrue(py_result);
+        Py_DECREF(py_result);
+        return result;
     }
-    Py_INCREF(op->func_dict);
-    return op->func_dict;
 }
-static int
-__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value)
-{
-    PyObject *tmp;
-    if (value == NULL) {
-        PyErr_SetString(PyExc_TypeError,
-               "function's dictionary may not be deleted");
-        return -1;
-    }
-    if (!PyDict_Check(value)) {
-        PyErr_SetString(PyExc_TypeError,
-               "setting function's dictionary to a non-dict");
-        return -1;
-    }
-    tmp = op->func_dict;
-    Py_INCREF(value);
-    op->func_dict = value;
-    Py_XDECREF(tmp);
-    return 0;
-}
-static PyObject *
-__Pyx_CyFunction_get_globals(CYTHON_UNUSED __pyx_CyFunctionObject *op)
-{
-    PyObject* dict = PyModule_GetDict(__pyx_m);
-    Py_XINCREF(dict);
-    return dict;
-}
-static PyObject *
-__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op)
-{
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-static PyObject *
-__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op)
-{
-    PyObject* result = (op->func_code) ? op->func_code : Py_None;
-    Py_INCREF(result);
-    return result;
-}
-static PyObject *
-__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op)
-{
-    if (op->defaults_tuple) {
-        Py_INCREF(op->defaults_tuple);
-        return op->defaults_tuple;
-    }
-    if (op->defaults_getter) {
-        PyObject *res = op->defaults_getter((PyObject *) op);
-        if (res) {
-            Py_INCREF(res);
-            op->defaults_tuple = res;
+
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
+    if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
+        return (equals == Py_EQ);
+    } else if (PyUnicode_CheckExact(s1) & PyUnicode_CheckExact(s2)) {
+        if (PyUnicode_GET_SIZE(s1) != PyUnicode_GET_SIZE(s2)) {
+            return (equals == Py_NE);
+        } else if (PyUnicode_GET_SIZE(s1) == 1) {
+            if (equals == Py_EQ)
+                return (PyUnicode_AS_UNICODE(s1)[0] == PyUnicode_AS_UNICODE(s2)[0]);
+            else
+                return (PyUnicode_AS_UNICODE(s1)[0] != PyUnicode_AS_UNICODE(s2)[0]);
+        } else {
+            int result = PyUnicode_Compare(s1, s2);
+            if ((result == -1) && unlikely(PyErr_Occurred()))
+                return -1;
+            return (equals == Py_EQ) ? (result == 0) : (result != 0);
         }
-        return res;
+    } else if ((s1 == Py_None) & PyUnicode_CheckExact(s2)) {
+        return (equals == Py_NE);
+    } else if ((s2 == Py_None) & PyUnicode_CheckExact(s1)) {
+        return (equals == Py_NE);
+    } else {
+        int result;
+        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
+        if (!py_result)
+            return -1;
+        result = __Pyx_PyObject_IsTrue(py_result);
+        Py_DECREF(py_result);
+        return result;
     }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-static PyGetSetDef __pyx_CyFunction_getsets[] = {
-    {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
-    {(char *) "__doc__",  (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
-    {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
-    {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
-    {(char *) "__self__", (getter)__Pyx_CyFunction_get_self, 0, 0, 0},
-    {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
-    {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
-    {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
-    {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
-    {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
-    {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
-    {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
-    {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
-    {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, 0, 0, 0},
-    {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, 0, 0, 0},
-    {0, 0, 0, 0, 0}
-};
-#ifndef PY_WRITE_RESTRICTED /* < Py2.5 */
-#define PY_WRITE_RESTRICTED WRITE_RESTRICTED
-#endif
-static PyMemberDef __pyx_CyFunction_members[] = {
-    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CyFunctionObject, func.m_module), PY_WRITE_RESTRICTED, 0},
-    {0, 0, 0,  0, 0}
-};
-static PyObject *
-__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args)
-{
-#if PY_MAJOR_VERSION >= 3
-    return PyUnicode_FromString(m->func.m_ml->ml_name);
-#else
-    return PyString_FromString(m->func.m_ml->ml_name);
-#endif
 }
-static PyMethodDef __pyx_CyFunction_methods[] = {
-    {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0},
-    {0, 0, 0, 0}
-};
-static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags,
-                                      PyObject *closure, PyObject *module, PyObject* code) {
-    __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type);
+
+
+static PyObject *__pyx_binding_PyCFunctionType_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) {
+    __pyx_binding_PyCFunctionType_object *op = PyObject_GC_New(__pyx_binding_PyCFunctionType_object, __pyx_binding_PyCFunctionType);
     if (op == NULL)
         return NULL;
-    op->flags = flags;
-    op->func_weakreflist = NULL;
     op->func.m_ml = ml;
-    op->func.m_self = (PyObject *) op;
-    Py_XINCREF(closure);
-    op->func_closure = closure;
+    Py_XINCREF(self);
+    op->func.m_self = self;
     Py_XINCREF(module);
     op->func.m_module = module;
-    op->func_dict = NULL;
-    op->func_name = NULL;
-    op->func_doc = NULL;
-    op->func_classobj = NULL;
-    Py_XINCREF(code);
-    op->func_code = code;
-    op->defaults_pyobjects = 0;
-    op->defaults = NULL;
-    op->defaults_tuple = NULL;
-    op->defaults_getter = NULL;
     PyObject_GC_Track(op);
-    return (PyObject *) op;
-}
-static int
-__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
-{
-    Py_CLEAR(m->func_closure);
-    Py_CLEAR(m->func.m_module);
-    Py_CLEAR(m->func_dict);
-    Py_CLEAR(m->func_name);
-    Py_CLEAR(m->func_doc);
-    Py_CLEAR(m->func_code);
-    Py_CLEAR(m->func_classobj);
-    Py_CLEAR(m->defaults_tuple);
-    if (m->defaults) {
-        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
-        int i;
-        for (i = 0; i < m->defaults_pyobjects; i++)
-            Py_XDECREF(pydefaults[i]);
-        PyMem_Free(m->defaults);
-        m->defaults = NULL;
-    }
-    return 0;
+    return (PyObject *)op;
 }
-static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
-{
+
+static void __pyx_binding_PyCFunctionType_dealloc(__pyx_binding_PyCFunctionType_object *m) {
     PyObject_GC_UnTrack(m);
-    if (m->func_weakreflist != NULL)
-        PyObject_ClearWeakRefs((PyObject *) m);
-    __Pyx_CyFunction_clear(m);
+    Py_XDECREF(m->func.m_self);
+    Py_XDECREF(m->func.m_module);
     PyObject_GC_Del(m);
 }
-static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg)
-{
-    Py_VISIT(m->func_closure);
-    Py_VISIT(m->func.m_module);
-    Py_VISIT(m->func_dict);
-    Py_VISIT(m->func_name);
-    Py_VISIT(m->func_doc);
-    Py_VISIT(m->func_code);
-    Py_VISIT(m->func_classobj);
-    Py_VISIT(m->defaults_tuple);
-    if (m->defaults) {
-        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
-        int i;
-        for (i = 0; i < m->defaults_pyobjects; i++)
-            Py_VISIT(pydefaults[i]);
-    }
-    return 0;
-}
-static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
-{
-    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
-    if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
-        Py_INCREF(func);
-        return func;
-    }
-    if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
-        if (type == NULL)
-            type = (PyObject *)(Py_TYPE(obj));
-        return PyMethod_New(func,
-                            type, (PyObject *)(Py_TYPE(type)));
-    }
+
+static PyObject *__pyx_binding_PyCFunctionType_descr_get(PyObject *func, PyObject *obj, PyObject *type) {
     if (obj == Py_None)
-        obj = NULL;
+            obj = NULL;
     return PyMethod_New(func, obj, type);
 }
-static PyObject*
-__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op)
-{
-    PyObject *func_name = __Pyx_CyFunction_get_name(op);
-#if PY_MAJOR_VERSION >= 3
-    return PyUnicode_FromFormat("<cyfunction %U at %p>",
-                                func_name, (void *)op);
-#else
-    return PyString_FromFormat("<cyfunction %s at %p>",
-                               PyString_AsString(func_name), (void *)op);
-#endif
-}
-#if CYTHON_COMPILING_IN_PYPY
-static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
-    PyCFunctionObject* f = (PyCFunctionObject*)func;
-    PyCFunction meth = PyCFunction_GET_FUNCTION(func);
-    PyObject *self = PyCFunction_GET_SELF(func);
-    Py_ssize_t size;
-    switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
-    case METH_VARARGS:
-        if (likely(kw == NULL) || PyDict_Size(kw) == 0)
-            return (*meth)(self, arg);
-        break;
-    case METH_VARARGS | METH_KEYWORDS:
-        return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
-    case METH_NOARGS:
-        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
-            size = PyTuple_GET_SIZE(arg);
-            if (size == 0)
-                return (*meth)(self, NULL);
-            PyErr_Format(PyExc_TypeError,
-                "%.200s() takes no arguments (%zd given)",
-                f->m_ml->ml_name, size);
-            return NULL;
-        }
-        break;
-    case METH_O:
-        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
-            size = PyTuple_GET_SIZE(arg);
-            if (size == 1)
-                return (*meth)(self, PyTuple_GET_ITEM(arg, 0));
-            PyErr_Format(PyExc_TypeError,
-                "%.200s() takes exactly one argument (%zd given)",
-                f->m_ml->ml_name, size);
-            return NULL;
-        }
-        break;
-    default:
-        PyErr_SetString(PyExc_SystemError, "Bad call flags in "
-                        "__Pyx_CyFunction_Call. METH_OLDARGS is no "
-                        "longer supported!");
-        return NULL;
-    }
-    PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
-                 f->m_ml->ml_name);
-    return NULL;
-}
-#else
-static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
-	return PyCFunction_Call(func, arg, kw);
-}
-#endif
-static PyTypeObject __pyx_CyFunctionType_type = {
-    PyVarObject_HEAD_INIT(0, 0)
-    __Pyx_NAMESTR("cython_function_or_method"), /*tp_name*/
-    sizeof(__pyx_CyFunctionObject),   /*tp_basicsize*/
-    0,                                  /*tp_itemsize*/
-    (destructor) __Pyx_CyFunction_dealloc, /*tp_dealloc*/
-    0,                                  /*tp_print*/
-    0,                                  /*tp_getattr*/
-    0,                                  /*tp_setattr*/
-#if PY_MAJOR_VERSION < 3
-    0,                                  /*tp_compare*/
-#else
-    0,                                  /*reserved*/
-#endif
-    (reprfunc) __Pyx_CyFunction_repr,   /*tp_repr*/
-    0,                                  /*tp_as_number*/
-    0,                                  /*tp_as_sequence*/
-    0,                                  /*tp_as_mapping*/
-    0,                                  /*tp_hash*/
-    __Pyx_CyFunction_Call,              /*tp_call*/
-    0,                                  /*tp_str*/
-    0,                                  /*tp_getattro*/
-    0,                                  /*tp_setattro*/
-    0,                                  /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
-    0,                                  /*tp_doc*/
-    (traverseproc) __Pyx_CyFunction_traverse,   /*tp_traverse*/
-    (inquiry) __Pyx_CyFunction_clear,   /*tp_clear*/
-    0,                                  /*tp_richcompare*/
-    offsetof(__pyx_CyFunctionObject, func_weakreflist), /* tp_weaklistoffse */
-    0,                                  /*tp_iter*/
-    0,                                  /*tp_iternext*/
-    __pyx_CyFunction_methods,           /*tp_methods*/
-    __pyx_CyFunction_members,           /*tp_members*/
-    __pyx_CyFunction_getsets,           /*tp_getset*/
-    0,                                  /*tp_base*/
-    0,                                  /*tp_dict*/
-    __Pyx_CyFunction_descr_get,         /*tp_descr_get*/
-    0,                                  /*tp_descr_set*/
-    offsetof(__pyx_CyFunctionObject, func_dict),/*tp_dictoffset*/
-    0,                                  /*tp_init*/
-    0,                                  /*tp_alloc*/
-    0,                                  /*tp_new*/
-    0,                                  /*tp_free*/
-    0,                                  /*tp_is_gc*/
-    0,                                  /*tp_bases*/
-    0,                                  /*tp_mro*/
-    0,                                  /*tp_cache*/
-    0,                                  /*tp_subclasses*/
-    0,                                  /*tp_weaklist*/
-    0,                                  /*tp_del*/
-#if PY_VERSION_HEX >= 0x02060000
-    0,                                  /*tp_version_tag*/
-#endif
-};
-static int __Pyx_CyFunction_init(void) {
-#if !CYTHON_COMPILING_IN_PYPY
-    __pyx_CyFunctionType_type.tp_call = PyCFunction_Call;
-#endif
-    if (PyType_Ready(&__pyx_CyFunctionType_type) < 0)
+
+static int __pyx_binding_PyCFunctionType_init(void) {
+    __pyx_binding_PyCFunctionType_type = PyCFunction_Type;
+    __pyx_binding_PyCFunctionType_type.tp_name = __Pyx_NAMESTR("cython_binding_builtin_function_or_method");
+    __pyx_binding_PyCFunctionType_type.tp_dealloc = (destructor)__pyx_binding_PyCFunctionType_dealloc;
+    __pyx_binding_PyCFunctionType_type.tp_descr_get = __pyx_binding_PyCFunctionType_descr_get;
+    if (PyType_Ready(&__pyx_binding_PyCFunctionType_type) < 0) {
         return -1;
-    __pyx_CyFunctionType = &__pyx_CyFunctionType_type;
+    }
+    __pyx_binding_PyCFunctionType = &__pyx_binding_PyCFunctionType_type;
     return 0;
-}
-static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) {
-    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
-    m->defaults = PyMem_Malloc(size);
-    if (!m->defaults)
-        return PyErr_NoMemory();
-    memset(m->defaults, 0, sizeof(size));
-    m->defaults_pyobjects = pyobjects;
-    return m->defaults;
-}
-static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) {
-    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
-    m->defaults_tuple = tuple;
-    Py_INCREF(tuple);
+
 }
 
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
@@ -66601,8 +63994,8 @@ static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject*
     }
 }
 
-static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
-                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename) {
+static void __Pyx_WriteUnraisable(const char *name, int clineno,
+                                  int lineno, const char *filename) {
     PyObject *old_exc, *old_val, *old_tb;
     PyObject *ctx;
     __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
@@ -66622,522 +64015,125 @@ static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
 
 static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *tmp_type, *tmp_value, *tmp_tb;
-#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
+
     tmp_type = tstate->exc_type;
     tmp_value = tstate->exc_value;
     tmp_tb = tstate->exc_traceback;
+
     tstate->exc_type = *type;
     tstate->exc_value = *value;
     tstate->exc_traceback = *tb;
-#else
-    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
-    PyErr_SetExcInfo(*type, *value, *tb);
-#endif
+
     *type = tmp_type;
     *value = tmp_value;
     *tb = tmp_tb;
 }
 
-static PyObject *__Pyx_Generator_Next(PyObject *self);
-static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
-static PyObject *__Pyx_Generator_Close(PyObject *self);
-static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args);
-static PyTypeObject *__pyx_GeneratorType = 0;
-#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
-#define __Pyx_Generator_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
-#if 1 || PY_VERSION_HEX < 0x030300B0
-static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
-    PyObject *et, *ev, *tb;
-    PyObject *value = NULL;
-    __Pyx_ErrFetch(&et, &ev, &tb);
-    if (!et) {
-        Py_XDECREF(tb);
-        Py_XDECREF(ev);
-        Py_INCREF(Py_None);
-        *pvalue = Py_None;
-        return 0;
-    }
-    if (unlikely(et != PyExc_StopIteration) &&
-            unlikely(!PyErr_GivenExceptionMatches(et, PyExc_StopIteration))) {
-        __Pyx_ErrRestore(et, ev, tb);
-        return -1;
-    }
-    if (likely(et == PyExc_StopIteration)) {
-        if (likely(!ev) || !PyObject_IsInstance(ev, PyExc_StopIteration)) {
-            if (!ev) {
-                Py_INCREF(Py_None);
-                ev = Py_None;
-            }
-            Py_XDECREF(tb);
-            Py_DECREF(et);
-            *pvalue = ev;
-            return 0;
-        }
-    }
-    PyErr_NormalizeException(&et, &ev, &tb);
-    if (unlikely(!PyObject_IsInstance(ev, PyExc_StopIteration))) {
-        __Pyx_ErrRestore(et, ev, tb);
-        return -1;
-    }
-    Py_XDECREF(tb);
-    Py_DECREF(et);
-#if PY_VERSION_HEX >= 0x030300A0
-    value = ((PyStopIterationObject *)ev)->value;
-    Py_INCREF(value);
-    Py_DECREF(ev);
-#else
-    {
-        PyObject* args = PyObject_GetAttrString(ev, "args");
-        Py_DECREF(ev);
-        if (likely(args)) {
-            value = PyObject_GetItem(args, 0);
-            Py_DECREF(args);
-        }
-        if (unlikely(!value)) {
-            __Pyx_ErrRestore(NULL, NULL, NULL);
-            Py_INCREF(Py_None);
-            value = Py_None;
-        }
-    }
-#endif
-    *pvalue = value;
-    return 0;
-}
-#endif
-static CYTHON_INLINE
-void __Pyx_Generator_ExceptionClear(__pyx_GeneratorObject *self) {
-    PyObject *exc_type = self->exc_type;
-    PyObject *exc_value = self->exc_value;
-    PyObject *exc_traceback = self->exc_traceback;
+static CYTHON_INLINE void __Pyx_Generator_ExceptionClear(struct __pyx_Generator_object *self)
+{
+    Py_XDECREF(self->exc_type);
+    Py_XDECREF(self->exc_value);
+    Py_XDECREF(self->exc_traceback);
+
     self->exc_type = NULL;
     self->exc_value = NULL;
     self->exc_traceback = NULL;
-    Py_XDECREF(exc_type);
-    Py_XDECREF(exc_value);
-    Py_XDECREF(exc_traceback);
 }
-static CYTHON_INLINE
-int __Pyx_Generator_CheckRunning(__pyx_GeneratorObject *gen) {
-    if (unlikely(gen->is_running)) {
+
+static CYTHON_INLINE PyObject *__Pyx_Generator_SendEx(struct __pyx_Generator_object *self, PyObject *value)
+{
+    PyObject *retval;
+
+    if (self->is_running) {
         PyErr_SetString(PyExc_ValueError,
                         "generator already executing");
-        return 1;
+        return NULL;
     }
-    return 0;
-}
-static CYTHON_INLINE
-PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value) {
-    PyObject *retval;
-    assert(!self->is_running);
-    if (unlikely(self->resume_label == 0)) {
-        if (unlikely(value && value != Py_None)) {
+
+    if (self->resume_label == 0) {
+        if (value && value != Py_None) {
             PyErr_SetString(PyExc_TypeError,
                             "can't send non-None value to a "
                             "just-started generator");
             return NULL;
         }
     }
-    if (unlikely(self->resume_label == -1)) {
+
+    if (self->resume_label == -1) {
         PyErr_SetNone(PyExc_StopIteration);
         return NULL;
     }
-    if (value) {
-#if CYTHON_COMPILING_IN_PYPY
-#else
-        /* Generators always return to their most recent caller, not
-         * necessarily their creator. */
-        if (self->exc_traceback) {
-            PyThreadState *tstate = PyThreadState_GET();
-            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
-            PyFrameObject *f = tb->tb_frame;
-            Py_XINCREF(tstate->frame);
-            assert(f->f_back == NULL);
-            f->f_back = tstate->frame;
-        }
-#endif
-        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
-                            &self->exc_traceback);
-    } else {
+
+
+    if (value)
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback);
+    else
         __Pyx_Generator_ExceptionClear(self);
-    }
+
     self->is_running = 1;
     retval = self->body((PyObject *) self, value);
     self->is_running = 0;
-    if (retval) {
-        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
-                            &self->exc_traceback);
-#if CYTHON_COMPILING_IN_PYPY
-#else
-        /* Don't keep the reference to f_back any longer than necessary.  It
-         * may keep a chain of frames alive or it could create a reference
-         * cycle. */
-        if (self->exc_traceback) {
-            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
-            PyFrameObject *f = tb->tb_frame;
-            Py_CLEAR(f->f_back);
-        }
-#endif
-    } else {
+
+    if (retval)
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback);
+    else
         __Pyx_Generator_ExceptionClear(self);
-    }
+
     return retval;
 }
-static CYTHON_INLINE
-PyObject *__Pyx_Generator_FinishDelegation(__pyx_GeneratorObject *gen) {
-    PyObject *ret;
-    PyObject *val = NULL;
-    __Pyx_Generator_Undelegate(gen);
-    __Pyx_PyGen_FetchStopIterationValue(&val);
-    ret = __Pyx_Generator_SendEx(gen, val);
-    Py_XDECREF(val);
-    return ret;
-}
-static PyObject *__Pyx_Generator_Next(PyObject *self) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
-    PyObject *yf = gen->yieldfrom;
-    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
-        return NULL;
-    if (yf) {
-        PyObject *ret;
-        gen->is_running = 1;
-        ret = Py_TYPE(yf)->tp_iternext(yf);
-        gen->is_running = 0;
-        if (likely(ret)) {
-            return ret;
-        }
-        return __Pyx_Generator_FinishDelegation(gen);
-    }
-    return __Pyx_Generator_SendEx(gen, Py_None);
+
+static PyObject *__Pyx_Generator_Next(PyObject *self)
+{
+    return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, Py_None);
 }
-static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
-    PyObject *yf = gen->yieldfrom;
-    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
-        return NULL;
-    if (yf) {
-        PyObject *ret;
-        gen->is_running = 1;
-        if (__Pyx_Generator_CheckExact(yf)) {
-            ret = __Pyx_Generator_Send(yf, value);
-        } else {
-            if (value == Py_None)
-                ret = PyIter_Next(yf);
-            else
-                ret = PyObject_CallMethod(yf, (char*)"send", (char*)"O", value);
-        }
-        gen->is_running = 0;
-        if (likely(ret)) {
-            return ret;
-        }
-        return __Pyx_Generator_FinishDelegation(gen);
-    }
-    return __Pyx_Generator_SendEx(gen, value);
-}
-static int __Pyx_Generator_CloseIter(__pyx_GeneratorObject *gen, PyObject *yf) {
-    PyObject *retval = NULL;
-    int err = 0;
-    if (__Pyx_Generator_CheckExact(yf)) {
-        retval = __Pyx_Generator_Close(yf);
-        if (!retval)
-            return -1;
-    } else {
-        PyObject *meth;
-        gen->is_running = 1;
-        meth = PyObject_GetAttrString(yf, "close");
-        if (unlikely(!meth)) {
-            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
-                PyErr_WriteUnraisable(yf);
-            }
-            PyErr_Clear();
-        } else {
-            retval = PyObject_CallFunction(meth, NULL);
-            Py_DECREF(meth);
-            if (!retval)
-                err = -1;
-        }
-        gen->is_running = 0;
-    }
-    Py_XDECREF(retval);
-    return err;
-}
-static PyObject *__Pyx_Generator_Close(PyObject *self) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
-    PyObject *retval, *raised_exception;
-    PyObject *yf = gen->yieldfrom;
-    int err = 0;
-    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
-        return NULL;
-    if (yf) {
-        Py_INCREF(yf);
-        err = __Pyx_Generator_CloseIter(gen, yf);
-        __Pyx_Generator_Undelegate(gen);
-        Py_DECREF(yf);
-    }
-    if (err == 0)
+
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value)
+{
+    return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, value);
+}
+
+static PyObject *__Pyx_Generator_Close(PyObject *self)
+{
+    struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
+    PyObject *retval;
 #if PY_VERSION_HEX < 0x02050000
-        PyErr_SetNone(PyExc_StopIteration);
+    PyErr_SetNone(PyExc_StopIteration);
 #else
-        PyErr_SetNone(PyExc_GeneratorExit);
+    PyErr_SetNone(PyExc_GeneratorExit);
 #endif
-    retval = __Pyx_Generator_SendEx(gen, NULL);
+    retval = __Pyx_Generator_SendEx(generator, NULL);
     if (retval) {
         Py_DECREF(retval);
         PyErr_SetString(PyExc_RuntimeError,
                         "generator ignored GeneratorExit");
         return NULL;
     }
-    raised_exception = PyErr_Occurred();
-    if (!raised_exception
-        || raised_exception == PyExc_StopIteration
-#if PY_VERSION_HEX >= 0x02050000
-        || raised_exception == PyExc_GeneratorExit
-        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
+#if PY_VERSION_HEX < 0x02050000
+    if (PyErr_ExceptionMatches(PyExc_StopIteration))
+#else
+    if (PyErr_ExceptionMatches(PyExc_StopIteration)
+        || PyErr_ExceptionMatches(PyExc_GeneratorExit))
 #endif
-        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
     {
-        if (raised_exception) PyErr_Clear();      /* ignore these errors */
+        PyErr_Clear();          /* ignore these errors */
         Py_INCREF(Py_None);
         return Py_None;
     }
     return NULL;
 }
-static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+
+static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args, CYTHON_UNUSED PyObject *kwds)
+{
+    struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
     PyObject *typ;
     PyObject *tb = NULL;
     PyObject *val = NULL;
-    PyObject *yf = gen->yieldfrom;
+
     if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
         return NULL;
-    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
-        return NULL;
-    if (yf) {
-        PyObject *ret;
-        Py_INCREF(yf);
-#if PY_VERSION_HEX >= 0x02050000
-        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
-            int err = __Pyx_Generator_CloseIter(gen, yf);
-            Py_DECREF(yf);
-            __Pyx_Generator_Undelegate(gen);
-            if (err < 0)
-                return __Pyx_Generator_SendEx(gen, NULL);
-            goto throw_here;
-        }
-#endif
-        gen->is_running = 1;
-        if (__Pyx_Generator_CheckExact(yf)) {
-            ret = __Pyx_Generator_Throw(yf, args);
-        } else {
-            PyObject *meth = PyObject_GetAttrString(yf, "throw");
-            if (unlikely(!meth)) {
-                Py_DECREF(yf);
-                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
-                    gen->is_running = 0;
-                    return NULL;
-                }
-                PyErr_Clear();
-                __Pyx_Generator_Undelegate(gen);
-                gen->is_running = 0;
-                goto throw_here;
-            }
-            ret = PyObject_CallObject(meth, args);
-            Py_DECREF(meth);
-        }
-        gen->is_running = 0;
-        Py_DECREF(yf);
-        if (!ret) {
-            ret = __Pyx_Generator_FinishDelegation(gen);
-        }
-        return ret;
-    }
-throw_here:
     __Pyx_Raise(typ, val, tb, NULL);
-    return __Pyx_Generator_SendEx(gen, NULL);
-}
-static int __Pyx_Generator_traverse(PyObject *self, visitproc visit, void *arg) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
-    Py_VISIT(gen->closure);
-    Py_VISIT(gen->classobj);
-    Py_VISIT(gen->yieldfrom);
-    Py_VISIT(gen->exc_type);
-    Py_VISIT(gen->exc_value);
-    Py_VISIT(gen->exc_traceback);
-    return 0;
-}
-static int __Pyx_Generator_clear(PyObject *self) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
-    Py_CLEAR(gen->closure);
-    Py_CLEAR(gen->classobj);
-    Py_CLEAR(gen->yieldfrom);
-    Py_CLEAR(gen->exc_type);
-    Py_CLEAR(gen->exc_value);
-    Py_CLEAR(gen->exc_traceback);
-    return 0;
-}
-static void __Pyx_Generator_dealloc(PyObject *self) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
-    PyObject_GC_UnTrack(gen);
-    if (gen->gi_weakreflist != NULL)
-        PyObject_ClearWeakRefs(self);
-    PyObject_GC_Track(self);
-    if (gen->resume_label > 0) {
-        Py_TYPE(gen)->tp_del(self);
-        if (self->ob_refcnt > 0)
-            return;                     /* resurrected.  :( */
-    }
-    PyObject_GC_UnTrack(self);
-    __Pyx_Generator_clear(self);
-    PyObject_GC_Del(gen);
-}
-static void __Pyx_Generator_del(PyObject *self) {
-    PyObject *res;
-    PyObject *error_type, *error_value, *error_traceback;
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
-    if (gen->resume_label <= 0)
-        return ;
-    assert(self->ob_refcnt == 0);
-    self->ob_refcnt = 1;
-    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
-    res = __Pyx_Generator_Close(self);
-    if (res == NULL)
-        PyErr_WriteUnraisable(self);
-    else
-        Py_DECREF(res);
-    __Pyx_ErrRestore(error_type, error_value, error_traceback);
-    /* Undo the temporary resurrection; can't use DECREF here, it would
-     * cause a recursive call.
-     */
-    assert(self->ob_refcnt > 0);
-    if (--self->ob_refcnt == 0)
-        return; /* this is the normal path out */
-    /* close() resurrected it!  Make it look like the original Py_DECREF
-     * never happened.
-     */
-    {
-        Py_ssize_t refcnt = self->ob_refcnt;
-        _Py_NewReference(self);
-        self->ob_refcnt = refcnt;
-    }
-#if CYTHON_COMPILING_FOR_CPYTHON
-    assert(PyType_IS_GC(self->ob_type) &&
-           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
-    /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
-     * we need to undo that. */
-    _Py_DEC_REFTOTAL;
-#endif
-    /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
-     * chain, so no more to do there.
-     * If COUNT_ALLOCS, the original decref bumped tp_frees, and
-     * _Py_NewReference bumped tp_allocs:  both of those need to be
-     * undone.
-     */
-#ifdef COUNT_ALLOCS
-    --Py_TYPE(self)->tp_frees;
-    --Py_TYPE(self)->tp_allocs;
-#endif
-}
-static PyMemberDef __pyx_Generator_memberlist[] = {
-    {(char *) "gi_running",
-#if PY_VERSION_HEX >= 0x02060000
-     T_BOOL,
-#else
-     T_BYTE,
-#endif
-     offsetof(__pyx_GeneratorObject, is_running),
-     READONLY,
-     NULL},
-    {0, 0, 0, 0, 0}
-};
-static PyMethodDef __pyx_Generator_methods[] = {
-    {__Pyx_NAMESTR("send"), (PyCFunction) __Pyx_Generator_Send, METH_O, 0},
-    {__Pyx_NAMESTR("throw"), (PyCFunction) __Pyx_Generator_Throw, METH_VARARGS, 0},
-    {__Pyx_NAMESTR("close"), (PyCFunction) __Pyx_Generator_Close, METH_NOARGS, 0},
-    {0, 0, 0, 0}
-};
-static PyTypeObject __pyx_GeneratorType_type = {
-    PyVarObject_HEAD_INIT(0, 0)
-    __Pyx_NAMESTR("generator"),         /*tp_name*/
-    sizeof(__pyx_GeneratorObject),      /*tp_basicsize*/
-    0,                                  /*tp_itemsize*/
-    (destructor) __Pyx_Generator_dealloc,/*tp_dealloc*/
-    0,                                  /*tp_print*/
-    0,                                  /*tp_getattr*/
-    0,                                  /*tp_setattr*/
-#if PY_MAJOR_VERSION < 3
-    0,                                  /*tp_compare*/
-#else
-    0,                                  /*reserved*/
-#endif
-    0,                                   /*tp_repr*/
-    0,                                  /*tp_as_number*/
-    0,                                  /*tp_as_sequence*/
-    0,                                  /*tp_as_mapping*/
-    0,                                  /*tp_hash*/
-    0,                                  /*tp_call*/
-    0,                                  /*tp_str*/
-    0,                                  /*tp_getattro*/
-    0,                                  /*tp_setattro*/
-    0,                                  /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
-    0,                                  /*tp_doc*/
-    (traverseproc) __Pyx_Generator_traverse,   /*tp_traverse*/
-    0,                                  /*tp_clear*/
-    0,                                  /*tp_richcompare*/
-    offsetof(__pyx_GeneratorObject, gi_weakreflist), /* tp_weaklistoffse */
-    0,                                  /*tp_iter*/
-    (iternextfunc) __Pyx_Generator_Next, /*tp_iternext*/
-    __pyx_Generator_methods,            /*tp_methods*/
-    __pyx_Generator_memberlist,         /*tp_members*/
-    0,                                  /*tp_getset*/
-    0,                                  /*tp_base*/
-    0,                                  /*tp_dict*/
-    0,                                  /*tp_descr_get*/
-    0,                                  /*tp_descr_set*/
-    0,                                  /*tp_dictoffset*/
-    0,                                  /*tp_init*/
-    0,                                  /*tp_alloc*/
-    0,                                  /*tp_new*/
-    0,                                  /*tp_free*/
-    0,                                  /*tp_is_gc*/
-    0,                                  /*tp_bases*/
-    0,                                  /*tp_mro*/
-    0,                                  /*tp_cache*/
-    0,                                  /*tp_subclasses*/
-    0,                                  /*tp_weaklist*/
-    __Pyx_Generator_del,                /*tp_del*/
-#if PY_VERSION_HEX >= 0x02060000
-    0,                                  /*tp_version_tag*/
-#endif
-};
-static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
-                                                  PyObject *closure) {
-    __pyx_GeneratorObject *gen =
-        PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType_type);
-    if (gen == NULL)
-        return NULL;
-    gen->body = body;
-    gen->closure = closure;
-    Py_XINCREF(closure);
-    gen->is_running = 0;
-    gen->resume_label = 0;
-    gen->classobj = NULL;
-    gen->yieldfrom = NULL;
-    gen->exc_type = NULL;
-    gen->exc_value = NULL;
-    gen->exc_traceback = NULL;
-    gen->gi_weakreflist = NULL;
-    PyObject_GC_Track(gen);
-    return gen;
-}
-static int __pyx_Generator_init(void) {
-    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
-    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
-    if (PyType_Ready(&__pyx_GeneratorType_type)) {
-        return -1;
-    }
-    __pyx_GeneratorType = &__pyx_GeneratorType_type;
-    return 0;
+    return __Pyx_Generator_SendEx(generator, NULL);
 }
 
 static int __Pyx_check_binary_version(void) {
@@ -67166,6 +64162,7 @@ static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *s
         void (*fp)(void);
         void *p;
     } tmp;
+
     d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__");
     if (!d) {
         PyErr_Clear();
@@ -67212,105 +64209,29 @@ bad:
     return -1;
 }
 
-static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
-    int start = 0, mid = 0, end = count - 1;
-    if (end >= 0 && code_line > entries[end].code_line) {
-        return count;
-    }
-    while (start < end) {
-        mid = (start + end) / 2;
-        if (code_line < entries[mid].code_line) {
-            end = mid;
-        } else if (code_line > entries[mid].code_line) {
-             start = mid + 1;
-        } else {
-            return mid;
-        }
-    }
-    if (code_line <= entries[mid].code_line) {
-        return mid;
-    } else {
-        return mid + 1;
-    }
-}
-static PyCodeObject *__pyx_find_code_object(int code_line) {
-    PyCodeObject* code_object;
-    int pos;
-    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
-        return NULL;
-    }
-    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
-    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
-        return NULL;
-    }
-    code_object = __pyx_code_cache.entries[pos].code_object;
-    Py_INCREF(code_object);
-    return code_object;
-}
-static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
-    int pos, i;
-    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
-    if (unlikely(!code_line)) {
-        return;
-    }
-    if (unlikely(!entries)) {
-        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
-        if (likely(entries)) {
-            __pyx_code_cache.entries = entries;
-            __pyx_code_cache.max_count = 64;
-            __pyx_code_cache.count = 1;
-            entries[0].code_line = code_line;
-            entries[0].code_object = code_object;
-            Py_INCREF(code_object);
-        }
-        return;
-    }
-    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
-    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
-        PyCodeObject* tmp = entries[pos].code_object;
-        entries[pos].code_object = code_object;
-        Py_DECREF(tmp);
-        return;
-    }
-    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
-        int new_max = __pyx_code_cache.max_count + 64;
-        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
-            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));
-        if (unlikely(!entries)) {
-            return;
-        }
-        __pyx_code_cache.entries = entries;
-        __pyx_code_cache.max_count = new_max;
-    }
-    for (i=__pyx_code_cache.count; i>pos; i--) {
-        entries[i] = entries[i-1];
-    }
-    entries[pos].code_line = code_line;
-    entries[pos].code_object = code_object;
-    __pyx_code_cache.count++;
-    Py_INCREF(code_object);
-}
-
 #include "compile.h"
 #include "frameobject.h"
 #include "traceback.h"
-static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
-            const char *funcname, int c_line,
-            int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
+
+static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
+                               int __pyx_lineno, const char *__pyx_filename) {
     PyObject *py_srcfile = 0;
     PyObject *py_funcname = 0;
+    PyObject *py_globals = 0;
+    PyCodeObject *py_code = 0;
+    PyFrameObject *py_frame = 0;
+
     #if PY_MAJOR_VERSION < 3
-    py_srcfile = PyString_FromString(filename);
+    py_srcfile = PyString_FromString(__pyx_filename);
     #else
-    py_srcfile = PyUnicode_FromString(filename);
+    py_srcfile = PyUnicode_FromString(__pyx_filename);
     #endif
     if (!py_srcfile) goto bad;
-    if (c_line) {
+    if (__pyx_clineno) {
         #if PY_MAJOR_VERSION < 3
-        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
         #else
-        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
         #endif
     }
     else {
@@ -67321,45 +64242,28 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
         #endif
     }
     if (!py_funcname) goto bad;
-    py_code = __Pyx_PyCode_New(
+    py_globals = PyModule_GetDict(__pyx_m);
+    if (!py_globals) goto bad;
+    py_code = PyCode_New(
         0,            /*int argcount,*/
+        #if PY_MAJOR_VERSION >= 3
         0,            /*int kwonlyargcount,*/
+        #endif
         0,            /*int nlocals,*/
         0,            /*int stacksize,*/
         0,            /*int flags,*/
         __pyx_empty_bytes, /*PyObject *code,*/
-        __pyx_empty_tuple, /*PyObject *consts,*/
-        __pyx_empty_tuple, /*PyObject *names,*/
-        __pyx_empty_tuple, /*PyObject *varnames,*/
-        __pyx_empty_tuple, /*PyObject *freevars,*/
-        __pyx_empty_tuple, /*PyObject *cellvars,*/
+        __pyx_empty_tuple,  /*PyObject *consts,*/
+        __pyx_empty_tuple,  /*PyObject *names,*/
+        __pyx_empty_tuple,  /*PyObject *varnames,*/
+        __pyx_empty_tuple,  /*PyObject *freevars,*/
+        __pyx_empty_tuple,  /*PyObject *cellvars,*/
         py_srcfile,   /*PyObject *filename,*/
         py_funcname,  /*PyObject *name,*/
-        py_line,      /*int firstlineno,*/
+        __pyx_lineno,   /*int firstlineno,*/
         __pyx_empty_bytes  /*PyObject *lnotab*/
     );
-    Py_DECREF(py_srcfile);
-    Py_DECREF(py_funcname);
-    return py_code;
-bad:
-    Py_XDECREF(py_srcfile);
-    Py_XDECREF(py_funcname);
-    return NULL;
-}
-static void __Pyx_AddTraceback(const char *funcname, int c_line,
-                               int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
-    PyObject *py_globals = 0;
-    PyFrameObject *py_frame = 0;
-    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
-    if (!py_code) {
-        py_code = __Pyx_CreateCodeObjectForTraceback(
-            funcname, c_line, py_line, filename);
-        if (!py_code) goto bad;
-        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
-    }
-    py_globals = PyModule_GetDict(__pyx_m);
-    if (!py_globals) goto bad;
+    if (!py_code) goto bad;
     py_frame = PyFrame_New(
         PyThreadState_GET(), /*PyThreadState *tstate,*/
         py_code,             /*PyCodeObject *code,*/
@@ -67367,9 +64271,11 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line,
         0                    /*PyObject *locals*/
     );
     if (!py_frame) goto bad;
-    py_frame->f_lineno = py_line;
+    py_frame->f_lineno = __pyx_lineno;
     PyTraceBack_Here(py_frame);
 bad:
+    Py_XDECREF(py_srcfile);
+    Py_XDECREF(py_funcname);
     Py_XDECREF(py_code);
     Py_XDECREF(py_frame);
 }
@@ -67404,7 +64310,6 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     return 0;
 }
 
-
 /* Type Conversion Functions */
 
 static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
diff --git a/python/src/sa/rulefactory.pxi b/python/src/sa/rulefactory.pxi
index 287b9a67..54471ccd 100644
--- a/python/src/sa/rulefactory.pxi
+++ b/python/src/sa/rulefactory.pxi
@@ -1103,7 +1103,7 @@ cdef class HieroCachingRuleFactory:
                                     count = len(locs)
                                     scores = self.scorer.score(FeatureContext(
                                                f, e, count, fcount[f], num_samples,
-                                               (i,k), locs, fwords
+                                               (k,i), locs, fwords
                                                ))
                                     yield Rule(self.category, f, e, scores, alignment)
 
-- 
cgit v1.2.3


From 01c4ae15be864f503cd12660920b74bc844f88be Mon Sep 17 00:00:00 2001
From: Adam Lopez <alopez@cs.jhu.edu>
Date: Wed, 5 Sep 2012 12:23:06 -0400
Subject: Change FeatureContext.input_span to return slice indices

---
 python/src/sa/_sa.c           | 263 +++++++++++++++++++++---------------------
 python/src/sa/rulefactory.pxi |   2 +-
 2 files changed, 134 insertions(+), 131 deletions(-)

(limited to 'python/src/sa')

diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index 7753341b..7b7796b4 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.15.1 on Wed Sep  5 11:46:33 2012 */
+/* Generated by Cython 0.15.1 on Wed Sep  5 12:16:41 2012 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -44706,7 +44706,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(             # <<<<<<<<<<<<<<
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i), locs, fwords
+ *                                                (k,i+spanlen), locs, fwords
  */
                 __pyx_t_14 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
@@ -44715,7 +44715,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,             # <<<<<<<<<<<<<<
- *                                                (k,i), locs, fwords
+ *                                                (k,i+spanlen), locs, fwords
  *                                                ))
  */
                 __pyx_t_13 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -44726,7 +44726,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1106
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i), locs, fwords             # <<<<<<<<<<<<<<
+ *                                                (k,i+spanlen), locs, fwords             # <<<<<<<<<<<<<<
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)
  */
@@ -44734,92 +44734,95 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_GOTREF(__pyx_t_7);
                 __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
-                PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_7);
+                __pyx_t_15 = PyNumber_Add(__pyx_t_2, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+                __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+                PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7);
                 __Pyx_GIVEREF(__pyx_t_7);
-                PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
-                __Pyx_GIVEREF(__pyx_t_2);
+                PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_15);
+                __Pyx_GIVEREF(__pyx_t_15);
                 __pyx_t_7 = 0;
-                __pyx_t_2 = 0;
+                __pyx_t_15 = 0;
 
                 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1107
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i), locs, fwords
+ *                                                (k,i+spanlen), locs, fwords
  *                                                ))             # <<<<<<<<<<<<<<
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  */
-                __pyx_t_2 = PyTuple_New(8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+                __pyx_t_15 = PyTuple_New(8); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
-                PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_f);
+                PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_f);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
-                PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_cur_scope->__pyx_v_e);
+                PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_cur_scope->__pyx_v_e);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_count);
-                PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_cur_scope->__pyx_v_count);
+                PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_cur_scope->__pyx_v_count);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_count);
-                PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_13);
+                PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_13);
                 __Pyx_GIVEREF(__pyx_t_13);
-                PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_t_3);
+                PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_3);
                 __Pyx_GIVEREF(__pyx_t_3);
-                PyTuple_SET_ITEM(__pyx_t_2, 5, ((PyObject *)__pyx_t_15));
-                __Pyx_GIVEREF(((PyObject *)__pyx_t_15));
+                PyTuple_SET_ITEM(__pyx_t_15, 5, ((PyObject *)__pyx_t_2));
+                __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
-                PyTuple_SET_ITEM(__pyx_t_2, 6, ((PyObject *)__pyx_cur_scope->__pyx_v_locs));
+                PyTuple_SET_ITEM(__pyx_t_15, 6, ((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
-                PyTuple_SET_ITEM(__pyx_t_2, 7, __pyx_cur_scope->__pyx_v_fwords);
+                PyTuple_SET_ITEM(__pyx_t_15, 7, __pyx_cur_scope->__pyx_v_fwords);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
                 __pyx_t_13 = 0;
                 __pyx_t_3 = 0;
-                __pyx_t_15 = 0;
-                __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
-                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer->__pyx_vtab)->score(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer, __pyx_t_15)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = 0;
+                __pyx_t_2 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
+                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer->__pyx_vtab)->score(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
                 __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
-                __Pyx_GIVEREF(__pyx_t_2);
-                __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_2);
-                __pyx_t_2 = 0;
+                __Pyx_GIVEREF(__pyx_t_15);
+                __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_15);
+                __pyx_t_15 = 0;
 
                 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1108
- *                                                (k,i), locs, fwords
+ *                                                (k,i+spanlen), locs, fwords
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)             # <<<<<<<<<<<<<<
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  */
-                __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyTuple_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
-                PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_2);
-                __Pyx_GIVEREF(__pyx_t_2);
+                __pyx_t_15 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+                PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_15);
+                __Pyx_GIVEREF(__pyx_t_15);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
-                PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_cur_scope->__pyx_v_f);
+                PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_cur_scope->__pyx_v_f);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
-                PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_cur_scope->__pyx_v_e);
+                PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_cur_scope->__pyx_v_e);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
-                PyTuple_SET_ITEM(__pyx_t_15, 3, ((PyObject *)__pyx_cur_scope->__pyx_v_scores));
+                PyTuple_SET_ITEM(__pyx_t_2, 3, ((PyObject *)__pyx_cur_scope->__pyx_v_scores));
                 __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_alignment);
-                PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_cur_scope->__pyx_v_alignment);
+                PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_alignment);
-                __pyx_t_2 = 0;
-                __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_2);
-                __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_r = __pyx_t_2;
-                __pyx_t_2 = 0;
+                __pyx_t_15 = 0;
+                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+                __pyx_r = __pyx_t_15;
+                __pyx_t_15 = 0;
                 __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
                 __pyx_cur_scope->__pyx_t_1 = __pyx_t_5;
                 __Pyx_XGIVEREF(__pyx_t_9);
@@ -44884,20 +44887,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_2 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_15 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_LT); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_15);
         __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
-          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_9 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __pyx_t_25 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_25 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
@@ -44945,23 +44948,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_15 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
+          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __pyx_t_14 = PyTuple_New(7); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_14));
           PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
-          PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_15);
+          __Pyx_GIVEREF(__pyx_t_15);
           PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_14, 3, __pyx_t_15);
-          __Pyx_GIVEREF(__pyx_t_15);
+          PyTuple_SET_ITEM(__pyx_t_14, 3, __pyx_t_2);
+          __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_node);
           PyTuple_SET_ITEM(__pyx_t_14, 4, __pyx_cur_scope->__pyx_v_node);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_node);
@@ -44972,9 +44975,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           PyTuple_SET_ITEM(__pyx_t_14, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
           __pyx_t_9 = 0;
-          __pyx_t_2 = 0;
-          __pyx_t_10 = 0;
           __pyx_t_15 = 0;
+          __pyx_t_10 = 0;
+          __pyx_t_2 = 0;
           __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_14)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
         }
@@ -45052,14 +45055,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
           __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
-          __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_14, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
+          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_14, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xnode);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_xnode);
-          __Pyx_GIVEREF(__pyx_t_15);
-          __pyx_cur_scope->__pyx_v_xnode = __pyx_t_15;
-          __pyx_t_15 = 0;
+          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_cur_scope->__pyx_v_xnode = __pyx_t_2;
+          __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1120
  *                         xnode = node.children[xcat]
@@ -45068,14 +45071,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  */
-          __pyx_t_15 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
+          __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-          PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_15);
-          __Pyx_GIVEREF(__pyx_t_15);
+          PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
+          __Pyx_GIVEREF(__pyx_t_2);
           PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_14);
           __Pyx_GIVEREF(__pyx_t_14);
           __Pyx_INCREF(__pyx_int_1);
@@ -45084,7 +45087,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
           PyList_SET_ITEM(__pyx_t_10, 3, __pyx_cur_scope->__pyx_v_pathlen);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
-          __pyx_t_15 = 0;
+          __pyx_t_2 = 0;
           __pyx_t_14 = 0;
           __pyx_t_14 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_14));
@@ -45152,40 +45155,40 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_GOTREF(__pyx_t_14);
             __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
+            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_15 = PyTuple_New(7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_15);
-            __Pyx_GIVEREF(__pyx_t_15);
+            PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_int_1);
-            PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_int_1);
+            PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_int_1);
             __Pyx_GIVEREF(__pyx_int_1);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
-            PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_cur_scope->__pyx_v_pathlen);
+            PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
-            PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_cur_scope->__pyx_v_fwords);
+            PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_cur_scope->__pyx_v_fwords);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
             __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_next_states));
-            PyTuple_SET_ITEM(__pyx_t_2, 5, ((PyObject *)__pyx_cur_scope->__pyx_v_next_states));
+            PyTuple_SET_ITEM(__pyx_t_15, 5, ((PyObject *)__pyx_cur_scope->__pyx_v_next_states));
             __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_next_states));
             __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
-            PyTuple_SET_ITEM(__pyx_t_2, 6, ((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
+            PyTuple_SET_ITEM(__pyx_t_15, 6, ((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
             __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
             __pyx_t_10 = 0;
-            __pyx_t_15 = 0;
-            __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
-            __Pyx_GIVEREF(__pyx_t_15);
-            __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_15;
-            __pyx_t_15 = 0;
+            __Pyx_GIVEREF(__pyx_t_2);
+            __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1126
  *                         else:
@@ -45206,33 +45209,33 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             frontier = new_frontier
  */
           if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes)) {
-            __pyx_t_15 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_15); __pyx_t_5 = 0;
+            __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_5 = 0;
             __pyx_t_20 = NULL;
           } else {
-            __pyx_t_5 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_20 = Py_TYPE(__pyx_t_15)->tp_iternext;
+            __pyx_t_5 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_20 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_15)) {
-              if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_15)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++;
-            } else if (PyTuple_CheckExact(__pyx_t_15)) {
-              if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++;
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_15); __pyx_t_5++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_15); __pyx_t_5++;
             } else {
-              __pyx_t_2 = __pyx_t_20(__pyx_t_15);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_15 = __pyx_t_20(__pyx_t_2);
+              if (unlikely(!__pyx_t_15)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
                   else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_15);
             }
-            if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
-              PyObject* sequence = __pyx_t_2;
+            if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
+              PyObject* sequence = __pyx_t_15;
               if (likely(PyTuple_CheckExact(sequence))) {
                 if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
                   if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
@@ -45255,12 +45258,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __Pyx_INCREF(__pyx_t_14);
               __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_9);
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             } else {
               Py_ssize_t index = -1;
-              __pyx_t_3 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __pyx_t_17 = Py_TYPE(__pyx_t_3)->tp_iternext;
               index = 0; __pyx_t_14 = __pyx_t_17(__pyx_t_3); if (unlikely(!__pyx_t_14)) goto __pyx_L71_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_14);
@@ -45300,8 +45303,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
               PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
             }
-            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_15);
             __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -45318,8 +45321,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
             __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_2);
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_15);
+            __Pyx_GIVEREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_9);
             PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_10);
@@ -45335,14 +45338,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
             PyTuple_SET_ITEM(__pyx_t_3, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-            __pyx_t_2 = 0;
+            __pyx_t_15 = 0;
             __pyx_t_9 = 0;
             __pyx_t_10 = 0;
             __pyx_t_14 = 0;
             __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           }
-          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           goto __pyx_L67;
         }
         __pyx_L67:;
@@ -45389,8 +45392,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
   __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_15 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_15);
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
@@ -45405,9 +45408,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
@@ -45442,18 +45445,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_t_3 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_kp_s_125));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_125));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
diff --git a/python/src/sa/rulefactory.pxi b/python/src/sa/rulefactory.pxi
index 54471ccd..a123e85f 100644
--- a/python/src/sa/rulefactory.pxi
+++ b/python/src/sa/rulefactory.pxi
@@ -1103,7 +1103,7 @@ cdef class HieroCachingRuleFactory:
                                     count = len(locs)
                                     scores = self.scorer.score(FeatureContext(
                                                f, e, count, fcount[f], num_samples,
-                                               (k,i), locs, fwords
+                                               (k,i+spanlen), locs, fwords
                                                ))
                                     yield Rule(self.category, f, e, scores, alignment)
 
-- 
cgit v1.2.3


From f99b04588d3725f28d13dcdfcbc0846cc1c52321 Mon Sep 17 00:00:00 2001
From: Adam Lopez <alopez@cs.jhu.edu>
Date: Wed, 5 Sep 2012 13:15:17 -0400
Subject: Pass F, E texts to features

---
 python/src/sa/_sa.c           | 22935 +++++++++++++++++++++++-----------------
 python/src/sa/rulefactory.pxi |     6 +-
 2 files changed, 13024 insertions(+), 9917 deletions(-)

(limited to 'python/src/sa')

diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index 7b7796b4..2c4fd655 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,16 +1,16 @@
-/* Generated by Cython 0.15.1 on Wed Sep  5 12:16:41 2012 */
+/* Generated by Cython 0.17 on Wed Sep  5 13:13:29 2012 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
+#elif PY_VERSION_HEX < 0x02040000
+    #error Cython requires Python 2.4+.
 #else
-
 #include <stddef.h> /* For offsetof */
 #ifndef offsetof
 #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
 #endif
-
 #if !defined(WIN32) && !defined(MS_WINDOWS)
   #ifndef __stdcall
     #define __stdcall
@@ -22,36 +22,44 @@
     #define __fastcall
   #endif
 #endif
-
 #ifndef DL_IMPORT
   #define DL_IMPORT(t) t
 #endif
 #ifndef DL_EXPORT
   #define DL_EXPORT(t) t
 #endif
-
 #ifndef PY_LONG_LONG
   #define PY_LONG_LONG LONG_LONG
 #endif
-
-#if PY_VERSION_HEX < 0x02040000
-  #define METH_COEXIST 0
-  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
-  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)
+#ifndef Py_HUGE_VAL
+  #define Py_HUGE_VAL HUGE_VAL
+#endif
+#ifdef PYPY_VERSION
+#define CYTHON_COMPILING_IN_PYPY 1
+#define CYTHON_COMPILING_IN_CPYTHON 0
+#else
+#define CYTHON_COMPILING_IN_PYPY 0
+#define CYTHON_COMPILING_IN_CPYTHON 1
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   typedef int Py_ssize_t;
   #define PY_SSIZE_T_MAX INT_MAX
   #define PY_SSIZE_T_MIN INT_MIN
   #define PY_FORMAT_SIZE_T ""
+  #define CYTHON_FORMAT_SSIZE_T ""
   #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
   #define PyInt_AsSsize_t(o)   __Pyx_PyInt_AsInt(o)
-  #define PyNumber_Index(o)    PyNumber_Int(o)
-  #define PyIndex_Check(o)     PyNumber_Check(o)
+  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \
+                                (PyErr_Format(PyExc_TypeError, \
+                                              "expected index value, got %.200s", Py_TYPE(o)->tp_name), \
+                                 (PyObject*)0))
+  #define PyIndex_Check(o)     (PyNumber_Check(o) && !PyFloat_Check(o) && !PyComplex_Check(o))
   #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
+  #define __PYX_BUILD_PY_SSIZE_T "i"
+#else
+  #define __PYX_BUILD_PY_SSIZE_T "n"
+  #define CYTHON_FORMAT_SSIZE_T "z"
 #endif
-
 #if PY_VERSION_HEX < 0x02060000
   #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
   #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
@@ -59,7 +67,6 @@
   #define PyVarObject_HEAD_INIT(type, size) \
           PyObject_HEAD_INIT(type) size,
   #define PyType_Modified(t)
-
   typedef struct {
      void *buf;
      PyObject *obj;
@@ -73,7 +80,6 @@
      Py_ssize_t *suboffsets;
      void *internal;
   } Py_buffer;
-
   #define PyBUF_SIMPLE 0
   #define PyBUF_WRITABLE 0x0001
   #define PyBUF_FORMAT 0x0004
@@ -83,24 +89,44 @@
   #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
   #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
   #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
-
+  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)
+  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)
+  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
+  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
 #endif
-
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
+  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
+          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
+  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
+          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+#endif
+#if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6
+  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict")
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define Py_TPFLAGS_CHECKTYPES 0
   #define Py_TPFLAGS_HAVE_INDEX 0
 #endif
-
 #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
-
+#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
+  #define CYTHON_PEP393_ENABLED 1
+  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \
+                                              0 : _PyUnicode_Ready((PyObject *)(op)))
+  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
+  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
+  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
+#else
+  #define CYTHON_PEP393_ENABLED 0
+  #define __Pyx_PyUnicode_READY(op)       (0)
+  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
+  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
+  #define __Pyx_PyUnicode_READ(k, d, i)   ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
+#endif
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
   #define PyStringObject               PyUnicodeObject
@@ -108,7 +134,6 @@
   #define PyString_Check               PyUnicode_Check
   #define PyString_CheckExact          PyUnicode_CheckExact
 #endif
-
 #if PY_VERSION_HEX < 0x02060000
   #define PyBytesObject                PyStringObject
   #define PyBytes_Type                 PyString_Type
@@ -127,7 +152,6 @@
   #define PyBytes_Concat               PyString_Concat
   #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
 #endif
-
 #if PY_VERSION_HEX < 0x02060000
   #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
   #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
@@ -135,9 +159,7 @@
 #ifndef PySet_CheckExact
   #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
 #endif
-
 #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
-
 #if PY_MAJOR_VERSION >= 3
   #define PyIntObject                  PyLongObject
   #define PyInt_Type                   PyLong_Type
@@ -154,11 +176,9 @@
   #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
   #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define PyBoolObject                 PyLongObject
 #endif
-
 #if PY_VERSION_HEX < 0x03020000
   typedef long Py_hash_t;
   #define __Pyx_PyInt_FromHash_t PyInt_FromLong
@@ -167,16 +187,6 @@
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
   #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
 #endif
-
-
-#if PY_MAJOR_VERSION >= 3
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
-#else
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
-#endif
-
 #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)
   #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)
   #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)
@@ -195,11 +205,9 @@
         (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \
             (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1)))
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
@@ -209,7 +217,6 @@
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
   #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_NAMESTR(n) ((char *)(n))
   #define __Pyx_DOCSTR(n)  ((char *)(n))
@@ -218,6 +225,15 @@
   #define __Pyx_DOCSTR(n)  (n)
 #endif
 
+
+#if PY_MAJOR_VERSION >= 3
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
+#else
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
+#endif
+
 #ifndef __PYX_EXTERN_C
   #ifdef __cplusplus
     #define __PYX_EXTERN_C extern "C"
@@ -267,7 +283,7 @@
 #   else
 #     define CYTHON_UNUSED
 #   endif
-# elif defined(__ICC) || defined(__INTEL_COMPILER)
+# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
 #   define CYTHON_UNUSED __attribute__ ((__unused__))
 # else
 #   define CYTHON_UNUSED
@@ -291,8 +307,12 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
 static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 
+#if CYTHON_COMPILING_IN_CPYTHON
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
-
+#else
+#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
+#endif
+#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
 
 #ifdef __GNUC__
   /* Test for GCC > 2.95 */
@@ -336,16 +356,8 @@ static const char *__pyx_f[] = {
   "str_map.pxi",
 };
 
-static PyObject *__Pyx_Generator_Next(PyObject *self);
-static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
-static PyObject *__Pyx_Generator_Close(PyObject *self);
-static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args, CYTHON_UNUSED PyObject *kwds);
-
-typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
-
 /*--- Type declarations ---*/
 struct __pyx_obj_3_sa_HieroCachingRuleFactory;
-struct __pyx_Generator_object;
 struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__;
 struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats;
 struct __pyx_obj_3_sa_IntList;
@@ -462,7 +474,7 @@ struct __pyx_t_3_sa__Trie_Node {
   int arr_len;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":62
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":64
  * 
  * # linked list structure for storing matches in BaselineRuleFactory
  * cdef struct match_node:             # <<<<<<<<<<<<<<
@@ -474,7 +486,7 @@ struct __pyx_t_3_sa_match_node {
   struct __pyx_t_3_sa_match_node *next;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":158
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":160
  * 
  * # struct used to encapsulate a single matching
  * cdef struct Matching:             # <<<<<<<<<<<<<<
@@ -489,7 +501,7 @@ struct __pyx_t_3_sa_Matching {
   int size;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":214
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":216
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -538,24 +550,6 @@ struct __pyx_obj_3_sa_HieroCachingRuleFactory {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
- *         free(self.arr)
- * 
- *     def __iter__(self):             # <<<<<<<<<<<<<<
- *         cdef int i
- *         for i in range(self.len):
- */
-struct __pyx_Generator_object {
-  PyObject_HEAD
-  __pyx_generator_body_t body;
-  int is_running;
-  int resume_label;
-  PyObject *exc_type;
-  PyObject *exc_value;
-  PyObject *exc_traceback;
-};
-
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
@@ -564,9 +558,9 @@ struct __pyx_Generator_object {
  *         for i from 0 <= i < self.n:
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   int __pyx_v_i;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_Phrase *__pyx_v_self;
   int __pyx_t_0;
 };
 
@@ -579,7 +573,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ {
  *         particular, the frequency associated with each word is
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   int __pyx_v_N;
   int __pyx_v_freq;
   int __pyx_v_h;
@@ -595,7 +589,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
   PyObject *__pyx_v_ngram_starts;
   int __pyx_v_rs;
   struct __pyx_obj_3_sa_IntList *__pyx_v_run_start;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_LCP *__pyx_v_self;
   int __pyx_v_valid;
   struct __pyx_obj_3_sa_VEB *__pyx_v_veb;
   int __pyx_t_0;
@@ -736,7 +730,7 @@ struct __pyx_obj_3_sa_Precomputation {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":935
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":937
  *         return sorted(result);
  * 
  *     def input(self, fwords):             # <<<<<<<<<<<<<<
@@ -744,7 +738,7 @@ struct __pyx_obj_3_sa_Precomputation {
  *         it looks up all of the rules that can be used to translate
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   PyObject *__pyx_v_alignment;
   PyObject *__pyx_v_als;
   PyObject *__pyx_v_alslist;
@@ -793,7 +787,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
   PyObject *__pyx_v_sa_range;
   struct __pyx_obj_3_sa_IntList *__pyx_v_sample;
   struct __pyx_obj_3_sa_FeatureVector *__pyx_v_scores;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self;
   PyObject *__pyx_v_spanlen;
   float __pyx_v_start_time;
   PyObject *__pyx_v_stop_time;
@@ -807,13 +801,15 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
   PyObject *__pyx_v_xnode;
   PyObject *__pyx_v_xroot;
   Py_ssize_t __pyx_t_0;
-  Py_ssize_t __pyx_t_1;
-  PyObject *__pyx_t_2;
-  PyObject *__pyx_t_3;
+  PyObject *__pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  int __pyx_t_3;
   PyObject *__pyx_t_4;
-  PyObject *(*__pyx_t_5)(PyObject *);
-  Py_ssize_t __pyx_t_6;
-  PyObject *(*__pyx_t_7)(PyObject *);
+  PyObject *__pyx_t_5;
+  int __pyx_t_6;
+  Py_ssize_t __pyx_t_7;
+  Py_ssize_t __pyx_t_8;
+  Py_ssize_t __pyx_t_9;
 };
 
 
@@ -877,7 +873,7 @@ struct __pyx_obj_3_sa_Rule {
  * 
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *__pyx_outer_scope;
   PyObject *__pyx_v_a;
   PyObject *__pyx_t_0;
@@ -894,7 +890,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
  * 
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_outer_scope;
   PyObject *__pyx_v_line;
   PyObject *__pyx_t_0;
@@ -903,7 +899,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":70
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":72
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -930,7 +926,7 @@ struct __pyx_obj_3_sa_PhraseLocation {
  * cdef class Scorer:
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *__pyx_outer_scope;
   PyObject *__pyx_v_feat;
   PyObject *__pyx_t_0;
@@ -948,7 +944,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ {
   PyObject_HEAD
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self;
 };
 
 
@@ -988,9 +984,9 @@ struct __pyx_obj_3_sa_FeatureVector {
  *             yield point/65536, point%65536
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   PyObject *__pyx_v_point;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_Rule *__pyx_v_self;
   PyObject *__pyx_t_0;
   Py_ssize_t __pyx_t_1;
   PyObject *(*__pyx_t_2)(PyObject *);
@@ -1034,9 +1030,9 @@ struct __pyx_obj_3_sa_Alignment {
  *         for i in range(self.names.len):
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   unsigned int __pyx_v_i;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self;
   int __pyx_t_0;
   unsigned int __pyx_t_1;
 };
@@ -1055,7 +1051,7 @@ struct __pyx_obj_3_sa_BitSet {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":92
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":94
  * 
  * 
  * cdef class Sampler:             # <<<<<<<<<<<<<<
@@ -1083,7 +1079,7 @@ struct __pyx_obj_3_sa_StringMap {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":32
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":34
  * cdef int EPSILON = sym_fromstring('*EPS*', True)
  * 
  * cdef class TrieNode:             # <<<<<<<<<<<<<<
@@ -1096,7 +1092,7 @@ struct __pyx_obj_3_sa_TrieNode {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":38
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":40
  *         self.children = {}
  * 
  * cdef class ExtendedTrieNode(TrieNode):             # <<<<<<<<<<<<<<
@@ -1151,15 +1147,15 @@ struct __pyx_obj_3_sa_Phrase {
  *         for i in range(self.len):
  */
 struct __pyx_obj_3_sa___pyx_scope_struct____iter__ {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   int __pyx_v_i;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_self;
   int __pyx_t_0;
   int __pyx_t_1;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":49
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":51
  * 
  * 
  * cdef class TrieTable:             # <<<<<<<<<<<<<<
@@ -1183,7 +1179,7 @@ struct __pyx_obj_3_sa_TrieTable {
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ {
   PyObject_HEAD
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_Rule *__pyx_v_self;
 };
 
 
@@ -1320,7 +1316,7 @@ struct __pyx_vtabstruct_3_sa_Phrase {
 static struct __pyx_vtabstruct_3_sa_Phrase *__pyx_vtabptr_3_sa_Phrase;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":70
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":72
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -1418,7 +1414,7 @@ struct __pyx_vtabstruct_3_sa_Alphabet {
 static struct __pyx_vtabstruct_3_sa_Alphabet *__pyx_vtabptr_3_sa_Alphabet;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":214
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":216
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -1455,17 +1451,15 @@ static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *__pyx_vtabptr_3_sa_
  */
 
 struct __pyx_vtabstruct_3_sa_SuffixArray {
-  int (*__search_high)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
-  int (*__search_low)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
-  PyObject *(*__get_range)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int);
-  PyObject *(*__lookup_helper)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  int (*__pyx___search_high)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  int (*__pyx___search_low)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  PyObject *(*__pyx___get_range)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int);
+  PyObject *(*__pyx___lookup_helper)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
 };
 static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
-
 #ifndef CYTHON_REFNANNY
   #define CYTHON_REFNANNY 0
 #endif
-
 #if CYTHON_REFNANNY
   typedef struct {
     void (*INCREF)(void*, PyObject*, int);
@@ -1478,8 +1472,21 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/
   #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
-  #define __Pyx_RefNannySetupContext(name)           __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
-  #define __Pyx_RefNannyFinishContext()           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
+#ifdef WITH_THREAD
+  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
+          if (acquire_gil) { \
+              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \
+              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
+              PyGILState_Release(__pyx_gilstate_save); \
+          } else { \
+              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
+          }
+#else
+  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
+          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
+#endif
+  #define __Pyx_RefNannyFinishContext() \
+          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
   #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
@@ -1490,7 +1497,7 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
 #else
   #define __Pyx_RefNannyDeclarations
-  #define __Pyx_RefNannySetupContext(name)
+  #define __Pyx_RefNannySetupContext(name, acquire_gil)
   #define __Pyx_RefNannyFinishContext()
   #define __Pyx_INCREF(r) Py_INCREF(r)
   #define __Pyx_DECREF(r) Py_DECREF(r)
@@ -1501,16 +1508,97 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   #define __Pyx_XGOTREF(r)
   #define __Pyx_XGIVEREF(r)
 #endif /* CYTHON_REFNANNY */
+#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
+#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
 
 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
 
-static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
-                                   Py_ssize_t end, int direction);
+static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
+                                         Py_ssize_t end, int direction)
+{
+    const char* self_ptr = PyBytes_AS_STRING(self);
+    Py_ssize_t self_len = PyBytes_GET_SIZE(self);
+    const char* sub_ptr;
+    Py_ssize_t sub_len;
+    int retval;
+#if PY_VERSION_HEX >= 0x02060000
+    Py_buffer view;
+    view.obj = NULL;
+#endif
+    if ( PyBytes_Check(arg) ) {
+        sub_ptr = PyBytes_AS_STRING(arg);
+        sub_len = PyBytes_GET_SIZE(arg);
+    }
+#if PY_MAJOR_VERSION < 3
+    else if ( PyUnicode_Check(arg) ) {
+        return PyUnicode_Tailmatch(self, arg, start, end, direction);
+    }
+#endif
+    else {
+#if PY_VERSION_HEX < 0x02060000
+        if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
+            return -1;
+#else
+        if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
+            return -1;
+        sub_ptr = (const char*) view.buf;
+        sub_len = view.len;
+#endif
+    }
+    if (end > self_len)
+        end = self_len;
+    else if (end < 0)
+        end += self_len;
+    if (end < 0)
+        end = 0;
+    if (start < 0)
+        start += self_len;
+    if (start < 0)
+        start = 0;
+    if (direction > 0) {
+        if (end-sub_len > start)
+            start = end - sub_len;
+    }
+    if (start + sub_len <= end)
+        retval = !memcmp(self_ptr+start, sub_ptr, sub_len);
+    else
+        retval = 0;
+#if PY_VERSION_HEX >= 0x02060000
+    if (view.obj)
+        PyBuffer_Release(&view);
+#endif
+    return retval;
+}
+static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
+                                   Py_ssize_t end, int direction)
+{
+    if (unlikely(PyTuple_Check(substr))) {
+        Py_ssize_t i, count = PyTuple_GET_SIZE(substr);
+        for (i = 0; i < count; i++) {
+            int result;
+#if CYTHON_COMPILING_IN_CPYTHON
+            result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
+                                                   start, end, direction);
+#else
+            PyObject* sub = PySequence_GetItem(substr, i);
+            if (unlikely(!sub)) return -1;
+            result = __Pyx_PyBytes_SingleTailmatch(self, sub, start, end, direction);
+            Py_DECREF(sub);
+#endif
+            if (result) {
+                return result;
+            }
+        }
+        return 0;
+    }
+    return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
+}
 
-static void __Pyx_RaiseDoubleKeywordsError(
-    const char* func_name, PyObject* kw_name); /*proto*/
+static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/
 
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
+    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
+    const char* function_name); /*proto*/
 
 static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
     Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
@@ -1522,9 +1610,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
 
 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
 
-static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict,
-    const char* function_name, int kw_allowed); /*proto*/
-
+static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /*proto*/
 
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
     PyObject *r;
@@ -1533,86 +1619,96 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j
     Py_DECREF(j);
     return r;
 }
-
-
 #define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_List_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) {
-    if (likely(o != Py_None)) {
-        if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-            PyObject *r = PyList_GET_ITEM(o, i);
-            Py_INCREF(r);
-            return r;
-        }
-        else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
-            PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
-            Py_INCREF(r);
-            return r;
-        }
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        PyObject *r = PyList_GET_ITEM(o, i);
+        Py_INCREF(r);
+        return r;
+    }
+    else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
+        PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
+        Py_INCREF(r);
+        return r;
     }
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    return PySequence_GetItem(o, i);
+#endif
 }
-
 #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_Tuple_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) {
-    if (likely(o != Py_None)) {
-        if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, i);
-            Py_INCREF(r);
-            return r;
-        }
-        else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
-            PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
-            Py_INCREF(r);
-            return r;
-        }
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        PyObject *r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
+        return r;
+    }
+    else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
+        PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
+        Py_INCREF(r);
+        return r;
     }
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    return PySequence_GetItem(o, i);
+#endif
 }
-
-
 #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
-    PyObject *r;
-    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-        r = PyList_GET_ITEM(o, i);
-        Py_INCREF(r);
-    }
-    else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-        r = PyTuple_GET_ITEM(o, i);
-        Py_INCREF(r);
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (PyList_CheckExact(o)) {
+        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
+        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
+            PyObject *r = PyList_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
     }
-    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
-        r = PySequence_GetItem(o, i);
+    else if (PyTuple_CheckExact(o)) {
+        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
+        if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
+            PyObject *r = PyTuple_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
+    } else {  /* inlined PySequence_GetItem() */
+        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
+        if (likely(m && m->sq_item)) {
+            if (unlikely(i < 0) && likely(m->sq_length)) {
+                Py_ssize_t l = m->sq_length(o);
+                if (unlikely(l < 0)) return NULL;
+                i += l;
+            }
+            return m->sq_item(o, i);
+        }
     }
-    else {
-        r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    if (PySequence_Check(o)) {
+        return PySequence_GetItem(o, i);
     }
-    return r;
+#endif
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
 }
 
-static CYTHON_INLINE int __Pyx_NegateNonNeg(int b) { 
-    return unlikely(b < 0) ? b : !b; 
-}
-static CYTHON_INLINE PyObject* __Pyx_PyBoolOrNull_FromLong(long b) {
-    return unlikely(b < 0) ? NULL : __Pyx_PyBool_FromLong(b);
+static CYTHON_INLINE int __Pyx_PySequence_Contains(PyObject* item, PyObject* seq, int eq) {
+    int result = PySequence_Contains(seq, item);
+    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
 }
 
 static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
     if (likely(PyList_CheckExact(L))) {
-        if (PyList_Append(L, x) < 0) return NULL;
+        if (unlikely(PyList_Append(L, x) < 0)) return NULL;
         Py_INCREF(Py_None);
         return Py_None; /* this is just to have an accurate signature */
-    }
-    else {
+    } else {
         PyObject *r, *m;
         m = __Pyx_GetAttrString(L, "append");
         if (!m) return NULL;
@@ -1630,16 +1726,17 @@ static CYTHON_INLINE long __Pyx_div_long(long, long); /* proto */
 
 static CYTHON_INLINE long __Pyx_mod_long(long, long); /* proto */
 
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
+
 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
+static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/
 
 static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/
 
 #define __Pyx_SetItemInt(o, i, v, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_SetItemInt_Fast(o, i, v) : \
                                                     __Pyx_SetItemInt_Generic(o, to_py_func(i), v))
-
 static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
     int r;
     if (!j) return -1;
@@ -1647,130 +1744,126 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyOb
     Py_DECREF(j);
     return r;
 }
-
 static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v) {
-    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-        Py_INCREF(v);
-        Py_DECREF(PyList_GET_ITEM(o, i));
-        PyList_SET_ITEM(o, i, v);
-        return 1;
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (PyList_CheckExact(o)) {
+        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
+        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
+            PyObject* old = PyList_GET_ITEM(o, n);
+            Py_INCREF(v);
+            PyList_SET_ITEM(o, n, v);
+            Py_DECREF(old);
+            return 1;
+        }
+    } else {  /* inlined PySequence_SetItem() */
+        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
+        if (likely(m && m->sq_ass_item)) {
+            if (unlikely(i < 0) && likely(m->sq_length)) {
+                Py_ssize_t l = m->sq_length(o);
+                if (unlikely(l < 0)) return -1;
+                i += l;
+            }
+            return m->sq_ass_item(o, i, v);
+        }
     }
-    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0)))
+#else
+#if CYTHON_COMPILING_IN_PYPY
+    if (PySequence_Check(o) && !PyDict_Check(o)) {
+#else
+    if (PySequence_Check(o)) {
+#endif
         return PySequence_SetItem(o, i, v);
-    else {
-        PyObject *j = PyInt_FromSsize_t(i);
-        return __Pyx_SetItemInt_Generic(o, j, v);
     }
+#endif
+    return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v);
 }
 
 static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */
-
+#if CYTHON_COMPILING_IN_PYPY
 #define __Pyx_PyObject_AsDouble(obj) \
-    ((likely(PyFloat_CheckExact(obj))) ? \
-     PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
+(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \
+ likely(PyInt_CheckExact(obj)) ? \
+ PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
+#else
+#define __Pyx_PyObject_AsDouble(obj) \
+((likely(PyFloat_CheckExact(obj))) ? \
+ PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
+#endif
 
 static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);
 
 static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact); /*proto*/
 
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
+    PyListObject* L = (PyListObject*) list;
+    Py_ssize_t len = Py_SIZE(list);
+    if (likely(L->allocated > len)) {
+        Py_INCREF(x);
+        PyList_SET_ITEM(list, len, x);
+        Py_SIZE(list) = len+1;
+        return 0;
+    }
+    return PyList_Append(list, x);
+}
+#else
+#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
+#endif
+
+static CYTHON_INLINE int __Pyx_PyDict_Contains(PyObject* item, PyObject* dict, int eq) {
+    int result = PyDict_Contains(dict, item);
+    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
+}
+
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
+
+static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
+
+static CYTHON_INLINE int __Pyx_unpack_tuple2(PyObject* tuple, PyObject** value1, PyObject** value2,
+                                             int is_tuple, int has_known_size, int decref_tuple);
+
+static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name,
+                                                   Py_ssize_t* p_orig_length, int* p_is_dict);
+static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos,
+                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict);
+
 #if PY_VERSION_HEX < 0x02050000
 #ifndef PyAnySet_CheckExact
-
 #define PyAnySet_CheckExact(ob) \
     ((ob)->ob_type == &PySet_Type || \
      (ob)->ob_type == &PyFrozenSet_Type)
-
 #define PySet_New(iterable) \
     PyObject_CallFunctionObjArgs((PyObject *)&PySet_Type, (iterable), NULL)
-
 #define Pyx_PyFrozenSet_New(iterable) \
     PyObject_CallFunctionObjArgs((PyObject *)&PyFrozenSet_Type, (iterable), NULL)
-
 #define PySet_Size(anyset) \
     PyObject_Size((anyset))
-
 #define PySet_Contains(anyset, key) \
     PySequence_Contains((anyset), (key))
-
 #define PySet_Pop(set) \
     PyObject_CallMethod(set, (char *)"pop", NULL)
-
 static CYTHON_INLINE int PySet_Clear(PyObject *set) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"clear", NULL);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
-
 static CYTHON_INLINE int PySet_Discard(PyObject *set, PyObject *key) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"discard", (char *)"O", key);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
-
 static CYTHON_INLINE int PySet_Add(PyObject *set, PyObject *key) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"add", (char *)"O", key);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
-
 #endif /* PyAnySet_CheckExact (<= Py2.4) */
-
-#if PY_VERSION_HEX < 0x02040000
-#ifndef Py_SETOBJECT_H
-#define Py_SETOBJECT_H
-
-static PyTypeObject *__Pyx_PySet_Type = NULL;
-static PyTypeObject *__Pyx_PyFrozenSet_Type = NULL;
-
-#define PySet_Type (*__Pyx_PySet_Type)
-#define PyFrozenSet_Type (*__Pyx_PyFrozenSet_Type)
-
-#define PyAnySet_Check(ob) \
-    (PyAnySet_CheckExact(ob) || \
-     PyType_IsSubtype((ob)->ob_type, &PySet_Type) || \
-     PyType_IsSubtype((ob)->ob_type, &PyFrozenSet_Type))
-
-#define PyFrozenSet_CheckExact(ob) ((ob)->ob_type == &PyFrozenSet_Type)
-
-static int __Pyx_Py23SetsImport(void) {
-    PyObject *sets=0, *Set=0, *ImmutableSet=0;
-
-    sets = PyImport_ImportModule((char *)"sets");
-    if (!sets) goto bad;
-    Set = PyObject_GetAttrString(sets, (char *)"Set");
-    if (!Set) goto bad;
-    ImmutableSet = PyObject_GetAttrString(sets, (char *)"ImmutableSet");
-    if (!ImmutableSet) goto bad;
-    Py_DECREF(sets);
-
-    __Pyx_PySet_Type       = (PyTypeObject*) Set;
-    __Pyx_PyFrozenSet_Type = (PyTypeObject*) ImmutableSet;
-
-    return 0;
-
- bad:
-    Py_XDECREF(sets);
-    Py_XDECREF(Set);
-    Py_XDECREF(ImmutableSet);
-    return -1;
-}
-
-#else
-static int __Pyx_Py23SetsImport(void) { return 0; }
-#endif /* !Py_SETOBJECT_H */
-#endif /* < Py2.4  */
 #endif /* < Py2.5  */
 
-static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void);
-
 #if PY_MAJOR_VERSION >= 3
 static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
     PyObject *value;
-    if (unlikely(d == Py_None)) {
-        __Pyx_RaiseNoneIndexingError();
-        return NULL;
-    }
     value = PyDict_GetItemWithError(d, key);
     if (unlikely(!value)) {
         if (!PyErr_Occurred())
@@ -1789,10 +1882,9 @@ static CYTHON_INLINE int __Pyx_div_int(int, int); /* proto */
 #define UNARY_NEG_WOULD_OVERFLOW(x)            (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
 
 static CYTHON_INLINE PyObject* __Pyx_PyObject_Pop(PyObject* L) {
-#if PY_VERSION_HEX >= 0x02040000
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02040000
     if (likely(PyList_CheckExact(L))
-            /* Check that both the size is positive and no reallocation shrinking needs to be done. */
-            && likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
+        && likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
         Py_SIZE(L) -= 1;
         return PyList_GET_ITEM(L, PyList_GET_SIZE(L));
     }
@@ -1810,31 +1902,49 @@ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb);
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/
 
-#include <string.h>
-
-static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
-
-static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
-
-#if PY_MAJOR_VERSION >= 3
-#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
-#else
-#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
-#endif
-
-#define __pyx_binding_PyCFunctionType_USED 1
-
+static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name);
+
+#define __Pyx_CyFunction_USED 1
+#include <structmember.h>
+#define __Pyx_CYFUNCTION_STATICMETHOD  0x01
+#define __Pyx_CYFUNCTION_CLASSMETHOD   0x02
+#define __Pyx_CYFUNCTION_CCLASS        0x04
+#define __Pyx_CyFunction_GetClosure(f) \
+    (((__pyx_CyFunctionObject *) (f))->func_closure)
+#define __Pyx_CyFunction_GetClassObj(f) \
+    (((__pyx_CyFunctionObject *) (f))->func_classobj)
+#define __Pyx_CyFunction_Defaults(type, f) \
+    ((type *)(((__pyx_CyFunctionObject *) (f))->defaults))
+#define __Pyx_CyFunction_SetDefaultsGetter(f, g) \
+    ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g)
 typedef struct {
     PyCFunctionObject func;
-} __pyx_binding_PyCFunctionType_object;
-
-static PyTypeObject __pyx_binding_PyCFunctionType_type;
-static PyTypeObject *__pyx_binding_PyCFunctionType = NULL;
-
-static PyObject *__pyx_binding_PyCFunctionType_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module); /* proto */
-#define __pyx_binding_PyCFunctionType_New(ml, self) __pyx_binding_PyCFunctionType_NewEx(ml, self, NULL)
-
-static int __pyx_binding_PyCFunctionType_init(void); /* proto */
+    int flags;
+    PyObject *func_dict;
+    PyObject *func_weakreflist;
+    PyObject *func_name;
+    PyObject *func_doc;
+    PyObject *func_code;
+    PyObject *func_closure;
+    PyObject *func_classobj; /* No-args super() class cell */
+    void *defaults;
+    int defaults_pyobjects;
+    PyObject *defaults_tuple; /* Const defaults tuple */
+    PyObject *(*defaults_getter)(PyObject *);
+} __pyx_CyFunctionObject;
+static PyTypeObject *__pyx_CyFunctionType = 0;
+#define __Pyx_CyFunction_NewEx(ml, flags, self, module, code) \
+    __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, self, module, code)
+static PyObject *__Pyx_CyFunction_New(PyTypeObject *,
+                                      PyMethodDef *ml, int flags,
+                                      PyObject *self, PyObject *module,
+                                      PyObject* code);
+static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m,
+                                                         size_t size,
+                                                         int pyobjects);
+static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m,
+                                                            PyObject *tuple);
+static int __Pyx_CyFunction_init(void);
 
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
 
@@ -1873,17 +1983,59 @@ static void __Pyx_WriteUnraisable(const char *name, int clineno,
 
 static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
 
+#define __Pyx_Generator_USED
+#include <structmember.h>
+#include <frameobject.h>
+typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
+typedef struct {
+    PyObject_HEAD
+    __pyx_generator_body_t body;
+    PyObject *closure;
+    PyObject *exc_type;
+    PyObject *exc_value;
+    PyObject *exc_traceback;
+    PyObject *gi_weakreflist;
+    PyObject *classobj;
+    PyObject *yieldfrom;
+    int resume_label;
+    char is_running;  // using T_BOOL for property below requires char value
+} __pyx_GeneratorObject;
+static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                                  PyObject *closure);
+static int __pyx_Generator_init(void);
+static int __Pyx_Generator_clear(PyObject* self);
+#if 1 || PY_VERSION_HEX < 0x030300B0
+static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
+#else
+#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
+#endif
+
 static int __Pyx_check_binary_version(void);
 
 static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/
 
 static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
 
-static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
-                               int __pyx_lineno, const char *__pyx_filename); /*proto*/
+typedef struct {
+    int code_line;
+    PyCodeObject* code_object;
+} __Pyx_CodeObjectCacheEntry;
+struct __Pyx_CodeObjectCache {
+    int count;
+    int max_count;
+    __Pyx_CodeObjectCacheEntry* entries;
+};
+static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
+static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
+static PyCodeObject *__pyx_find_code_object(int code_line);
+static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
+
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+                               int py_line, const char *filename); /*proto*/
 
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
 
+
 /* Module declarations from 'libc.stdio' */
 
 /* Module declarations from 'libc.stdlib' */
@@ -1918,7 +2070,6 @@ static PyTypeObject *__pyx_ptype_3_sa_PhraseLocation = 0;
 static PyTypeObject *__pyx_ptype_3_sa_Sampler = 0;
 static PyTypeObject *__pyx_ptype_3_sa_HieroCachingRuleFactory = 0;
 static PyTypeObject *__pyx_ptype_3_sa_Scorer = 0;
-static PyTypeObject *__pyx_ptype_3_sa___pyx_Generator = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct____iter__ = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = 0;
@@ -1943,7 +2094,6 @@ static int __pyx_v_3_sa_BAEZA_YATES;
 static int __pyx_v_3_sa_EPSILON;
 static struct __pyx_obj_3_sa_StringMap *__pyx_v_3_sa_FD = 0;
 static char *__pyx_f_3_sa_sym_tostring(int); /*proto*/
-static char *__pyx_f_3_sa_sym_tocat(int); /*proto*/
 static int __pyx_f_3_sa_sym_isvar(int); /*proto*/
 static int __pyx_f_3_sa_sym_getindex(int); /*proto*/
 static float __pyx_f_3_sa_monitor_cpu(void); /*proto*/
@@ -1968,7 +2118,6 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *);
 static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
-static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_Node *, int *, int); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *, PyObject *, PyObject *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *, PyObject *, PyObject *, int); /*proto*/
@@ -1993,6 +2142,192 @@ static PyObject *__pyx_builtin_StopIteration;
 static PyObject *__pyx_builtin_cmp;
 static PyObject *__pyx_builtin_sorted;
 static PyObject *__pyx_builtin_max;
+static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_filename); /* proto */
+static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len); /* proto */
+static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, float __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_16__iter__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_index); /* proto */
+static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_25getSize(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_4getSentId(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_8getSentPos(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id); /* proto */
+static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_from_text, PyObject *__pyx_v_from_data, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_earray, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_alignment); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_eword); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword, PyObject *__pyx_v_eword, PyObject *__pyx_v_col); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBIterator *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_size); /* proto */
+static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa); /* proto */
+static PyObject *__pyx_pf_3_sa_3LCP_2compute_stats(struct __pyx_obj_3_sa_LCP *__pyx_v_self, int __pyx_v_max_n); /* proto */
+static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_2sym_fromstring(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_string, int __pyx_v_terminal); /* proto */
+static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_words); /* proto */
+static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_k); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_ci); /* proto */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
+#endif
+static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_28__iter__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_children); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, int __pyx_v_lhs, struct __pyx_obj_3_sa_Phrase *__pyx_v_f, struct __pyx_obj_3_sa_Phrase *__pyx_v_e, PyObject *__pyx_v_scores, PyObject *__pyx_v_word_alignments); /* proto */
+static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Rule *__pyx_v_other); /* proto */
+#endif
+static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Phrase *__pyx_v_f); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_7__str___genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_12alignments(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, int __pyx_v_alphabet_size); /* proto */
+static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_flag); /* proto */
+static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_from_stats, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_precompute_rank, PyObject *__pyx_v_precompute_secondary_rank, PyObject *__pyx_v_max_length, PyObject *__pyx_v_max_nonterminals, PyObject *__pyx_v_train_max_initial_size, PyObject *__pyx_v_train_min_gap_size); /* proto */
+static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray); /* proto */
+static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentId(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6getSent(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8getSentPos(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high); /* proto */
+static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_8TrieNode_8children_4__del__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_phrase, PyObject *__pyx_v_phrase_location, PyObject *__pyx_v_suffix_link); /* proto */
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_extended); /* proto */
+static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_4root_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sa_low, int __pyx_v_sa_high, int __pyx_v_arr_low, int __pyx_v_arr_high, PyObject *__pyx_v_arr, int __pyx_v_num_subpatterns); /* proto */
+static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, int __pyx_v_sample_size, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray); /* proto */
+static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location); /* proto */
+static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment, float __pyx_v_by_slack_factor, char *__pyx_v_category, PyObject *__pyx_v_max_chunks, unsigned int __pyx_v_max_initial_size, unsigned int __pyx_v_max_length, unsigned int __pyx_v_max_nonterminals, PyObject *__pyx_v_max_target_chunks, PyObject *__pyx_v_max_target_length, unsigned int __pyx_v_min_gap_size, PyObject *__pyx_v_precompute_file, unsigned int __pyx_v_precompute_secondary_rank, unsigned int __pyx_v_precompute_rank, int __pyx_v_require_aligned_terminal, int __pyx_v_require_aligned_chunks, unsigned int __pyx_v_train_max_initial_size, unsigned int __pyx_v_train_min_gap_size, int __pyx_v_tight_phrases, int __pyx_v_use_baeza_yates, int __pyx_v_use_collocations, int __pyx_v_use_index); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray, struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray, struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler, struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_phrase); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_frontier, PyObject *__pyx_v_res, PyObject *__pyx_v_fwords); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_skip, PyObject *__pyx_v_i, PyObject *__pyx_v_spanlen, PyObject *__pyx_v_pathlen, PyObject *__pyx_v_fwords, PyObject *__pyx_v_next_states, PyObject *__pyx_v_reachable_buffer); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_dist); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_ito); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v__columns, PyObject *__pyx_v_curr_idx, PyObject *__pyx_v_min_dist); /* proto */
+static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords); /* proto */
+static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str___genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_self, PyObject *__pyx_v_models); /* proto */
 static char __pyx_k_1[] = ".gz";
 static char __pyx_k_2[] = "Requested index %d of %d-length FloatList";
 static char __pyx_k_3[] = "IntList[";
@@ -2086,8 +2421,10 @@ static char __pyx_k_131[] = "Subphrase [%d, %d] failed integrity check";
 static char __pyx_k_132[] = "Didn't extract anything from [%d, %d] -> [%d, %d]";
 static char __pyx_k_133[] = "Unable to extract basic phrase";
 static char __pyx_k_134[] = "%s=%s";
-static char __pyx_k_135[] = "cdec.sa";
-static char __pyx_k_137[] = "*EPS*";
+static char __pyx_k_137[] = "/home/hltcoe/alopez/dev/cdec/python/src/sa/_sa.pyx";
+static char __pyx_k_138[] = "cdec.sa";
+static char __pyx_k_142[] = "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi";
+static char __pyx_k_143[] = "*EPS*";
 static char __pyx_k__gc[] = "gc";
 static char __pyx_k__sa[] = "sa";
 static char __pyx_k___sa[] = "_sa";
@@ -2139,8 +2476,10 @@ static char __pyx_k__toMap[] = "toMap";
 static char __pyx_k__value[] = "value";
 static char __pyx_k__words[] = "words";
 static char __pyx_k__write[] = "write";
+static char __pyx_k__e_text[] = "e_text";
 static char __pyx_k__earray[] = "earray";
 static char __pyx_k__extend[] = "extend";
+static char __pyx_k__f_text[] = "f_text";
 static char __pyx_k__fcount[] = "fcount";
 static char __pyx_k__fwords[] = "fwords";
 static char __pyx_k__get_id[] = "get_id";
@@ -2303,9 +2642,11 @@ static PyObject *__pyx_kp_s_131;
 static PyObject *__pyx_kp_s_132;
 static PyObject *__pyx_kp_s_133;
 static PyObject *__pyx_kp_s_134;
-static PyObject *__pyx_kp_s_135;
 static PyObject *__pyx_kp_s_137;
+static PyObject *__pyx_kp_s_138;
 static PyObject *__pyx_kp_s_14;
+static PyObject *__pyx_kp_s_142;
+static PyObject *__pyx_kp_s_143;
 static PyObject *__pyx_kp_s_18;
 static PyObject *__pyx_kp_s_2;
 static PyObject *__pyx_kp_s_21;
@@ -2399,6 +2740,7 @@ static PyObject *__pyx_n_s__debug;
 static PyObject *__pyx_n_s__defaultdict;
 static PyObject *__pyx_n_s__dist;
 static PyObject *__pyx_n_s__e;
+static PyObject *__pyx_n_s__e_text;
 static PyObject *__pyx_n_s__earray;
 static PyObject *__pyx_n_s__edarray;
 static PyObject *__pyx_n_s__end;
@@ -2408,6 +2750,7 @@ static PyObject *__pyx_n_s__eword;
 static PyObject *__pyx_n_s__extend;
 static PyObject *__pyx_n_s__extended;
 static PyObject *__pyx_n_s__f;
+static PyObject *__pyx_n_s__f_text;
 static PyObject *__pyx_n_s__fcount;
 static PyObject *__pyx_n_s__filename;
 static PyObject *__pyx_n_s__fphrase;
@@ -2604,7 +2947,11 @@ static PyObject *__pyx_k_tuple_98;
 static PyObject *__pyx_k_tuple_102;
 static PyObject *__pyx_k_tuple_107;
 static PyObject *__pyx_k_tuple_122;
-static PyObject *__pyx_k_tuple_136;
+static PyObject *__pyx_k_tuple_135;
+static PyObject *__pyx_k_tuple_139;
+static PyObject *__pyx_k_tuple_140;
+static PyObject *__pyx_k_codeobj_136;
+static PyObject *__pyx_k_codeobj_141;
 
 /* "_sa.pyx":5
  * import gzip
@@ -2625,7 +2972,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("monitor_cpu");
+  __Pyx_RefNannySetupContext("monitor_cpu", 0);
 
   /* "_sa.pyx":6
  * 
@@ -2645,7 +2992,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -2675,7 +3022,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   __pyx_t_4 = 0;
@@ -2690,7 +3037,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_r = __pyx_t_5;
   goto __pyx_L0;
@@ -2709,6 +3056,28 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_1gzip_or_text = {__Pyx_NAMESTR("gzip_or_text"), (PyCFunction)__pyx_pw_3_sa_1gzip_or_text, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("gzip_or_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.gzip_or_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_gzip_or_text(__pyx_self, ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "_sa.pyx":9
  *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
  * 
@@ -2717,10 +3086,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
  *         return gzip.GzipFile(filename)
  */
 
-static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_gzip_or_text = {__Pyx_NAMESTR("gzip_or_text"), (PyCFunction)__pyx_pf_3_sa_gzip_or_text, METH_O, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_filename) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2730,17 +3096,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("gzip_or_text");
-  __pyx_self = __pyx_self;
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.gzip_or_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("gzip_or_text", 0);
 
   /* "_sa.pyx":10
  * 
@@ -2771,7 +3127,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -2782,7 +3138,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
@@ -2797,7 +3153,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -2808,7 +3164,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_t_1 = 0;
     goto __pyx_L0;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -2824,32 +3180,22 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":11
- * cdef class FloatList:
- * 
- *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
- *         if initial_len > size:
- *             size = initial_len
- */
-
-static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -2857,7 +3203,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
@@ -2875,7 +3221,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -2910,6 +3256,24 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList___cinit__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_size, __pyx_v_increment, __pyx_v_initial_len);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":11
+ * cdef class FloatList:
+ * 
+ *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
+ *         if initial_len > size:
+ *             size = initial_len
+ */
+
+static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":12
  * 
@@ -2929,9 +3293,9 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.increment = increment
  */
     __pyx_v_size = __pyx_v_initial_len;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":14
  *         if initial_len > size:
@@ -2940,7 +3304,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.increment = increment
  *         self.len = initial_len
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size = __pyx_v_size;
+  __pyx_v_self->size = __pyx_v_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":15
  *             size = initial_len
@@ -2949,7 +3313,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->increment = __pyx_v_increment;
+  __pyx_v_self->increment = __pyx_v_increment;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":16
  *         self.size = size
@@ -2958,7 +3322,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.arr = <float*> malloc(size*sizeof(float))
  *         memset(self.arr, 0, initial_len*sizeof(float))
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len = __pyx_v_initial_len;
+  __pyx_v_self->len = __pyx_v_initial_len;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":17
  *         self.increment = increment
@@ -2967,7 +3331,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
+  __pyx_v_self->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":18
  *         self.len = initial_len
@@ -2976,13 +3340,22 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  *     def __dealloc__(self):
  */
-  memset(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr, 0, (__pyx_v_initial_len * (sizeof(float))));
+  memset(__pyx_v_self->arr, 0, (__pyx_v_initial_len * (sizeof(float))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* Python wrapper */
+static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_9FloatList_2__dealloc__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
@@ -2991,10 +3364,9 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":21
  * 
@@ -3003,9 +3375,20 @@ static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self) {
  * 
  *     def __getitem__(self, i):
  */
-  free(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr);
+  free(__pyx_v_self->arr);
+
+  __Pyx_RefNannyFinishContext();
+}
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9FloatList_4__getitem__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((PyObject *)__pyx_v_i));
   __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":23
@@ -3016,8 +3399,7 @@ static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self) {
  *         if i<0:
  */
 
-static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_v_j = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -3030,7 +3412,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":24
  * 
@@ -3049,8 +3431,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
@@ -3062,7 +3443,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  */
-    __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
@@ -3070,9 +3451,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
     __Pyx_DECREF(__pyx_v_j);
     __pyx_v_j = __pyx_t_3;
     __pyx_t_3 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":27
  *         if i<0:
@@ -3081,15 +3462,13 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         return self.arr[j]
  */
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (!__pyx_t_2) {
-    __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_j, __pyx_t_3, Py_GE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_j, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3106,10 +3485,10 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
  *         return self.arr[j]
  * 
  */
-    __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_i);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_i);
     __Pyx_GIVEREF(__pyx_v_i);
@@ -3120,7 +3499,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -3130,9 +3509,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
     __Pyx_Raise(__pyx_t_1, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L4;
   }
-  __pyx_L6:;
+  __pyx_L4:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":29
  *         if j<0 or j>=self.len:
@@ -3143,7 +3522,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_j); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr[__pyx_t_6])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->arr[__pyx_t_6])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3183,7 +3562,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set");
+  __Pyx_RefNannySetupContext("set", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":32
  * 
@@ -3244,7 +3623,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
     __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -3255,7 +3634,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -3288,6 +3667,17 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
+/* Python wrapper */
+static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9FloatList_6__setitem__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((PyObject *)__pyx_v_i), ((PyObject *)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":39
  *         self.arr[j] = v
  * 
@@ -3296,8 +3686,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
  * 
  */
 
-static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
-static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -3305,7 +3694,7 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setitem__");
+  __Pyx_RefNannySetupContext("__setitem__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":40
  * 
@@ -3315,8 +3704,8 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
  *     def __len__(self):
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = __pyx_PyFloat_AsDouble(__pyx_v_val); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->set(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_t_1, __pyx_t_2);
+  __pyx_t_2 = __pyx_PyFloat_AsFloat(__pyx_v_val); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->set(__pyx_v_self, __pyx_t_1, __pyx_t_2);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -3328,6 +3717,17 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9FloatList_8__len__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":42
  *         self.set(i, val)
  * 
@@ -3336,11 +3736,10 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":43
  * 
@@ -3349,7 +3748,7 @@ static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self) {
  * 
  *     def append(self, float val):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len;
+  __pyx_r = __pyx_v_self->len;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -3358,6 +3757,27 @@ static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
+  float __pyx_v_val;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("append (wrapper)", 0);
+  assert(__pyx_arg_val); {
+    __pyx_v_val = __pyx_PyFloat_AsFloat(__pyx_arg_val); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.FloatList.append", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList_10append(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((float)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":45
  *         return self.len
  * 
@@ -3366,25 +3786,11 @@ static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self) {
  *             self.size = self.size + self.increment
  */
 
-static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
-  float __pyx_v_val;
+static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, float __pyx_v_val) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("append");
-  assert(__pyx_arg_val); {
-    __pyx_v_val = __pyx_PyFloat_AsDouble(__pyx_arg_val); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.FloatList.append", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("append", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":46
  * 
@@ -3393,7 +3799,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len == ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size);
+  __pyx_t_1 = (__pyx_v_self->len == __pyx_v_self->size);
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":47
@@ -3403,7 +3809,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val
  */
-    ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size + ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->increment);
+    __pyx_v_self->size = (__pyx_v_self->size + __pyx_v_self->increment);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":48
  *         if self.len == self.size:
@@ -3412,10 +3818,10 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
  *         self.arr[self.len] = val
  *         self.len = self.len + 1
  */
-    ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr = ((float *)realloc(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr, (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size * (sizeof(float)))));
-    goto __pyx_L5;
+    __pyx_v_self->arr = ((float *)realloc(__pyx_v_self->arr, (__pyx_v_self->size * (sizeof(float)))));
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":49
  *             self.size = self.size + self.increment
@@ -3424,7 +3830,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
  *         self.len = self.len + 1
  * 
  */
-  (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr[((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len]) = __pyx_v_val;
+  (__pyx_v_self->arr[__pyx_v_self->len]) = __pyx_v_val;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":50
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
@@ -3433,7 +3839,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
  * 
  *     cdef void write_handle(self, FILE* f):
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len + 1);
+  __pyx_v_self->len = (__pyx_v_self->len + 1);
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -3451,7 +3857,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
 
 static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_handle");
+  __Pyx_RefNannySetupContext("write_handle", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":53
  * 
@@ -3474,24 +3880,13 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":56
- *         fwrite(self.arr, sizeof(float), self.len, f)
- * 
- *     def write(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write");
+  __Pyx_RefNannySetupContext("write (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -3501,6 +3896,24 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList_12write(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":56
+ *         fwrite(self.arr, sizeof(float), self.len, f)
+ * 
+ *     def write(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":58
  *     def write(self, char* filename):
@@ -3518,7 +3931,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":60
  *         f = fopen(filename, "w")
@@ -3545,7 +3958,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
 
 static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_handle");
+  __Pyx_RefNannySetupContext("read_handle", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":63
  * 
@@ -3595,24 +4008,13 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":69
- *         fread(self.arr, sizeof(float), self.len, f)
- * 
- *     def read(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read");
+  __Pyx_RefNannySetupContext("read (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -3622,6 +4024,24 @@ static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList_14read(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":69
+ *         fread(self.arr, sizeof(float), self.len, f)
+ * 
+ *     def read(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":71
  *     def read(self, char* filename):
@@ -3638,7 +4058,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":73
  *         f = fopen(filename, "r")
@@ -3653,32 +4073,22 @@ static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":11
- * cdef class IntList:
- * 
- *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
- *         if initial_len > size:
- *             size = initial_len
- */
-
-static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -3686,7 +4096,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
@@ -3704,7 +4114,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3739,6 +4149,24 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList___cinit__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_size, __pyx_v_increment, __pyx_v_initial_len);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":11
+ * cdef class IntList:
+ * 
+ *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
+ *         if initial_len > size:
+ *             size = initial_len
+ */
+
+static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":12
  * 
@@ -3758,9 +4186,9 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         self.increment = increment
  */
     __pyx_v_size = __pyx_v_initial_len;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":14
  *         if initial_len > size:
@@ -3769,7 +4197,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         self.increment = increment
  *         self.len = initial_len
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size = __pyx_v_size;
+  __pyx_v_self->size = __pyx_v_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":15
  *             size = initial_len
@@ -3778,7 +4206,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->increment = __pyx_v_increment;
+  __pyx_v_self->increment = __pyx_v_increment;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":16
  *         self.size = size
@@ -3787,7 +4215,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         self.arr = <int*> malloc(size*sizeof(int))
  *         memset(self.arr, 0, initial_len*sizeof(int))
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len = __pyx_v_initial_len;
+  __pyx_v_self->len = __pyx_v_initial_len;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":17
  *         self.increment = increment
@@ -3796,7 +4224,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
+  __pyx_v_self->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":18
  *         self.len = initial_len
@@ -3805,13 +4233,24 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  * 
  *     def __str__(self):
  */
-  memset(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr, 0, (__pyx_v_initial_len * (sizeof(int))));
+  memset(__pyx_v_self->arr, 0, (__pyx_v_initial_len * (sizeof(int))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_2__str__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
@@ -3820,8 +4259,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         ret = "IntList["
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_v_ret = NULL;
   int __pyx_v_idx;
   PyObject *__pyx_r = NULL;
@@ -3834,7 +4272,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":22
  *     def __str__(self):
@@ -3853,7 +4291,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
  *             if idx>0:
  *                 ret += ","
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size;
+  __pyx_t_1 = __pyx_v_self->size;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_idx = __pyx_t_2;
 
@@ -3879,9 +4317,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
       __Pyx_DECREF(__pyx_v_ret);
       __pyx_v_ret = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":26
  *             if idx>0:
@@ -3890,10 +4328,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
  *         ret += "]"
  *         ret += "len="
  */
-    __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_idx])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_idx])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
@@ -3941,7 +4379,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
  *         return ret
  * 
  */
-  __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_ret, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
@@ -3976,6 +4414,17 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("index (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_4index(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":32
  *         return ret
  * 
@@ -3984,8 +4433,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
  *         for i in range(self.len):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
+static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_val) {
   unsigned int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -3997,7 +4445,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("index");
+  __Pyx_RefNannySetupContext("index", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":34
  *     def index(self, val):
@@ -4006,7 +4454,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
  *             if self.arr[i] == val:
  *                 return i
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len;
+  __pyx_t_1 = __pyx_v_self->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
@@ -4017,10 +4465,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
  *                 return i
  *         return IndexError
  */
-    __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_val, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_val, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
@@ -4039,9 +4486,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
       __pyx_r = __pyx_t_4;
       __pyx_t_4 = 0;
       goto __pyx_L0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":37
@@ -4069,60 +4516,39 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":39
- *         return IndexError
- * 
- *     def partition(self,start,end):             # <<<<<<<<<<<<<<
- *         pivot = self.arr[end]
- *         bottom = start-1
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_end = 0;
-  PyObject *__pyx_v_pivot = NULL;
-  PyObject *__pyx_v_bottom = NULL;
-  PyObject *__pyx_v_top = NULL;
-  long __pyx_v_done;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  Py_ssize_t __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
-  __Pyx_RefNannySetupContext("partition");
+  __Pyx_RefNannySetupContext("partition (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("partition", 1, 2, 2, 1); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "partition") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "partition") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -4141,6 +4567,36 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_6partition(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_start, __pyx_v_end);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":39
+ *         return IndexError
+ * 
+ *     def partition(self,start,end):             # <<<<<<<<<<<<<<
+ *         pivot = self.arr[end]
+ *         bottom = start-1
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end) {
+  PyObject *__pyx_v_pivot = NULL;
+  PyObject *__pyx_v_bottom = NULL;
+  PyObject *__pyx_v_top = NULL;
+  long __pyx_v_done;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  Py_ssize_t __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  Py_ssize_t __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("partition", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":40
  * 
@@ -4150,7 +4606,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *         top = end
  */
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_end); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_pivot = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -4228,8 +4684,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *                     done = 1
  *                     break
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_bottom, __pyx_v_top, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_bottom, __pyx_v_top, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
@@ -4250,10 +4705,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]
  */
-        goto __pyx_L9_break;
-        goto __pyx_L10;
+        goto __pyx_L6_break;
+        goto __pyx_L7;
       }
-      __pyx_L10:;
+      __pyx_L7:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":50
  *                     done = 1
@@ -4263,10 +4718,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *                     break
  */
       __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_pivot, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_pivot, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
@@ -4281,7 +4735,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
         __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_5]) = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]);
+        (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":52
  *                 if self.arr[bottom] > pivot:
@@ -4290,12 +4744,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *             while not done:
  *                 top -= 1
  */
-        goto __pyx_L9_break;
-        goto __pyx_L11;
+        goto __pyx_L6_break;
+        goto __pyx_L8;
       }
-      __pyx_L11:;
+      __pyx_L8:;
     }
-    __pyx_L9_break:;
+    __pyx_L6_break:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":53
  *                     self.arr[top] = self.arr[bottom]
@@ -4328,8 +4782,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *                     done = 1
  *                     break
  */
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_top, __pyx_v_bottom, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_top, __pyx_v_bottom, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
@@ -4350,10 +4803,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]
  */
-        goto __pyx_L13_break;
-        goto __pyx_L14;
+        goto __pyx_L10_break;
+        goto __pyx_L11;
       }
-      __pyx_L14:;
+      __pyx_L11:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":58
  *                     done = 1
@@ -4363,10 +4816,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *                     break
  */
       __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pivot, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pivot, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -4381,7 +4833,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
         __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_5]) = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]);
+        (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":60
  *                 if self.arr[top] < pivot:
@@ -4390,12 +4842,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *         self.arr[top] = pivot
  *         return top
  */
-        goto __pyx_L13_break;
-        goto __pyx_L15;
+        goto __pyx_L10_break;
+        goto __pyx_L12;
       }
-      __pyx_L15:;
+      __pyx_L12:;
     }
-    __pyx_L13_break:;
+    __pyx_L10_break:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":61
@@ -4407,7 +4859,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
   __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_pivot); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]) = __pyx_t_6;
+  (__pyx_v_self->arr[__pyx_t_1]) = __pyx_t_6;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":62
  *                     break
@@ -4437,55 +4889,39 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":64
- *         return top
- * 
- *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
- *         if start < end:
- *             split = self.partition(start,end)
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_end = 0;
-  PyObject *__pyx_v_split = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
-  __Pyx_RefNannySetupContext("_doquicksort");
+  __Pyx_RefNannySetupContext("_doquicksort (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("_doquicksort", 1, 2, 2, 1); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_doquicksort") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_doquicksort") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -4504,6 +4940,31 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_8_doquicksort(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_start, __pyx_v_end);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":64
+ *         return top
+ * 
+ *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
+ *         if start < end:
+ *             split = self.partition(start,end)
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end) {
+  PyObject *__pyx_v_split = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_doquicksort", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":65
  * 
@@ -4512,8 +4973,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_start, __pyx_v_end, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_start, __pyx_v_end, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
@@ -4525,10 +4985,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
  *             self._doquicksort(start,split-1)
  *             self._doquicksort(split+1,end)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__partition); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__partition); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_start);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_start);
     __Pyx_GIVEREF(__pyx_v_start);
@@ -4549,12 +5009,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
  *             self._doquicksort(split+1,end)
  *         else:
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyNumber_Subtract(__pyx_v_split, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_start);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_start);
     __Pyx_GIVEREF(__pyx_v_start);
@@ -4574,12 +5034,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
  *         else:
  *             return
  */
-    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_1 = PyNumber_Add(__pyx_v_split, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_end);
@@ -4591,7 +5051,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
@@ -4606,7 +5066,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -4623,6 +5083,17 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("sort (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_10sort(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":72
  *             return
  * 
@@ -4631,8 +5102,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -4641,7 +5111,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNU
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sort");
+  __Pyx_RefNannySetupContext("sort", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":73
  * 
@@ -4650,12 +5120,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNU
  * 
  *     def reset(self):
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->len - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(__pyx_int_0);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
@@ -4682,6 +5152,17 @@ static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNU
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("reset (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_12reset(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":75
  *         self._doquicksort(0,self.len-1)
  * 
@@ -4690,11 +5171,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNU
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("reset");
+  __Pyx_RefNannySetupContext("reset", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":76
  * 
@@ -4703,7 +5183,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UN
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len = 0;
+  __pyx_v_self->len = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -4711,6 +5191,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
+/* Python wrapper */
+static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_7IntList_14__dealloc__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":78
  *         self.len = 0
  * 
@@ -4719,10 +5208,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UN
  * 
  */
 
-static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":79
  * 
@@ -4731,11 +5219,22 @@ static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self) {
  * 
  *     def __iter__(self):
  */
-  free(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr);
+  free(__pyx_v_self->arr);
+
+  __Pyx_RefNannyFinishContext();
+}
+static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_16__iter__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
   __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
@@ -4745,43 +5244,52 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
  *         for i in range(self.len):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_8__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_8__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_16__iter__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__iter__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)__pyx_ptype_3_sa___pyx_scope_struct____iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct____iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7IntList_9generator;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_7IntList_18generator, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.IntList.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -4798,7 +5306,7 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
  *             yield self.arr[i]
  * 
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_cur_scope->__pyx_v_self)->len;
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
@@ -4809,7 +5317,7 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
  * 
  *     def __getitem__(self, index):
  */
-    __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_cur_scope->__pyx_v_self)->arr[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->arr[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
@@ -4818,25 +5326,37 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_19__getitem__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_index));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":86
  *             yield self.arr[i]
  * 
@@ -4845,8 +5365,7 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
  *         if isinstance(index, int):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
+static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_index) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -4866,7 +5385,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":88
  *     def __getitem__(self, index):
@@ -4908,10 +5427,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  */
-      __pyx_v_j = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_j);
-      goto __pyx_L6;
+      __pyx_v_j = (__pyx_v_self->len + __pyx_v_j);
+      goto __pyx_L4;
     }
-    __pyx_L6:;
+    __pyx_L4:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":92
  *             if j < 0:
@@ -4922,7 +5441,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  */
     __pyx_t_2 = (__pyx_v_j < 0);
     if (!__pyx_t_2) {
-      __pyx_t_4 = (__pyx_v_j >= ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
+      __pyx_t_4 = (__pyx_v_j >= __pyx_v_self->len);
       __pyx_t_5 = __pyx_t_4;
     } else {
       __pyx_t_5 = __pyx_t_2;
@@ -4936,10 +5455,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  *             return self.arr[j]
  *         elif isinstance(index, slice):
  */
-      __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+      __Pyx_GOTREF(__pyx_t_6);
       __Pyx_INCREF(__pyx_v_index);
       PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_index);
       __Pyx_GIVEREF(__pyx_v_index);
@@ -4950,7 +5469,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
       __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+      __Pyx_GOTREF(__pyx_t_6);
       PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_1));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
       __pyx_t_1 = 0;
@@ -4960,9 +5479,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_Raise(__pyx_t_1, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":94
  *             if j<0 or j>=self.len:
@@ -4972,12 +5491,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  *             i = index.start
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_j])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_j])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":95
@@ -5036,10 +5555,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  *             if j < 0:
  *                 j = self.len + j
  */
-      __pyx_v_i = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_i);
-      goto __pyx_L8;
+      __pyx_v_i = (__pyx_v_self->len + __pyx_v_i);
+      goto __pyx_L6;
     }
-    __pyx_L8:;
+    __pyx_L6:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":100
  *             if i < 0:
@@ -5058,10 +5577,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  */
-      __pyx_v_j = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_j);
-      goto __pyx_L9;
+      __pyx_v_j = (__pyx_v_self->len + __pyx_v_j);
+      goto __pyx_L7;
     }
-    __pyx_L9:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":102
  *             if j < 0:
@@ -5072,11 +5591,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  */
     __pyx_t_5 = (__pyx_v_i < 0);
     if (!__pyx_t_5) {
-      __pyx_t_2 = (__pyx_v_i >= ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
+      __pyx_t_2 = (__pyx_v_i >= __pyx_v_self->len);
       if (!__pyx_t_2) {
         __pyx_t_4 = (__pyx_v_j < 0);
         if (!__pyx_t_4) {
-          __pyx_t_7 = (__pyx_v_j > ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
+          __pyx_t_7 = (__pyx_v_j > __pyx_v_self->len);
           __pyx_t_8 = __pyx_t_7;
         } else {
           __pyx_t_8 = __pyx_t_4;
@@ -5102,10 +5621,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_6 = PyObject_GetAttr(__pyx_v_index, __pyx_n_s__stop); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_9 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+      __Pyx_GOTREF(__pyx_t_10);
       PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_6);
@@ -5119,7 +5638,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
       __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+      __Pyx_GOTREF(__pyx_t_10);
       PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
       __pyx_t_9 = 0;
@@ -5129,9 +5648,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_Raise(__pyx_t_9, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L10;
+      goto __pyx_L8;
     }
-    __pyx_L10:;
+    __pyx_L8:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":104
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
@@ -5160,10 +5679,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  *             return result
  *         else:
  */
-      __pyx_t_9 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_k])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_k])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+      __Pyx_GOTREF(__pyx_t_10);
       PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_9);
       __Pyx_GIVEREF(__pyx_t_9);
       __pyx_t_9 = 0;
@@ -5186,7 +5705,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_INCREF(((PyObject *)__pyx_v_result));
     __pyx_r = ((PyObject *)__pyx_v_result);
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
@@ -5200,7 +5719,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_9), ((PyObject *)Py_TYPE(__pyx_v_index))); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_9));
     __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+    __Pyx_GOTREF(__pyx_t_10);
     PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
     __pyx_t_9 = 0;
@@ -5211,7 +5730,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -5249,7 +5768,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set");
+  __Pyx_RefNannySetupContext("set", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":112
  * 
@@ -5310,7 +5829,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
     __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -5321,7 +5840,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -5354,6 +5873,17 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
 }
 
+/* Python wrapper */
+static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_21__setitem__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_i), ((PyObject *)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":119
  *         self.arr[j] = val
  * 
@@ -5362,8 +5892,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
  * 
  */
 
-static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
-static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -5371,7 +5900,7 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setitem__");
+  __Pyx_RefNannySetupContext("__setitem__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":120
  * 
@@ -5382,7 +5911,7 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_v_val); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->set(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_t_1, __pyx_t_2);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->set(__pyx_v_self, __pyx_t_1, __pyx_t_2);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -5394,6 +5923,17 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_23__len__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":122
  *         self.set(i, val)
  * 
@@ -5402,11 +5942,10 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":123
  * 
@@ -5415,7 +5954,7 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
  * 
  *     def getSize(self):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len;
+  __pyx_r = __pyx_v_self->len;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -5424,6 +5963,17 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_26getSize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_26getSize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getSize (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_25getSize(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":125
  *         return self.len
  * 
@@ -5432,15 +5982,14 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_13getSize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_13getSize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_7IntList_25getSize(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSize");
+  __Pyx_RefNannySetupContext("getSize", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":126
  * 
@@ -5450,7 +5999,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_13getSize(PyObject *__pyx_v_self, CYTHON
  *     def append(self, int val):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -5468,23 +6017,13 @@ static PyObject *__pyx_pf_3_sa_7IntList_13getSize(PyObject *__pyx_v_self, CYTHON
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":128
- *         return self.size
- * 
- *     def append(self, int val):             # <<<<<<<<<<<<<<
- *         self._append(val)
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
   int __pyx_v_val;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("append");
+  __Pyx_RefNannySetupContext("append (wrapper)", 0);
   assert(__pyx_arg_val); {
     __pyx_v_val = __Pyx_PyInt_AsInt(__pyx_arg_val); if (unlikely((__pyx_v_val == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -5494,6 +6033,23 @@ static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_27append(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((int)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":128
+ *         return self.size
+ * 
+ *     def append(self, int val):             # <<<<<<<<<<<<<<
+ *         self._append(val)
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("append", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":129
  * 
@@ -5502,7 +6058,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObjec
  * 
  *     cdef void _append(self, int val):
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->_append(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_val);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->_append(__pyx_v_self, __pyx_v_val);
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -5521,7 +6077,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObjec
 static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("_append");
+  __Pyx_RefNannySetupContext("_append", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":132
  * 
@@ -5575,6 +6131,17 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("extend (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_29extend(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_other));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":138
  *         self.len = self.len + 1
  * 
@@ -5583,15 +6150,14 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_other) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extend");
+  __Pyx_RefNannySetupContext("extend", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":139
  * 
@@ -5603,7 +6169,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObjec
   if (!(likely(((__pyx_v_other) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_other, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __pyx_v_other;
   __Pyx_INCREF(__pyx_t_1);
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->_extend(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1));
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->_extend(__pyx_v_self, ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1));
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -5628,7 +6194,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObjec
 
 static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, struct __pyx_obj_3_sa_IntList *__pyx_v_other) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_extend");
+  __Pyx_RefNannySetupContext("_extend", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":142
  * 
@@ -5653,7 +6219,7 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
 static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int *__pyx_v_other, int __pyx_v_other_len) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("_extend_arr");
+  __Pyx_RefNannySetupContext("_extend_arr", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":145
  * 
@@ -5717,7 +6283,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
 
 static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_clear");
+  __Pyx_RefNannySetupContext("_clear", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":152
  * 
@@ -5768,7 +6334,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
 
 static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_handle");
+  __Pyx_RefNannySetupContext("write_handle", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":158
  * 
@@ -5791,24 +6357,13 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":161
- *         fwrite(self.arr, sizeof(int), self.len, f)
- * 
- *     def write(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write");
+  __Pyx_RefNannySetupContext("write (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -5818,6 +6373,24 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_31write(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":161
+ *         fwrite(self.arr, sizeof(int), self.len, f)
+ * 
+ *     def write(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":163
  *     def write(self, char* filename):
@@ -5835,7 +6408,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":165
  *         f = fopen(filename, "w")
@@ -5862,7 +6435,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
 
 static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_handle");
+  __Pyx_RefNannySetupContext("read_handle", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":168
  * 
@@ -5912,24 +6485,13 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":174
- *         fread(self.arr, sizeof(int), self.len, f)
- * 
- *     def read(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read");
+  __Pyx_RefNannySetupContext("read (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -5939,6 +6501,24 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_33read(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":174
+ *         fread(self.arr, sizeof(int), self.len, f)
+ * 
+ *     def read(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":176
  *     def read(self, char* filename):
@@ -5955,7 +6535,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":178
  *         f = fopen(filename, "r")
@@ -5970,6 +6550,20 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
+/* Python wrapper */
+static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_9StringMap___cinit__(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":13
  *     cdef int index(self, char *s)
  * 
@@ -5978,14 +6572,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":14
  * 
@@ -5994,13 +6584,22 @@ static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self)->vocab = stringmap_new();
+  __pyx_v_self->vocab = stringmap_new();
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* Python wrapper */
+static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_9StringMap_2__dealloc__(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":16
  *         self.vocab = stringmap_new()
  * 
@@ -6009,10 +6608,9 @@ static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":17
  * 
@@ -6021,7 +6619,7 @@ static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self) {
  * 
  *     cdef char *word(self, int i):
  */
-  stringmap_delete(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self)->vocab);
+  stringmap_delete(__pyx_v_self->vocab);
 
   __Pyx_RefNannyFinishContext();
 }
@@ -6037,7 +6635,7 @@ static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self) {
 static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx_v_self, int __pyx_v_i) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("word");
+  __Pyx_RefNannySetupContext("word", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":20
  * 
@@ -6065,7 +6663,7 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
 static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_v_self, char *__pyx_v_s) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("index");
+  __Pyx_RefNannySetupContext("index", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":23
  * 
@@ -6081,40 +6679,34 @@ static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":17
- *     cdef bint use_sent_id
- * 
- *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
- *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
- *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
- */
-
-static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_v_use_sent_id;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  long __pyx_t_5;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
     PyObject* values[4] = {0,0,0,0};
+
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":17
+ *     cdef bint use_sent_id
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
+ *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
+ *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -6123,7 +6715,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -6146,7 +6738,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -6175,6 +6767,23 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray___cinit__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text, __pyx_v_side, __pyx_v_use_sent_id);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  long __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":18
  * 
@@ -6188,9 +6797,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__END_OF_FILE), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__END_OF_LINE), __pyx_int_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id);
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->word2id);
+  __Pyx_DECREF(__pyx_v_self->word2id);
+  __pyx_v_self->word2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":19
@@ -6201,7 +6810,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.sent_id = IntList(1000,1000)
  */
   __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__END_OF_FILE));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__END_OF_FILE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__END_OF_FILE));
@@ -6209,9 +6818,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   PyList_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_n_s__END_OF_LINE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__END_OF_LINE));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word);
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->id2word);
+  __Pyx_DECREF(__pyx_v_self->id2word);
+  __pyx_v_self->id2word = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
@@ -6224,9 +6833,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data));
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->data);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->data));
+  __pyx_v_self->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":21
@@ -6239,9 +6848,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_11), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id));
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sent_id);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_id));
+  __pyx_v_self->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":22
@@ -6254,9 +6863,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_12), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index));
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sent_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
+  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":23
@@ -6266,7 +6875,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
  *         if from_binary:
  *             self.read_binary(from_binary)
  */
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id = __pyx_v_use_sent_id;
+  __pyx_v_self->use_sent_id = __pyx_v_use_sent_id;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":24
  *         self.sent_index = IntList(1000,1000)
@@ -6285,10 +6894,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
  *         elif from_text:
  *             if side:
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -6297,7 +6906,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":26
@@ -6327,9 +6936,11 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
  *             else:
  *                 self.read_text(from_text)
  */
-      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_bitext); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_bitext); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = __Pyx_PyString_Equals(__pyx_v_side, ((PyObject *)__pyx_n_s__source), Py_EQ); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_side, ((PyObject *)__pyx_n_s__source), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_2) {
         __pyx_t_5 = 0;
       } else {
@@ -6338,7 +6949,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
       __pyx_t_3 = PyInt_FromLong(__pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(__pyx_v_from_text);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
       __Pyx_GIVEREF(__pyx_v_from_text);
@@ -6350,7 +6961,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L7;
+      goto __pyx_L4;
     }
     /*else*/ {
 
@@ -6361,10 +6972,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  *     def __len__(self):
  */
-      __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(__pyx_v_from_text);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
       __Pyx_GIVEREF(__pyx_v_from_text);
@@ -6374,10 +6985,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     }
-    __pyx_L7:;
-    goto __pyx_L6;
+    __pyx_L4:;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -6392,6 +7003,17 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_2__len__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":32
  *                 self.read_text(from_text)
  * 
@@ -6400,8 +7022,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -6409,7 +7030,7 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":33
  * 
@@ -6418,7 +7039,7 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
  * 
  *     def getSentId(self, i):
  */
-  __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->data);
   __Pyx_INCREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -6436,6 +7057,17 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_5getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_5getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getSentId (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_4getSentId(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":35
  *         return len(self.data)
  * 
@@ -6444,8 +7076,7 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_4getSentId(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -6453,7 +7084,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentId");
+  __Pyx_RefNannySetupContext("getSentId", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":36
  * 
@@ -6464,7 +7095,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyO
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -6482,6 +7113,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_7getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_7getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getSent (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_6getSent(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":38
  *         return self.sent_id.arr[i]
  * 
@@ -6490,8 +7132,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyO
  *         sent = []
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_6getSent(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_sent = NULL;
@@ -6505,7 +7146,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSent");
+  __Pyx_RefNannySetupContext("getSent", 0);
   __Pyx_INCREF(__pyx_v_i);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":40
@@ -6516,7 +7157,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
  *         stop = self.sent_index.arr[i+1]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_sent = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -6528,7 +7169,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
  *         for i from start <= i < stop:
  */
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":42
  *         sent = []
@@ -6541,7 +7182,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_stop = (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_stop = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
  *         start = self.sent_index.arr[i]
@@ -6565,11 +7206,8 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
  *         return sent
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_sent) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = __Pyx_GetItemInt(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_self->id2word, (__pyx_v_self->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyList_Append(__pyx_v_sent, __pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -6615,6 +7253,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_9getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_9getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getSentPos (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_8getSentPos(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":47
  *         return sent
  * 
@@ -6623,8 +7272,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_9DataArray_8getSentPos(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -6633,7 +7281,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentPos");
+  __Pyx_RefNannySetupContext("getSentPos", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":48
  * 
@@ -6644,7 +7292,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, Py
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_index->arr[(__pyx_v_self->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyNumber_Subtract(__pyx_v_loc, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
@@ -6666,6 +7314,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_10get_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_word));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":50
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]
  * 
@@ -6674,8 +7333,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, Py
  *             self.word2id[word] = len(self.id2word)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
+static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -6685,7 +7343,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_id");
+  __Pyx_RefNannySetupContext("get_id", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":51
  * 
@@ -6694,7 +7352,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  */
-  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (!__pyx_t_1);
   if (__pyx_t_2) {
 
@@ -6705,13 +7363,13 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
  *             self.id2word.append(word)
  *         return self.word2id[word]
  */
-    __pyx_t_3 = ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word;
+    __pyx_t_3 = __pyx_v_self->id2word;
     __Pyx_INCREF(__pyx_t_3);
     __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (PyObject_SetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_self->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":53
@@ -6721,12 +7379,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
  *         return self.word2id[word]
  * 
  */
-    __pyx_t_3 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Append(__pyx_v_self->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":54
  *             self.word2id[word] = len(self.id2word)
@@ -6736,7 +7394,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
  *     def get_word(self, id):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_3 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -6754,6 +7412,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_word (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_12get_word(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_id));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":56
  *         return self.word2id[word]
  * 
@@ -6762,15 +7431,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
+static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_word");
+  __Pyx_RefNannySetupContext("get_word", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":57
  * 
@@ -6780,7 +7448,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyOb
  *     def write_text(self, char* filename):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetItem(__pyx_v_self->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -6798,6 +7466,27 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_14write_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":59
  *         return self.id2word[id]
  * 
@@ -6806,9 +7495,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyOb
  *             for w_id in self.data:
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_w_id = NULL;
   PyObject *__pyx_r = NULL;
@@ -6819,10 +7506,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  int __pyx_t_9;
-  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
+  int __pyx_t_10;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
   PyObject *__pyx_t_13 = NULL;
@@ -6830,16 +7517,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
  * 
@@ -6852,7 +7530,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -6864,21 +7542,22 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":61
  *     def write_text(self, char* filename):
@@ -6887,35 +7566,43 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->data)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->data))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_w_id);
-            __pyx_v_w_id = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_w_id = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":62
  *         with open(filename, "w") as f:
@@ -6924,11 +7611,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  */
-            __pyx_t_2 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            if (__pyx_t_9) {
+            __pyx_t_1 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            if (__pyx_t_10) {
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
  *             for w_id in self.data:
@@ -6937,35 +7623,35 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
  *                 if w_id == 1:
  *                     f.write("\n")
  */
-              __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_word); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_word); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_v_w_id);
               PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_w_id);
               __Pyx_GIVEREF(__pyx_v_w_id);
-              __pyx_t_12 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(((PyObject *)__pyx_t_11));
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_12);
               PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
               __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
               __pyx_t_11 = 0;
-              __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-              goto __pyx_L19;
+              goto __pyx_L18;
             }
-            __pyx_L19:;
+            __pyx_L18:;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":64
  *                 if w_id > 1:
@@ -6974,11 +7660,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
  *                     f.write("\n")
  * 
  */
-            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            if (__pyx_t_9) {
+            if (__pyx_t_10) {
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":65
  *                     f.write("%s " % self.get_word(w_id))
@@ -6987,28 +7672,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
  * 
  *     def read_text(self, char* filename):
  */
-              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              goto __pyx_L20;
+              goto __pyx_L19;
             }
-            __pyx_L20:;
+            __pyx_L19:;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
-        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
  * 
@@ -7019,75 +7704,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_12);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
-          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
+          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __pyx_t_14 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_14 = (!__pyx_t_10);
           if (__pyx_t_14) {
-            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_12);
             __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_12, __pyx_t_11);
-            __pyx_t_1 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_ErrRestore(__pyx_t_4, __pyx_t_12, __pyx_t_11);
+            __pyx_t_4 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7095,7 +7780,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
@@ -7108,6 +7793,27 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_16read_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":67
  *                     f.write("\n")
  * 
@@ -7116,9 +7822,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
  *             self.read_text_data(fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_fp = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -7136,16 +7840,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
  * 
@@ -7160,7 +7855,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -7170,12 +7865,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -7183,8 +7878,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_fp = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_v_fp = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":69
  *     def read_text(self, char* filename):
@@ -7193,27 +7889,27 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
  * 
  *     def read_bitext(self, char* filename, int side):
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_INCREF(__pyx_v_fp);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fp);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fp);
           __Pyx_GIVEREF(__pyx_v_fp);
-          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
  * 
@@ -7224,57 +7920,57 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_3, __pyx_t_2);
-            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L19;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L18;
           }
-          __pyx_L19:;
+          __pyx_L18:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L16_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -7288,11 +7984,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L20;
-    __pyx_L5_error:;
+    goto __pyx_L19;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L20:;
+    __pyx_L19:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7310,7 +8006,63 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_filename;
+  int __pyx_v_side;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_bitext (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_18read_bitext(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
@@ -7320,37 +8072,45 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11read_bitext_genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_11read_bitext_genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("genexpr");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)__pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *) __pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  __pyx_self = __pyx_self;
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_11read_bitext_1generator6;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_9DataArray_11read_bitext_2generator6, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_bitext.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
@@ -7358,8 +8118,8 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -7368,7 +8128,8 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
     __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
@@ -7377,12 +8138,20 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -7416,7 +8185,7 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -7427,7 +8196,7 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -7436,7 +8205,8 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -7449,10 +8219,8 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
  *             data = (line.split(' ||| ')[side] for line in fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_cur_scope;
-  char *__pyx_v_filename;
   PyObject *__pyx_v_data = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -7470,58 +8238,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
-  __Pyx_RefNannySetupContext("read_bitext");
+  __Pyx_RefNannySetupContext("read_bitext", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  {
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-    }
-    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_cur_scope->__pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_cur_scope->__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __pyx_cur_scope->__pyx_v_side = __pyx_v_side;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
  * 
@@ -7536,7 +8260,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -7546,12 +8270,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -7559,9 +8283,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_cur_scope->__pyx_v_fp = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_cur_scope->__pyx_v_fp = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
@@ -7570,10 +8295,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
  *             self.read_text_data(data)
  * 
  */
-          __pyx_t_2 = __pyx_pf_3_sa_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_v_data = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_t_1 = __pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_v_data = __pyx_t_1;
+          __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
  *         with gzip_or_text(filename) as fp:
@@ -7582,27 +8307,27 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
  * 
  *     def read_text_data(self, data):
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_INCREF(__pyx_v_data);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_data);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_data);
           __Pyx_GIVEREF(__pyx_v_data);
-          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L17_try_end;
-        __pyx_L10_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
  * 
@@ -7612,58 +8337,58 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
  *             self.read_text_data(data)
  */
         /*except:*/ {
-          __Pyx_AddTraceback("_sa.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_3, __pyx_t_2);
-            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
-            goto __pyx_L20;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L18;
           }
-          __pyx_L20:;
+          __pyx_L18:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L11_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L12_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L11_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L17_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -7677,11 +8402,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L21;
-    __pyx_L6_error:;
+    goto __pyx_L19;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L21:;
+    __pyx_L19:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7701,6 +8426,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text_data (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_20read_text_data(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_data));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
  *             self.read_text_data(data)
  * 
@@ -7709,8 +8445,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
  *         for line_num, line in enumerate(data):
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
+static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data) {
   int __pyx_v_word_count;
   PyObject *__pyx_v_line_num = NULL;
   PyObject *__pyx_v_line = NULL;
@@ -7730,7 +8465,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text_data");
+  __Pyx_RefNannySetupContext("read_text_data", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":77
  * 
@@ -7759,12 +8494,20 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
@@ -7797,7 +8540,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  */
     __pyx_t_5 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
@@ -7824,12 +8567,20 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
     }
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_6)) {
+      if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
-        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
-      } else if (PyTuple_CheckExact(__pyx_t_6)) {
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
         __pyx_t_5 = __pyx_t_8(__pyx_t_6);
         if (unlikely(!__pyx_t_5)) {
@@ -7852,10 +8603,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  */
-      __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+      __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_word);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_word);
       __Pyx_GIVEREF(__pyx_v_word);
@@ -7863,7 +8614,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
@@ -7875,7 +8626,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  */
-      if (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id) {
+      if (__pyx_v_self->use_sent_id) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":83
  *                 self.data.append(self.get_id(word))
@@ -7884,12 +8635,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  *                 word_count = word_count + 1
  *             self.data.append(1)
  */
-        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        goto __pyx_L9;
+        goto __pyx_L7;
       }
-      __pyx_L9:;
+      __pyx_L7:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":84
  *                 if self.use_sent_id:
@@ -7909,7 +8660,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  */
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
@@ -7920,7 +8671,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  */
-    if (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id) {
+    if (__pyx_v_self->use_sent_id) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":87
  *             self.data.append(1)
@@ -7929,12 +8680,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  *             word_count = word_count + 1
  *         self.data.append(0)
  */
-      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L10;
+      goto __pyx_L8;
     }
-    __pyx_L10:;
+    __pyx_L8:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":88
  *             if self.use_sent_id:
@@ -7955,7 +8706,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  *         self.sent_index.append(word_count)
  * 
  */
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -7968,7 +8719,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  */
   __pyx_t_1 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -7993,24 +8744,13 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":93
- * 
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -8020,6 +8760,24 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_22read_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":93
+ * 
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":95
  *     def read_binary(self, char* filename):
@@ -8037,7 +8795,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self,
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":97
  *         f = fopen(filename, "r")
@@ -8065,7 +8823,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self,
 static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, FILE *__pyx_v_f) {
   int __pyx_v_num_words;
   int __pyx_v_word_len;
-  unsigned int __pyx_v_i;
+  CYTHON_UNUSED unsigned int __pyx_v_i;
   char *__pyx_v_word;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -8077,7 +8835,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_handle");
+  __Pyx_RefNannySetupContext("read_handle", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":104
  *         cdef char* word
@@ -8264,7 +9022,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_handle");
+  __Pyx_RefNannySetupContext("write_handle", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":124
  *         cdef int num_words
@@ -8334,12 +9092,20 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_3)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_3)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_1 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_1)) {
@@ -8396,24 +9162,13 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":134
- *             fwrite(<char *>word, sizeof(char), word_len, f)
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -8423,6 +9178,24 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_24write_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":134
+ *             fwrite(<char *>word, sizeof(char), word_len, f)
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":136
  *     def write_binary(self, char* filename):
@@ -8440,7 +9213,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self,
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":138
  *         f = fopen(filename, "w")
@@ -8457,6 +9230,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced_handle (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_26write_enhanced_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_f));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":140
  *         fclose(f)
  * 
@@ -8465,8 +9249,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self,
  *             f.write("%d " %i)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f) {
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_word = NULL;
   PyObject *__pyx_r = NULL;
@@ -8480,7 +9263,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced_handle");
+  __Pyx_RefNannySetupContext("write_enhanced_handle", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":141
  * 
@@ -8489,21 +9272,29 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data))) {
-    __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self->data)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->data))) {
+    __pyx_t_1 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -8531,7 +9322,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -8564,21 +9355,29 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index))) {
-    __pyx_t_5 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_index))) {
+    __pyx_t_5 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_3 = Py_TYPE(__pyx_t_5)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_5)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_5)) break;
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_5)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_1 = __pyx_t_3(__pyx_t_5);
       if (unlikely(!__pyx_t_1)) {
@@ -8606,7 +9405,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_6));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
     __pyx_t_6 = 0;
@@ -8639,21 +9438,29 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id))) {
-    __pyx_t_6 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_id)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_id))) {
+    __pyx_t_6 = ((PyObject *)__pyx_v_self->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_3 = Py_TYPE(__pyx_t_6)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_6)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_6)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_6)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_6);
       if (unlikely(!__pyx_t_5)) {
@@ -8681,7 +9488,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
     __pyx_t_4 = 0;
@@ -8714,21 +9521,29 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word)) {
-    __pyx_t_4 = ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
+  if (PyList_CheckExact(__pyx_v_self->id2word) || PyTuple_CheckExact(__pyx_v_self->id2word)) {
+    __pyx_t_4 = __pyx_v_self->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_self->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_4)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_4)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_6 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_6)) {
@@ -8753,10 +9568,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
  */
     __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_word);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_word);
     __Pyx_GIVEREF(__pyx_v_word);
@@ -8767,7 +9582,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -8810,6 +9625,27 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_28write_enhanced(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":154
  *         f.write("\n")
  * 
@@ -8818,9 +9654,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
  *             self.write_enhanced_handle(self, f)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -8838,16 +9672,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
  * 
@@ -8859,7 +9684,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -8871,51 +9696,52 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":156
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.write_enhanced_handle(self, f)             # <<<<<<<<<<<<<<
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s_27); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          __Pyx_INCREF(__pyx_v_self);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self);
-          __Pyx_GIVEREF(__pyx_v_self);
+          __Pyx_INCREF(((PyObject *)__pyx_v_self));
+          PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
           __Pyx_INCREF(__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
  * 
@@ -8925,75 +9751,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_7);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_INCREF(__pyx_t_7);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7);
-          __Pyx_GIVEREF(__pyx_t_7);
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __pyx_t_10 = PyObject_Call(__pyx_t_3, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
-            __Pyx_GIVEREF(__pyx_t_7);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_7, __pyx_t_2, __pyx_t_1);
-            __pyx_t_7 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L19;
+            __Pyx_GIVEREF(__pyx_t_4);
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_4);
+            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_4 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L18;
           }
-          __pyx_L19:;
+          __pyx_L18:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L20;
-    __pyx_L5_error:;
+    goto __pyx_L19;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L20:;
+    __pyx_L19:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -9001,7 +9827,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -9020,10 +9846,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
  *         return i*65536 + j
  */
 
-static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
+static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("link");
+  __Pyx_RefNannySetupContext("link", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":14
  *     cdef int link(self, int i, int j):
@@ -9041,6 +9867,18 @@ static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link); /*proto*/
+static char __pyx_doc_3_sa_9Alignment_unlink[] = "De-integerizes an alignment link pair";
+static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("unlink (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9Alignment_unlink(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((PyObject *)__pyx_v_link));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":16
  *         return i*65536 + j
  * 
@@ -9049,9 +9887,7 @@ static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v
  *         return (link/65536, link%65536)
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link); /*proto*/
-static char __pyx_doc_3_sa_9Alignment_unlink[] = "De-integerizes an alignment link pair";
-static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link) {
+static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -9060,7 +9896,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("unlink");
+  __Pyx_RefNannySetupContext("unlink", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":18
  *     def unlink(self, link):
@@ -9075,7 +9911,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
   __pyx_t_2 = PyNumber_Remainder(__pyx_v_link, __pyx_int_65536); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -9108,10 +9944,10 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
  *         e[0] = link%65536
  */
 
-static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_link, int *__pyx_v_f, int *__pyx_v_e) {
+static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_link, int *__pyx_v_f, int *__pyx_v_e) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_unlink");
+  __Pyx_RefNannySetupContext("_unlink", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":21
  * 
@@ -9137,6 +9973,27 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id) {
+  int __pyx_v_sent_id;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sent_links (wrapper)", 0);
+  assert(__pyx_arg_sent_id); {
+    __pyx_v_sent_id = __Pyx_PyInt_AsInt(__pyx_arg_sent_id); if (unlikely((__pyx_v_sent_id == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.get_sent_links", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_2get_sent_links(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((int)__pyx_v_sent_id));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":24
  *         e[0] = link%65536
  * 
@@ -9145,9 +10002,7 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment
  *         cdef int* arr
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id) {
-  int __pyx_v_sent_id;
+static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id) {
   struct __pyx_obj_3_sa_IntList *__pyx_v_sent_links = 0;
   int *__pyx_v_arr;
   int __pyx_v_arr_len;
@@ -9157,16 +10012,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sent_links");
-  assert(__pyx_arg_sent_id); {
-    __pyx_v_sent_id = __Pyx_PyInt_AsInt(__pyx_arg_sent_id); if (unlikely((__pyx_v_sent_id == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.get_sent_links", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("get_sent_links", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":28
  *         cdef int* arr
@@ -9187,7 +10033,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)
  */
-  __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->__pyx_vtab)->_get_sent_links(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_v_sent_id, (&__pyx_v_arr_len));
+  __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->_get_sent_links(__pyx_v_self, __pyx_v_sent_id, (&__pyx_v_arr_len));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":30
  *         sent_links = IntList()
@@ -9252,7 +10098,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_get_sent_links");
+  __Pyx_RefNannySetupContext("_get_sent_links", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":37
  *         cdef int* sent_links
@@ -9333,43 +10179,38 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":45
- *         return sent_links
- * 
- *     def __cinit__(self, from_binary=None, from_text=None):             # <<<<<<<<<<<<<<
- *         self.links = IntList(1000,1000)
- *         self.sent_index = IntList(1000,1000)
- */
-
-static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
     PyObject* values[2] = {0,0};
+
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":45
+ *         return sent_links
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None):             # <<<<<<<<<<<<<<
+ *         self.links = IntList(1000,1000)
+ *         self.sent_index = IntList(1000,1000)
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -9382,7 +10223,7 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -9403,6 +10244,22 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_4__cinit__(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":46
  * 
@@ -9414,9 +10271,9 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_29), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links));
-  ((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->links);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->links));
+  __pyx_v_self->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":47
@@ -9429,9 +10286,9 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_30), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index));
-  ((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sent_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
+  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":48
@@ -9451,10 +10308,10 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
  *         elif from_text:
  *             self.read_text(from_text)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -9463,7 +10320,7 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":50
@@ -9483,10 +10340,10 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
  * 
  *     def read_text(self, char* filename):
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -9495,9 +10352,9 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -9512,6 +10369,27 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_6read_text(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":53
  *             self.read_text(from_text)
  * 
@@ -9520,9 +10398,7 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
  *             for line in f:
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_line = NULL;
   PyObject *__pyx_v_pairs = NULL;
@@ -9554,16 +10430,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
  * 
@@ -9578,7 +10445,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -9588,12 +10455,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -9601,8 +10468,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_v_f = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":55
  *     def read_text(self, char* filename):
@@ -9612,34 +10480,42 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  *                 pairs = line.split()
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_3 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_3)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_line);
-            __pyx_v_line = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_line = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":56
  *         with gzip_or_text(filename) as f:
@@ -9648,16 +10524,16 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  *                 pairs = line.split()
  *                 for pair in pairs:
  */
-            __pyx_t_3 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
-            __Pyx_INCREF(__pyx_t_3);
-            __pyx_t_10 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = ((PyObject *)__pyx_v_self->links);
+            __Pyx_INCREF(__pyx_t_2);
+            __pyx_t_10 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":57
  *             for line in f:
@@ -9666,14 +10542,14 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_XDECREF(__pyx_v_pairs);
-            __pyx_v_pairs = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_pairs = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":58
  *                 self.sent_index.append(len(self.links))
@@ -9683,34 +10559,42 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  *                     self.links.append(self.link(i, j))
  */
             if (PyList_CheckExact(__pyx_v_pairs) || PyTuple_CheckExact(__pyx_v_pairs)) {
-              __pyx_t_3 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
+              __pyx_t_2 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_2); __pyx_t_10 = 0;
               __pyx_t_11 = NULL;
             } else {
-              __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_3);
-              __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
+              __pyx_t_10 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_11 = Py_TYPE(__pyx_t_2)->tp_iternext;
             }
             for (;;) {
-              if (PyList_CheckExact(__pyx_t_3)) {
-                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
-                __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++;
-              } else if (PyTuple_CheckExact(__pyx_t_3)) {
-                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-                __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++;
+              if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_2)) {
+                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_2)) break;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #else
+                __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #endif
+              } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_2)) {
+                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #else
+                __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #endif
               } else {
-                __pyx_t_1 = __pyx_t_11(__pyx_t_3);
-                if (unlikely(!__pyx_t_1)) {
+                __pyx_t_3 = __pyx_t_11(__pyx_t_2);
+                if (unlikely(!__pyx_t_3)) {
                   if (PyErr_Occurred()) {
                     if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                    else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                   }
                   break;
                 }
-                __Pyx_GOTREF(__pyx_t_1);
+                __Pyx_GOTREF(__pyx_t_3);
               }
               __Pyx_XDECREF(__pyx_v_pair);
-              __pyx_v_pair = __pyx_t_1;
-              __pyx_t_1 = 0;
+              __pyx_v_pair = __pyx_t_3;
+              __pyx_t_3 = 0;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
@@ -9719,67 +10603,74 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  *                     self.links.append(self.link(i, j))
  *             self.sent_index.append(len(self.links))
  */
-              __pyx_t_1 = PyObject_GetAttr(__pyx_v_pair, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_12 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_32), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_3 = PyObject_GetAttr(__pyx_v_pair, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_12 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_k_tuple_32), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_3);
               __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-              PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
+              PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
               __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-              PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
+              PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_12);
               __Pyx_GIVEREF(__pyx_t_12);
               __pyx_t_12 = 0;
-              __pyx_t_12 = PyObject_Call(__pyx_builtin_map, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_builtin_map, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+              __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
               if ((likely(PyTuple_CheckExact(__pyx_t_12))) || (PyList_CheckExact(__pyx_t_12))) {
                 PyObject* sequence = __pyx_t_12;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                Py_ssize_t size = Py_SIZE(sequence);
+                #else
+                Py_ssize_t size = PySequence_Size(sequence);
+                #endif
+                if (unlikely(size != 2)) {
+                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                }
+                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                  }
-                  __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
+                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                  }
-                  __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
+                  __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
                 }
-                __Pyx_INCREF(__pyx_t_1);
+                __Pyx_INCREF(__pyx_t_3);
                 __Pyx_INCREF(__pyx_t_13);
+                #else
+                __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_t_13 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #endif
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              } else {
+              } else
+              {
                 Py_ssize_t index = -1;
-                __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
                 __pyx_t_15 = Py_TYPE(__pyx_t_14)->tp_iternext;
-                index = 0; __pyx_t_1 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_1)) goto __pyx_L21_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_1);
-                index = 1; __pyx_t_13 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L21_unpacking_failed;
+                index = 0; __pyx_t_3 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_3)) goto __pyx_L20_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_3);
+                index = 1; __pyx_t_13 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L20_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_13);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_14), 2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_14), 2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_t_15 = NULL;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                goto __pyx_L22_unpacking_done;
-                __pyx_L21_unpacking_failed:;
+                goto __pyx_L21_unpacking_done;
+                __pyx_L20_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                __pyx_L22_unpacking_done:;
+                __pyx_t_15 = NULL;
+                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_L21_unpacking_done:;
               }
               __Pyx_XDECREF(__pyx_v_i);
-              __pyx_v_i = __pyx_t_1;
-              __pyx_t_1 = 0;
+              __pyx_v_i = __pyx_t_3;
+              __pyx_t_3 = 0;
               __Pyx_XDECREF(__pyx_v_j);
               __pyx_v_j = __pyx_t_13;
               __pyx_t_13 = 0;
@@ -9791,18 +10682,18 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  *             self.sent_index.append(len(self.links))
  * 
  */
-              __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_t_12 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->__pyx_vtab)->link(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_t_16, __pyx_t_17)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->link(__pyx_v_self, __pyx_t_16, __pyx_t_17)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __pyx_t_13 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links), __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_13 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->links), __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_13);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
             }
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":61
  *                     (i, j) = map(int, pair.split('-'))
@@ -9811,28 +10702,28 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  * 
  *     def read_binary(self, char* filename):
  */
-          __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
-          __Pyx_INCREF(__pyx_t_2);
-          __pyx_t_8 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = ((PyObject *)__pyx_v_self->links);
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_t_8 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_3 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
  * 
@@ -9843,57 +10734,57 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_13) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_13) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-          __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_3);
-          __Pyx_GIVEREF(__pyx_t_3);
+          __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_12);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_13);
           PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_t_13);
           __Pyx_GIVEREF(__pyx_t_13);
           __pyx_t_19 = PyObject_Call(__pyx_t_4, __pyx_t_12, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_19);
           __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_19);
           __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-          if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_20 = (!__pyx_t_18);
           if (__pyx_t_20) {
-            __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_13);
-            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_13);
-            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_13 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L25;
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_13);
+            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_13 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L24;
           }
-          __pyx_L25:;
+          __pyx_L24:;
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L16_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -9907,11 +10798,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
         if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L26;
-    __pyx_L5_error:;
+    goto __pyx_L25;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L26:;
+    __pyx_L25:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -9937,24 +10828,13 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":63
- *             self.sent_index.append(len(self.links))
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -9964,6 +10844,24 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_8read_binary(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":63
+ *             self.sent_index.append(len(self.links))
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":65
  *     def read_binary(self, char* filename):
@@ -9981,7 +10879,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
  *         self.sent_index.read_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->read_handle(__pyx_v_self->links, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":67
  *         f = fopen(filename, "r")
@@ -9990,7 +10888,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":68
  *         self.links.read_handle(f)
@@ -10007,6 +10905,27 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_10write_text(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":70
  *         fclose(f)
  * 
@@ -10015,9 +10934,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
  *             sent_num = 0
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_sent_num = NULL;
   PyObject *__pyx_v_i = NULL;
@@ -10030,9 +10947,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   PyObject *__pyx_t_10 = NULL;
   int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
@@ -10042,16 +10959,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
  * 
@@ -10064,7 +10972,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -10076,21 +10984,22 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":72
  *     def write_text(self, char* filename):
@@ -10110,44 +11019,52 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  *                     f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_1 = __pyx_int_0;
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links))) {
-            __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links); __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_4 = __pyx_int_0;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->links)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->links))) {
+            __pyx_t_1 = ((PyObject *)__pyx_v_self->links); __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->links)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_9 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_9 = __pyx_t_8(__pyx_t_2);
-              if (unlikely(!__pyx_t_9)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_9);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_link);
-            __pyx_v_link = __pyx_t_9;
-            __pyx_t_9 = 0;
-            __Pyx_INCREF(__pyx_t_1);
+            __pyx_v_link = __pyx_t_2;
+            __pyx_t_2 = 0;
+            __Pyx_INCREF(__pyx_t_4);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_9 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_1);
-            __pyx_t_1 = __pyx_t_9;
-            __pyx_t_9 = 0;
+            __pyx_v_i = __pyx_t_4;
+            __pyx_t_2 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_4);
+            __pyx_t_4 = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":74
  *             sent_num = 0
@@ -10157,12 +11074,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  *                     sent_num = sent_num + 1
  */
             while (1) {
-              __pyx_t_9 = PyObject_GetItem(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_v_sent_num); if (!__pyx_t_9) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_9);
-              __pyx_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_9, Py_GE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_2 = PyObject_GetItem(((PyObject *)__pyx_v_self->sent_index), __pyx_v_sent_num); if (!__pyx_t_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               if (!__pyx_t_11) break;
 
@@ -10173,12 +11089,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  */
-              __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_k_tuple_34), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_2 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_k_tuple_34), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":76
  *                 while i >= self.sent_index[sent_num]:
@@ -10187,11 +11103,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")
  */
-              __pyx_t_9 = PyNumber_Add(__pyx_v_sent_num, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_2 = PyNumber_Add(__pyx_v_sent_num, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
               __Pyx_DECREF(__pyx_v_sent_num);
-              __pyx_v_sent_num = __pyx_t_9;
-              __pyx_t_9 = 0;
+              __pyx_v_sent_num = __pyx_t_2;
+              __pyx_t_2 = 0;
             }
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":77
@@ -10201,35 +11117,35 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  * 
  */
-            __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__unlink); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__unlink); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
             __Pyx_INCREF(__pyx_v_link);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_link);
             __Pyx_GIVEREF(__pyx_v_link);
-            __pyx_t_13 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_13 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_13);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __pyx_t_12 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_35), __pyx_t_13); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_35), __pyx_t_13); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_13);
             PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_t_12));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
             __pyx_t_12 = 0;
-            __pyx_t_12 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
@@ -10238,24 +11154,24 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  * 
  *     def write_binary(self, char* filename):
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_36), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_36), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
  * 
@@ -10266,75 +11182,75 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_12) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_4, &__pyx_t_12) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-          __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_13);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_12);
           PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __pyx_t_14 = PyObject_Call(__pyx_t_3, __pyx_t_13, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_14);
           __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_15 = (!__pyx_t_11);
           if (__pyx_t_15) {
-            __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_12);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_12);
-            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_12 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_4, __pyx_t_12);
+            __pyx_t_1 = 0; __pyx_t_4 = 0; __pyx_t_12 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
+          __pyx_L22:;
           __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_37, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_37, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -10342,7 +11258,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_XDECREF(__pyx_t_13);
@@ -10358,24 +11274,13 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":80
- *             f.write("\n")
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -10385,6 +11290,24 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_12write_binary(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":80
+ *             f.write("\n")
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":82
  *     def write_binary(self, char* filename):
@@ -10402,7 +11325,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
  *         self.sent_index.write_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->write_handle(__pyx_v_self->links, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":84
  *         f = fopen(filename, "w")
@@ -10411,7 +11334,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":85
  *         self.links.write_handle(f)
@@ -10428,6 +11351,27 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_14write_enhanced(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":87
  *         fclose(f)
  * 
@@ -10436,11 +11380,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
  *             sent_num = 1
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
-  long __pyx_v_sent_num;
+  CYTHON_UNUSED long __pyx_v_sent_num;
   PyObject *__pyx_v_link = NULL;
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_r = NULL;
@@ -10451,9 +11393,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   PyObject *__pyx_t_10 = NULL;
   int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
@@ -10461,16 +11403,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
  * 
@@ -10483,7 +11416,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -10495,21 +11428,22 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":89
  *     def write_enhanced(self, char* filename):
@@ -10527,35 +11461,43 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  *                 f.write("%d " % link)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->links)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->links))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->links); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->links)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_link);
-            __pyx_v_link = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_link = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":91
  *             sent_num = 1
@@ -10564,22 +11506,22 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  *             f.write("\n")
  *             for i in self.sent_index:
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
-            __pyx_t_9 = 0;
-            __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
@@ -10588,12 +11530,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_38), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_38), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":93
  *                 f.write("%d " % link)
@@ -10602,35 +11544,43 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  *                 f.write("%d " % i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index))) {
-            __pyx_t_9 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index); __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_index))) {
+            __pyx_t_2 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_1 = __pyx_t_8(__pyx_t_9);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_4 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_4)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_4);
             }
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_i = __pyx_t_4;
+            __pyx_t_4 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":94
  *             f.write("\n")
@@ -10639,22 +11589,22 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  *             f.write("\n")
  * 
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_10));
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
@@ -10663,21 +11613,21 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  * 
  *     def alignment(self, i):
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_39), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_39), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
@@ -10689,75 +11639,75 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_9, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
-          __Pyx_INCREF(__pyx_t_9);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
-          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_9, __pyx_t_2);
-            __pyx_t_10 = 0; __pyx_t_9 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_2, __pyx_t_1);
+            __pyx_t_10 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_40, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_40, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -10765,7 +11715,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -10778,6 +11728,18 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static char __pyx_doc_3_sa_9Alignment_16alignment[] = "Return all (e,f) pairs for sentence i";
+static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("alignment (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9Alignment_16alignment(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":97
  *             f.write("\n")
  * 
@@ -10786,9 +11748,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  *         cdef int j, start, end
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static char __pyx_doc_3_sa_9Alignment_8alignment[] = "Return all (e,f) pairs for sentence i";
-static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_j;
   int __pyx_v_start;
   int __pyx_v_end;
@@ -10804,7 +11764,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("alignment");
+  __Pyx_RefNannySetupContext("alignment", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":100
  *         """Return all (e,f) pairs for sentence i"""
@@ -10814,7 +11774,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
  *         end = self.sent_index.arr[i+1]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -10826,7 +11786,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
  *         for j from start <= j < end:
  */
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = (((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":102
  *         result = []
@@ -10839,7 +11799,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_end = (((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_end = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":103
  *         start = self.sent_index.arr[i]
@@ -10857,15 +11817,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
  *             result.append(self.unlink(self.links.arr[j]))             # <<<<<<<<<<<<<<
  *         return result
  */
-    if (unlikely(((PyObject *)__pyx_v_result) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__unlink); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__unlink); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->arr[__pyx_v_j])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((__pyx_v_self->links->arr[__pyx_v_j])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
@@ -10914,7 +11871,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   struct __pyx_t_3_sa__node *__pyx_v_n;
   struct __pyx_t_3_sa__node *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_node");
+  __Pyx_RefNannySetupContext("new_node", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":17
  * cdef _node* new_node(int key):
@@ -10993,7 +11950,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("del_node");
+  __Pyx_RefNannySetupContext("del_node", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":26
  * 
@@ -11076,7 +12033,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("get_val");
+  __Pyx_RefNannySetupContext("get_val", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":33
  * 
@@ -11205,16 +12162,9 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
- *     cdef id2eword, id2fword, eword2id, fword2id
- * 
- *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
- *             earray=None, fsarray=None, alignment=None):
- *         self.id2eword = []
- */
-
-static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_from_data = 0;
   PyObject *__pyx_v_from_binary = 0;
@@ -11223,18 +12173,18 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   PyObject *__pyx_v_alignment = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
     PyObject* values[6] = {0,0,0,0,0,0};
+
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
+ *     cdef id2eword, id2fword, eword2id, fword2id
+ * 
+ *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
+ *             earray=None, fsarray=None, alignment=None):
+ *         self.id2eword = []
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = __pyx_k_41;
     values[2] = ((PyObject *)Py_None);
@@ -11251,7 +12201,8 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     values[5] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -11262,7 +12213,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_text);
@@ -11295,7 +12246,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -11324,6 +12275,31 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex___cinit__(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_v_from_text, __pyx_v_from_data, __pyx_v_from_binary, __pyx_v_earray, __pyx_v_fsarray, __pyx_v_alignment);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
+ *     cdef id2eword, id2fword, eword2id, fword2id
+ * 
+ *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
+ *             earray=None, fsarray=None, alignment=None):
+ *         self.id2eword = []
+ */
+
+static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_from_text, PyObject *__pyx_v_from_data, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_earray, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_alignment) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":56
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,
@@ -11333,11 +12309,11 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
  *         self.eword2id = {}
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->id2eword);
+  __Pyx_DECREF(__pyx_v_self->id2eword);
+  __pyx_v_self->id2eword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":57
@@ -11348,11 +12324,11 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
  *         self.fword2id = {}
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->id2fword);
+  __Pyx_DECREF(__pyx_v_self->id2fword);
+  __pyx_v_self->id2fword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":58
@@ -11365,9 +12341,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->eword2id);
+  __Pyx_DECREF(__pyx_v_self->eword2id);
+  __pyx_v_self->eword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":59
@@ -11380,9 +12356,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->fword2id);
+  __Pyx_DECREF(__pyx_v_self->fword2id);
+  __pyx_v_self->fword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":60
@@ -11395,9 +12371,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->e_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->e_index));
+  __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":61
@@ -11410,9 +12386,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->f_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->f_index));
+  __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":62
@@ -11425,9 +12401,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->col1);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->col1));
+  __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":63
@@ -11440,9 +12416,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->col2);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->col2));
+  __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":64
@@ -11462,10 +12438,10 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
  *         elif from_data:
  *             self.compute_from_data(fsarray, earray, alignment)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -11474,7 +12450,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":66
@@ -11503,13 +12479,13 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     if (!(likely(((__pyx_v_alignment) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_alignment, __pyx_ptype_3_sa_Alignment))))) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __pyx_v_alignment;
     __Pyx_INCREF(__pyx_t_1);
-    __pyx_t_5 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->compute_from_data(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_t_4), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_3), ((struct __pyx_obj_3_sa_Alignment *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->compute_from_data(__pyx_v_self, ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_t_4), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_3), ((struct __pyx_obj_3_sa_Alignment *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
@@ -11520,10 +12496,10 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
  * 
  * 
  */
-    __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -11533,7 +12509,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -11601,7 +12577,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("compute_from_data");
+  __Pyx_RefNannySetupContext("compute_from_data", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":79
  *         cdef int null_word
@@ -11628,12 +12604,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -11689,12 +12673,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_4)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_4)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_5)) {
@@ -11746,12 +12738,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -11807,12 +12807,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_4)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_4)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_5)) {
@@ -12109,7 +13117,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_12 = PyInt_FromLong((__pyx_v_sent_id + 1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_12);
         __pyx_t_13 = PyTuple_New(5); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+        __Pyx_GOTREF(__pyx_t_13);
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4);
@@ -12129,7 +13137,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __Pyx_GOTREF(((PyObject *)__pyx_t_12));
         __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
         __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+        __Pyx_GOTREF(__pyx_t_13);
         PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_t_12));
         __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
         __pyx_t_12 = 0;
@@ -12587,7 +13595,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_13);
   if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_GIVEREF(__pyx_t_13);
@@ -12609,7 +13617,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_12);
   if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
   __Pyx_GIVEREF(__pyx_t_12);
@@ -12631,7 +13639,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_13);
   if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_GIVEREF(__pyx_t_13);
@@ -12653,7 +13661,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_12);
   if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
   __Pyx_GIVEREF(__pyx_t_12);
@@ -12801,7 +13809,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_add_node");
+  __Pyx_RefNannySetupContext("_add_node", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":191
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):
@@ -12916,6 +13924,27 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_2write_binary(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":202
  * 
  * 
@@ -12924,9 +13953,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -12935,16 +13962,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":204
  *     def write_binary(self, char* filename):
@@ -12962,7 +13980,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->write_handle(__pyx_v_self->f_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":206
  *         f = fopen(filename, "w")
@@ -12971,7 +13989,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->write_handle(__pyx_v_self->e_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":207
  *         self.f_index.write_handle(f)
@@ -12980,7 +13998,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->write_handle(__pyx_v_self->col1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":208
  *         self.e_index.write_handle(f)
@@ -12989,7 +14007,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->write_handle(__pyx_v_self->col2, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":209
  *         self.col1.write_handle(f)
@@ -12998,9 +14016,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  *         self.write_wordlist(self.id2eword, f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
+  __pyx_t_1 = __pyx_v_self->id2fword;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->write_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->write_wordlist(__pyx_v_self, __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -13012,9 +14030,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  *         fclose(f)
  * 
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
+  __pyx_t_2 = __pyx_v_self->id2eword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->write_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->write_wordlist(__pyx_v_self, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -13049,7 +14067,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  *         cdef int num_words
  */
 
-static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_wordlist, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_wordlist, FILE *__pyx_v_f) {
   int __pyx_v_word_len;
   int __pyx_v_num_words;
   PyObject *__pyx_v_word = NULL;
@@ -13064,7 +14082,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_wordlist");
+  __Pyx_RefNannySetupContext("write_wordlist", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":218
  *         cdef int num_words
@@ -13101,12 +14119,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
     __pyx_t_3 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
@@ -13175,11 +14201,11 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
  *         cdef int word_len
  */
 
-static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_word2id, PyObject *__pyx_v_id2word, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_word2id, PyObject *__pyx_v_id2word, FILE *__pyx_v_f) {
   int __pyx_v_num_words;
   int __pyx_v_word_len;
   char *__pyx_v_word;
-  long __pyx_v_i;
+  CYTHON_UNUSED long __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -13189,7 +14215,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_wordlist");
+  __Pyx_RefNannySetupContext("read_wordlist", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":231
  *         cdef char* word
@@ -13290,6 +14316,27 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_4read_binary(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":240
  *             free(word)
  * 
@@ -13298,9 +14345,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -13310,16 +14355,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_binary", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":242
  *     def read_binary(self, char* filename):
@@ -13337,7 +14373,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->read_handle(__pyx_v_self->f_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":244
  *         f = fopen(filename, "r")
@@ -13346,7 +14382,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->read_handle(__pyx_v_self->e_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":245
  *         self.f_index.read_handle(f)
@@ -13355,7 +14391,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->read_handle(__pyx_v_self->col1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":246
  *         self.e_index.read_handle(f)
@@ -13364,7 +14400,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->read_handle(__pyx_v_self->col2, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":247
  *         self.col1.read_handle(f)
@@ -13373,11 +14409,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id;
+  __pyx_t_1 = __pyx_v_self->fword2id;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
+  __pyx_t_2 = __pyx_v_self->id2fword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->read_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_1, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->read_wordlist(__pyx_v_self, __pyx_t_1, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -13390,11 +14426,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  *         fclose(f)
  * 
  */
-  __pyx_t_3 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id;
+  __pyx_t_3 = __pyx_v_self->eword2id;
   __Pyx_INCREF(__pyx_t_3);
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
+  __pyx_t_2 = __pyx_v_self->id2eword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->read_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_3, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->read_wordlist(__pyx_v_self, __pyx_t_3, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -13423,6 +14459,17 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_e_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_5BiLex_6get_e_id(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((PyObject *)__pyx_v_eword));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":252
  * 
  * 
@@ -13431,9 +14478,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  *             e_id = len(self.id2eword)
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword) {
-  Py_ssize_t __pyx_v_e_id;
+static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_eword) {
+  PyObject *__pyx_v_e_id = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -13442,7 +14488,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_e_id");
+  __Pyx_RefNannySetupContext("get_e_id", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":253
  * 
@@ -13451,7 +14497,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":254
@@ -13461,11 +14507,14 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id
  */
-    __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
+    __pyx_t_2 = __pyx_v_self->id2eword;
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_v_e_id = __pyx_t_3;
+    __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_v_e_id = __pyx_t_2;
+    __pyx_t_2 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":255
  *         if eword not in self.eword2id:
@@ -13474,7 +14523,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
  *             self.eword2id[eword] = e_id
  *         return self.eword2id[eword]
  */
-    __pyx_t_2 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword, __pyx_v_eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_self->id2eword, __pyx_v_eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
@@ -13485,13 +14534,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
  *         return self.eword2id[eword]
  * 
  */
-    __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_e_id); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    if (PyObject_SetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L5;
+    if (PyObject_SetItem(__pyx_v_self->eword2id, __pyx_v_eword, __pyx_v_e_id) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":257
  *             self.id2eword.append(eword)
@@ -13501,7 +14547,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -13514,11 +14560,23 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
   __Pyx_AddTraceback("_sa.BiLex.get_e_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_e_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_f_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_5BiLex_8get_f_id(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((PyObject *)__pyx_v_fword));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":260
  * 
  * 
@@ -13527,9 +14585,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
  *             f_id = len(self.id2fword)
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword) {
-  Py_ssize_t __pyx_v_f_id;
+static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword) {
+  PyObject *__pyx_v_f_id = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -13538,7 +14595,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_f_id");
+  __Pyx_RefNannySetupContext("get_f_id", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":261
  * 
@@ -13547,7 +14604,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":262
@@ -13557,11 +14614,14 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id
  */
-    __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
+    __pyx_t_2 = __pyx_v_self->id2fword;
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_v_f_id = __pyx_t_3;
+    __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_v_f_id = __pyx_t_2;
+    __pyx_t_2 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":263
  *         if fword not in self.fword2id:
@@ -13570,7 +14630,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
  *             self.fword2id[fword] = f_id
  *         return self.fword2id[fword]
  */
-    __pyx_t_2 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword, __pyx_v_fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_self->id2fword, __pyx_v_fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
@@ -13581,13 +14641,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
  *         return self.fword2id[fword]
  * 
  */
-    __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_f_id); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    if (PyObject_SetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L5;
+    if (PyObject_SetItem(__pyx_v_self->fword2id, __pyx_v_fword, __pyx_v_f_id) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":265
  *             self.id2fword.append(fword)
@@ -13597,7 +14654,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -13610,11 +14667,33 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
   __Pyx_AddTraceback("_sa.BiLex.get_f_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_f_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_10read_text(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":268
  * 
  * 
@@ -13623,9 +14702,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
  *         cdef IntList fcount
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_j = 0;
   PyObject *__pyx_v_e_id = 0;
@@ -13670,16 +14747,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":272
  *         cdef IntList fcount
@@ -13706,7 +14774,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -13716,12 +14784,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -13729,8 +14797,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_v_f = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":275
  *         with gzip_or_text(filename) as f:
@@ -13740,34 +14809,42 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 f_id = self.get_f_id(fword)
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_3 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_3)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_line);
-            __pyx_v_line = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_line = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":276
  *             # first loop merely establishes size of array objects
@@ -13776,66 +14853,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
-              PyObject* sequence = __pyx_t_1;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+              PyObject* sequence = __pyx_t_3;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 4)) {
+                if (size > 4) __Pyx_RaiseTooManyValuesError(4);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
-                  if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
-                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
                 __pyx_t_12 = PyTuple_GET_ITEM(sequence, 3); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
-                  if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
-                __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
+                __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
                 __pyx_t_12 = PyList_GET_ITEM(sequence, 3); 
               }
-              __Pyx_INCREF(__pyx_t_3);
+              __Pyx_INCREF(__pyx_t_2);
               __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else {
+              #else
+              Py_ssize_t i;
+              PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_10,&__pyx_t_11,&__pyx_t_12};
+              for (i=0; i < 4; i++) {
+                PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                *(temps[i]) = item;
+              }
+              #endif
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_10,&__pyx_t_11,&__pyx_t_12};
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              index = 0; __pyx_t_3 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_3);
-              index = 1; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_11);
-              index = 3; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_12);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              for (index=0; index < 4; index++) {
+                PyObject* item = __pyx_t_14(__pyx_t_13); if (unlikely(!item)) goto __pyx_L18_unpacking_failed;
+                __Pyx_GOTREF(item);
+                *(temps[index]) = item;
+              }
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_14 = NULL;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L20_unpacking_done;
-              __pyx_L19_unpacking_failed:;
+              goto __pyx_L19_unpacking_done;
+              __pyx_L18_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_L20_unpacking_done:;
+              __pyx_t_14 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_L19_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_fword);
-            __pyx_v_fword = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_fword = __pyx_t_2;
+            __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_eword);
             __pyx_v_eword = __pyx_t_10;
             __pyx_t_10 = 0;
@@ -13853,16 +14939,16 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
             __Pyx_INCREF(__pyx_v_fword);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_fword);
             __Pyx_GIVEREF(__pyx_v_fword);
-            __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XDECREF(__pyx_v_f_id);
             __pyx_v_f_id = __pyx_t_11;
@@ -13875,20 +14961,20 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)
  */
-            __pyx_t_11 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
             __Pyx_INCREF(__pyx_v_eword);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_eword);
             __Pyx_GIVEREF(__pyx_v_eword);
-            __pyx_t_1 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_e_id = __pyx_t_3;
+            __pyx_t_3 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":279
  *                 f_id = self.get_f_id(fword)
@@ -13898,13 +14984,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  */
             while (1) {
-              __pyx_t_15 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_15 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               if (!__pyx_t_16) break;
 
@@ -13915,7 +15000,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  * 
  */
-              __pyx_t_12 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_fcount), __pyx_int_0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_fcount), __pyx_int_0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             }
@@ -13927,11 +15012,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  * 
  *             # Allocate space for dictionary in arrays
  */
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_fcount->arr[__pyx_t_17]) = ((__pyx_v_fcount->arr[__pyx_t_15]) + 1);
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":284
  * 
@@ -13950,11 +15035,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:
  */
-          __pyx_t_8 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_v_n_f = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_t_8 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_v_n_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":286
  *             N = 0
@@ -13963,19 +15048,19 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N
  */
-          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          __pyx_t_12 = PyNumber_Add(__pyx_v_n_f, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __pyx_t_12 = PyNumber_Add(__pyx_v_n_f, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
+          __Pyx_GOTREF(__pyx_v_self->f_index);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->f_index));
+          __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
@@ -13985,9 +15070,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  */
-          __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19++) {
-            __pyx_t_12 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_XDECREF(__pyx_v_i);
             __pyx_v_i = __pyx_t_12;
@@ -14000,9 +15085,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0
  */
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8]) = __pyx_t_20;
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":289
  *             for i from 0 <= i < n_f:
@@ -14011,15 +15096,15 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_12 = PyInt_FromLong((__pyx_v_fcount->arr[__pyx_t_8])); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyInt_FromLong((__pyx_v_fcount->arr[__pyx_t_8])); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_2 = PyNumber_Add(__pyx_v_N, __pyx_t_12); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_1 = PyNumber_Add(__pyx_v_N, __pyx_t_12); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             __Pyx_DECREF(__pyx_v_N);
-            __pyx_v_N = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_N = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":290
  *                 self.f_index.arr[i] = N
@@ -14028,9 +15113,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_fcount->arr[__pyx_t_8]) = 0;
-            __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           }
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
@@ -14040,11 +15125,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_1 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_XDECREF(__pyx_v_i);
-          __pyx_v_i = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_v_i = __pyx_t_1;
+          __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":291
  *                 N = N + fcount.arr[i]
@@ -14053,9 +15138,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)
  */
-          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8]) = __pyx_t_20;
+          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":292
  *                 fcount.arr[i] = 0
@@ -14064,16 +15149,16 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             self.col1 = FloatList(initial_len=N)
  *             self.col2 = FloatList(initial_len=N)
  */
-          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
+          __Pyx_GOTREF(__pyx_v_self->e_index);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->e_index));
+          __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":293
@@ -14083,17 +15168,17 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             self.col2 = FloatList(initial_len=N)
  * 
  */
-          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-          __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_2);
-          __pyx_t_2 = 0;
+          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_v_self->col1);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->col1));
+          __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+          __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":294
  *             self.e_index = IntList(initial_len=N)
@@ -14102,16 +15187,16 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  * 
  *             # Re-read file, placing words into buckets
  */
-          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
+          __Pyx_GOTREF(__pyx_v_self->col2);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->col2));
+          __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":297
@@ -14121,12 +15206,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  */
-          __pyx_t_12 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_2 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_1 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":298
  *             # Re-read file, placing words into buckets
@@ -14136,26 +15221,34 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 f_id = self.get_f_id(fword)
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_12 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_12 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_12 = __pyx_t_9(__pyx_t_2);
+              __pyx_t_12 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_12)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -14172,62 +15265,71 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  */
-            __pyx_t_12 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_1 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
-              PyObject* sequence = __pyx_t_1;
+            if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+              PyObject* sequence = __pyx_t_3;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 4)) {
+                if (size > 4) __Pyx_RaiseTooManyValuesError(4);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
-                  if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_12 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
-                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 3); 
+                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 3); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
-                  if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_12 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
-                __pyx_t_3 = PyList_GET_ITEM(sequence, 3); 
+                __pyx_t_2 = PyList_GET_ITEM(sequence, 3); 
               }
               __Pyx_INCREF(__pyx_t_12);
               __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_3);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else {
+              __Pyx_INCREF(__pyx_t_2);
+              #else
+              Py_ssize_t i;
+              PyObject** temps[4] = {&__pyx_t_12,&__pyx_t_11,&__pyx_t_10,&__pyx_t_2};
+              for (i=0; i < 4; i++) {
+                PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                *(temps[i]) = item;
+              }
+              #endif
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              PyObject** temps[4] = {&__pyx_t_12,&__pyx_t_11,&__pyx_t_10,&__pyx_t_2};
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              index = 0; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_12);
-              index = 1; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_11);
-              index = 2; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_10);
-              index = 3; __pyx_t_3 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_3);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              for (index=0; index < 4; index++) {
+                PyObject* item = __pyx_t_14(__pyx_t_13); if (unlikely(!item)) goto __pyx_L26_unpacking_failed;
+                __Pyx_GOTREF(item);
+                *(temps[index]) = item;
+              }
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_14 = NULL;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L28_unpacking_done;
-              __pyx_L27_unpacking_failed:;
+              goto __pyx_L27_unpacking_done;
+              __pyx_L26_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_L28_unpacking_done:;
+              __pyx_t_14 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_L27_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_fword);
             __pyx_v_fword = __pyx_t_12;
@@ -14239,8 +15341,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
             __pyx_v_score1 = __pyx_t_10;
             __pyx_t_10 = 0;
             __Pyx_XDECREF(__pyx_v_score2);
-            __pyx_v_score2 = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_score2 = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":300
  *             for line in f:
@@ -14249,17 +15351,17 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_v_fword);
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fword);
+            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fword);
             __Pyx_GIVEREF(__pyx_v_fword);
-            __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_f_id);
             __pyx_v_f_id = __pyx_t_10;
             __pyx_t_10 = 0;
@@ -14271,20 +15373,20 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_v_eword);
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_eword);
+            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_eword);
             __Pyx_GIVEREF(__pyx_v_eword);
-            __pyx_t_1 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_e_id = __pyx_t_3;
+            __pyx_t_3 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":302
  *                 f_id = self.get_f_id(fword)
@@ -14293,13 +15395,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)
  */
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_1 = PyInt_FromLong(((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_15]) + (__pyx_v_fcount->arr[__pyx_t_17]))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_3 = PyInt_FromLong(((__pyx_v_self->f_index->arr[__pyx_t_15]) + (__pyx_v_fcount->arr[__pyx_t_17]))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_XDECREF(__pyx_v_index);
-            __pyx_v_index = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_index = __pyx_t_3;
+            __pyx_t_3 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":303
  *                 e_id = self.get_e_id(eword)
@@ -14308,8 +15410,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)
  */
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_fcount->arr[__pyx_t_15]) = ((__pyx_v_fcount->arr[__pyx_t_17]) + 1);
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":304
@@ -14319,18 +15421,18 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 self.col1[index] = float(score1)
  *                 self.col2[index] = float(score2)
  */
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_INCREF(__pyx_v_e_id);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_e_id);
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_e_id);
             __Pyx_GIVEREF(__pyx_v_e_id);
-            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_17]) = __pyx_t_20;
+            __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            (__pyx_v_self->e_index->arr[__pyx_t_17]) = __pyx_t_20;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":305
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
@@ -14339,11 +15441,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 self.col2[index] = float(score2)
  * 
  */
-            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score1); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_3 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            if (PyObject_SetItem(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1), __pyx_v_index, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score1); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            if (PyObject_SetItem(((PyObject *)__pyx_v_self->col1), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":306
  *                 self.e_index.arr[index] = int(e_id)
@@ -14352,26 +15454,26 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  * 
  *         # Sort buckets by eword
  */
-            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score2); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_3 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            if (PyObject_SetItem(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2), __pyx_v_index, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score2); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            if (PyObject_SetItem(((PyObject *)__pyx_v_self->col2), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
  * 
@@ -14382,57 +15484,57 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_3);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+          __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_22 = PyObject_Call(__pyx_t_4, __pyx_t_10, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_22)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_22)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_22);
           __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_22);
           __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
-          if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_23 = (!__pyx_t_16);
           if (__pyx_t_23) {
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_3);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_3, __pyx_t_1);
-            __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L31;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_3);
+            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L30;
           }
-          __pyx_L31:;
+          __pyx_L30:;
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L16_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -14446,13 +15548,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
         if (unlikely(__pyx_t_23 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L32;
-    __pyx_L5_error:;
+    goto __pyx_L31;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L32:;
+    __pyx_L31:;
   }
-  if (unlikely(!__pyx_v_n_f)) { __Pyx_RaiseUnboundLocalError("n_f"); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":309
  * 
@@ -14461,12 +15562,14 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  */
+  if (unlikely(!__pyx_v_n_f)) { __Pyx_RaiseUnboundLocalError("n_f"); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_19; __pyx_t_18++) {
-    __pyx_t_1 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_XDECREF(__pyx_v_b);
-    __pyx_v_b = __pyx_t_1;
-    __pyx_t_1 = 0;
+    __pyx_v_b = __pyx_t_3;
+    __pyx_t_3 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":310
  *         # Sort buckets by eword
@@ -14476,11 +15579,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             self.qsort(i,j, "")
  */
     __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_b); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_XDECREF(__pyx_v_i);
-    __pyx_v_i = __pyx_t_1;
-    __pyx_t_1 = 0;
+    __pyx_v_i = __pyx_t_3;
+    __pyx_t_3 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":311
  *         for b from 0 <= b < n_f:
@@ -14489,15 +15592,15 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             self.qsort(i,j, "")
  * 
  */
-    __pyx_t_1 = PyNumber_Add(__pyx_v_b, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = PyNumber_Add(__pyx_v_b, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_XDECREF(__pyx_v_j);
-    __pyx_v_j = __pyx_t_1;
-    __pyx_t_1 = 0;
+    __pyx_v_j = __pyx_t_3;
+    __pyx_t_3 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":312
  *             i = self.f_index.arr[b]
@@ -14508,12 +15611,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  */
     __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_24 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_24 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = ((PyObject *)__pyx_kp_s_45);
-    __Pyx_INCREF(__pyx_t_1);
-    __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->qsort(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_20, __pyx_t_24, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_3 = ((PyObject *)__pyx_kp_s_45);
+    __Pyx_INCREF(__pyx_t_3);
+    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->qsort(__pyx_v_self, __pyx_t_20, __pyx_t_24, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_b); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
@@ -14524,11 +15627,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  */
-  __pyx_t_3 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_v_b);
-  __pyx_v_b = __pyx_t_3;
-  __pyx_t_3 = 0;
+  __pyx_v_b = __pyx_t_2;
+  __pyx_t_2 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -14577,7 +15680,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("swap");
+  __Pyx_RefNannySetupContext("swap", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":319
  *         cdef float ftmp
@@ -14712,7 +15815,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("qsort");
+  __Pyx_RefNannySetupContext("qsort", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":338
  *         cdef int pval, p
@@ -14922,6 +16025,27 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_12write_enhanced(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":358
  * 
  * 
@@ -14930,9 +16054,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  *             for i in self.f_index:
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_s1 = NULL;
@@ -14946,9 +16068,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   PyObject *__pyx_t_10 = NULL;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
@@ -14959,16 +16081,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
  * 
@@ -14981,7 +16094,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -14993,21 +16106,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":360
  *     def write_enhanced(self, char* filename):
@@ -15016,35 +16130,43 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *                 f.write("%d " % i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->f_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->f_index))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->f_index); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->f_index)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":361
  *         with open(filename, "w") as f:
@@ -15053,22 +16175,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
-            __pyx_t_9 = 0;
-            __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
@@ -15077,12 +16199,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_49), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_49), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":363
  *                 f.write("%d " % i)
@@ -15091,100 +16213,116 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")
  */
-          __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          PyTuple_SET_ITEM(__pyx_t_9, 1, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          PyTuple_SET_ITEM(__pyx_t_9, 2, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          __pyx_t_1 = PyObject_Call(__pyx_builtin_zip, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-          if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
-            __pyx_t_9 = __pyx_t_1; __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_INCREF(((PyObject *)__pyx_v_self->e_index));
+          PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->e_index));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e_index));
+          __Pyx_INCREF(((PyObject *)__pyx_v_self->col1));
+          PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->col1));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->col1));
+          __Pyx_INCREF(((PyObject *)__pyx_v_self->col2));
+          PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->col2));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->col2));
+          __pyx_t_4 = PyObject_Call(__pyx_builtin_zip, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
+            __pyx_t_2 = __pyx_t_4; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_1 = __pyx_t_8(__pyx_t_9);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_4 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_4)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_4);
             }
-            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
-              PyObject* sequence = __pyx_t_1;
+            if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
+              PyObject* sequence = __pyx_t_4;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 3)) {
+                if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); 
-                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
+                __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-                  if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 0); 
-                __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
+                __pyx_t_1 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
               }
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_2);
+              __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_11);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else {
+              #else
+              __pyx_t_10 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_12 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
               __pyx_t_13 = Py_TYPE(__pyx_t_12)->tp_iternext;
-              index = 0; __pyx_t_10 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
+              index = 0; __pyx_t_10 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_10)) goto __pyx_L20_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_10);
-              index = 1; __pyx_t_2 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_2)) goto __pyx_L21_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_2);
-              index = 2; __pyx_t_11 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L21_unpacking_failed;
+              index = 1; __pyx_t_1 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_1)) goto __pyx_L20_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_1);
+              index = 2; __pyx_t_11 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L20_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_11);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_13 = NULL;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              goto __pyx_L22_unpacking_done;
-              __pyx_L21_unpacking_failed:;
+              goto __pyx_L21_unpacking_done;
+              __pyx_L20_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_L22_unpacking_done:;
+              __pyx_t_13 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_L21_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_i);
             __pyx_v_i = __pyx_t_10;
             __pyx_t_10 = 0;
             __Pyx_XDECREF(__pyx_v_s1);
-            __pyx_v_s1 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_s1 = __pyx_t_1;
+            __pyx_t_1 = 0;
             __Pyx_XDECREF(__pyx_v_s2);
             __pyx_v_s2 = __pyx_t_11;
             __pyx_t_11 = 0;
@@ -15196,10 +16334,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+            __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __Pyx_INCREF(__pyx_v_i);
             PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
@@ -15209,21 +16347,21 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
             __Pyx_INCREF(__pyx_v_s2);
             PyTuple_SET_ITEM(__pyx_t_11, 2, __pyx_v_s2);
             __Pyx_GIVEREF(__pyx_v_s2);
-            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_50), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_50), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
-            PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_t_2));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_t_1));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
+            __pyx_t_1 = 0;
+            __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           }
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":365
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
@@ -15232,12 +16370,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_51), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_51), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":366
  *                 f.write("%d %f %f " % (i, s1, s2))
@@ -15247,28 +16385,36 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_2 = __pyx_int_0;
-          if (PyList_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword)) {
-            __pyx_t_9 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword; __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_1 = __pyx_int_0;
+          if (PyList_CheckExact(__pyx_v_self->id2fword) || PyTuple_CheckExact(__pyx_v_self->id2fword)) {
+            __pyx_t_2 = __pyx_v_self->id2fword; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self->id2fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_11); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_11); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_11 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_11 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_11 = __pyx_t_8(__pyx_t_9);
+              __pyx_t_11 = __pyx_t_9(__pyx_t_2);
               if (unlikely(!__pyx_t_11)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -15277,13 +16423,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
             __Pyx_XDECREF(__pyx_v_w);
             __pyx_v_w = __pyx_t_11;
             __pyx_t_11 = 0;
-            __Pyx_INCREF(__pyx_t_2);
+            __Pyx_INCREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_2;
-            __pyx_t_11 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_11 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_2);
-            __pyx_t_2 = __pyx_t_11;
+            __Pyx_DECREF(__pyx_t_1);
+            __pyx_t_1 = __pyx_t_11;
             __pyx_t_11 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":367
@@ -15293,32 +16439,32 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):
  */
-            __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_INCREF(__pyx_v_i);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
             __Pyx_INCREF(__pyx_v_w);
-            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_w);
+            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_w);
             __Pyx_GIVEREF(__pyx_v_w);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
@@ -15327,12 +16473,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_53), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_53), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":369
  *                 f.write("%d %s " % (i, w))
@@ -15342,28 +16488,36 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_9 = __pyx_int_0;
-          if (PyList_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword)) {
-            __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_2 = __pyx_int_0;
+          if (PyList_CheckExact(__pyx_v_self->id2eword) || PyTuple_CheckExact(__pyx_v_self->id2eword)) {
+            __pyx_t_1 = __pyx_v_self->id2eword; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->id2eword); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_10); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_10); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_10 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_10 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_10 = __pyx_t_8(__pyx_t_2);
+              __pyx_t_10 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_10)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -15372,13 +16526,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
             __Pyx_XDECREF(__pyx_v_w);
             __pyx_v_w = __pyx_t_10;
             __pyx_t_10 = 0;
-            __Pyx_INCREF(__pyx_t_9);
+            __Pyx_INCREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_9;
-            __pyx_t_10 = PyNumber_Add(__pyx_t_9, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_v_i = __pyx_t_2;
+            __pyx_t_10 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_9);
-            __pyx_t_9 = __pyx_t_10;
+            __Pyx_DECREF(__pyx_t_2);
+            __pyx_t_2 = __pyx_t_10;
             __pyx_t_10 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":370
@@ -15388,32 +16542,32 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  * 
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_INCREF(__pyx_v_i);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
             __Pyx_INCREF(__pyx_v_w);
-            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_w);
+            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_w);
             __Pyx_GIVEREF(__pyx_v_w);
-            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_11));
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_11));
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_11));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
             __pyx_t_11 = 0;
-            __pyx_t_11 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
           }
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
@@ -15422,24 +16576,24 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  * 
  * 
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_54), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_54), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
-        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
  * 
@@ -15450,75 +16604,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_9, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_9);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
-          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
-          __pyx_t_15 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __pyx_t_15 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_16 = (!__pyx_t_14);
           if (__pyx_t_16) {
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_9, __pyx_t_11);
-            __pyx_t_2 = 0; __pyx_t_9 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L29;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_11);
+            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_11 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L28;
           }
-          __pyx_L29:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __pyx_L28:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_55, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_55, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L30;
-    __pyx_L5_error:;
+    goto __pyx_L29;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L30:;
+    __pyx_L29:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -15526,7 +16680,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
@@ -15543,41 +16697,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":374
- * 
- * 
- *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
- *         cdef e_id, f_id, low, high, midpoint, val
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fword = 0;
   PyObject *__pyx_v_eword = 0;
   PyObject *__pyx_v_col = 0;
-  PyObject *__pyx_v_e_id = 0;
-  PyObject *__pyx_v_f_id = 0;
-  PyObject *__pyx_v_low = 0;
-  PyObject *__pyx_v_high = 0;
-  PyObject *__pyx_v_midpoint = 0;
-  PyObject *__pyx_v_val = 0;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
-  __Pyx_RefNannySetupContext("get_score");
+  __Pyx_RefNannySetupContext("get_score (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -15585,26 +16720,23 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fword);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fword)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eword);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eword)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_score", 1, 3, 3, 1); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__col);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__col)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_score", 1, 3, 3, 2); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_score") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_score") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -15625,6 +16757,36 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_14get_score(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_v_fword, __pyx_v_eword, __pyx_v_col);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":374
+ * 
+ * 
+ *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
+ *         cdef e_id, f_id, low, high, midpoint, val
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword, PyObject *__pyx_v_eword, PyObject *__pyx_v_col) {
+  PyObject *__pyx_v_e_id = 0;
+  PyObject *__pyx_v_f_id = 0;
+  PyObject *__pyx_v_low = 0;
+  PyObject *__pyx_v_high = 0;
+  PyObject *__pyx_v_midpoint = 0;
+  PyObject *__pyx_v_val = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_score", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":377
  *         cdef e_id, f_id, low, high, midpoint, val
@@ -15633,7 +16795,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *             return None
  *         if fword not in self.fword2id:
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":378
@@ -15647,9 +16809,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
     __Pyx_INCREF(Py_None);
     __pyx_r = Py_None;
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":379
  *         if eword not in self.eword2id:
@@ -15658,7 +16820,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *             return None
  *         f_id = self.fword2id[fword]
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":380
@@ -15672,9 +16834,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
     __Pyx_INCREF(Py_None);
     __pyx_r = Py_None;
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":381
  *         if fword not in self.fword2id:
@@ -15683,7 +16845,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]
  */
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_f_id = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -15695,7 +16857,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]
  */
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_e_id = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -15708,7 +16870,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *         while high - low > 0:
  */
   __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_low = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -15724,7 +16886,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_t_2); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_high = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -15739,8 +16901,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   while (1) {
     __pyx_t_2 = PyNumber_Subtract(__pyx_v_high, __pyx_v_low); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
@@ -15770,7 +16931,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *                 if col == 0:
  */
     __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->e_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_XDECREF(__pyx_v_val);
     __pyx_v_val = __pyx_t_2;
@@ -15783,8 +16944,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
@@ -15796,8 +16956,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
@@ -15811,14 +16970,14 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  */
         __Pyx_XDECREF(__pyx_r);
         __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyFloat_FromDouble((__pyx_v_self->col1->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_r = __pyx_t_2;
         __pyx_t_2 = 0;
         goto __pyx_L0;
-        goto __pyx_L11;
+        goto __pyx_L8;
       }
-      __pyx_L11:;
+      __pyx_L8:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":391
  *                 if col == 0:
@@ -15827,8 +16986,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
@@ -15842,17 +17000,17 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  */
         __Pyx_XDECREF(__pyx_r);
         __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyFloat_FromDouble((__pyx_v_self->col2->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_r = __pyx_t_2;
         __pyx_t_2 = 0;
         goto __pyx_L0;
-        goto __pyx_L12;
+        goto __pyx_L9;
       }
-      __pyx_L12:;
-      goto __pyx_L10;
+      __pyx_L9:;
+      goto __pyx_L7;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":393
  *                 if col == 1:
@@ -15861,8 +17019,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *                 high = midpoint
  *             if val < e_id:
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
@@ -15877,9 +17034,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
       __Pyx_INCREF(__pyx_v_midpoint);
       __Pyx_DECREF(__pyx_v_high);
       __pyx_v_high = __pyx_v_midpoint;
-      goto __pyx_L13;
+      goto __pyx_L10;
     }
-    __pyx_L13:;
+    __pyx_L10:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":395
  *             if val > e_id:
@@ -15888,8 +17045,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *                 low = midpoint + 1
  *         return None
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
@@ -15906,9 +17062,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
       __Pyx_DECREF(__pyx_v_low);
       __pyx_v_low = __pyx_t_2;
       __pyx_t_2 = 0;
-      goto __pyx_L14;
+      goto __pyx_L11;
     }
-    __pyx_L14:;
+    __pyx_L11:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":397
@@ -15942,6 +17098,28 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static char __pyx_doc_3_sa_5BiLex_16write_text[] = "Note: does not guarantee writing the dictionary in the original order";
+static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_16write_text(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":400
  * 
  * 
@@ -15950,10 +17128,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *         cdef i, N, e_id, f_id
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static char __pyx_doc_3_sa_5BiLex_8write_text[] = "Note: does not guarantee writing the dictionary in the original order";
-static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_N = 0;
   PyObject *__pyx_v_e_id = 0;
@@ -15969,27 +17144,18 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  long __pyx_t_8;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
   long __pyx_t_9;
-  int __pyx_t_10;
-  PyObject *__pyx_t_11 = NULL;
+  long __pyx_t_10;
+  int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
   PyObject *__pyx_t_13 = NULL;
   int __pyx_t_14;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
@@ -16002,7 +17168,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -16014,21 +17180,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":405
  * 
@@ -16037,14 +17204,14 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  *             f_id = 0
  *             for i from 0 <= i < N:
  */
-          __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_t_7 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_v_N = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_t_4 = ((PyObject *)__pyx_v_self->e_index);
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_t_8 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_v_N = __pyx_t_4;
+          __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":406
  *         with open(filename, "w") as f:
@@ -16063,13 +17230,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  */
-          __pyx_t_8 = __Pyx_PyInt_AsLong(__pyx_v_N); if (unlikely((__pyx_t_8 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9++) {
-            __pyx_t_1 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_9 = __Pyx_PyInt_AsLong(__pyx_v_N); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10++) {
+            __pyx_t_4 = PyInt_FromLong(__pyx_t_10); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_i = __pyx_t_4;
+            __pyx_t_4 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":408
  *             f_id = 0
@@ -16079,18 +17246,17 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  *                 e_id = self.e_index.arr[i]
  */
             while (1) {
-              __pyx_t_1 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_7])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_v_i, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_4 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __pyx_t_4 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_v_i, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-              if (!__pyx_t_10) break;
+              if (!__pyx_t_11) break;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":409
  *             for i from 0 <= i < N:
@@ -16099,11 +17265,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]
  */
-              __pyx_t_2 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_1 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_v_f_id);
-              __pyx_v_f_id = __pyx_t_2;
-              __pyx_t_2 = 0;
+              __pyx_v_f_id = __pyx_t_1;
+              __pyx_t_1 = 0;
             }
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":410
@@ -16113,12 +17279,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  */
-            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyInt_FromLong((__pyx_v_self->e_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_e_id = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":411
  *                     f_id = f_id + 1
@@ -16127,12 +17293,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))
  */
-            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->col1->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_score1);
-            __pyx_v_score1 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_score1 = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":412
  *                 e_id = self.e_index.arr[i]
@@ -16140,52 +17306,52 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  *                 score2 = self.col2.arr[i]             # <<<<<<<<<<<<<<
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))
  */
-            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->col2->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_score2);
-            __pyx_v_score2 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_score2 = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":413
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))             # <<<<<<<<<<<<<<
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword, __pyx_v_f_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_11 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword, __pyx_v_e_id); if (!__pyx_t_11) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_12 = PyTuple_New(4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_1);
-            __Pyx_GIVEREF(__pyx_t_1);
-            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_11);
-            __Pyx_GIVEREF(__pyx_t_11);
+            __pyx_t_4 = PyObject_GetItem(__pyx_v_self->id2fword, __pyx_v_f_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_2 = PyObject_GetItem(__pyx_v_self->id2eword, __pyx_v_e_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_12 = PyTuple_New(4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
+            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_4);
+            __Pyx_GIVEREF(__pyx_t_4);
+            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_v_score1);
             PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_v_score1);
             __Pyx_GIVEREF(__pyx_v_score1);
             __Pyx_INCREF(__pyx_v_score2);
             PyTuple_SET_ITEM(__pyx_t_12, 3, __pyx_v_score2);
             __Pyx_GIVEREF(__pyx_v_score2);
-            __pyx_t_1 = 0;
-            __pyx_t_11 = 0;
-            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_56), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+            __pyx_t_4 = 0;
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_56), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-            PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
-            __pyx_t_11 = 0;
-            __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
+            PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            __pyx_t_9 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_10 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           }
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":407
@@ -16195,21 +17361,21 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  */
-          __pyx_t_11 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_2 = PyInt_FromLong(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_XDECREF(__pyx_v_i);
-          __pyx_v_i = __pyx_t_11;
-          __pyx_t_11 = 0;
+          __pyx_v_i = __pyx_t_2;
+          __pyx_t_2 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
@@ -16220,75 +17386,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_11, &__pyx_t_12, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_11);
-          __Pyx_GOTREF(__pyx_t_12);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_12, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-          __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
-          __Pyx_GIVEREF(__pyx_t_11);
-          __Pyx_INCREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
-          __Pyx_GIVEREF(__pyx_t_12);
+          __Pyx_GOTREF(__pyx_t_12);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __Pyx_INCREF(__pyx_t_12);
+          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_12);
+          __Pyx_GIVEREF(__pyx_t_12);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __pyx_t_14 = (!__pyx_t_10);
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_14 = (!__pyx_t_11);
           if (__pyx_t_14) {
-            __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_GIVEREF(__pyx_t_12);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_11, __pyx_t_12, __pyx_t_2);
-            __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_GIVEREF(__pyx_t_12);
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_12, __pyx_t_1);
+            __pyx_t_2 = 0; __pyx_t_12 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_57, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_57, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -16296,7 +17462,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -16327,7 +17493,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   unsigned int __pyx_t_2;
-  __Pyx_RefNannySetupContext("_init_lower_mask");
+  __Pyx_RefNannySetupContext("_init_lower_mask", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":23
  * cdef void _init_lower_mask():
@@ -16383,7 +17549,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   struct __pyx_t_3_sa__BitSet *__pyx_v_b;
   struct __pyx_t_3_sa__BitSet *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_BitSet");
+  __Pyx_RefNannySetupContext("new_BitSet", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":40
  *     cdef _BitSet* b
@@ -16465,7 +17631,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("bitset_findsucc");
+  __Pyx_RefNannySetupContext("bitset_findsucc", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":52
  *     cdef int low, high, mid
@@ -16647,7 +17813,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("bitset_insert");
+  __Pyx_RefNannySetupContext("bitset_insert", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":74
  *     cdef int val
@@ -16805,7 +17971,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("bitset_contains");
+  __Pyx_RefNannySetupContext("bitset_contains", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":93
  *     cdef int val
@@ -16857,6 +18023,17 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_14BitSetIterator___next__(((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":104
  *     cdef int next_val
  * 
@@ -16865,8 +18042,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_self) {
   int __pyx_v_ret_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -16875,7 +18051,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__next__");
+  __Pyx_RefNannySetupContext("__next__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":107
  *         cdef int ret_val
@@ -16884,7 +18060,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
  *             raise StopIteration()
  *         ret_val = self.next_val
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val == -1);
+  __pyx_t_1 = (__pyx_v_self->next_val == -1);
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":108
@@ -16899,9 +18075,9 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[6]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":109
  *         if self.next_val == -1:
@@ -16910,7 +18086,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
  *         self.next_val = bitset_findsucc(self.b, ret_val)
  *         return ret_val
  */
-  __pyx_v_ret_val = ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val;
+  __pyx_v_ret_val = __pyx_v_self->next_val;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":110
  *             raise StopIteration()
@@ -16919,7 +18095,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
  *         return ret_val
  * 
  */
-  ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val = __pyx_f_3_sa_bitset_findsucc(((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->b, __pyx_v_ret_val);
+  __pyx_v_self->next_val = __pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_v_ret_val);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":111
  *         ret_val = self.next_val
@@ -16947,6 +18123,20 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
+/* Python wrapper */
+static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_6BitSet___cinit__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":122
  *     cdef _BitSet* b
  * 
@@ -16955,14 +18145,10 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
  * 
  */
 
-static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":123
  * 
@@ -16971,13 +18157,22 @@ static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__p
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b = __pyx_f_3_sa_new_BitSet();
+  __pyx_v_self->b = __pyx_f_3_sa_new_BitSet();
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* Python wrapper */
+static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_6BitSet_2__dealloc__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":125
  *         self.b = new_BitSet()
  * 
@@ -16986,10 +18181,9 @@ static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__p
  * 
  */
 
-static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":126
  * 
@@ -16998,11 +18192,22 @@ static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self) {
  * 
  *     def __iter__(self):
  */
-  free(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b);
+  free(__pyx_v_self->b);
 
   __Pyx_RefNannyFinishContext();
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_4__iter__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":128
  *         free(self.b)
  * 
@@ -17011,8 +18216,7 @@ static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self) {
  *         it = BitSetIterator()
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_it = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -17020,7 +18224,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__");
+  __Pyx_RefNannySetupContext("__iter__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":130
  *     def __iter__(self):
@@ -17041,7 +18245,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
  *         it.next_val = self.b.min_val
  *         return it
  */
-  __pyx_v_it->b = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b;
+  __pyx_v_it->b = __pyx_v_self->b;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":132
  *         it = BitSetIterator()
@@ -17050,7 +18254,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
  *         return it
  * 
  */
-  __pyx_v_it->next_val = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val;
+  __pyx_v_it->next_val = __pyx_v_self->b->min_val;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":133
  *         it.b = self.b
@@ -17077,6 +18281,17 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_6insert(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":135
  *         return it
  * 
@@ -17085,8 +18300,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17094,7 +18308,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert");
+  __Pyx_RefNannySetupContext("insert", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":136
  * 
@@ -17105,7 +18319,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_insert(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_insert(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -17123,6 +18337,17 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("findsucc (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_8findsucc(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":138
  *         return bitset_insert(self.b, i)
  * 
@@ -17131,8 +18356,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17140,7 +18364,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("findsucc");
+  __Pyx_RefNannySetupContext("findsucc", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":139
  * 
@@ -17151,7 +18375,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_findsucc(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -17169,6 +18393,17 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_10__str__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":141
  *         return bitset_findsucc(self.b, i)
  * 
@@ -17177,8 +18412,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -17187,7 +18421,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":142
  * 
@@ -17197,15 +18431,15 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
  *     def min(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = ((PyObject *)__pyx_f_3_sa_dec2bin(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->bitset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PyObject *)__pyx_f_3_sa_dec2bin(__pyx_v_self->b->bitset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyNumber_Add(__pyx_t_1, ((PyObject *)__pyx_kp_s_58)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -17219,10 +18453,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   __pyx_t_1 = PyNumber_Add(__pyx_t_3, ((PyObject *)__pyx_kp_s_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromLong(__pyx_v_self->b->min_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -17236,10 +18470,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   __pyx_t_3 = PyNumber_Add(__pyx_t_2, ((PyObject *)__pyx_kp_s_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->max_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_v_self->b->max_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -17271,6 +18505,17 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("min (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_12min(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":144
  *         return dec2bin(self.b.bitset)+"  ("+str(self.b.size)+","+str(self.b.min_val)+","+str(self.b.max_val)+")"
  * 
@@ -17279,15 +18524,14 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("min");
+  __Pyx_RefNannySetupContext("min", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":145
  * 
@@ -17297,7 +18541,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSE
  *     def max(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->min_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -17315,6 +18559,17 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("max (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_14max(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":147
  *         return self.b.min_val
  * 
@@ -17323,15 +18578,14 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSE
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("max");
+  __Pyx_RefNannySetupContext("max", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":148
  * 
@@ -17341,7 +18595,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSE
  *     def __len__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->max_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->max_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -17359,6 +18613,17 @@ static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_16__len__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":150
  *         return self.b.max_val
  * 
@@ -17367,11 +18632,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSE
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":151
  * 
@@ -17380,7 +18644,7 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
  * 
  *     def __contains__(self, i):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->size;
+  __pyx_r = __pyx_v_self->b->size;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -17389,6 +18653,17 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_18__contains__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":153
  *         return self.b.size
  * 
@@ -17397,8 +18672,7 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17407,7 +18681,7 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__contains__");
+  __Pyx_RefNannySetupContext("__contains__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":154
  * 
@@ -17417,7 +18691,7 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
  * 
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_contains(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_contains(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -17445,7 +18719,7 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
 
 static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   PyObject *__pyx_v_result = 0;
-  unsigned int __pyx_v_d;
+  CYTHON_UNUSED unsigned int __pyx_v_d;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17455,7 +18729,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("dec2bin");
+  __Pyx_RefNannySetupContext("dec2bin", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":158
  * 
@@ -17573,7 +18847,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("new_VEB");
+  __Pyx_RefNannySetupContext("new_VEB", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":181
  *     cdef int num_bits, num_top_bits, i
@@ -17756,7 +19030,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("VEB_insert");
+  __Pyx_RefNannySetupContext("VEB_insert", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":208
  *     cdef int a, b, tmp
@@ -18117,7 +19391,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("del_VEB");
+  __Pyx_RefNannySetupContext("del_VEB", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":249
  *     cdef int i
@@ -18318,7 +19592,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("VEB_findsucc");
+  __Pyx_RefNannySetupContext("VEB_findsucc", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":278
  *     cdef int a, b, j, c, found
@@ -18657,7 +19931,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("VEB_contains");
+  __Pyx_RefNannySetupContext("VEB_contains", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":318
  *     cdef int a, b
@@ -18844,6 +20118,17 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11VEBIterator___next__(((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":344
  *     cdef int next_val
  * 
@@ -18852,8 +20137,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBIterator *__pyx_v_self) {
   int __pyx_v_ret_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -18862,7 +20146,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__next__");
+  __Pyx_RefNannySetupContext("__next__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":347
  *         cdef int ret_val
@@ -18871,7 +20155,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
  *             raise StopIteration()
  *         ret_val = self.next_val
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val == -1);
+  __pyx_t_1 = (__pyx_v_self->next_val == -1);
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":348
@@ -18886,9 +20170,9 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[6]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":349
  *         if self.next_val == -1:
@@ -18897,7 +20181,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
  *         self.next_val = VEB_findsucc(self.v, ret_val)
  *         return ret_val
  */
-  __pyx_v_ret_val = ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val;
+  __pyx_v_ret_val = __pyx_v_self->next_val;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":350
  *             raise StopIteration()
@@ -18906,7 +20190,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
  *         return ret_val
  * 
  */
-  ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val = __pyx_f_3_sa_VEB_findsucc(((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->v, __pyx_v_ret_val);
+  __pyx_v_self->next_val = __pyx_f_3_sa_VEB_findsucc(__pyx_v_self->v, __pyx_v_ret_val);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":351
  *         ret_val = self.next_val
@@ -18934,42 +20218,32 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":360
- *     cdef int _first(self)
- * 
- *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
- *         self.veb = new_VEB(size)
- * 
- */
-
-static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -18986,6 +20260,23 @@ static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_3VEB___cinit__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), __pyx_v_size);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":360
+ *     cdef int _first(self)
+ * 
+ *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
+ *         self.veb = new_VEB(size)
+ * 
+ */
+
+static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_size) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":361
  * 
@@ -18994,13 +20285,22 @@ static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb = __pyx_f_3_sa_new_VEB(__pyx_v_size);
+  __pyx_v_self->veb = __pyx_f_3_sa_new_VEB(__pyx_v_size);
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* Python wrapper */
+static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_3VEB_2__dealloc__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":363
  *         self.veb = new_VEB(size)
  * 
@@ -19009,14 +20309,13 @@ static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  * 
  */
 
-static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":364
  * 
@@ -19025,7 +20324,7 @@ static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
  * 
  *     def __iter__(self):
  */
-  __pyx_t_1 = __pyx_f_3_sa_del_VEB(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_3_sa_del_VEB(__pyx_v_self->veb); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -19037,6 +20336,17 @@ static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_4__iter__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":366
  *         del_VEB(self.veb)
  * 
@@ -19045,8 +20355,7 @@ static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
  *         it = VEBIterator()
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   struct __pyx_obj_3_sa_VEBIterator *__pyx_v_it = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -19054,7 +20363,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__");
+  __Pyx_RefNannySetupContext("__iter__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":368
  *     def __iter__(self):
@@ -19075,7 +20384,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
  *         it.next_val = self.veb.min_val
  *         return it
  */
-  __pyx_v_it->v = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb;
+  __pyx_v_it->v = __pyx_v_self->veb;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":370
  *         it = VEBIterator()
@@ -19084,7 +20393,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
  *         return it
  * 
  */
-  __pyx_v_it->next_val = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb->min_val;
+  __pyx_v_it->next_val = __pyx_v_self->veb->min_val;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":371
  *         it.v = self.veb
@@ -19111,6 +20420,17 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_6insert(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":373
  *         return it
  * 
@@ -19119,8 +20439,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -19128,7 +20447,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert");
+  __Pyx_RefNannySetupContext("insert", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":374
  * 
@@ -19139,7 +20458,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_insert(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_insert(__pyx_v_self->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -19168,7 +20487,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
 static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_insert");
+  __Pyx_RefNannySetupContext("_insert", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":377
  * 
@@ -19186,6 +20505,17 @@ static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, in
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("findsucc (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_8findsucc(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":379
  *         return VEB_insert(self.veb, i)
  * 
@@ -19194,8 +20524,7 @@ static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, in
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -19203,7 +20532,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("findsucc");
+  __Pyx_RefNannySetupContext("findsucc", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":380
  * 
@@ -19214,7 +20543,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_findsucc(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_findsucc(__pyx_v_self->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -19243,7 +20572,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
 static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_first");
+  __Pyx_RefNannySetupContext("_first", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":383
  * 
@@ -19272,7 +20601,7 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
 static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_findsucc");
+  __Pyx_RefNannySetupContext("_findsucc", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":386
  * 
@@ -19290,6 +20619,17 @@ static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
   return __pyx_r;
 }
 
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_10__len__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":388
  *         return VEB_findsucc(self.veb, i)
  * 
@@ -19298,11 +20638,10 @@ static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":389
  * 
@@ -19311,7 +20650,7 @@ static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self) {
  * 
  *     def __contains__(self, i):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb->size;
+  __pyx_r = __pyx_v_self->veb->size;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -19320,6 +20659,17 @@ static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_12__contains__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":391
  *         return self.veb.size
  * 
@@ -19327,15 +20677,14 @@ static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self) {
  *         return VEB_contains(self.veb, i)
  */
 
-static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__contains__");
+  __Pyx_RefNannySetupContext("__contains__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":392
  * 
@@ -19343,7 +20692,7 @@ static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__
  *         return VEB_contains(self.veb, i)             # <<<<<<<<<<<<<<
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_f_3_sa_VEB_contains(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1);
+  __pyx_r = __pyx_f_3_sa_VEB_contains(__pyx_v_self->veb, __pyx_t_1);
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -19356,55 +20705,32 @@ static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":9
- *     cdef IntList lcp
- * 
- *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
- *         cdef int i, k, j, h, n
- *         cdef IntList rank
- */
-
-static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa = 0;
-  int __pyx_v_i;
-  int __pyx_v_k;
-  int __pyx_v_j;
-  int __pyx_v_h;
-  int __pyx_v_n;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_rank = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  int __pyx_t_4;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -19422,6 +20748,43 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sa), __pyx_ptype_3_sa_SuffixArray, 1, "sa", 0))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_3LCP___cinit__(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self), __pyx_v_sa);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":9
+ *     cdef IntList lcp
+ * 
+ *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
+ *         cdef int i, k, j, h, n
+ *         cdef IntList rank
+ */
+
+static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa) {
+  int __pyx_v_i;
+  int __pyx_v_k;
+  int __pyx_v_j;
+  int __pyx_v_h;
+  int __pyx_v_n;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_rank = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
@@ -19449,9 +20812,9 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_sa));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_sa));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa = __pyx_v_sa;
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = __pyx_v_sa;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":15
  *         logger.info("Constructing LCP array")
@@ -19460,7 +20823,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  *         self.lcp = IntList(initial_len=n)
  * 
  */
-  __pyx_v_n = ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa->sa->len;
+  __pyx_v_n = __pyx_v_self->sa->sa->len;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":16
  *         self.sa = sa
@@ -19475,13 +20838,13 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp));
-  ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->lcp);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->lcp));
+  __pyx_v_self->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":18
@@ -19497,7 +20860,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
@@ -19568,8 +20931,8 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  *             else:
  *                 j = sa.sa.arr[k-1]
  */
-      (((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp->arr[__pyx_v_k]) = -1;
-      goto __pyx_L10;
+      (__pyx_v_self->lcp->arr[__pyx_v_k]) = -1;
+      goto __pyx_L7;
     }
     /*else*/ {
 
@@ -19622,9 +20985,9 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  *             if h > 0:
  *                 h = h-1
  */
-      (((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp->arr[__pyx_v_k]) = __pyx_v_h;
+      (__pyx_v_self->lcp->arr[__pyx_v_k]) = __pyx_v_h;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":32
  *                     h = h+1
@@ -19644,9 +21007,9 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  * 
  */
       __pyx_v_h = (__pyx_v_h - 1);
-      goto __pyx_L13;
+      goto __pyx_L10;
     }
-    __pyx_L13:;
+    __pyx_L10:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":34
@@ -19678,7 +21041,29 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n); /*proto*/
+static char __pyx_doc_3_sa_3LCP_2compute_stats[] = "Note: the output of this function is not exact.  In\n        particular, the frequency associated with each word is \n        not guaranteed to be correct.  This is due to a bit of\n        laxness in the design; the function is intended only to\n        obtain a list of the most frequent words; for this \n        purpose it is perfectly fine";
+static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n) {
+  int __pyx_v_max_n;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("compute_stats (wrapper)", 0);
+  assert(__pyx_arg_max_n); {
+    __pyx_v_max_n = __Pyx_PyInt_AsInt(__pyx_arg_max_n); if (unlikely((__pyx_v_max_n == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_3LCP_2compute_stats(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self), ((int)__pyx_v_max_n));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
@@ -19688,51 +21073,46 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *         particular, the frequency associated with each word is
  */
 
-static PyObject *__pyx_pf_3_sa_3LCP_1compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n); /*proto*/
-static char __pyx_doc_3_sa_3LCP_1compute_stats[] = "Note: the output of this function is not exact.  In\n        particular, the frequency associated with each word is \n        not guaranteed to be correct.  This is due to a bit of\n        laxness in the design; the function is intended only to\n        obtain a list of the most frequent words; for this \n        purpose it is perfectly fine";
-static PyObject *__pyx_pf_3_sa_3LCP_1compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n) {
+static PyObject *__pyx_pf_3_sa_3LCP_2compute_stats(struct __pyx_obj_3_sa_LCP *__pyx_v_self, int __pyx_v_max_n) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("compute_stats");
+  __Pyx_RefNannySetupContext("compute_stats", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  assert(__pyx_arg_max_n); {
-    __pyx_cur_scope->__pyx_v_max_n = __Pyx_PyInt_AsInt(__pyx_arg_max_n); if (unlikely((__pyx_cur_scope->__pyx_v_max_n == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_XDECREF((PyObject *)__pyx_cur_scope->__pyx_v_self); __pyx_cur_scope->__pyx_v_self = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_3LCP_2generator1;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  __pyx_cur_scope->__pyx_v_max_n = __pyx_v_max_n;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_3LCP_4generator1, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   int __pyx_t_2;
@@ -19745,8 +21125,8 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   long __pyx_t_9;
   PyObject *__pyx_t_10 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L26_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -19763,7 +21143,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  * 
  *         ngram_starts = []
  */
-  __pyx_cur_scope->__pyx_v_N = ((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->sa->len;
+  __pyx_cur_scope->__pyx_v_N = __pyx_cur_scope->__pyx_v_self->sa->sa->len;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":50
  *         N = self.sa.sa.len
@@ -19773,7 +21153,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *             ngram_starts.append(IntList(initial_len=N))
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_cur_scope->__pyx_v_ngram_starts = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -19795,16 +21175,13 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  * 
  *         run_start = IntList(initial_len=max_n)
  */
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_ngram_starts) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __pyx_t_4 = PyList_Append(__pyx_cur_scope->__pyx_v_ngram_starts, __pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -19824,7 +21201,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
@@ -19841,7 +21218,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_t_1 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -19869,7 +21246,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *             if h < 0:
  *                 h = 0
  */
-    __pyx_cur_scope->__pyx_v_h = (((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
+    __pyx_cur_scope->__pyx_v_h = (__pyx_cur_scope->__pyx_v_self->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":59
  *         for i from 0 <= i < N:
@@ -20103,7 +21480,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *                     valid = 1
  *                     for k from 0 <= k < n+1:
  */
-        __pyx_cur_scope->__pyx_v_j = (((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
+        __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_self->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":80
  *                 while (ii==-1 or iii < ii) and rs != 0:
@@ -20131,7 +21508,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *                             valid = 0
  *                     if valid:
  */
-          __pyx_t_7 = ((((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
+          __pyx_t_7 = ((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
           if (__pyx_t_7) {
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":83
@@ -20164,13 +21541,13 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *                     iii = iii + 1
  */
           __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __Pyx_GOTREF(__pyx_t_1);
           __pyx_t_9 = (__pyx_cur_scope->__pyx_v_n + 1);
           for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_9; __pyx_t_6+=1) {
             __pyx_cur_scope->__pyx_v_k = __pyx_t_6;
-            __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           }
           __pyx_t_3 = ((PyObject *)PyList_AsTuple(__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -20194,7 +21571,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_t_1 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_n + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+          __Pyx_GOTREF(__pyx_t_10);
           PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
@@ -20210,7 +21587,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __Pyx_XGIVEREF(__pyx_r);
           __Pyx_RefNannyFinishContext();
           /* return from generator, yielding value */
-          __pyx_cur_scope->__pyx_base.resume_label = 1;
+          __pyx_generator->resume_label = 1;
           return __pyx_r;
           __pyx_L26_resume_from_yield:;
           __pyx_t_2 = __pyx_cur_scope->__pyx_t_0;
@@ -20245,7 +21622,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
     __pyx_cur_scope->__pyx_v_i = __pyx_cur_scope->__pyx_v_ii;
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -20254,11 +21631,26 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __Pyx_AddTraceback("compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
+/* Python wrapper */
+static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_8Alphabet___cinit__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":12
  *     cdef dict id2sym
  * 
@@ -20267,18 +21659,14 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *         self.nonterminals = StringMap()
  */
 
-static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":13
  * 
@@ -20290,9 +21678,9 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals));
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->terminals);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->terminals));
+  __pyx_v_self->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":14
@@ -20305,9 +21693,9 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals));
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->nonterminals);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->nonterminals));
+  __pyx_v_self->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":15
@@ -20320,9 +21708,9 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym));
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->id2sym);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->id2sym));
+  __pyx_v_self->id2sym = __pyx_t_1;
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":16
@@ -20332,7 +21720,7 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->first_nonterminal = -1;
+  __pyx_v_self->first_nonterminal = -1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -20345,6 +21733,15 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
+/* Python wrapper */
+static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_8Alphabet_2__dealloc__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":18
  *         self.first_nonterminal = -1
  * 
@@ -20353,10 +21750,9 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
  * 
  */
 
-static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
   __Pyx_RefNannyFinishContext();
 }
@@ -20369,10 +21765,10 @@ static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_isvar(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("isvar");
+  __Pyx_RefNannySetupContext("isvar", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":22
  * 
@@ -20398,10 +21794,10 @@ static int __pyx_f_3_sa_8Alphabet_isvar(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_isword(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("isword");
+  __Pyx_RefNannySetupContext("isword", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":25
  * 
@@ -20427,10 +21823,10 @@ static int __pyx_f_3_sa_8Alphabet_isword(struct __pyx_obj_3_sa_Alphabet *__pyx_v
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_getindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getindex");
+  __Pyx_RefNannySetupContext("getindex", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":28
  * 
@@ -20456,10 +21852,10 @@ static int __pyx_f_3_sa_8Alphabet_getindex(struct __pyx_obj_3_sa_Alphabet *__pyx
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_setindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym, int __pyx_v_ind) {
+static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym, int __pyx_v_ind) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("setindex");
+  __Pyx_RefNannySetupContext("setindex", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":31
  * 
@@ -20485,10 +21881,10 @@ static int __pyx_f_3_sa_8Alphabet_setindex(struct __pyx_obj_3_sa_Alphabet *__pyx
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_clearindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("clearindex");
+  __Pyx_RefNannySetupContext("clearindex", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":34
  * 
@@ -20517,7 +21913,7 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(struct __pyx_obj_3_sa_Alphabet *__p
 static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym1, int __pyx_v_sym2) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("match");
+  __Pyx_RefNannySetupContext("match", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":37
  * 
@@ -20546,7 +21942,7 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
 static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("tocat");
+  __Pyx_RefNannySetupContext("tocat", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":40
  * 
@@ -20577,7 +21973,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("fromcat");
+  __Pyx_RefNannySetupContext("fromcat", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":44
  *     cdef int fromcat(self, char *s):
@@ -20669,7 +22065,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("tostring");
+  __Pyx_RefNannySetupContext("tostring", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":53
  *     cdef char* tostring(self, int sym):
@@ -20691,9 +22087,10 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_2 = PyInt_FromLong(__pyx_v_sym); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    __pyx_t_3 = ((PyDict_Contains(((PyObject *)__pyx_v_self->id2sym), __pyx_t_2))); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = (__Pyx_PyDict_Contains(__pyx_t_2, ((PyObject *)__pyx_v_self->id2sym), Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_3) {
 
@@ -20704,6 +22101,10 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
  *             ind = self.getindex(sym)
  *             if ind > 0:
  */
+      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
       __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_4 = PyBytes_AsString(__pyx_t_2); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -20745,7 +22146,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_5 = PyInt_FromLong(__pyx_v_ind); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+      __Pyx_GOTREF(__pyx_t_6);
       PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -20755,6 +22156,10 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_64), ((PyObject *)__pyx_t_6)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
+      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
       if (__Pyx_SetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, ((PyObject *)__pyx_t_5), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       goto __pyx_L5;
@@ -20773,6 +22178,10 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_65), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
+      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
       if (__Pyx_SetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, ((PyObject *)__pyx_t_6), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     }
@@ -20785,6 +22194,10 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
  *         else:
  *             return self.terminals.word(sym)
  */
+    if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
     __pyx_t_6 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, sizeof(int), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_4 = PyBytes_AsString(__pyx_t_6); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -20846,7 +22259,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("fromstring");
+  __Pyx_RefNannySetupContext("fromstring", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":69
  *         cdef char *comma
@@ -21031,6 +22444,17 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8Alphabet_9terminals___get__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":8
  * 
  * cdef class Alphabet:
@@ -21039,14 +22463,13 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  *     cdef dict id2sym
  */
 
-static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->terminals));
+  __pyx_r = ((PyObject *)__pyx_v_self->terminals);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -21056,14 +22479,24 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8Alphabet_12nonterminals___get__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->nonterminals));
+  __pyx_r = ((PyObject *)__pyx_v_self->nonterminals);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -21084,7 +22517,7 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_
 static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_tostring");
+  __Pyx_RefNannySetupContext("sym_tostring", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":90
  * 
@@ -21113,7 +22546,7 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
 static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_tocat");
+  __Pyx_RefNannySetupContext("sym_tocat", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":93
  * 
@@ -21142,7 +22575,7 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_isvar");
+  __Pyx_RefNannySetupContext("sym_isvar", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":96
  * 
@@ -21171,7 +22604,7 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_getindex");
+  __Pyx_RefNannySetupContext("sym_getindex", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":99
  * 
@@ -21200,7 +22633,7 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_setindex");
+  __Pyx_RefNannySetupContext("sym_setindex", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":102
  * 
@@ -21218,52 +22651,40 @@ static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
- *     return ALPHABET.setindex(sym, id)
- * 
- * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
- *     return ALPHABET.fromstring(string, terminal)
- */
-
-static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_1sym_fromstring = {__Pyx_NAMESTR("sym_fromstring"), (PyCFunction)__pyx_pf_3_sa_1sym_fromstring, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_3sym_fromstring = {__Pyx_NAMESTR("sym_fromstring"), (PyCFunction)__pyx_pw_3_sa_3sym_fromstring, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_3sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_string;
   int __pyx_v_terminal;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__string,&__pyx_n_s__terminal,0};
-  __Pyx_RefNannySetupContext("sym_fromstring");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("sym_fromstring (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__string,&__pyx_n_s__terminal,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__string);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__string)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__terminal);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__terminal)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("sym_fromstring", 1, 2, 2, 1); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "sym_fromstring") < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "sym_fromstring") < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -21282,6 +22703,26 @@ static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *_
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_2sym_fromstring(__pyx_self, __pyx_v_string, __pyx_v_terminal);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
+ *     return ALPHABET.setindex(sym, id)
+ * 
+ * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
+ *     return ALPHABET.fromstring(string, terminal)
+ */
+
+static PyObject *__pyx_pf_3_sa_2sym_fromstring(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_string, int __pyx_v_terminal) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("sym_fromstring", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":105
  * 
@@ -21307,50 +22748,32 @@ static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":6
- * cdef class Phrase:
- * 
- *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
- *         cdef int i, j, n, n_vars
- *         n_vars = 0
- */
-
-static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_words = 0;
-  int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_n;
-  int __pyx_v_n_vars;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__words,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__words,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__words);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__words)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -21367,6 +22790,34 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_6Phrase___cinit__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_v_words);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":6
+ * cdef class Phrase:
+ * 
+ *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
+ *         cdef int i, j, n, n_vars
+ *         n_vars = 0
+ */
+
+static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_words) {
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_n;
+  int __pyx_v_n_vars;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  Py_ssize_t __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":8
  *     def __cinit__(self, words):
@@ -21394,7 +22845,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
+  __pyx_v_self->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":11
  *         n = len(words)
@@ -21417,7 +22868,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) = __pyx_t_4;
+    (__pyx_v_self->syms[__pyx_v_i]) = __pyx_t_4;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":13
  *         for i from 0 <= i < n:
@@ -21426,7 +22877,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *                 n_vars += 1
  *         self.n = n
  */
-    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":14
@@ -21437,9 +22888,9 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *         self.n_vars = n_vars
  */
       __pyx_v_n_vars = (__pyx_v_n_vars + 1);
-      goto __pyx_L8;
+      goto __pyx_L5;
     }
-    __pyx_L8:;
+    __pyx_L5:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":15
@@ -21449,7 +22900,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n = __pyx_v_n;
+  __pyx_v_self->n = __pyx_v_n;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":16
  *                 n_vars += 1
@@ -21458,7 +22909,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars = __pyx_v_n_vars;
+  __pyx_v_self->n_vars = __pyx_v_n_vars;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":17
  *         self.n = n
@@ -21467,7 +22918,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *         j = 0
  *         for i from 0 <= i < n:
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
+  __pyx_v_self->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":18
  *         self.n_vars = n_vars
@@ -21495,7 +22946,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *                 self.varpos[j] = i
  *                 j = j + 1
  */
-    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":21
@@ -21505,7 +22956,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *                 j = j + 1
  * 
  */
-      (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_v_j]) = __pyx_v_i;
+      (__pyx_v_self->varpos[__pyx_v_j]) = __pyx_v_i;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":22
  *             if sym_isvar(self.syms[i]):
@@ -21515,9 +22966,9 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *     def __dealloc__(self):
  */
       __pyx_v_j = (__pyx_v_j + 1);
-      goto __pyx_L11;
+      goto __pyx_L8;
     }
-    __pyx_L11:;
+    __pyx_L8:;
   }
 
   __pyx_r = 0;
@@ -21531,6 +22982,15 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   return __pyx_r;
 }
 
+/* Python wrapper */
+static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_6Phrase_2__dealloc__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":24
  *                 j = j + 1
  * 
@@ -21539,10 +22999,9 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *         free(self.varpos)
  */
 
-static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":25
  * 
@@ -21551,7 +23010,7 @@ static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self) {
  *         free(self.varpos)
  * 
  */
-  free(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms);
+  free(__pyx_v_self->syms);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":26
  *     def __dealloc__(self):
@@ -21560,11 +23019,22 @@ static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self) {
  * 
  *     def __str__(self):
  */
-  free(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos);
+  free(__pyx_v_self->varpos);
 
   __Pyx_RefNannyFinishContext();
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_4__str__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":28
  *         free(self.varpos)
  * 
@@ -21573,8 +23043,7 @@ static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self) {
  *         cdef int i, s
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_v_strs = NULL;
   int __pyx_v_i;
   int __pyx_v_s;
@@ -21588,7 +23057,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":29
  * 
@@ -21598,7 +23067,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
  *         for i from 0 <= i < self.n:
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -21609,7 +23078,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":32
@@ -21619,7 +23088,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
  *             strs.append(sym_tostring(s))
  *         return ' '.join(strs)
  */
-    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]);
+    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_i]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":33
  *         for i from 0 <= i < self.n:
@@ -21628,9 +23097,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
  *         return ' '.join(strs)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_strs) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_v_s)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_3 = PyList_Append(__pyx_v_strs, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -21648,7 +23114,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(((PyObject *)__pyx_v_strs));
   PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_strs));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_strs));
@@ -21675,6 +23141,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_3_sa_6Phrase_6handle[] = "return a hashable representation that normalizes the ordering\n        of the nonterminal indices";
+static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("handle (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_6handle(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":36
  *         return ' '.join(strs)
  * 
@@ -21683,9 +23161,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
  *         of the nonterminal indices"""
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static char __pyx_doc_3_sa_6Phrase_3handle[] = "return a hashable representation that normalizes the ordering\n        of the nonterminal indices";
-static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_v_norm = NULL;
   int __pyx_v_i;
   int __pyx_v_j;
@@ -21699,7 +23175,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("handle");
+  __Pyx_RefNannySetupContext("handle", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":39
  *         """return a hashable representation that normalizes the ordering
@@ -21709,7 +23185,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *         i = 1
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -21738,7 +23214,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *             s = self.syms[j]
  *             if sym_isvar(s):
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":44
@@ -21748,7 +23224,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  */
-    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_j]);
+    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":45
  *         for j from 0 <= j < self.n:
@@ -21777,9 +23253,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *         return tuple(norm)
  */
       __pyx_v_i = (__pyx_v_i + 1);
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":48
  *                 s = sym_setindex(s,i)
@@ -21788,9 +23264,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *         return tuple(norm)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyInt_FromLong(__pyx_v_s); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyList_Append(__pyx_v_norm, __pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -21805,9 +23278,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *     def strhandle(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
   __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_v_norm)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_r = ((PyObject *)__pyx_t_1);
@@ -21827,6 +23297,17 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("strhandle (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_8strhandle(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":51
  *         return tuple(norm)
  * 
@@ -21835,9 +23316,8 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *         norm = []
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_v_strs = NULL;
+static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *__pyx_v_strs = NULL;
   PyObject *__pyx_v_norm = NULL;
   int __pyx_v_i;
   int __pyx_v_j;
@@ -21853,7 +23333,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("strhandle");
+  __Pyx_RefNannySetupContext("strhandle", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":52
  * 
@@ -21863,7 +23343,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *         cdef int i, j, s
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -21875,7 +23355,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *         i = 1
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -21904,7 +23384,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *             s = self.syms[j]
  *             if sym_isvar(s):
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":58
@@ -21914,7 +23394,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  */
-    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_j]);
+    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":59
  *         for j from 0 <= j < self.n:
@@ -21943,9 +23423,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *         return ' '.join(norm)
  */
       __pyx_v_i = (__pyx_v_i + 1);
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":62
  *                 s = sym_setindex(s,i)
@@ -21954,9 +23434,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *         return ' '.join(norm)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_v_s)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyList_Append(__pyx_v_norm, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -21974,7 +23451,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+  __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_norm));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_norm));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_norm));
@@ -22002,6 +23479,17 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("arity (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_10arity(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":65
  *         return ' '.join(norm)
  * 
@@ -22010,15 +23498,14 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("arity");
+  __Pyx_RefNannySetupContext("arity", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":66
  * 
@@ -22028,7 +23515,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNU
  *     def getvarpos(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -22046,6 +23533,17 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNU
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getvarpos (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_12getvarpos(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":68
  *         return self.n_vars
  * 
@@ -22054,8 +23552,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNU
  *             return self.varpos[i]
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -22065,7 +23562,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getvarpos");
+  __Pyx_RefNannySetupContext("getvarpos", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":69
  * 
@@ -22074,14 +23571,12 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
  *             return self.varpos[i]
  *         else:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
     __Pyx_DECREF(__pyx_t_1);
-    __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -22097,12 +23592,12 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_t_4])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->varpos[__pyx_t_4])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
@@ -22116,7 +23611,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
     __Pyx_Raise(__pyx_builtin_IndexError, 0, 0, 0);
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -22131,6 +23626,17 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getvar (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_14getvar(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":74
  *             raise IndexError
  * 
@@ -22139,8 +23645,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
  *             return self.syms[self.varpos[i]]
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -22150,7 +23655,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getvar");
+  __Pyx_RefNannySetupContext("getvar", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":75
  * 
@@ -22159,14 +23664,12 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
  *             return self.syms[self.varpos[i]]
  *         else:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
     __Pyx_DECREF(__pyx_t_1);
-    __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -22182,12 +23685,12 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_t_4])])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->syms[(__pyx_v_self->varpos[__pyx_t_4])])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
@@ -22201,7 +23704,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
     __Pyx_Raise(__pyx_builtin_IndexError, 0, 0, 0);
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -22228,7 +23731,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("chunkpos");
+  __Pyx_RefNannySetupContext("chunkpos", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":81
  * 
@@ -22283,7 +23786,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("chunklen");
+  __Pyx_RefNannySetupContext("chunklen", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":87
  * 
@@ -22370,6 +23873,17 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("clen (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_16clen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_k));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":96
  *             return self.varpos[k]-self.varpos[k-1]-1
  * 
@@ -22378,8 +23892,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k) {
+static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_k) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -22387,7 +23900,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("clen");
+  __Pyx_RefNannySetupContext("clen", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":97
  * 
@@ -22398,7 +23911,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_k); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunklen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -22416,6 +23929,17 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getchunk (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_18getchunk(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_ci));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":99
  *          return self.chunklen(k)
  * 
@@ -22424,8 +23948,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
  *         start = self.chunkpos(ci)
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci) {
+static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_ci) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_chunk = NULL;
@@ -22438,7 +23961,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getchunk");
+  __Pyx_RefNannySetupContext("getchunk", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":101
  *     def getchunk(self, ci):
@@ -22448,7 +23971,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  *         chunk = []
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunkpos(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1);
+  __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunkpos(__pyx_v_self, __pyx_t_1);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":102
  *         cdef int start, stop
@@ -22458,7 +23981,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  *         for i from start <= i < stop:
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunklen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1));
+  __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":103
  *         start = self.chunkpos(ci)
@@ -22468,7 +23991,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  *             chunk.append(self.syms[i])
  */
   __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_chunk = __pyx_t_2;
   __pyx_t_2 = 0;
 
@@ -22489,10 +24012,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  *         return chunk
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_chunk) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->syms[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_3 = PyList_Append(__pyx_v_chunk, __pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -22523,6 +24043,19 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
+/* Python wrapper */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cmp__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_20__cmp__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_other));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+#endif /*!(#if PY_MAJOR_VERSION < 3)*/
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":108
  *         return chunk
  * 
@@ -22532,8 +24065,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  */
 
 #if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_other) {
   struct __pyx_obj_3_sa_Phrase *__pyx_v_otherp = 0;
   int __pyx_v_i;
   int __pyx_r;
@@ -22545,7 +24077,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cmp__");
+  __Pyx_RefNannySetupContext("__cmp__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":111
  *         cdef Phrase otherp
@@ -22566,7 +24098,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  *                 return -1
  */
   __pyx_t_1 = __pyx_v_otherp->n;
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   if ((__pyx_t_1 < __pyx_t_2)) {
     __pyx_t_3 = __pyx_t_1;
   } else {
@@ -22582,7 +24114,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:
  */
-    __pyx_t_4 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
+    __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":114
@@ -22594,7 +24126,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
       __pyx_r = -1;
       goto __pyx_L0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":115
@@ -22604,7 +24136,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  *                 return 1
  *         if self.n < otherp.n:
  */
-    __pyx_t_4 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
+    __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":116
@@ -22616,9 +24148,9 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
       __pyx_r = 1;
       goto __pyx_L0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":117
@@ -22628,7 +24160,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  *             return -1
  *         elif self.n > otherp.n:
  */
-  __pyx_t_4 = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n < __pyx_v_otherp->n);
+  __pyx_t_4 = (__pyx_v_self->n < __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":118
@@ -22640,7 +24172,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
     __pyx_r = -1;
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L6;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":119
@@ -22650,7 +24182,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  *             return 1
  *         else:
  */
-  __pyx_t_4 = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n > __pyx_v_otherp->n);
+  __pyx_t_4 = (__pyx_v_self->n > __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":120
@@ -22662,7 +24194,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
     __pyx_r = 1;
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L6;
   }
   /*else*/ {
 
@@ -22676,7 +24208,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
     __pyx_r = 0;
     goto __pyx_L0;
   }
-  __pyx_L8:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -22690,6 +24222,17 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
+/* Python wrapper */
+static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self); /*proto*/
+static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self) {
+  Py_hash_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_22__hash__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":124
  *             return 0
  * 
@@ -22698,15 +24241,14 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  *         cdef unsigned h
  */
 
-static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
+static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   int __pyx_v_i;
   unsigned int __pyx_v_h;
   Py_hash_t __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("__hash__");
+  __Pyx_RefNannySetupContext("__hash__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":127
  *         cdef int i
@@ -22724,7 +24266,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
  *             if self.syms[i] > 0:
  *                 h = (h << 1) + self.syms[i]
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_1 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":129
@@ -22734,7 +24276,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
  *                 h = (h << 1) + self.syms[i]
  *             else:
  */
-    __pyx_t_2 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) > 0);
+    __pyx_t_2 = ((__pyx_v_self->syms[__pyx_v_i]) > 0);
     if (__pyx_t_2) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":130
@@ -22744,8 +24286,8 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
  *             else:
  *                 h = (h << 1) + -self.syms[i]
  */
-      __pyx_v_h = ((__pyx_v_h << 1) + (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
-      goto __pyx_L7;
+      __pyx_v_h = ((__pyx_v_h << 1) + (__pyx_v_self->syms[__pyx_v_i]));
+      goto __pyx_L5;
     }
     /*else*/ {
 
@@ -22756,9 +24298,9 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
  *         return h
  * 
  */
-      __pyx_v_h = ((__pyx_v_h << 1) + (-(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])));
+      __pyx_v_h = ((__pyx_v_h << 1) + (-(__pyx_v_self->syms[__pyx_v_i])));
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":133
@@ -22778,6 +24320,17 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_24__len__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":135
  *         return h
  * 
@@ -22786,11 +24339,10 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":136
  * 
@@ -22799,7 +24351,7 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
  * 
  *     def __getitem__(self, i):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_r = __pyx_v_self->n;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -22808,6 +24360,17 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_26__getitem__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":138
  *         return self.n
  * 
@@ -22816,8 +24379,7 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -22825,7 +24387,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":139
  * 
@@ -22836,7 +24398,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyO
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->syms[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -22853,7 +24415,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyO
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_28__iter__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
@@ -22863,42 +24436,51 @@ static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_
  *         for i from 0 <= i < self.n:
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_14__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_14__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_28__iter__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__iter__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_4___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_4___iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_6Phrase_15generator2;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_6Phrase_30generator2, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.Phrase.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -22915,7 +24497,7 @@ static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_
  *             yield self.syms[i]
  * 
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_self)->n;
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->n;
   for (__pyx_cur_scope->__pyx_v_i = 0; __pyx_cur_scope->__pyx_v_i < __pyx_t_1; __pyx_cur_scope->__pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":144
@@ -22925,7 +24507,7 @@ static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_
  * 
  *     def subst(self, start, children):
  */
-    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_self)->syms[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->syms[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
@@ -22933,74 +24515,58 @@ static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":146
- *             yield self.syms[i]
- * 
- *     def subst(self, start, children):             # <<<<<<<<<<<<<<
- *         cdef int i
- *         for i from 0 <= i < self.n:
- */
-
-static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_children = 0;
-  int __pyx_v_i;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  long __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
-  __Pyx_RefNannySetupContext("subst");
+  __Pyx_RefNannySetupContext("subst (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("subst", 1, 2, 2, 1); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "subst") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "subst") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -23019,6 +24585,32 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_6Phrase_31subst(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_v_start, __pyx_v_children);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":146
+ *             yield self.syms[i]
+ * 
+ *     def subst(self, start, children):             # <<<<<<<<<<<<<<
+ *         cdef int i
+ *         for i from 0 <= i < self.n:
+ */
+
+static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_children) {
+  int __pyx_v_i;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  long __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("subst", 0);
   __Pyx_INCREF(__pyx_v_start);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":148
@@ -23028,7 +24620,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
  *             if sym_isvar(self.syms[i]):
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_1 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":149
@@ -23038,7 +24630,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  *             else:
  */
-    __pyx_t_2 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+    __pyx_t_2 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_2) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":150
@@ -23048,7 +24640,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
  *             else:
  *                 start = start + (self.syms[i],)
  */
-      __pyx_t_3 = (__pyx_f_3_sa_sym_getindex((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])) - 1);
+      __pyx_t_3 = (__pyx_f_3_sa_sym_getindex((__pyx_v_self->syms[__pyx_v_i])) - 1);
       __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_children, __pyx_t_3, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_5 = PyNumber_Add(__pyx_v_start, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -23057,7 +24649,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
       __Pyx_DECREF(__pyx_v_start);
       __pyx_v_start = __pyx_t_5;
       __pyx_t_5 = 0;
-      goto __pyx_L8;
+      goto __pyx_L5;
     }
     /*else*/ {
 
@@ -23068,10 +24660,10 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
  *         return start
  * 
  */
-      __pyx_t_5 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_self->syms[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
@@ -23082,7 +24674,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
       __pyx_v_start = __pyx_t_5;
       __pyx_t_5 = 0;
     }
-    __pyx_L8:;
+    __pyx_L5:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":153
@@ -23111,6 +24703,17 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_5words___get__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":156
  * 
  *     property words:
@@ -23119,8 +24722,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_v_w = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -23134,7 +24736,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":157
  *     property words:
@@ -23145,22 +24747,30 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (PyList_CheckExact(__pyx_v_self) || PyTuple_CheckExact(__pyx_v_self)) {
-    __pyx_t_2 = __pyx_v_self; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self))) {
+    __pyx_t_2 = ((PyObject *)__pyx_v_self); __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
@@ -23181,11 +24791,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-      if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_INCREF(((PyObject *)__pyx_t_1));
@@ -23208,16 +24818,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":161
- * cdef class Rule:
- * 
- *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
- *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
- *         self.lhs = lhs
- */
-
-static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_lhs;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_f = 0;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_e = 0;
@@ -23225,21 +24828,24 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   PyObject *__pyx_v_word_alignments = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
     PyObject* values[5] = {0,0,0,0,0};
+
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":161
+ * cdef class Rule:
+ * 
+ *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
+ *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
+ *         self.lhs = lhs
+ */
     values[3] = ((PyObject *)Py_None);
     values[4] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -23249,20 +24855,17 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lhs);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lhs)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -23278,7 +24881,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -23307,6 +24910,25 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_e), __pyx_ptype_3_sa_Phrase, 1, "e", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_4Rule___cinit__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), __pyx_v_lhs, __pyx_v_f, __pyx_v_e, __pyx_v_scores, __pyx_v_word_alignments);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, int __pyx_v_lhs, struct __pyx_obj_3_sa_Phrase *__pyx_v_f, struct __pyx_obj_3_sa_Phrase *__pyx_v_e, PyObject *__pyx_v_scores, PyObject *__pyx_v_word_alignments) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":162
  * 
@@ -23323,7 +24945,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -23333,9 +24955,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":163
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):
@@ -23344,7 +24966,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  *         self.f = f
  *         self.e = e
  */
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs = __pyx_v_lhs;
+  __pyx_v_self->lhs = __pyx_v_lhs;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":164
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
@@ -23355,9 +24977,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_f));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_f));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f = __pyx_v_f;
+  __Pyx_GOTREF(__pyx_v_self->f);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
+  __pyx_v_self->f = __pyx_v_f;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":165
  *         self.lhs = lhs
@@ -23368,9 +24990,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_e));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_e));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e = __pyx_v_e;
+  __Pyx_GOTREF(__pyx_v_self->e);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->e));
+  __pyx_v_self->e = __pyx_v_e;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":166
  *         self.f = f
@@ -23381,9 +25003,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  */
   __Pyx_INCREF(__pyx_v_word_alignments);
   __Pyx_GIVEREF(__pyx_v_word_alignments);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments = __pyx_v_word_alignments;
+  __Pyx_GOTREF(__pyx_v_self->word_alignments);
+  __Pyx_DECREF(__pyx_v_self->word_alignments);
+  __pyx_v_self->word_alignments = __pyx_v_word_alignments;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":167
  *         self.e = e
@@ -23395,9 +25017,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   if (!(likely(((__pyx_v_scores) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_scores, __pyx_ptype_3_sa_FeatureVector))))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_scores);
   __Pyx_GIVEREF(__pyx_v_scores);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores));
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_scores);
+  __Pyx_GOTREF(__pyx_v_self->scores);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->scores));
+  __pyx_v_self->scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_scores);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -23411,6 +25033,17 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   return __pyx_r;
 }
 
+/* Python wrapper */
+static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self); /*proto*/
+static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self) {
+  Py_hash_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_2__hash__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":169
  *         self.scores = scores
  * 
@@ -23419,8 +25052,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  * 
  */
 
-static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
+static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   Py_hash_t __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23429,7 +25061,7 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__hash__");
+  __Pyx_RefNannySetupContext("__hash__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":170
  * 
@@ -23438,18 +25070,18 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
  * 
  *     def __cmp__(self, Rule other):
  */
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->f));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e));
   __pyx_t_1 = 0;
   __pyx_t_3 = PyObject_Hash(((PyObject *)__pyx_t_2)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -23469,6 +25101,24 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cmp__ (wrapper)", 0);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_ptype_3_sa_Rule, 1, "other", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_4Rule_4__cmp__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), ((struct __pyx_obj_3_sa_Rule *)__pyx_v_other));
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+#endif /*!(#if PY_MAJOR_VERSION < 3)*/
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":172
  *         return hash((self.lhs, self.f, self.e))
  * 
@@ -23478,8 +25128,7 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
  */
 
 #if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Rule *__pyx_v_other) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23489,8 +25138,7 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cmp__");
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_ptype_3_sa_Rule, 1, "other", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("__cmp__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":173
  * 
@@ -23499,21 +25147,21 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  PyTuple_SET_ITEM(__pyx_t_2, 3, ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  __Pyx_GIVEREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->f));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e));
+  __Pyx_INCREF(__pyx_v_self->word_alignments);
+  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->word_alignments);
+  __Pyx_GIVEREF(__pyx_v_self->word_alignments);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":174
@@ -23523,24 +25171,24 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
  * 
  *     def fmerge(self, Phrase f):
  */
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_other->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
-  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
-  PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  PyTuple_SET_ITEM(__pyx_t_3, 3, ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  __Pyx_GIVEREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_INCREF(((PyObject *)__pyx_v_other->f));
+  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_other->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_other->f));
+  __Pyx_INCREF(((PyObject *)__pyx_v_other->e));
+  PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)__pyx_v_other->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_other->e));
+  __Pyx_INCREF(__pyx_v_self->word_alignments);
+  PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_v_self->word_alignments);
+  __Pyx_GIVEREF(__pyx_v_self->word_alignments);
   __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_3));
@@ -23569,6 +25217,22 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("fmerge (wrapper)", 0);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_4Rule_6fmerge(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_f));
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":176
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
@@ -23577,8 +25241,7 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
  *             self.f = f
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Phrase *__pyx_v_f) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23586,8 +25249,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("fmerge");
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("fmerge", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":177
  * 
@@ -23596,8 +25258,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
  *             self.f = f
  * 
  */
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f), __pyx_v_f, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_self->f), ((PyObject *)__pyx_v_f), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
@@ -23609,14 +25270,14 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
  * 
  *     def arity(self):
  */
-    __Pyx_INCREF(__pyx_v_f);
-    __Pyx_GIVEREF(__pyx_v_f);
-    __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
-    __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-    ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_f);
-    goto __pyx_L5;
+    __Pyx_INCREF(((PyObject *)__pyx_v_f));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_f));
+    __Pyx_GOTREF(__pyx_v_self->f);
+    __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
+    __pyx_v_self->f = __pyx_v_f;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -23630,6 +25291,17 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("arity (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_8arity(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":180
  *             self.f = f
  * 
@@ -23638,8 +25310,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23647,7 +25318,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSE
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("arity");
+  __Pyx_RefNannySetupContext("arity", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":181
  * 
@@ -23657,7 +25328,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSE
  *     def __str__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->f), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -23678,7 +25349,18 @@ static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSE
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_10__str__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
@@ -23688,45 +25370,53 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7__str___genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7__str___genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_4Rule_7__str___genexpr(PyObject *__pyx_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("genexpr");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)__pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *) __pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  __pyx_self = __pyx_self;
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7__str___1generator7;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_7__str___2generator7, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.Rule.__str__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   Py_ssize_t __pyx_t_3;
   PyObject *(*__pyx_t_4)(PyObject *);
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -23735,7 +25425,8 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self, __pyx_n_s__alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self), __pyx_n_s__alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -23750,12 +25441,20 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_2 = __pyx_t_4(__pyx_t_1);
       if (unlikely(!__pyx_t_2)) {
@@ -23783,7 +25482,7 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -23794,7 +25493,7 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -23802,7 +25501,8 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -23815,8 +25515,7 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *__pyx_cur_scope;
   PyObject *__pyx_v_fields = NULL;
   PyObject *__pyx_r = NULL;
@@ -23831,15 +25530,15 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_5___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_5___str__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":185
@@ -23849,34 +25548,34 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  */
-  __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->lhs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_cur_scope->__pyx_v_self->lhs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
   __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
   __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
+  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
   __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyList_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
@@ -23899,7 +25598,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  *         return ' ||| '.join(fields)
  */
-  __pyx_t_6 = (((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments != Py_None);
+  __pyx_t_6 = (__pyx_cur_scope->__pyx_v_self->word_alignments != Py_None);
   if (__pyx_t_6) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
@@ -23909,15 +25608,12 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
  *         return ' ||| '.join(fields)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_fields) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_5 = __pyx_pf_3_sa_7__str___genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __pyx_pf_3_sa_4Rule_7__str___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
@@ -23927,9 +25623,9 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_t_7 = PyList_Append(__pyx_v_fields, __pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":188
  *         if self.word_alignments is not None:
@@ -23942,7 +25638,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_18), __pyx_n_s__join); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(((PyObject *)__pyx_v_fields));
   PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_fields));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fields));
@@ -23971,7 +25667,18 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("alignments (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_12alignments(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
@@ -23981,36 +25688,45 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
  *             yield point/65536, point%65536
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_6alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_6alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_4Rule_12alignments(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("alignments");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("alignments", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)__pyx_ptype_3_sa___pyx_scope_struct_7_alignments->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_7_alignments, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_7generator3;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_14generator3, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.Rule.alignments", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
@@ -24019,8 +25735,8 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -24036,21 +25752,29 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
  *         for point in self.word_alignments:             # <<<<<<<<<<<<<<
  *             yield point/65536, point%65536
  */
-  if (PyList_CheckExact(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments)) {
-    __pyx_t_1 = ((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_self->word_alignments) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_self->word_alignments)) {
+    __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->word_alignments; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_self->word_alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -24078,7 +25802,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     __pyx_t_5 = PyNumber_Remainder(__pyx_cur_scope->__pyx_v_point, __pyx_int_65536); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -24094,7 +25818,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -24105,7 +25829,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -24115,11 +25839,23 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
   __Pyx_AddTraceback("alignments", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_1f___get__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "_sa.pxd":37
  * cdef class Rule:
  *     cdef int lhs
@@ -24128,14 +25864,13 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
  *     cdef int n_scores
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
+  __pyx_r = ((PyObject *)__pyx_v_self->f);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -24145,14 +25880,24 @@ static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_1e_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_1e_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_1e___get__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
+  __pyx_r = ((PyObject *)__pyx_v_self->e);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -24174,7 +25919,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   struct __pyx_t_3_sa__Trie_Node *__pyx_v_node;
   struct __pyx_t_3_sa__Trie_Node *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_trie_node");
+  __Pyx_RefNannySetupContext("new_trie_node", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":23
  * cdef _Trie_Node* new_trie_node():
@@ -24240,7 +25985,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   struct __pyx_t_3_sa__Trie_Edge *__pyx_v_edge;
   struct __pyx_t_3_sa__Trie_Edge *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_trie_edge");
+  __Pyx_RefNannySetupContext("new_trie_edge", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":31
  * cdef _Trie_Edge* new_trie_edge(int val):
@@ -24319,7 +26064,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("free_trie_node");
+  __Pyx_RefNannySetupContext("free_trie_node", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":39
  * 
@@ -24382,7 +26127,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("free_trie_edge");
+  __Pyx_RefNannySetupContext("free_trie_edge", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":44
  * 
@@ -24457,7 +26202,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("trie_find");
+  __Pyx_RefNannySetupContext("trie_find", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":51
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):
@@ -24582,7 +26327,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   int __pyx_v_new_len;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("trie_node_data_append");
+  __Pyx_RefNannySetupContext("trie_node_data_append", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":64
  * cdef trie_node_data_append(_Trie_Node* node, int val):
@@ -24638,7 +26383,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   int __pyx_v_new_len;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("trie_node_data_extend");
+  __Pyx_RefNannySetupContext("trie_node_data_extend", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":71
  * cdef trie_node_data_extend(_Trie_Node* node, int* vals, int num_vals):
@@ -24697,7 +26442,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("trie_insert");
+  __Pyx_RefNannySetupContext("trie_insert", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":79
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):
@@ -24825,7 +26570,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("trie_node_to_map");
+  __Pyx_RefNannySetupContext("trie_node_to_map", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":92
  *     cdef IntList arr
@@ -24952,7 +26697,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("trie_edge_to_map");
+  __Pyx_RefNannySetupContext("trie_edge_to_map", 0);
   __Pyx_INCREF(__pyx_v_prefix);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":103
@@ -24997,7 +26742,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __pyx_t_2 = PyInt_FromLong(__pyx_v_edge->val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
@@ -25036,42 +26781,32 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":114
- *     cdef int V
- * 
- *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
- *         self.V = alphabet_size
- *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
- */
-
-static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_alphabet_size;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alphabet_size);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alphabet_size)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -25088,6 +26823,23 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7TrieMap___cinit__(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_alphabet_size);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":114
+ *     cdef int V
+ * 
+ *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
+ *         self.V = alphabet_size
+ *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
+ */
+
+static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, int __pyx_v_alphabet_size) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":115
  * 
@@ -25096,7 +26848,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))
  */
-  ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V = __pyx_v_alphabet_size;
+  __pyx_v_self->V = __pyx_v_alphabet_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":116
  *     def __cinit__(self, int alphabet_size):
@@ -25105,7 +26857,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))
  * 
  */
-  ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
+  __pyx_v_self->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":117
  *         self.V = alphabet_size
@@ -25114,13 +26866,22 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__
  * 
  * 
  */
-  memset(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root, 0, (((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *))));
+  memset(__pyx_v_self->root, 0, (__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* Python wrapper */
+static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_7TrieMap_2__dealloc__(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":120
  * 
  * 
@@ -25129,8 +26890,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         for i from 0 <= i < self.V:
  */
 
-static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self) {
   int __pyx_v_i;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -25139,7 +26899,7 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":122
  *     def __dealloc__(self):
@@ -25148,7 +26908,7 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V;
+  __pyx_t_1 = __pyx_v_self->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":123
@@ -25158,7 +26918,7 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
  *                 free_trie_node(self.root[i])
  *         free(self.root)
  */
-    __pyx_t_2 = ((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]) != NULL);
+    __pyx_t_2 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
     if (__pyx_t_2) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":124
@@ -25168,12 +26928,12 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
  *         free(self.root)
  * 
  */
-      __pyx_t_3 = __pyx_f_3_sa_free_trie_node((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __pyx_f_3_sa_free_trie_node((__pyx_v_self->root[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":125
@@ -25183,7 +26943,7 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
  * 
  * 
  */
-  free(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root);
+  free(__pyx_v_self->root);
 
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -25193,6 +26953,17 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7TrieMap_4insert(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":128
  * 
  * 
@@ -25201,8 +26972,7 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
  *         cdef int i, l
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern) {
   int *__pyx_v_p;
   int __pyx_v_i;
   int __pyx_v_l;
@@ -25215,7 +26985,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert");
+  __Pyx_RefNannySetupContext("insert", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":131
  *         cdef int* p
@@ -25267,7 +27037,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
  *         free(p)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_TrieMap *)((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->__pyx_vtab)->_insert(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_p, __pyx_v_l);
+  ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_insert(__pyx_v_self, __pyx_v_p, __pyx_v_l);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":136
  *             p[i] = pattern[i]
@@ -25305,7 +27075,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("_insert");
+  __Pyx_RefNannySetupContext("_insert", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":142
  *         cdef int i
@@ -25374,6 +27144,17 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("contains (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7TrieMap_6contains(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":149
  *         return node
  * 
@@ -25382,8 +27163,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
  *         cdef int i, l
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern) {
   int *__pyx_v_p;
   int __pyx_v_i;
   int __pyx_v_l;
@@ -25398,7 +27178,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("contains");
+  __Pyx_RefNannySetupContext("contains", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":153
  *         cdef int i, l
@@ -25450,7 +27230,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
  *         free(p)
  *         if node == NULL:
  */
-  __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->__pyx_vtab)->_contains(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_p, __pyx_v_l);
+  __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_contains(__pyx_v_self, __pyx_v_p, __pyx_v_l);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":158
  *             p[i] = pattern[i]
@@ -25484,7 +27264,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
     __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L5;
   }
   /*else*/ {
 
@@ -25502,7 +27282,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
     __pyx_t_3 = 0;
     goto __pyx_L0;
   }
-  __pyx_L7:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -25532,7 +27312,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("_contains");
+  __Pyx_RefNannySetupContext("_contains", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":167
  *         cdef int i
@@ -25604,6 +27384,17 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
+static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("toMap (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7TrieMap_8toMap(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_flag));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":174
  *         return node
  * 
@@ -25612,8 +27403,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
-static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_flag) {
   int __pyx_v_i;
   int __pyx_v_include_zeros;
   PyObject *__pyx_v_result = NULL;
@@ -25626,7 +27416,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("toMap");
+  __Pyx_RefNannySetupContext("toMap", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":177
  *         cdef int i, include_zeros
@@ -25646,7 +27436,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
  *             include_zeros=0
  */
     __pyx_v_include_zeros = 1;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
@@ -25659,7 +27449,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
  */
     __pyx_v_include_zeros = 0;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":181
  *         else:
@@ -25680,7 +27470,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  */
-  __pyx_t_3 = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V;
+  __pyx_t_3 = __pyx_v_self->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":183
@@ -25690,7 +27480,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  *         return result
  */
-    __pyx_t_1 = ((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]) != NULL);
+    __pyx_t_1 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
     if (__pyx_t_1) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":184
@@ -25703,17 +27493,17 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
       __pyx_t_2 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_2 = 0;
-      __pyx_t_2 = __pyx_f_3_sa_trie_node_to_map((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]), ((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_4), __pyx_v_include_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __pyx_f_3_sa_trie_node_to_map((__pyx_v_self->root[__pyx_v_i]), ((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_4), __pyx_v_include_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      goto __pyx_L8;
+      goto __pyx_L6;
     }
-    __pyx_L8:;
+    __pyx_L6:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":185
@@ -25742,16 +27532,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":200
- *     cdef write_map(self, m, FILE* f)
- * 
- *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
- *             precompute_rank=1000, precompute_secondary_rank=20,
- *             max_length=5, max_nonterminals=2,
- */
-
-static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fsarray = 0;
   PyObject *__pyx_v_from_stats = 0;
   PyObject *__pyx_v_from_binary = 0;
@@ -25763,18 +27546,18 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   PyObject *__pyx_v_train_min_gap_size = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
     PyObject* values[9] = {0,0,0,0,0,0,0,0,0};
+
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":200
+ *     cdef write_map(self, m, FILE* f)
+ * 
+ *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
+ *             precompute_rank=1000, precompute_secondary_rank=20,
+ *             max_length=5, max_nonterminals=2,
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
@@ -25786,7 +27569,8 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
     values[8] = ((PyObject *)__pyx_int_2);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
         case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
         case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
@@ -25800,7 +27584,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
@@ -25848,7 +27632,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -25883,6 +27667,23 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14Precomputation___cinit__(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_from_stats, __pyx_v_from_binary, __pyx_v_precompute_rank, __pyx_v_precompute_secondary_rank, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_from_stats, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_precompute_rank, PyObject *__pyx_v_precompute_secondary_rank, PyObject *__pyx_v_max_length, PyObject *__pyx_v_max_nonterminals, PyObject *__pyx_v_train_max_initial_size, PyObject *__pyx_v_train_min_gap_size) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":204
  *             max_length=5, max_nonterminals=2,
@@ -25892,7 +27693,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.max_length = max_length
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank = __pyx_t_1;
+  __pyx_v_self->precompute_rank = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":205
  *             train_max_initial_size=10, train_min_gap_size=2):
@@ -25902,7 +27703,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.max_nonterminals = max_nonterminals
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_secondary_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank = __pyx_t_1;
+  __pyx_v_self->precompute_secondary_rank = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":206
  *         self.precompute_rank = precompute_rank
@@ -25912,7 +27713,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.train_max_initial_size = train_max_initial_size
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_length); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length = __pyx_t_1;
+  __pyx_v_self->max_length = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":207
  *         self.precompute_secondary_rank = precompute_secondary_rank
@@ -25922,7 +27723,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.train_min_gap_size = train_min_gap_size
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_nonterminals); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals = __pyx_t_1;
+  __pyx_v_self->max_nonterminals = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":208
  *         self.max_length = max_length
@@ -25932,7 +27733,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         if from_binary:
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_max_initial_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size = __pyx_t_1;
+  __pyx_v_self->train_max_initial_size = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":209
  *         self.max_nonterminals = max_nonterminals
@@ -25942,7 +27743,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *             self.read_binary(from_binary)
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_min_gap_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size = __pyx_t_1;
+  __pyx_v_self->train_min_gap_size = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":210
  *         self.train_max_initial_size = train_max_initial_size
@@ -25961,10 +27762,10 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         elif from_stats:
  *             self.precompute(from_stats, fsarray)
  */
-    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -25973,7 +27774,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":212
@@ -25993,10 +27794,10 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  * 
  * 
  */
-    __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__precompute); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_from_stats);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_from_stats);
     __Pyx_GIVEREF(__pyx_v_from_stats);
@@ -26008,9 +27809,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -26025,6 +27826,27 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14Precomputation_2read_binary(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":216
  * 
  * 
@@ -26033,9 +27855,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -26043,16 +27863,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_binary", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":218
  *     def read_binary(self, char* filename):
@@ -26070,7 +27881,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":220
  *         f = fopen(filename, "r")
@@ -26079,7 +27890,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":221
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)
@@ -26088,7 +27899,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":222
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
@@ -26097,7 +27908,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":223
  *         fread(&(self.max_length), sizeof(int), 1, f)
@@ -26106,7 +27917,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":224
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
@@ -26115,7 +27926,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":225
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
@@ -26124,12 +27935,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         self.precomputed_collocations = self.read_map(f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->read_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->read_map(__pyx_v_self, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
+  __Pyx_DECREF(__pyx_v_self->precomputed_index);
+  __pyx_v_self->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":226
@@ -26139,12 +27950,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         fclose(f)
  * 
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->read_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->read_map(__pyx_v_self, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
+  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
+  __pyx_v_self->precomputed_collocations = __pyx_t_1;
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":227
@@ -26168,6 +27979,27 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14Precomputation_4write_binary(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":230
  * 
  * 
@@ -26176,9 +28008,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -26187,16 +28017,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":232
  *     def write_binary(self, char* filename):
@@ -26214,7 +28035,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":234
  *         f = fopen(filename, "w")
@@ -26223,7 +28044,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":235
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)
@@ -26232,7 +28053,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":236
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
@@ -26241,7 +28062,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":237
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
@@ -26250,7 +28071,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":238
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
@@ -26259,7 +28080,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":239
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
@@ -26268,9 +28089,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         self.write_map(self.precomputed_collocations, f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index;
+  __pyx_t_1 = __pyx_v_self->precomputed_index;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->write_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->write_map(__pyx_v_self, __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -26282,9 +28103,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         fclose(f)
  * 
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
+  __pyx_t_2 = __pyx_v_self->precomputed_collocations;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->write_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->write_map(__pyx_v_self, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -26319,7 +28140,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         cdef IntList arr
  */
 
-static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_m, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_m, FILE *__pyx_v_f) {
   int __pyx_v_i;
   int __pyx_v_N;
   struct __pyx_obj_3_sa_IntList *__pyx_v_arr = 0;
@@ -26330,19 +28151,17 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *(*__pyx_t_4)(PyObject *);
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  Py_ssize_t __pyx_t_9;
-  PyObject *(*__pyx_t_10)(PyObject *);
-  int __pyx_t_11;
+  int __pyx_t_7;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_map");
+  __Pyx_RefNannySetupContext("write_map", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":248
  *         cdef IntList arr
@@ -26370,80 +28189,22 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)
  */
-  __pyx_t_2 = PyObject_GetAttr(__pyx_v_m, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-    __pyx_t_2 = __pyx_t_3; __Pyx_INCREF(__pyx_t_2); __pyx_t_1 = 0;
-    __pyx_t_4 = NULL;
-  } else {
-    __pyx_t_1 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v_m == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
-      if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
-      if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
-    } else {
-      __pyx_t_3 = __pyx_t_4(__pyx_t_2);
-      if (unlikely(!__pyx_t_3)) {
-        if (PyErr_Occurred()) {
-          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        break;
-      }
-      __Pyx_GOTREF(__pyx_t_3);
-    }
-    if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-      PyObject* sequence = __pyx_t_3;
-      if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
-        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
-      } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
-        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
-      }
-      __Pyx_INCREF(__pyx_t_5);
-      __Pyx_INCREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    } else {
-      Py_ssize_t index = -1;
-      __pyx_t_7 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
-      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_5);
-      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_6);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L6_unpacking_done;
-      __pyx_L5_unpacking_failed:;
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L6_unpacking_done:;
-    }
+  __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_m, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_2);
+  __pyx_t_2 = __pyx_t_5;
+  __pyx_t_5 = 0;
+  while (1) {
+    __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_2, __pyx_t_3, &__pyx_t_1, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4);
+    if (unlikely(__pyx_t_7 == 0)) break;
+    if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_XDECREF(__pyx_v_pattern);
     __pyx_v_pattern = __pyx_t_5;
     __pyx_t_5 = 0;
@@ -26458,8 +28219,8 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:
  */
-    __pyx_t_9 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_N = __pyx_t_9;
+    __pyx_t_8 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_N = __pyx_t_8;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":252
  *         for pattern, val in m.iteritems():
@@ -26478,34 +28239,42 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  *                 fwrite(&(i), sizeof(int), 1, f)
  */
     if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-      __pyx_t_3 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_3); __pyx_t_9 = 0;
-      __pyx_t_10 = NULL;
+      __pyx_t_6 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_6); __pyx_t_8 = 0;
+      __pyx_t_9 = NULL;
     } else {
-      __pyx_t_9 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_10 = Py_TYPE(__pyx_t_3)->tp_iternext;
+      __pyx_t_8 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_9 = Py_TYPE(__pyx_t_6)->tp_iternext;
     }
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_3)) {
-        if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_3)) break;
-        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++;
-      } else if (PyTuple_CheckExact(__pyx_t_3)) {
-        if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++;
+      if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_6)) {
+        if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_6)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_6)) {
+        if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
-        __pyx_t_6 = __pyx_t_10(__pyx_t_3);
-        if (unlikely(!__pyx_t_6)) {
+        __pyx_t_5 = __pyx_t_9(__pyx_t_6);
+        if (unlikely(!__pyx_t_5)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
             else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
-        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_GOTREF(__pyx_t_5);
       }
       __Pyx_XDECREF(__pyx_v_word_id);
-      __pyx_v_word_id = __pyx_t_6;
-      __pyx_t_6 = 0;
+      __pyx_v_word_id = __pyx_t_5;
+      __pyx_t_5 = 0;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":254
  *             fwrite(&(N), sizeof(int), 1, f)
@@ -26514,8 +28283,8 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val
  */
-      __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_i = __pyx_t_11;
+      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_i = __pyx_t_7;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":255
  *             for word_id in pattern:
@@ -26526,7 +28295,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  */
       fwrite((&__pyx_v_i), (sizeof(int)), 1, __pyx_v_f);
     }
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":256
  *                 i = word_id
@@ -26555,10 +28324,8 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_5);
   __Pyx_XDECREF(__pyx_t_6);
-  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_AddTraceback("_sa.Precomputation.write_map", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
@@ -26579,10 +28346,10 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  *         cdef IntList arr
  */
 
-static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, FILE *__pyx_v_f) {
   int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_k;
+  CYTHON_UNUSED int __pyx_v_j;
+  CYTHON_UNUSED int __pyx_v_k;
   int __pyx_v_word_id;
   int __pyx_v_N;
   struct __pyx_obj_3_sa_IntList *__pyx_v_arr = 0;
@@ -26597,7 +28364,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_map");
+  __Pyx_RefNannySetupContext("read_map", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":264
  *         cdef IntList arr
@@ -26679,7 +28446,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
       __pyx_t_1 = PyInt_FromLong(__pyx_v_word_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
@@ -26751,6 +28518,67 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_stats = 0;
+  struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("precompute (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__sarray,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stats)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sarray)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, 1); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "precompute") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_stats = values[0];
+    __pyx_v_sarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sarray), __pyx_ptype_3_sa_SuffixArray, 1, "sarray", 0))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_14Precomputation_6precompute(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_stats, __pyx_v_sarray);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":278
  * 
  * 
@@ -26759,10 +28587,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  *         cdef DataArray darray = sarray.darray
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_stats = 0;
-  struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray = 0;
+static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray) {
   int __pyx_v_i;
   int __pyx_v_l;
   int __pyx_v_N;
@@ -26795,7 +28620,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   PyObject *__pyx_v_pattern_rank = NULL;
   float __pyx_v_start_time;
   PyObject *__pyx_v_rank = NULL;
-  PyObject *__pyx_v__ = NULL;
+  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
   PyObject *__pyx_v_phrase = NULL;
   int __pyx_v_sa_word_id;
   PyObject *__pyx_v_x = NULL;
@@ -26810,7 +28635,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   PyObject *__pyx_v_arity = NULL;
   PyObject *__pyx_v_cumul_cost = NULL;
   PyObject *__pyx_v_cumul_count = NULL;
-  Py_ssize_t __pyx_v_num_found_patterns;
+  PyObject *__pyx_v_num_found_patterns = NULL;
   float __pyx_v_stop_time;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -26837,52 +28662,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__sarray,0};
-  __Pyx_RefNannySetupContext("precompute");
-  {
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stats);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sarray);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, 1); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "precompute") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-    }
-    __pyx_v_stats = values[0];
-    __pyx_v_sarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sarray), __pyx_ptype_3_sa_SuffixArray, 1, "sarray", 0))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("precompute", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":280
  *     def precompute(self, stats, SuffixArray sarray):
@@ -26918,7 +28698,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -26942,7 +28722,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -26966,7 +28746,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -27089,12 +28869,20 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_3)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_3)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_5)) {
@@ -27108,21 +28896,22 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
       PyObject* sequence = __pyx_t_5;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 3)) {
+        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-          if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_8 = PyTuple_GET_ITEM(sequence, 2); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-          if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_8 = PyList_GET_ITEM(sequence, 2); 
@@ -27130,28 +28919,35 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_INCREF(__pyx_t_6);
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_8);
+      #else
+      __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
       __pyx_t_9 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_10 = Py_TYPE(__pyx_t_9)->tp_iternext;
-      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
+      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
-      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L8_unpacking_failed;
+      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L8_unpacking_failed;
+      index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_8);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_9), 3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = NULL;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      goto __pyx_L9_unpacking_done;
-      __pyx_L8_unpacking_failed:;
+      goto __pyx_L6_unpacking_done;
+      __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      __pyx_t_10 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L9_unpacking_done:;
+      __pyx_L6_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v__);
     __pyx_v__ = __pyx_t_6;
@@ -27178,10 +28974,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  */
-    __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(__pyx_v_self->precompute_rank); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_8 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_5, Py_GE); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_8 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
@@ -27194,10 +28989,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)
  */
-      goto __pyx_L7_break;
-      goto __pyx_L10;
+      goto __pyx_L4_break;
+      goto __pyx_L7;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":304
  *             if rank >= self.precompute_rank:
@@ -27225,7 +29020,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_frequent_patterns), __pyx_n_s__insert); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_phrase);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_phrase);
     __Pyx_GIVEREF(__pyx_v_phrase);
@@ -27242,9 +29037,6 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:
  */
-    if (unlikely(((PyObject *)__pyx_v_I_set) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_15 = PySet_Add(__pyx_v_I_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":307
@@ -27263,10 +29055,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 super_frequent_patterns.insert(phrase)
  *                 J_set.add(phrase)
  */
-    __pyx_t_7 = PyInt_FromLong(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyInt_FromLong(__pyx_v_self->precompute_secondary_rank); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_7, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_5 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_7, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -27282,7 +29073,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_super_frequent_patterns), __pyx_n_s__insert); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_7));
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_v_phrase);
@@ -27299,15 +29090,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  * 
  *         queue = IntList(increment=1000)
  */
-      if (unlikely(((PyObject *)__pyx_v_J_set) == Py_None)) {
-        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-      }
       __pyx_t_15 = PySet_Add(__pyx_v_J_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L11;
+      goto __pyx_L8;
     }
-    __pyx_L11:;
+    __pyx_L8:;
   }
-  __pyx_L7_break:;
+  __pyx_L4_break:;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -27321,7 +29109,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__increment), __pyx_int_1000) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_queue = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
@@ -27391,7 +29179,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 for l from 1 <= l <= max_pattern_len:
  */
       ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, -1);
-      goto __pyx_L14;
+      goto __pyx_L11;
     }
     /*else*/ {
 
@@ -27431,10 +29219,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                     queue._append(i)
  *                     queue._append(l)
  */
-          goto __pyx_L16_break;
-          goto __pyx_L17;
+          goto __pyx_L13_break;
+          goto __pyx_L14;
         }
-        __pyx_L17:;
+        __pyx_L14:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":325
  *                     if node == NULL:
@@ -27465,9 +29253,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       }
-      __pyx_L16_break:;
+      __pyx_L13_break:;
     }
-    __pyx_L14:;
+    __pyx_L11:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":329
@@ -27592,7 +29380,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_t_11 = (__pyx_v_i2 == -1);
         if (!__pyx_t_11) {
-          __pyx_t_17 = ((__pyx_v_i2 - __pyx_v_i1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+          __pyx_t_17 = ((__pyx_v_i2 - __pyx_v_i1) >= __pyx_v_self->train_max_initial_size);
           __pyx_t_18 = __pyx_t_17;
         } else {
           __pyx_t_18 = __pyx_t_11;
@@ -27606,10 +29394,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  */
-          goto __pyx_L22_break;
-          goto __pyx_L23;
+          goto __pyx_L19_break;
+          goto __pyx_L20;
         }
-        __pyx_L23:;
+        __pyx_L20:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":342
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
@@ -27627,7 +29415,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):
  */
-        __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size);
+        __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= __pyx_v_self->train_min_gap_size);
         if (__pyx_t_18) {
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":344
@@ -27637,7 +29425,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)
  */
-          __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+          __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
           if (__pyx_t_11) {
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":345
@@ -27647,7 +29435,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)
  */
-            __pyx_t_17 = (((__pyx_v_l1 + __pyx_v_l2) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+            __pyx_t_17 = (((__pyx_v_l1 + __pyx_v_l2) + 1) <= __pyx_v_self->max_length);
             __pyx_t_19 = __pyx_t_17;
           } else {
             __pyx_t_19 = __pyx_t_11;
@@ -27746,7 +29534,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                                 is_super = 0
  */
               __pyx_v_is_super = 1;
-              goto __pyx_L28;
+              goto __pyx_L25;
             }
             /*else*/ {
 
@@ -27759,7 +29547,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_v_is_super = 0;
             }
-            __pyx_L28:;
+            __pyx_L25:;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":357
  *                             else:
@@ -27799,7 +29587,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_t_11 = (__pyx_v_i3 == -1);
               if (!__pyx_t_11) {
-                __pyx_t_18 = ((__pyx_v_i3 - __pyx_v_i1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+                __pyx_t_18 = ((__pyx_v_i3 - __pyx_v_i1) >= __pyx_v_self->train_max_initial_size);
                 __pyx_t_19 = __pyx_t_18;
               } else {
                 __pyx_t_19 = __pyx_t_11;
@@ -27813,10 +29601,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  */
-                goto __pyx_L30_break;
-                goto __pyx_L31;
+                goto __pyx_L27_break;
+                goto __pyx_L28;
               }
-              __pyx_L31:;
+              __pyx_L28:;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":362
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
@@ -27834,7 +29622,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):
  */
-              __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size);
+              __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= __pyx_v_self->train_min_gap_size);
               if (__pyx_t_19) {
 
                 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":364
@@ -27844,7 +29632,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  */
-                __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+                __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
                 if (__pyx_t_11) {
 
                   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":365
@@ -27854,7 +29642,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)
  */
-                  __pyx_t_18 = ((((__pyx_v_l1 + __pyx_v_l2) + __pyx_v_l3) + 2) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+                  __pyx_t_18 = ((((__pyx_v_l1 + __pyx_v_l2) + __pyx_v_l3) + 2) <= __pyx_v_self->max_length);
                   __pyx_t_17 = __pyx_t_18;
                 } else {
                   __pyx_t_17 = __pyx_t_11;
@@ -27979,12 +29767,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __pyx_t_3 = __pyx_f_3_sa_trie_node_data_append(__pyx_v_node, __pyx_v_i3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                  goto __pyx_L33;
+                  goto __pyx_L30;
                 }
-                __pyx_L33:;
-                goto __pyx_L32;
+                __pyx_L30:;
+                goto __pyx_L29;
               }
-              __pyx_L32:;
+              __pyx_L29:;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":377
  *                                         trie_node_data_append(node, i2)
@@ -27995,13 +29783,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_v_ptr3 = (__pyx_v_ptr3 + 2);
             }
-            __pyx_L30_break:;
-            goto __pyx_L27;
+            __pyx_L27_break:;
+            goto __pyx_L24;
           }
-          __pyx_L27:;
-          goto __pyx_L24;
+          __pyx_L24:;
+          goto __pyx_L21;
         }
-        __pyx_L24:;
+        __pyx_L21:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":378
  *                                         trie_node_data_append(node, i3)
@@ -28012,7 +29800,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_v_ptr2 = (__pyx_v_ptr2 + 2);
       }
-      __pyx_L22_break:;
+      __pyx_L19_break:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":379
  *                                 ptr3 = ptr3 + 2
@@ -28022,7 +29810,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 sent_count = sent_count + 1
  */
       __pyx_v_ptr1 = (__pyx_v_ptr1 + 2);
-      goto __pyx_L20;
+      goto __pyx_L17;
     }
     /*else*/ {
 
@@ -28060,7 +29848,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_t_3 = PyInt_FromLong(__pyx_v_sent_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+        __Pyx_GOTREF(__pyx_t_8);
         __Pyx_INCREF(((PyObject *)__pyx_kp_s_78));
         PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_78));
         __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_78));
@@ -28072,9 +29860,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        goto __pyx_L38;
+        goto __pyx_L35;
       }
-      __pyx_L38:;
+      __pyx_L35:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":384
  *                 if sent_count % 10000 == 0:
@@ -28085,7 +29873,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_ptr1 = (__pyx_v_ptr1 + 1);
     }
-    __pyx_L20:;
+    __pyx_L17:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":386
@@ -28100,7 +29888,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_8 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
   __pyx_t_8 = 0;
@@ -28109,9 +29897,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_8);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations = __pyx_t_8;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
+  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
+  __pyx_v_self->precomputed_collocations = __pyx_t_8;
   __pyx_t_8 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":387
@@ -28126,7 +29914,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -28135,9 +29923,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
+  __Pyx_DECREF(__pyx_v_self->precomputed_index);
+  __pyx_v_self->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":389
@@ -28211,7 +29999,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":393
@@ -28237,13 +30025,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  * 
  *         for pattern1 in I_set:
  */
-        if (unlikely(((PyObject *)__pyx_v_J2_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_J2_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L43;
+        goto __pyx_L40;
       }
-      __pyx_L43:;
+      __pyx_L40:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
@@ -28323,7 +30108,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+      __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":400
@@ -28349,13 +30134,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  * 
  *         for pattern1 in I_set:
  */
-        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L48;
+        goto __pyx_L45;
       }
-      __pyx_L48:;
+      __pyx_L45:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
@@ -28435,7 +30217,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":407
@@ -28461,9 +30243,6 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  *                     IJ_set.add(combined_pattern)
  */
-        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":409
@@ -28489,13 +30268,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  * 
  *         N = len(pattern_rank)
  */
-        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L53;
+        goto __pyx_L50;
       }
-      __pyx_L53:;
+      __pyx_L50:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
@@ -28508,10 +30284,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)
  */
-  if (unlikely(((PyObject *)__pyx_v_pattern_rank) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); 
+  __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_14;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":413
@@ -28527,7 +30300,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_cost_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
@@ -28546,7 +30319,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __pyx_v_count_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
@@ -28559,86 +30332,28 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *             if pattern not in IJ_set:
  *                 s = ""
  */
-  __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-    __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_14 = 0;
-    __pyx_t_4 = NULL;
-  } else {
-    __pyx_t_14 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  __pyx_t_14 = 0;
+  if (unlikely(__pyx_v_self->precomputed_collocations == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
-      if (__pyx_t_14 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
-      if (__pyx_t_14 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++;
-    } else {
-      __pyx_t_3 = __pyx_t_4(__pyx_t_1);
-      if (unlikely(!__pyx_t_3)) {
-        if (PyErr_Occurred()) {
-          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        break;
-      }
-      __Pyx_GOTREF(__pyx_t_3);
-    }
-    if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-      PyObject* sequence = __pyx_t_3;
-      if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
-        __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
-      } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
-        __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
-      }
-      __Pyx_INCREF(__pyx_t_8);
-      __Pyx_INCREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    } else {
-      Py_ssize_t index = -1;
-      __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_10 = Py_TYPE(__pyx_t_5)->tp_iternext;
-      index = 0; __pyx_t_8 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_8)) goto __pyx_L56_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_8);
-      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_7)) goto __pyx_L56_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_7);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_5), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L57_unpacking_done;
-      __pyx_L56_unpacking_failed:;
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L57_unpacking_done:;
-    }
+  __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_self->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_2), (&__pyx_t_13)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_1);
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_t_3 = 0;
+  while (1) {
+    __pyx_t_16 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_2, &__pyx_t_14, &__pyx_t_3, &__pyx_t_8, NULL, __pyx_t_13);
+    if (unlikely(__pyx_t_16 == 0)) break;
+    if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_8;
-    __pyx_t_8 = 0;
+    __pyx_v_pattern = __pyx_t_3;
+    __pyx_t_3 = 0;
     __Pyx_XDECREF(__pyx_v_arr);
-    __pyx_v_arr = __pyx_t_7;
-    __pyx_t_7 = 0;
+    __pyx_v_arr = __pyx_t_8;
+    __pyx_t_8 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":416
  *         count_by_rank = IntList(initial_len=N)
@@ -28647,7 +30362,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 s = ""
  *                 for word_id in pattern:
  */
-    __pyx_t_19 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_IJ_set), __pyx_v_pattern))); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, ((PyObject *)__pyx_v_IJ_set), Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":417
@@ -28669,34 +30384,42 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         s = s + "X "
  */
       if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-        __pyx_t_3 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
-        __pyx_t_20 = NULL;
+        __pyx_t_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_12 = 0;
+        __pyx_t_4 = NULL;
       } else {
-        __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_20 = Py_TYPE(__pyx_t_3)->tp_iternext;
+        __pyx_t_12 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_4 = Py_TYPE(__pyx_t_8)->tp_iternext;
       }
       for (;;) {
-        if (PyList_CheckExact(__pyx_t_3)) {
-          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-          __pyx_t_7 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
-        } else if (PyTuple_CheckExact(__pyx_t_3)) {
-          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-          __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
+        if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_8)) {
+          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_8)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_12); __Pyx_INCREF(__pyx_t_3); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_8)) {
+          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_12); __Pyx_INCREF(__pyx_t_3); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
         } else {
-          __pyx_t_7 = __pyx_t_20(__pyx_t_3);
-          if (unlikely(!__pyx_t_7)) {
+          __pyx_t_3 = __pyx_t_4(__pyx_t_8);
+          if (unlikely(!__pyx_t_3)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
               else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_GOTREF(__pyx_t_3);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_7;
-        __pyx_t_7 = 0;
+        __pyx_v_word_id = __pyx_t_3;
+        __pyx_t_3 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":419
  *                 s = ""
@@ -28705,10 +30428,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         s = s + "X "
  *                     else:
  */
-        __pyx_t_7 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __pyx_t_3 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_19) {
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":420
@@ -28718,12 +30440,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "
  */
-          __pyx_t_7 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_7);
+          __pyx_t_3 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_7;
-          __pyx_t_7 = 0;
-          goto __pyx_L61;
+          __pyx_v_s = __pyx_t_3;
+          __pyx_t_3 = 0;
+          goto __pyx_L56;
         }
         /*else*/ {
 
@@ -28734,21 +30456,21 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)
  *             else:
  */
-          __pyx_t_7 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_7 = PyNumber_Add(__pyx_v_s, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_7);
-          __pyx_t_8 = PyNumber_Add(__pyx_v_s, __pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __pyx_t_3 = PyNumber_Add(__pyx_t_7, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-          __pyx_t_7 = PyNumber_Add(__pyx_t_8, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_7;
-          __pyx_t_7 = 0;
+          __pyx_v_s = __pyx_t_3;
+          __pyx_t_3 = 0;
         }
-        __pyx_L61:;
+        __pyx_L56:;
       }
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":423
  *                     else:
@@ -28757,25 +30479,25 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *             else:
  *                 chunk = ()
  */
-      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__warn); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_7 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_84));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_84));
+      PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_84));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_84));
       __Pyx_INCREF(__pyx_v_s);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_s);
+      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_s);
       __Pyx_GIVEREF(__pyx_v_s);
-      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      goto __pyx_L58;
+      goto __pyx_L53;
     }
     /*else*/ {
 
@@ -28818,34 +30540,42 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  */
       if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-        __pyx_t_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_2 = 0;
-        __pyx_t_20 = NULL;
+        __pyx_t_7 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_7); __pyx_t_12 = 0;
+        __pyx_t_4 = NULL;
       } else {
-        __pyx_t_2 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_20 = Py_TYPE(__pyx_t_8)->tp_iternext;
+        __pyx_t_12 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_4 = Py_TYPE(__pyx_t_7)->tp_iternext;
       }
       for (;;) {
-        if (PyList_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_8)) break;
-          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
-        } else if (PyTuple_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
-          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
+        if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_7)) {
+          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_7)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_8 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_8); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_7)) {
+          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_8); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
         } else {
-          __pyx_t_3 = __pyx_t_20(__pyx_t_8);
-          if (unlikely(!__pyx_t_3)) {
+          __pyx_t_8 = __pyx_t_4(__pyx_t_7);
+          if (unlikely(!__pyx_t_8)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
               else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(__pyx_t_8);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_word_id = __pyx_t_8;
+        __pyx_t_8 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":429
  *                 arity = 0
@@ -28854,10 +30584,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1
  */
-        __pyx_t_3 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_8 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
         if (__pyx_t_19) {
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":430
@@ -28867,29 +30596,28 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         arity = arity + 1
  *                         chunk = ()
  */
-          __pyx_t_3 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_13 = __pyx_v_max_rank;
-          __pyx_t_5 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_16 = __pyx_v_max_rank;
+          __pyx_t_5 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
-          __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, __pyx_t_5, Py_GT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_5, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
           __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
           if (__pyx_t_19) {
-            __Pyx_INCREF(__pyx_t_3);
-            __pyx_t_7 = __pyx_t_3;
+            __Pyx_INCREF(__pyx_t_8);
+            __pyx_t_3 = __pyx_t_8;
           } else {
-            __pyx_t_6 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_6 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_6);
-            __pyx_t_7 = __pyx_t_6;
+            __pyx_t_3 = __pyx_t_6;
             __pyx_t_6 = 0;
           }
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-          __pyx_v_max_rank = __pyx_t_13;
+          __pyx_v_max_rank = __pyx_t_16;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":431
  *                     if word_id == -1:
@@ -28898,11 +30626,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         chunk = ()
  *                     else:
  */
-          __pyx_t_7 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_7);
+          __pyx_t_3 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_v_arity);
-          __pyx_v_arity = __pyx_t_7;
-          __pyx_t_7 = 0;
+          __pyx_v_arity = __pyx_t_3;
+          __pyx_t_3 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":432
  *                         max_rank = max(max_rank, pattern_rank[chunk])
@@ -28914,7 +30642,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
           __pyx_v_chunk = __pyx_empty_tuple;
-          goto __pyx_L64;
+          goto __pyx_L59;
         }
         /*else*/ {
 
@@ -28925,21 +30653,21 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  */
-          __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_7));
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_v_word_id);
-          PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_word_id);
+          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_word_id);
           __Pyx_GIVEREF(__pyx_v_word_id);
-          __pyx_t_3 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-          __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+          __pyx_t_8 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
-          __pyx_v_chunk = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __pyx_v_chunk = __pyx_t_8;
+          __pyx_t_8 = 0;
         }
-        __pyx_L64:;
+        __pyx_L59:;
       }
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":435
  *                     else:
@@ -28948,29 +30676,28 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  */
-      __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_13 = __pyx_v_max_rank;
-      __pyx_t_7 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_7, Py_GT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_16 = __pyx_v_max_rank;
+      __pyx_t_3 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_6 = PyObject_RichCompare(__pyx_t_7, __pyx_t_3, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       if (__pyx_t_19) {
-        __Pyx_INCREF(__pyx_t_8);
-        __pyx_t_3 = __pyx_t_8;
+        __Pyx_INCREF(__pyx_t_7);
+        __pyx_t_8 = __pyx_t_7;
       } else {
-        __pyx_t_6 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_3 = __pyx_t_6;
+        __pyx_t_8 = __pyx_t_6;
         __pyx_t_6 = 0;
       }
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_v_max_rank = __pyx_t_13;
+      __pyx_v_max_rank = __pyx_t_16;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":436
  *                         chunk = chunk + (word_id,)
@@ -28979,8 +30706,8 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  * 
  */
-      __pyx_t_2 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_2));
+      __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_12));
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":437
  *                 max_rank = max(max_rank, pattern_rank[chunk])
@@ -28989,26 +30716,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  * 
  *         cumul_cost = 0
  */
-      __pyx_t_3 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_2 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyInt_FromSsize_t(__pyx_t_12); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_6 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = __Pyx_PyNumber_Divide(__pyx_t_8, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyNumber_Add(__pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyNumber_Add(__pyx_t_8, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_13;
+      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_16;
     }
-    __pyx_L58:;
+    __pyx_L53:;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -29088,35 +30815,35 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_7 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_8 = PyTuple_New(6); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+    __pyx_t_8 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_7 = PyTuple_New(6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_85));
+    PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_85));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
-    PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7);
-    __Pyx_GIVEREF(__pyx_t_7);
-    PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_8);
+    __Pyx_GIVEREF(__pyx_t_8);
     __Pyx_INCREF(__pyx_v_cumul_count);
-    PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_v_cumul_count);
+    PyTuple_SET_ITEM(__pyx_t_7, 4, __pyx_v_cumul_count);
     __Pyx_GIVEREF(__pyx_v_cumul_count);
     __Pyx_INCREF(__pyx_v_cumul_cost);
-    PyTuple_SET_ITEM(__pyx_t_8, 5, __pyx_v_cumul_cost);
+    PyTuple_SET_ITEM(__pyx_t_7, 5, __pyx_v_cumul_cost);
     __Pyx_GIVEREF(__pyx_v_cumul_cost);
     __pyx_t_1 = 0;
-    __pyx_t_7 = 0;
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_8 = 0;
+    __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":446
@@ -29126,11 +30853,14 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:
  */
-  __pyx_t_3 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_3);
-  __pyx_t_14 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_num_found_patterns = __pyx_t_14;
+  __pyx_t_8 = __pyx_v_self->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_8);
+  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_v_num_found_patterns = __pyx_t_8;
+  __pyx_t_8 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":447
  * 
@@ -29139,24 +30869,24 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *             if pattern not in self.precomputed_collocations:
  *                 self.precomputed_collocations[pattern] = IntList()
  */
-  __pyx_t_3 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
+  __pyx_t_8 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_4 = Py_TYPE(__pyx_t_8)->tp_iternext;
   for (;;) {
     {
-      __pyx_t_8 = __pyx_t_4(__pyx_t_3);
-      if (unlikely(!__pyx_t_8)) {
+      __pyx_t_7 = __pyx_t_4(__pyx_t_8);
+      if (unlikely(!__pyx_t_7)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
           else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
-      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_GOTREF(__pyx_t_7);
     }
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_8;
-    __pyx_t_8 = 0;
+    __pyx_v_pattern = __pyx_t_7;
+    __pyx_t_7 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":448
  *         num_found_patterns = len(self.precomputed_collocations)
@@ -29165,7 +30895,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 self.precomputed_collocations[pattern] = IntList()
  * 
  */
-    __pyx_t_19 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_v_pattern))); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, __pyx_v_self->precomputed_collocations, Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":449
@@ -29175,15 +30905,15 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  * 
  *         cdef float stop_time = monitor_cpu()
  */
-      __pyx_t_8 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      if (PyObject_SetItem(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_v_pattern, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      goto __pyx_L69;
+      __pyx_t_7 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_pattern, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L64;
     }
-    __pyx_L69:;
+    __pyx_L64:;
   }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":451
  *                 self.precomputed_collocations[pattern] = IntList()
@@ -29201,38 +30931,36 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))
  */
-  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_num_found_patterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_6 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_6);
-  __pyx_t_14 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_14); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __pyx_v_self->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_8);
+  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_6 = PyTuple_New(4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_86));
-  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_86));
+  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_s_86));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_86));
-  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_3);
-  __Pyx_GIVEREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_6);
-  __Pyx_GIVEREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_v_num_found_patterns);
+  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_v_num_found_patterns);
+  __Pyx_GIVEREF(__pyx_v_num_found_patterns);
+  PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
   __Pyx_INCREF(__pyx_v_x);
-  PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_v_x);
+  PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_v_x);
   __Pyx_GIVEREF(__pyx_v_x);
-  __pyx_t_3 = 0;
-  __pyx_t_6 = 0;
-  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":453
  *         cdef float stop_time = monitor_cpu()
@@ -29240,56 +30968,56 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))             # <<<<<<<<<<<<<<
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))
  */
-  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_6 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_7 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __pyx_v_self->precomputed_index;
+  __Pyx_INCREF(__pyx_t_8);
+  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index;
-  __Pyx_INCREF(__pyx_t_6);
-  __pyx_t_14 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_14); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_8));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_87));
+  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_87));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6);
-  __Pyx_GIVEREF(__pyx_t_6);
-  __pyx_t_6 = 0;
-  __pyx_t_6 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":454
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
  */
-  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_88));
-  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_88));
+  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_s_88));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_88));
-  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6);
-  __Pyx_GIVEREF(__pyx_t_6);
-  __pyx_t_6 = 0;
-  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
+  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -29332,43 +31060,39 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_XDECREF(__pyx_v_arity);
   __Pyx_XDECREF(__pyx_v_cumul_cost);
   __Pyx_XDECREF(__pyx_v_cumul_count);
+  __Pyx_XDECREF(__pyx_v_num_found_patterns);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":11
- *     cdef IntList ha
- * 
- *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
- *         self.darray = DataArray()
- *         self.sa = IntList()
- */
-
-static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
     PyObject* values[3] = {0,0,0};
+
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":11
+ *     cdef IntList ha
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
+ *         self.darray = DataArray()
+ *         self.sa = IntList()
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -29376,7 +31100,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -29394,7 +31118,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -29417,6 +31141,22 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray___cinit__(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text, __pyx_v_side);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":12
  * 
@@ -29428,9 +31168,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->darray);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->darray));
+  __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":13
@@ -29443,9 +31183,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":14
@@ -29458,9 +31198,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->ha);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->ha));
+  __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":15
@@ -29480,10 +31220,10 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
  *         elif from_text:
  *             self.read_text(from_text, side)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -29492,7 +31232,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":17
@@ -29512,10 +31252,10 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
  * 
  *     def __getitem__(self, i):
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -29527,9 +31267,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -29544,6 +31284,17 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_2__getitem__(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":20
  *             self.read_text(from_text, side)
  * 
@@ -29552,8 +31303,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -29561,7 +31311,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":21
  * 
@@ -29572,7 +31322,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sa->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -29590,6 +31340,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_5getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_5getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getSentId (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_4getSentId(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":23
  *         return self.sa.arr[i]
  * 
@@ -29598,8 +31359,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentId(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -29608,7 +31368,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentId");
+  __Pyx_RefNannySetupContext("getSentId", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":24
  * 
@@ -29618,10 +31378,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self,
  *     def getSent(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__getSentId); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__getSentId); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_i);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -29647,6 +31407,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_7getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_7getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getSent (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_6getSent(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":26
  *         return self.darray.getSentId(i)
  * 
@@ -29655,8 +31426,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self,
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6getSent(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -29665,7 +31435,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSent");
+  __Pyx_RefNannySetupContext("getSent", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":27
  * 
@@ -29675,10 +31445,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, Py
  *     def getSentPos(self, loc):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__getSent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__getSent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_i);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -29704,6 +31474,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_9getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_9getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getSentPos (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_8getSentPos(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":29
  *         return self.darray.getSent(i)
  * 
@@ -29712,8 +31493,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, Py
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8getSentPos(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -29722,7 +31502,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentPos");
+  __Pyx_RefNannySetupContext("getSentPos", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":30
  * 
@@ -29732,10 +31512,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self,
  *     def read_text(self, filename, side):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__getSentPos); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__getSentPos); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_loc);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_loc);
   __Pyx_GIVEREF(__pyx_v_loc);
@@ -29761,75 +31541,40 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":32
- *         return self.darray.getSentPos(loc)
- * 
- *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
- *         '''Constructs suffix array using the algorithm
- *         of Larsson & Sadahkane (1999)'''
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_5read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
-static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_10read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
+static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_filename = 0;
   PyObject *__pyx_v_side = 0;
-  int __pyx_v_V;
-  int __pyx_v_N;
-  int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_h;
-  int __pyx_v_a_i;
-  int __pyx_v_n;
-  int __pyx_v_current_run;
-  int __pyx_v_skip;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_word_count = 0;
-  float __pyx_v_sort_start_time;
-  float __pyx_v_start_time;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  long __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
-  __Pyx_RefNannySetupContext("read_text");
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("read_text", 1, 2, 2, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -29848,6 +31593,50 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_10read_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":32
+ *         return self.darray.getSentPos(loc)
+ * 
+ *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
+ *         '''Constructs suffix array using the algorithm
+ *         of Larsson & Sadahkane (1999)'''
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side) {
+  int __pyx_v_V;
+  int __pyx_v_N;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_h;
+  int __pyx_v_a_i;
+  int __pyx_v_n;
+  int __pyx_v_current_run;
+  int __pyx_v_skip;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_word_count = 0;
+  float __pyx_v_sort_start_time;
+  float __pyx_v_start_time;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  long __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":38
  *         cdef IntList isa, word_count
@@ -29864,13 +31653,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__use_sent_id), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->darray);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->darray));
+  __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
   __pyx_t_2 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":39
@@ -29880,7 +31669,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *         V = len(self.darray.id2word)
  * 
  */
-  __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
+  __pyx_t_2 = ((PyObject *)__pyx_v_self->darray);
   __Pyx_INCREF(__pyx_t_2);
   __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -29893,7 +31682,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  * 
  *         self.sa = IntList(initial_len=N)
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->id2word;
+  __pyx_t_2 = __pyx_v_self->darray->id2word;
   __Pyx_INCREF(__pyx_t_2);
   __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -29912,13 +31701,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":43
@@ -29934,13 +31723,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->ha);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->ha));
+  __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":45
@@ -29956,7 +31745,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_isa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
@@ -29975,7 +31764,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_word_count = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
@@ -30016,7 +31805,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  */
-    __pyx_v_a_i = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->data->arr[__pyx_v_i]);
+    __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":53
  *         for i from 0 <= i < N:
@@ -30054,7 +31843,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i]) = __pyx_v_n;
+    (__pyx_v_self->ha->arr[__pyx_v_i]) = __pyx_v_n;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":58
  *         for i from 0 <= i < V+1:
@@ -30092,7 +31881,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  */
-    __pyx_v_a_i = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->data->arr[__pyx_v_i]);
+    __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":63
  *         for i from 0 <= i < N:
@@ -30101,7 +31890,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
+    (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":64
  *             a_i = self.darray.data.arr[i]
@@ -30110,7 +31899,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  */
-    (__pyx_v_isa->arr[__pyx_v_i]) = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[(__pyx_v_a_i + 1)]) - 1);
+    (__pyx_v_isa->arr[__pyx_v_i]) = ((__pyx_v_self->ha->arr[(__pyx_v_a_i + 1)]) - 1);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":65
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
@@ -30150,7 +31939,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_t_6 = (__pyx_v_i < __pyx_v_V);
     if (__pyx_t_6) {
-      __pyx_t_7 = (((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[(__pyx_v_i + 1)]) - (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i])) == 1);
+      __pyx_t_7 = (((__pyx_v_self->ha->arr[(__pyx_v_i + 1)]) - (__pyx_v_self->ha->arr[__pyx_v_i])) == 1);
       __pyx_t_8 = __pyx_t_7;
     } else {
       __pyx_t_8 = __pyx_t_6;
@@ -30165,7 +31954,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                 if current_run > 0:
  */
       __pyx_v_current_run = (__pyx_v_current_run + 1);
-      goto __pyx_L14;
+      goto __pyx_L11;
     }
     /*else*/ {
 
@@ -30186,7 +31975,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                     current_run = 0
  * 
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
+        (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":75
  *                 if current_run > 0:
@@ -30196,11 +31985,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))
  */
         __pyx_v_current_run = 0;
-        goto __pyx_L15;
+        goto __pyx_L12;
       }
-      __pyx_L15:;
+      __pyx_L12:;
     }
-    __pyx_L14:;
+    __pyx_L11:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":77
@@ -30218,7 +32007,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_2 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+  __Pyx_GOTREF(__pyx_t_9);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_89));
   PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_89));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_89));
@@ -30248,7 +32037,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *             logger.debug("    Refining, sort depth = %d", h)
  */
   while (1) {
-    __pyx_t_8 = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[0]) != (-__pyx_v_N));
+    __pyx_t_8 = ((__pyx_v_self->sa->arr[0]) != (-__pyx_v_N));
     if (!__pyx_t_8) break;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":82
@@ -30275,7 +32064,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __pyx_t_2 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_90));
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_90));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_90));
@@ -30324,7 +32113,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                     skip = skip + self.sa.arr[i]
  *                     i = i - self.sa.arr[i]
  */
-      __pyx_t_8 = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) < 0);
+      __pyx_t_8 = ((__pyx_v_self->sa->arr[__pyx_v_i]) < 0);
       if (__pyx_t_8) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":88
@@ -30334,7 +32123,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                     i = i - self.sa.arr[i]
  *                 else:
  */
-        __pyx_v_skip = (__pyx_v_skip + (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]));
+        __pyx_v_skip = (__pyx_v_skip + (__pyx_v_self->sa->arr[__pyx_v_i]));
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":89
  *                 if self.sa.arr[i] < 0:
@@ -30343,8 +32132,8 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                 else:
  *                     if skip < 0:
  */
-        __pyx_v_i = (__pyx_v_i - (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]));
-        goto __pyx_L20;
+        __pyx_v_i = (__pyx_v_i - (__pyx_v_self->sa->arr[__pyx_v_i]));
+        goto __pyx_L17;
       }
       /*else*/ {
 
@@ -30365,7 +32154,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  */
-          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
+          (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":93
  *                     if skip < 0:
@@ -30375,9 +32164,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                     self.q3sort(i, j, h, isa)
  */
           __pyx_v_skip = 0;
-          goto __pyx_L21;
+          goto __pyx_L18;
         }
-        __pyx_L21:;
+        __pyx_L18:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":94
  *                         self.sa.arr[i+skip] = skip
@@ -30386,7 +32175,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  */
-        __pyx_v_j = (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i])]);
+        __pyx_v_j = (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":95
  *                         skip = 0
@@ -30395,7 +32184,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                     i = j+1
  *             if skip < 0:
  */
-        __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
@@ -30404,7 +32193,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
         __pyx_t_10 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __pyx_t_11 = PyTuple_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+        __Pyx_GOTREF(__pyx_t_11);
         PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_9);
@@ -30432,7 +32221,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
         __pyx_v_i = (__pyx_v_j + 1);
       }
-      __pyx_L20:;
+      __pyx_L17:;
     }
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":97
@@ -30452,10 +32241,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *             h = h * 2
  *             logger.debug("    Refinement took %f seconds", (monitor_cpu() - sort_start_time))
  */
-      (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
-      goto __pyx_L22;
+      (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
+      goto __pyx_L19;
     }
-    __pyx_L22:;
+    __pyx_L19:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":99
  *             if skip < 0:
@@ -30481,7 +32270,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_91));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_91));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_91));
@@ -30538,7 +32327,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
  * 
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_j]) = __pyx_v_i;
+    (__pyx_v_self->sa->arr[__pyx_v_j]) = __pyx_v_i;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":107
@@ -30556,7 +32345,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
   __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+  __Pyx_GOTREF(__pyx_t_11);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_94));
   PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_kp_s_94));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_94));
@@ -30587,49 +32376,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":109
- *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
- * 
- *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
- *         '''This is a ternary quicksort. It divides the array into
- *         three partitions: items less than the pivot, items equal
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_6q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_12q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
+static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_h;
   struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
   PyObject *__pyx_v_pad = 0;
-  int __pyx_v_k;
-  int __pyx_v_midpoint;
-  int __pyx_v_pval;
-  int __pyx_v_phead;
-  int __pyx_v_ptail;
-  int __pyx_v_tmp;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  long __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *__pyx_t_8 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__i,&__pyx_n_s__j,&__pyx_n_s__h,&__pyx_n_s__isa,&__pyx_n_s__pad,0};
-  __Pyx_RefNannySetupContext("q3sort");
+  __Pyx_RefNannySetupContext("q3sort (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__i,&__pyx_n_s__j,&__pyx_n_s__h,&__pyx_n_s__isa,&__pyx_n_s__pad,0};
     PyObject* values[5] = {0,0,0,0,0};
     values[4] = ((PyObject *)__pyx_kp_s_45);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -30639,26 +32405,22 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -30669,7 +32431,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -30697,6 +32459,44 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_isa), __pyx_ptype_3_sa_IntList, 1, "isa", 0))) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_12q3sort(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_i, __pyx_v_j, __pyx_v_h, __pyx_v_isa, __pyx_v_pad);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":109
+ *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
+ * 
+ *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
+ *         '''This is a ternary quicksort. It divides the array into
+ *         three partitions: items less than the pivot, items equal
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad) {
+  int __pyx_v_k;
+  int __pyx_v_midpoint;
+  int __pyx_v_pval;
+  int __pyx_v_phead;
+  int __pyx_v_ptail;
+  int __pyx_v_tmp;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  long __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("q3sort", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":116
  *         cdef int k, midpoint, pval, phead, ptail, tmp
@@ -30720,7 +32520,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __pyx_t_3 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -30731,7 +32531,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -30741,9 +32541,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":118
  *         if j-i < -1:
@@ -30765,9 +32565,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_XDECREF(__pyx_r);
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":120
  *         if j-i == -1:    # recursive base case -- empty interval
@@ -30786,7 +32586,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *             self.sa.arr[i] = -1
  *             return
  */
-    (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i])]) = __pyx_v_i;
+    (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]) = __pyx_v_i;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":122
  *         if (j-i == 0):    # recursive base case -- singleton interval
@@ -30795,7 +32595,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *             return
  * 
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) = -1;
+    (__pyx_v_self->sa->arr[__pyx_v_i]) = -1;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":123
  *             isa.arr[self.sa.arr[i]] = i
@@ -30807,9 +32607,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_XDECREF(__pyx_r);
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L5;
   }
-  __pyx_L8:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":132
  *         # If the method of assigning word_id's is changed, this method
@@ -30827,7 +32627,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  */
-  __pyx_v_pval = (__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
+  __pyx_v_pval = (__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":134
  *         midpoint = (i+j)/2
@@ -30846,7 +32646,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  */
-    __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]);
+    __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_midpoint]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":136
  *         if i != midpoint:
@@ -30855,7 +32655,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *             self.sa.arr[i] = tmp
  *         phead = i
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]);
+    (__pyx_v_self->sa->arr[__pyx_v_midpoint]) = (__pyx_v_self->sa->arr[__pyx_v_i]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":137
  *             tmp = self.sa.arr[midpoint]
@@ -30864,10 +32664,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *         phead = i
  *         ptail = i
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) = __pyx_v_tmp;
-    goto __pyx_L9;
+    (__pyx_v_self->sa->arr[__pyx_v_i]) = __pyx_v_tmp;
+    goto __pyx_L6;
   }
-  __pyx_L9:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":138
  *             self.sa.arr[midpoint] = self.sa.arr[i]
@@ -30904,7 +32704,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]
  */
-    __pyx_t_1 = ((__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
+    __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
     if (__pyx_t_1) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":145
@@ -30924,7 +32724,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  */
-        __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]);
+        __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":147
  *                 if k > ptail+1:
@@ -30933,7 +32733,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  *                     self.sa.arr[ptail+1] = tmp
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
+        (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":148
  *                     tmp = self.sa.arr[phead]
@@ -30942,7 +32742,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]);
+        (__pyx_v_self->sa->arr[__pyx_v_k]) = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":149
  *                     self.sa.arr[phead] = self.sa.arr[k]
@@ -30951,8 +32751,8 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]) = __pyx_v_tmp;
-        goto __pyx_L13;
+        (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = __pyx_v_tmp;
+        goto __pyx_L10;
       }
       /*else*/ {
 
@@ -30963,7 +32763,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  */
-        __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]);
+        __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":152
  *                 else: # k == ptail+1
@@ -30972,7 +32772,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
+        (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":153
  *                     tmp = self.sa.arr[phead]
@@ -30981,9 +32781,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                 phead = phead + 1
  *                 ptail = ptail + 1
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
+        (__pyx_v_self->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
       }
-      __pyx_L13:;
+      __pyx_L10:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":154
  *                     self.sa.arr[phead] = self.sa.arr[k]
@@ -31002,7 +32802,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  */
       __pyx_v_ptail = (__pyx_v_ptail + 1);
-      goto __pyx_L12;
+      goto __pyx_L9;
     }
     /*else*/ {
 
@@ -31013,7 +32813,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]
  */
-      __pyx_t_1 = ((__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
+      __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
       if (__pyx_t_1) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":158
@@ -31033,7 +32833,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp
  */
-          __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]);
+          __pyx_v_tmp = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":160
  *                     if k > ptail+1:
@@ -31042,7 +32842,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                         self.sa.arr[k] = tmp
  *                     ptail = ptail + 1
  */
-          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
+          (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":161
  *                         tmp = self.sa.arr[ptail+1]
@@ -31051,10 +32851,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                     ptail = ptail + 1
  * 
  */
-          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
-          goto __pyx_L15;
+          (__pyx_v_self->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
+          goto __pyx_L12;
         }
-        __pyx_L15:;
+        __pyx_L12:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":162
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
@@ -31064,11 +32864,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *         # recursively sort smaller suffixes
  */
         __pyx_v_ptail = (__pyx_v_ptail + 1);
-        goto __pyx_L14;
+        goto __pyx_L11;
       }
-      __pyx_L14:;
+      __pyx_L11:;
     }
-    __pyx_L12:;
+    __pyx_L9:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":165
@@ -31078,7 +32878,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  * 
  *         # update suffixes with pivot value
  */
-  __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_4 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
@@ -31089,7 +32889,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_7 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __pyx_t_8 = PyTuple_New(5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+  __Pyx_GOTREF(__pyx_t_8);
   PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
@@ -31128,7 +32928,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1
  */
-    (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
+    (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":171
@@ -31148,10 +32948,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  * 
  *         # recursively sort larger suffixes
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = -1;
-    goto __pyx_L18;
+    (__pyx_v_self->sa->arr[__pyx_v_phead]) = -1;
+    goto __pyx_L15;
   }
-  __pyx_L18:;
+  __pyx_L15:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":175
  * 
@@ -31160,7 +32960,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  * 
  * 
  */
-  __pyx_t_7 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __pyx_t_8 = PyInt_FromLong((__pyx_v_ptail + 1)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
@@ -31171,7 +32971,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_2 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
   PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -31210,6 +33010,27 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_14write_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":178
  * 
  * 
@@ -31218,9 +33039,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -31229,16 +33048,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":179
  * 
@@ -31247,12 +33057,12 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self,
  * 
  *     def read_binary(self, char* filename):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_t_2 = 0;
@@ -31276,24 +33086,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":181
- *         self.darray.write_text(filename)
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE *f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -31303,6 +33102,24 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_16read_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":181
+ *         self.darray.write_text(filename)
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE *f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":183
  *     def read_binary(self, char* filename):
@@ -31320,7 +33137,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->read_handle(__pyx_v_self->darray, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":185
  *         f = fopen(filename, "r")
@@ -31329,7 +33146,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
  *         self.ha.read_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->read_handle(__pyx_v_self->sa, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":186
  *         self.darray.read_handle(f)
@@ -31338,7 +33155,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->read_handle(__pyx_v_self->ha, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":187
  *         self.sa.read_handle(f)
@@ -31355,24 +33172,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":189
- *         fclose(f)
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -31382,6 +33188,24 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_18write_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":189
+ *         fclose(f)
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":191
  *     def write_binary(self, char* filename):
@@ -31399,7 +33223,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->write_handle(__pyx_v_self->darray, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":193
  *         f = fopen(filename, "w")
@@ -31408,7 +33232,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
  *         self.ha.write_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->write_handle(__pyx_v_self->sa, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":194
  *         self.darray.write_handle(f)
@@ -31417,7 +33241,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->write_handle(__pyx_v_self->ha, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":195
  *         self.sa.write_handle(f)
@@ -31434,6 +33258,27 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_20write_enhanced(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":197
  *         fclose(f)
  * 
@@ -31442,9 +33287,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
  *             self.darray.write_enhanced_handle(f)
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_a_i = NULL;
   PyObject *__pyx_v_w_i = NULL;
@@ -31466,16 +33309,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
  * 
@@ -31488,7 +33322,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -31500,21 +33334,22 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":199
  *     def write_enhanced(self, char* filename):
@@ -31523,18 +33358,18 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
           __Pyx_INCREF(__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":200
  *         with open(filename, "w") as f:
@@ -31543,35 +33378,43 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa))) {
-            __pyx_t_7 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa); __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->sa)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sa))) {
+            __pyx_t_2 = ((PyObject *)__pyx_v_self->sa); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_7);
-            __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sa)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_7)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_7)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_7);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_a_i);
-            __pyx_v_a_i = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_a_i = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":201
  *             self.darray.write_enhanced_handle(f)
@@ -31580,22 +33423,22 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
  *             f.write("\n")
  *             for w_i in self.ha:
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_1));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-            __pyx_t_1 = 0;
-            __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_4));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
+            __pyx_t_4 = 0;
+            __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           }
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":202
  *             for a_i in self.sa:
@@ -31604,12 +33447,12 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  */
-          __pyx_t_7 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __pyx_t_1 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_k_tuple_96), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_96), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":203
  *                 f.write("%d " % a_i)
@@ -31618,35 +33461,43 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
  *                 f.write("%d " % w_i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha); __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->ha)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->ha))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->ha); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->ha)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_7 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_7); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_7); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_7 = __pyx_t_9(__pyx_t_1);
-              if (unlikely(!__pyx_t_7)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_7);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_w_i);
-            __pyx_v_w_i = __pyx_t_7;
-            __pyx_t_7 = 0;
+            __pyx_v_w_i = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":204
  *             f.write("\n")
@@ -31655,22 +33506,22 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
  *             f.write("\n")
  * 
  */
-            __pyx_t_7 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_7);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_10));
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":205
  *             for w_i in self.ha:
@@ -31679,21 +33530,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
@@ -31705,75 +33556,75 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_1, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_4, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_7));
           __Pyx_INCREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
-          __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_7, NULL);
+          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
+            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_1, __pyx_t_2);
-            __pyx_t_10 = 0; __pyx_t_1 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_4, __pyx_t_1);
+            __pyx_t_10 = 0; __pyx_t_4 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_98, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_98, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -31781,7 +33632,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -31807,7 +33658,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__search_high");
+  __Pyx_RefNannySetupContext("__search_high", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":210
  *         cdef int midpoint
@@ -31858,7 +33709,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
  *         else:
  *             return self.__search_high(word_id, offset, low, midpoint)
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
     goto __pyx_L0;
     goto __pyx_L4;
   }
@@ -31871,7 +33722,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
  * 
  *     cdef int __search_low(self, int word_id, int offset, int low, int high):
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
     goto __pyx_L0;
   }
   __pyx_L4:;
@@ -31895,7 +33746,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__search_low");
+  __Pyx_RefNannySetupContext("__search_low", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":221
  *         cdef int midpoint
@@ -31946,7 +33797,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
  *         else:
  *             return self.__search_low(word_id, offset, midpoint+1, high)
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
     goto __pyx_L0;
     goto __pyx_L4;
   }
@@ -31959,7 +33810,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
     goto __pyx_L0;
   }
   __pyx_L4:;
@@ -31987,7 +33838,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get_range");
+  __Pyx_RefNannySetupContext("__get_range", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":230
  * 
@@ -31997,7 +33848,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":231
@@ -32007,10 +33858,10 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):
  */
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -32054,7 +33905,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__lookup_helper");
+  __Pyx_RefNannySetupContext("__lookup_helper", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":236
  *         cdef int midpoint
@@ -32079,7 +33930,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
     __pyx_t_3 = PyInt_FromLong((__pyx_v_self->ha->arr[(__pyx_v_word_id + 1)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -32145,7 +33996,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -32172,7 +34023,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -32189,7 +34040,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *     def lookup(self, word, int offset, int low, int high):
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -32211,37 +34062,23 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":249
- *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
- * 
- *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
- *         cdef int wordid
- *         if low == -1:
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_word = 0;
   int __pyx_v_offset;
   int __pyx_v_low;
   int __pyx_v_high;
-  PyObject *__pyx_v_word_id = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
-  __Pyx_RefNannySetupContext("lookup");
+  __Pyx_RefNannySetupContext("lookup (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
     PyObject* values[4] = {0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -32250,32 +34087,28 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -32298,6 +34131,31 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_22lookup(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_word, __pyx_v_offset, __pyx_v_low, __pyx_v_high);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":249
+ *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
+ * 
+ *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
+ *         cdef int wordid
+ *         if low == -1:
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high) {
+  PyObject *__pyx_v_word_id = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("lookup", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":251
  *     def lookup(self, word, int offset, int low, int high):
@@ -32317,9 +34175,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  *             high = len(self.sa)
  */
     __pyx_v_low = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":253
  *         if low == -1:
@@ -32338,14 +34196,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]
  */
-    __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
+    __pyx_t_2 = ((PyObject *)__pyx_v_self->sa);
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_v_high = __pyx_t_3;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":255
  *         if high == -1:
@@ -32354,7 +34212,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)
  */
-  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->word2id, __pyx_v_word))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->darray->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":256
@@ -32364,7 +34222,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  */
-    __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_word_id = __pyx_t_2;
     __pyx_t_2 = 0;
@@ -32378,12 +34236,12 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->__pyx_vtab)->__lookup_helper(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L5;
   }
   /*else*/ {
 
@@ -32397,7 +34255,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
     __pyx_r = Py_None;
     goto __pyx_L0;
   }
-  __pyx_L8:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -32412,7 +34270,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":35
+/* Python wrapper */
+static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_8TrieNode___cinit__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":37
  *     cdef public children
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -32420,32 +34292,28 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  * 
  */
 
-static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":36
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":38
  * 
  *     def __cinit__(self):
  *         self.children = {}             # <<<<<<<<<<<<<<
  * 
  * cdef class ExtendedTrieNode(TrieNode):
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->children);
+  __Pyx_DECREF(__pyx_v_self->children);
+  __pyx_v_self->children = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   __pyx_r = 0;
@@ -32459,7 +34327,18 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":33
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children___get__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":35
  * 
  * cdef class TrieNode:
  *     cdef public children             # <<<<<<<<<<<<<<
@@ -32467,14 +34346,13 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *_
  *     def __cinit__(self):
  */
 
-static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __pyx_r = ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children;
+  __Pyx_INCREF(__pyx_v_self->children);
+  __pyx_r = __pyx_v_self->children;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32484,66 +34362,85 @@ static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_8TrieNode_8children_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_8TrieNode_8children_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_8TrieNode_8children_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_8TrieNode_8children_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children_2__set__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->children);
+  __Pyx_DECREF(__pyx_v_self->children);
+  __pyx_v_self->children = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_8TrieNode_8children_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_8TrieNode_8children_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_8TrieNode_8children_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_8TrieNode_8children_5__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children_4__del__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_8TrieNode_8children_4__del__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->children);
+  __Pyx_DECREF(__pyx_v_self->children);
+  __pyx_v_self->children = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":43
- *     cdef public suffix_link
- * 
- *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
- *         self.phrase = phrase
- *         self.phrase_location = phrase_location
- */
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_phrase = 0;
   PyObject *__pyx_v_phrase_location = 0;
   PyObject *__pyx_v_suffix_link = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
     PyObject* values[3] = {0,0,0};
+
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":45
+ *     cdef public suffix_link
+ * 
+ *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
+ *         self.phrase = phrase
+ *         self.phrase_location = phrase_location
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -32551,7 +34448,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__phrase);
@@ -32569,7 +34466,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -32586,14 +34483,23 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.ExtendedTrieNode.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), __pyx_v_phrase, __pyx_v_phrase_location, __pyx_v_suffix_link);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_phrase, PyObject *__pyx_v_phrase_location, PyObject *__pyx_v_suffix_link) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":44
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":46
  * 
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase             # <<<<<<<<<<<<<<
@@ -32602,11 +34508,11 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  */
   __Pyx_INCREF(__pyx_v_phrase);
   __Pyx_GIVEREF(__pyx_v_phrase);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = __pyx_v_phrase;
+  __Pyx_GOTREF(__pyx_v_self->phrase);
+  __Pyx_DECREF(__pyx_v_self->phrase);
+  __pyx_v_self->phrase = __pyx_v_phrase;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":45
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":47
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location             # <<<<<<<<<<<<<<
@@ -32615,11 +34521,11 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  */
   __Pyx_INCREF(__pyx_v_phrase_location);
   __Pyx_GIVEREF(__pyx_v_phrase_location);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = __pyx_v_phrase_location;
+  __Pyx_GOTREF(__pyx_v_self->phrase_location);
+  __Pyx_DECREF(__pyx_v_self->phrase_location);
+  __pyx_v_self->phrase_location = __pyx_v_phrase_location;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":46
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":48
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location
  *         self.suffix_link = suffix_link             # <<<<<<<<<<<<<<
@@ -32628,16 +34534,27 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  */
   __Pyx_INCREF(__pyx_v_suffix_link);
   __Pyx_GIVEREF(__pyx_v_suffix_link);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = __pyx_v_suffix_link;
+  __Pyx_GOTREF(__pyx_v_self->suffix_link);
+  __Pyx_DECREF(__pyx_v_self->suffix_link);
+  __pyx_v_self->suffix_link = __pyx_v_suffix_link;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":39
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":41
  * 
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase             # <<<<<<<<<<<<<<
@@ -32645,14 +34562,13 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  *     cdef public suffix_link
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase;
+  __Pyx_INCREF(__pyx_v_self->phrase);
+  __pyx_r = __pyx_v_self->phrase;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32662,39 +34578,70 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__py
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->phrase);
+  __Pyx_DECREF(__pyx_v_self->phrase);
+  __pyx_v_self->phrase = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->phrase);
+  __Pyx_DECREF(__pyx_v_self->phrase);
+  __pyx_v_self->phrase = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":40
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":42
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase
  *     cdef public phrase_location             # <<<<<<<<<<<<<<
@@ -32702,14 +34649,13 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_s
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location;
+  __Pyx_INCREF(__pyx_v_self->phrase_location);
+  __pyx_r = __pyx_v_self->phrase_location;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32719,39 +34665,70 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyOb
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->phrase_location);
+  __Pyx_DECREF(__pyx_v_self->phrase_location);
+  __pyx_v_self->phrase_location = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->phrase_location);
+  __Pyx_DECREF(__pyx_v_self->phrase_location);
+  __pyx_v_self->phrase_location = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":41
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":43
  *     cdef public phrase
  *     cdef public phrase_location
  *     cdef public suffix_link             # <<<<<<<<<<<<<<
@@ -32759,14 +34736,13 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link;
+  __Pyx_INCREF(__pyx_v_self->suffix_link);
+  __pyx_r = __pyx_v_self->suffix_link;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32776,71 +34752,79 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->suffix_link);
+  __Pyx_DECREF(__pyx_v_self->suffix_link);
+  __pyx_v_self->suffix_link = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->suffix_link);
+  __Pyx_DECREF(__pyx_v_self->suffix_link);
+  __pyx_v_self->suffix_link = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":53
- *     cdef public int count
- *     cdef public root
- *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
- *         self.count = 0
- *         self.extended = extended
- */
-
-static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_extended = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
     PyObject* values[1] = {0};
     values[0] = __pyx_k_99;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__extended);
@@ -32848,7 +34832,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -32861,76 +34845,99 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.TrieTable.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9TrieTable___cinit__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), __pyx_v_extended);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":54
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":55
+ *     cdef public int count
+ *     cdef public root
+ *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
+ *         self.count = 0
+ *         self.extended = extended
+ */
+
+static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_extended) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":56
  *     cdef public root
  *     def __cinit__(self, extended=False):
  *         self.count = 0             # <<<<<<<<<<<<<<
  *         self.extended = extended
  *         if extended:
  */
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count = 0;
+  __pyx_v_self->count = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":55
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":57
  *     def __cinit__(self, extended=False):
  *         self.count = 0
  *         self.extended = extended             # <<<<<<<<<<<<<<
  *         if extended:
  *             self.root = ExtendedTrieNode()
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_extended); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended = __pyx_t_1;
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_extended); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_self->extended = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":56
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":58
  *         self.count = 0
  *         self.extended = extended
  *         if extended:             # <<<<<<<<<<<<<<
  *             self.root = ExtendedTrieNode()
  *         else:
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_extended); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_extended); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":57
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":59
  *         self.extended = extended
  *         if extended:
  *             self.root = ExtendedTrieNode()             # <<<<<<<<<<<<<<
  *         else:
  *             self.root = TrieNode()
  */
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_t_3;
+    __Pyx_GOTREF(__pyx_v_self->root);
+    __Pyx_DECREF(__pyx_v_self->root);
+    __pyx_v_self->root = __pyx_t_3;
     __pyx_t_3 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":59
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":61
  *             self.root = ExtendedTrieNode()
  *         else:
  *             self.root = TrieNode()             # <<<<<<<<<<<<<<
  * 
  * # linked list structure for storing matches in BaselineRuleFactory
  */
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_t_3;
+    __Pyx_GOTREF(__pyx_v_self->root);
+    __Pyx_DECREF(__pyx_v_self->root);
+    __pyx_v_self->root = __pyx_t_3;
     __pyx_t_3 = 0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -32943,7 +34950,18 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":50
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_8extended___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":52
  * 
  * cdef class TrieTable:
  *     cdef public int extended             # <<<<<<<<<<<<<<
@@ -32951,17 +34969,16 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
  *     cdef public root
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -32979,17 +34996,27 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_8extended_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_8extended_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_8extended_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__");
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended = __pyx_t_1;
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_self->extended = __pyx_t_1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33001,7 +35028,18 @@ static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":51
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_5count___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":53
  * cdef class TrieTable:
  *     cdef public int extended
  *     cdef public int count             # <<<<<<<<<<<<<<
@@ -33009,17 +35047,16 @@ static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, P
  *     def __cinit__(self, extended=False):
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -33037,17 +35074,27 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_5count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_5count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_5count_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__");
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count = __pyx_t_1;
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_self->count = __pyx_t_1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33059,7 +35106,18 @@ static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":52
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":54
  *     cdef public int extended
  *     cdef public int count
  *     cdef public root             # <<<<<<<<<<<<<<
@@ -33067,14 +35125,13 @@ static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyOb
  *         self.count = 0
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  __pyx_r = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root;
+  __Pyx_INCREF(__pyx_v_self->root);
+  __pyx_r = __pyx_v_self->root;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -33084,39 +35141,59 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_4root_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_4root_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_4root_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_4root_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_4root_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->root);
+  __Pyx_DECREF(__pyx_v_self->root);
+  __pyx_v_self->root = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_4root_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_4root_5__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root_4__del__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->root);
+  __Pyx_DECREF(__pyx_v_self->root);
+  __pyx_v_self->root = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":79
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":81
  * 
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -33124,12 +35201,12 @@ static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self) {
  * 
  */
 
-static int __pyx_f_3_sa_14PhraseLocation_contains(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sent_id) {
+static int __pyx_f_3_sa_14PhraseLocation_contains(CYTHON_UNUSED struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, CYTHON_UNUSED int __pyx_v_sent_id) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("contains");
+  __Pyx_RefNannySetupContext("contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":80
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":82
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):
  *         return 1             # <<<<<<<<<<<<<<
@@ -33145,16 +35222,9 @@ static int __pyx_f_3_sa_14PhraseLocation_contains(struct __pyx_obj_3_sa_PhraseLo
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":82
- *         return 1
- * 
- *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
- *             arr=None, int num_subpatterns=1):
- *         self.sa_low = sa_low
- */
-
-static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_sa_low;
   int __pyx_v_sa_high;
   int __pyx_v_arr_low;
@@ -33163,15 +35233,12 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
   int __pyx_v_num_subpatterns;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
     PyObject* values[6] = {0,0,0,0,0,0};
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":83
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":85
  * 
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):             # <<<<<<<<<<<<<<
@@ -33181,7 +35248,8 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
     values[4] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -33192,7 +35260,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa_low);
@@ -33225,7 +35293,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -33240,99 +35308,119 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
       }
     }
     if (values[0]) {
-      __pyx_v_sa_low = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sa_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_sa_low = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sa_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_sa_low = ((int)-1);
     }
     if (values[1]) {
-      __pyx_v_sa_high = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_sa_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_sa_high = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_sa_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_sa_high = ((int)-1);
     }
     if (values[2]) {
-      __pyx_v_arr_low = __Pyx_PyInt_AsInt(values[2]); if (unlikely((__pyx_v_arr_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_arr_low = __Pyx_PyInt_AsInt(values[2]); if (unlikely((__pyx_v_arr_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_arr_low = ((int)-1);
     }
     if (values[3]) {
-      __pyx_v_arr_high = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_arr_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_arr_high = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_arr_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_arr_high = ((int)-1);
     }
     __pyx_v_arr = values[4];
     if (values[5]) {
-      __pyx_v_num_subpatterns = __Pyx_PyInt_AsInt(values[5]); if (unlikely((__pyx_v_num_subpatterns == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_num_subpatterns = __Pyx_PyInt_AsInt(values[5]); if (unlikely((__pyx_v_num_subpatterns == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_num_subpatterns = ((int)1);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.PhraseLocation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14PhraseLocation___cinit__(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self), __pyx_v_sa_low, __pyx_v_sa_high, __pyx_v_arr_low, __pyx_v_arr_high, __pyx_v_arr, __pyx_v_num_subpatterns);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":84
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":84
+ *         return 1
+ * 
+ *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
+ *             arr=None, int num_subpatterns=1):
+ *         self.sa_low = sa_low
+ */
+
+static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sa_low, int __pyx_v_sa_high, int __pyx_v_arr_low, int __pyx_v_arr_high, PyObject *__pyx_v_arr, int __pyx_v_num_subpatterns) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":86
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low             # <<<<<<<<<<<<<<
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->sa_low = __pyx_v_sa_low;
+  __pyx_v_self->sa_low = __pyx_v_sa_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":85
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":87
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high             # <<<<<<<<<<<<<<
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->sa_high = __pyx_v_sa_high;
+  __pyx_v_self->sa_high = __pyx_v_sa_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":86
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":88
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low             # <<<<<<<<<<<<<<
  *         self.arr_high = arr_high
  *         self.arr = arr
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr_low = __pyx_v_arr_low;
+  __pyx_v_self->arr_low = __pyx_v_arr_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":89
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high             # <<<<<<<<<<<<<<
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr_high = __pyx_v_arr_high;
+  __pyx_v_self->arr_high = __pyx_v_arr_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":90
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  *         self.arr = arr             # <<<<<<<<<<<<<<
  *         self.num_subpatterns = num_subpatterns
  * 
  */
-  if (!(likely(((__pyx_v_arr) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_arr, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_v_arr) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_arr, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_arr);
   __Pyx_GIVEREF(__pyx_v_arr);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr));
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
+  __Pyx_GOTREF(__pyx_v_self->arr);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->arr));
+  __pyx_v_self->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":89
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":91
  *         self.arr_high = arr_high
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->num_subpatterns = __pyx_v_num_subpatterns;
+  __pyx_v_self->num_subpatterns = __pyx_v_num_subpatterns;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33344,54 +35432,39 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":99
- *     cdef IntList sa
- * 
- *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
- *         self.sample_size = sample_size
- *         self.sa = fsarray.sa
- */
-
-static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_sample_size;
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_size);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_size)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -33399,29 +35472,57 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_sample_size = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sample_size == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_sample_size = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sample_size == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_fsarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.Sampler.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_7Sampler___cinit__(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), __pyx_v_sample_size, __pyx_v_fsarray);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":100
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":101
+ *     cdef IntList sa
+ * 
+ *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
+ *         self.sample_size = sample_size
+ *         self.sa = fsarray.sa
+ */
+
+static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, int __pyx_v_sample_size, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":102
  * 
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size             # <<<<<<<<<<<<<<
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  */
-  ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size = __pyx_v_sample_size;
+  __pyx_v_self->sample_size = __pyx_v_sample_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":101
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":103
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa             # <<<<<<<<<<<<<<
@@ -33430,11 +35531,11 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray->sa));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray->sa));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa = __pyx_v_fsarray->sa;
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = __pyx_v_fsarray->sa;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":102
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":104
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa
  *         if sample_size > 0:             # <<<<<<<<<<<<<<
@@ -33444,55 +35545,55 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
   __pyx_t_1 = (__pyx_v_sample_size > 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":103
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":105
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)             # <<<<<<<<<<<<<<
  *         else:
  *             logger.info("Sampling strategy: no sampling")
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyInt_FromLong(__pyx_v_sample_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_sample_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_100));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_100));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_100));
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":105
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":107
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
  * 
  *     def sample(self, PhraseLocation phrase_location):
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_102), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_102), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33507,7 +35608,24 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":107
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location); /*proto*/
+static char __pyx_doc_3_sa_7Sampler_2sample[] = "Returns a sample of the locations for\n        the phrase.    If there are less than self.sample_size\n        locations, return all of them; otherwise, return\n        up to self.sample_size locations.    In the latter case,\n        we choose to sample UNIFORMLY -- that is, the locations\n        are chosen at uniform intervals over the entire set, rather\n        than randomly.    This makes the algorithm deterministic, which\n        is good for things like MERT";
+static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("sample (wrapper)", 0);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_7Sampler_2sample(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location));
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":109
  *             logger.info("Sampling strategy: no sampling")
  * 
  *     def sample(self, PhraseLocation phrase_location):             # <<<<<<<<<<<<<<
@@ -33515,9 +35633,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         the phrase.    If there are less than self.sample_size
  */
 
-static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location); /*proto*/
-static char __pyx_doc_3_sa_7Sampler_1sample[] = "Returns a sample of the locations for\n        the phrase.    If there are less than self.sample_size\n        locations, return all of them; otherwise, return\n        up to self.sample_size locations.    In the latter case,\n        we choose to sample UNIFORMLY -- that is, the locations\n        are chosen at uniform intervals over the entire set, rather\n        than randomly.    This makes the algorithm deterministic, which\n        is good for things like MERT";
-static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location) {
+static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location) {
   struct __pyx_obj_3_sa_IntList *__pyx_v_sample = 0;
   double __pyx_v_i;
   double __pyx_v_stepsize;
@@ -33534,91 +35650,90 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sample");
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("sample", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":120
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":122
  *         cdef int num_locations, val, j
  * 
  *         sample = IntList()             # <<<<<<<<<<<<<<
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":121
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":123
  * 
  *         sample = IntList()
  *         if phrase_location.arr is None:             # <<<<<<<<<<<<<<
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  */
-  __pyx_t_2 = (((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr) == Py_None);
+  __pyx_t_2 = (((PyObject *)__pyx_v_phrase_location->arr) == Py_None);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":122
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":124
  *         sample = IntList()
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low             # <<<<<<<<<<<<<<
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  */
-    __pyx_v_num_locations = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_high - ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low);
+    __pyx_v_num_locations = (__pyx_v_phrase_location->sa_high - __pyx_v_phrase_location->sa_low);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":123
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":125
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  */
-    __pyx_t_2 = (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size == -1);
+    __pyx_t_2 = (__pyx_v_self->sample_size == -1);
     if (!__pyx_t_2) {
-      __pyx_t_3 = (__pyx_v_num_locations <= ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
+      __pyx_t_3 = (__pyx_v_num_locations <= __pyx_v_self->sample_size);
       __pyx_t_4 = __pyx_t_3;
     } else {
       __pyx_t_4 = __pyx_t_2;
     }
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":124
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":126
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)             # <<<<<<<<<<<<<<
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  */
-      ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa->arr + ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low), __pyx_v_num_locations);
-      goto __pyx_L6;
+      ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_self->sa->arr + __pyx_v_phrase_location->sa_low), __pyx_v_num_locations);
+      goto __pyx_L4;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":126
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":128
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:
  */
-      if (unlikely(((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size) == 0)) {
+      if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size));
+      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":127
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":129
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low             # <<<<<<<<<<<<<<
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:
  *                     '''Note: int(i) not guaranteed to have the desired
  */
-      __pyx_v_i = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low;
+      __pyx_v_i = __pyx_v_phrase_location->sa_low;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":128
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":130
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:             # <<<<<<<<<<<<<<
@@ -33626,16 +35741,16 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  *                     effect, according to the python documentation'''
  */
       while (1) {
-        __pyx_t_4 = (__pyx_v_i < ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_high);
+        __pyx_t_4 = (__pyx_v_i < __pyx_v_phrase_location->sa_high);
         if (__pyx_t_4) {
-          __pyx_t_2 = (__pyx_v_sample->len < ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
+          __pyx_t_2 = (__pyx_v_sample->len < __pyx_v_self->sample_size);
           __pyx_t_3 = __pyx_t_2;
         } else {
           __pyx_t_3 = __pyx_t_4;
         }
         if (!__pyx_t_3) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":131
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":133
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -33645,7 +35760,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_t_3 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":132
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":134
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -33653,11 +35768,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  *                         val = int(floor(i))
  */
           __pyx_v_val = ((int)ceil(__pyx_v_i));
-          goto __pyx_L9;
+          goto __pyx_L7;
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":134
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":136
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -33666,18 +35781,18 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  */
           __pyx_v_val = ((int)floor(__pyx_v_i));
         }
-        __pyx_L9:;
+        __pyx_L7:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":135
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":137
  *                     else:
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])             # <<<<<<<<<<<<<<
  *                     i = i + stepsize
  *         else:
  */
-        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa->arr[__pyx_v_val]));
+        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (__pyx_v_self->sa->arr[__pyx_v_val]));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":136
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":138
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -33687,82 +35802,82 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_v_i = (__pyx_v_i + __pyx_v_stepsize);
       }
     }
-    __pyx_L6:;
-    goto __pyx_L5;
+    __pyx_L4:;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":138
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":140
  *                     i = i + stepsize
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns             # <<<<<<<<<<<<<<
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr
  */
-    __pyx_t_5 = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_high - ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low);
-    if (unlikely(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns == 0)) {
+    __pyx_t_5 = (__pyx_v_phrase_location->arr_high - __pyx_v_phrase_location->arr_low);
+    if (unlikely(__pyx_v_phrase_location->num_subpatterns == 0)) {
       PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    else if (sizeof(int) == sizeof(long) && unlikely(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
+    else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_phrase_location->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
       PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns);
+    __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, __pyx_v_phrase_location->num_subpatterns);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":139
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":141
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
  *                 sample = phrase_location.arr
  *             else:
  */
-    __pyx_t_3 = (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size == -1);
+    __pyx_t_3 = (__pyx_v_self->sample_size == -1);
     if (!__pyx_t_3) {
-      __pyx_t_4 = (__pyx_v_num_locations <= ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
+      __pyx_t_4 = (__pyx_v_num_locations <= __pyx_v_self->sample_size);
       __pyx_t_2 = __pyx_t_4;
     } else {
       __pyx_t_2 = __pyx_t_3;
     }
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":140
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":142
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr             # <<<<<<<<<<<<<<
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  */
-      __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr));
+      __Pyx_INCREF(((PyObject *)__pyx_v_phrase_location->arr));
       __Pyx_DECREF(((PyObject *)__pyx_v_sample));
-      __pyx_v_sample = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr;
-      goto __pyx_L10;
+      __pyx_v_sample = __pyx_v_phrase_location->arr;
+      goto __pyx_L8;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":142
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":144
  *                 sample = phrase_location.arr
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:
  */
-      if (unlikely(((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size) == 0)) {
+      if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size));
+      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":143
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":145
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low             # <<<<<<<<<<<<<<
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:
  *                     '''Note: int(i) not guaranteed to have the desired
  */
-      __pyx_v_i = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low;
+      __pyx_v_i = __pyx_v_phrase_location->arr_low;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":144
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":146
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -33772,14 +35887,14 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
       while (1) {
         __pyx_t_2 = (__pyx_v_i < __pyx_v_num_locations);
         if (__pyx_t_2) {
-          __pyx_t_3 = (__pyx_v_sample->len < (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size * ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns));
+          __pyx_t_3 = (__pyx_v_sample->len < (__pyx_v_self->sample_size * __pyx_v_phrase_location->num_subpatterns));
           __pyx_t_4 = __pyx_t_3;
         } else {
           __pyx_t_4 = __pyx_t_2;
         }
         if (!__pyx_t_4) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":147
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":149
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -33789,7 +35904,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_t_4 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":148
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":150
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -33797,11 +35912,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  *                         val = int(floor(i))
  */
           __pyx_v_val = ((int)ceil(__pyx_v_i));
-          goto __pyx_L13;
+          goto __pyx_L11;
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":150
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":152
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -33810,27 +35925,27 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  */
           __pyx_v_val = ((int)floor(__pyx_v_i));
         }
-        __pyx_L13:;
+        __pyx_L11:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":151
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":153
  *                     else:
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  */
-        __pyx_v_j = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low + (__pyx_v_val * ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns));
+        __pyx_v_j = (__pyx_v_phrase_location->arr_low + (__pyx_v_val * __pyx_v_phrase_location->num_subpatterns));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":152
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":154
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
  *                     i = i + stepsize
  *         return sample
  */
-        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr->arr + __pyx_v_j), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns);
+        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_phrase_location->arr->arr + __pyx_v_j), __pyx_v_phrase_location->num_subpatterns);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":153
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":155
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -33840,11 +35955,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_v_i = (__pyx_v_i + __pyx_v_stepsize);
       }
     }
-    __pyx_L10:;
+    __pyx_L8:;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":154
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":156
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  *         return sample             # <<<<<<<<<<<<<<
@@ -33869,7 +35984,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":166
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":168
  * 
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):             # <<<<<<<<<<<<<<
@@ -33879,9 +35994,9 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
 
 static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m, int *__pyx_v_arr, int __pyx_v_start, int __pyx_v_step, int *__pyx_v_sent_id_arr) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("assign_matching");
+  __Pyx_RefNannySetupContext("assign_matching", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":167
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":169
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr             # <<<<<<<<<<<<<<
@@ -33890,7 +36005,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->arr = __pyx_v_arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":168
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":170
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr
  *     m.start = start             # <<<<<<<<<<<<<<
@@ -33899,7 +36014,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->start = __pyx_v_start;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":169
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":171
  *     m.arr = arr
  *     m.start = start
  *     m.end = start + step             # <<<<<<<<<<<<<<
@@ -33908,7 +36023,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->end = (__pyx_v_start + __pyx_v_step);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":170
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":172
  *     m.start = start
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]             # <<<<<<<<<<<<<<
@@ -33917,7 +36032,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->sent_id = (__pyx_v_sent_id_arr[(__pyx_v_arr[__pyx_v_start])]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":171
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":173
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]
  *     m.size = step             # <<<<<<<<<<<<<<
@@ -33929,7 +36044,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":174
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":176
  * 
  * 
  * cdef int* append_combined_matching(int* arr, Matching* loc1, Matching* loc2,             # <<<<<<<<<<<<<<
@@ -33937,16 +36052,16 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  *     cdef int i, new_len
  */
 
-static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx_t_3_sa_Matching *__pyx_v_loc1, struct __pyx_t_3_sa_Matching *__pyx_v_loc2, int __pyx_v_offset_by_one, int __pyx_v_num_subpatterns, int *__pyx_v_result_len) {
+static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx_t_3_sa_Matching *__pyx_v_loc1, struct __pyx_t_3_sa_Matching *__pyx_v_loc2, CYTHON_UNUSED int __pyx_v_offset_by_one, int __pyx_v_num_subpatterns, int *__pyx_v_result_len) {
   int __pyx_v_i;
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("append_combined_matching");
+  __Pyx_RefNannySetupContext("append_combined_matching", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":178
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":180
  *     cdef int i, new_len
  * 
  *     new_len = result_len[0] + num_subpatterns             # <<<<<<<<<<<<<<
@@ -33955,7 +36070,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_new_len = ((__pyx_v_result_len[0]) + __pyx_v_num_subpatterns);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":179
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":181
  * 
  *     new_len = result_len[0] + num_subpatterns
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -33964,7 +36079,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":183
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  * 
  *     for i from 0 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -33974,7 +36089,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_1 = __pyx_v_loc1->size;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":182
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":184
  * 
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]             # <<<<<<<<<<<<<<
@@ -33984,7 +36099,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
     (__pyx_v_arr[((__pyx_v_result_len[0]) + __pyx_v_i)]) = (__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":185
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:             # <<<<<<<<<<<<<<
@@ -33994,7 +36109,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_2 = (__pyx_v_num_subpatterns > __pyx_v_loc1->size);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":184
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":186
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]             # <<<<<<<<<<<<<<
@@ -34006,7 +36121,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":187
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -34015,7 +36130,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   (__pyx_v_result_len[0]) = __pyx_v_new_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":186
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":188
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -34031,7 +36146,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":189
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":191
  * 
  * 
  * cdef int* extend_arr(int* arr, int* arr_len, int* appendix, int appendix_len):             # <<<<<<<<<<<<<<
@@ -34043,9 +36158,9 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("extend_arr");
+  __Pyx_RefNannySetupContext("extend_arr", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":192
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":194
  *     cdef int new_len
  * 
  *     new_len = arr_len[0] + appendix_len             # <<<<<<<<<<<<<<
@@ -34054,7 +36169,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_appendix_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":193
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":195
  * 
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -34063,7 +36178,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":194
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":196
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -34072,7 +36187,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_appendix, (__pyx_v_appendix_len * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":195
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":197
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -34081,7 +36196,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":196
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":198
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -34097,7 +36212,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":198
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":200
  *     return arr
  * 
  * cdef int median(int low, int high, int step):             # <<<<<<<<<<<<<<
@@ -34112,9 +36227,9 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("median");
+  __Pyx_RefNannySetupContext("median", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":199
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":201
  * 
  * cdef int median(int low, int high, int step):
  *     return low + (((high - low)/step)/2)*step             # <<<<<<<<<<<<<<
@@ -34124,11 +36239,11 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   __pyx_t_1 = (__pyx_v_high - __pyx_v_low);
   if (unlikely(__pyx_v_step == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_step == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_1))) {
     PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_r = (__pyx_v_low + (__Pyx_div_long(__Pyx_div_int(__pyx_t_1, __pyx_v_step), 2) * __pyx_v_step));
   goto __pyx_L0;
@@ -34143,7 +36258,7 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":202
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":204
  * 
  * 
  * cdef void find_comparable_matchings(int low, int high, int* arr, int step, int loc, int* loc_minus, int* loc_plus):             # <<<<<<<<<<<<<<
@@ -34156,9 +36271,9 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("find_comparable_matchings");
+  __Pyx_RefNannySetupContext("find_comparable_matchings", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":206
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":208
  *     # in which all matchings have the same first index as the one
  *     # starting at loc
  *     loc_plus[0] = loc + step             # <<<<<<<<<<<<<<
@@ -34167,7 +36282,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_plus[0]) = (__pyx_v_loc + __pyx_v_step);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":207
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":209
  *     # starting at loc
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -34184,7 +36299,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":208
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":210
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step             # <<<<<<<<<<<<<<
@@ -34194,7 +36309,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     (__pyx_v_loc_plus[0]) = ((__pyx_v_loc_plus[0]) + __pyx_v_step);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":209
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":211
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc             # <<<<<<<<<<<<<<
@@ -34203,7 +36318,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_minus[0]) = __pyx_v_loc;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":210
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":212
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -34220,7 +36335,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_2) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":211
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":213
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:
  *         loc_minus[0] = loc_minus[0] - step             # <<<<<<<<<<<<<<
@@ -34233,16 +36348,9 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":263
- *     cdef IntList findexes1
- * 
- *     def __cinit__(self,             # <<<<<<<<<<<<<<
- *             # compiled alignment object (REQUIRED)
- *             Alignment alignment,
- */
-
-static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment = 0;
   float __pyx_v_by_slack_factor;
   char *__pyx_v_category;
@@ -34266,21 +36374,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   int __pyx_v_use_index;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_103,&__pyx_n_s_104,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_103,&__pyx_n_s_104,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
     PyObject* values[21] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":271
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":273
  *             char* category="[X]",
  *             # maximum number of contiguous chunks of terminal symbols in RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_chunks=None,             # <<<<<<<<<<<<<<
@@ -34289,7 +36388,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
     values[3] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":279
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":281
  *             unsigned max_nonterminals=2,
  *             # maximum number of contiguous chunks of terminal symbols in target-side RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_target_chunks=None,             # <<<<<<<<<<<<<<
@@ -34298,7 +36397,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
     values[7] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":281
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":283
  *             max_target_chunks=None,
  *             # maximum number of target side symbols (both T and NT) allowed in a rule. If None, defaults to max_initial_size
  *             max_target_length=None,             # <<<<<<<<<<<<<<
@@ -34307,7 +36406,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
     values[8] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":285
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":287
  *             unsigned min_gap_size=2,
  *             # filename of file containing precomputed collocations
  *             precompute_file=None,             # <<<<<<<<<<<<<<
@@ -34317,7 +36416,8 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
     values[10] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case 21: values[20] = PyTuple_GET_ITEM(__pyx_args, 20);
         case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);
         case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
@@ -34343,10 +36443,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
         if (kw_args > 0) {
@@ -34450,7 +36549,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -34481,10 +36580,10 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
     }
     __pyx_v_alignment = ((struct __pyx_obj_3_sa_Alignment *)values[0]);
     if (values[1]) {
-      __pyx_v_by_slack_factor = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_by_slack_factor = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":267
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":269
  *             Alignment alignment,
  *             # parameter for double-binary search; doesn't seem to matter much
  *             float by_slack_factor=1.0,             # <<<<<<<<<<<<<<
@@ -34494,49 +36593,49 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_by_slack_factor = ((float)1.0);
     }
     if (values[2]) {
-      __pyx_v_category = PyBytes_AsString(values[2]); if (unlikely((!__pyx_v_category) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_category = PyBytes_AsString(values[2]); if (unlikely((!__pyx_v_category) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_category = ((char *)__pyx_k_105);
     }
     __pyx_v_max_chunks = values[3];
     if (values[4]) {
-      __pyx_v_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[4]); if (unlikely((__pyx_v_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[4]); if (unlikely((__pyx_v_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_max_initial_size = ((unsigned int)10);
     }
     if (values[5]) {
-      __pyx_v_max_length = __Pyx_PyInt_AsUnsignedInt(values[5]); if (unlikely((__pyx_v_max_length == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_max_length = __Pyx_PyInt_AsUnsignedInt(values[5]); if (unlikely((__pyx_v_max_length == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_max_length = ((unsigned int)5);
     }
     if (values[6]) {
-      __pyx_v_max_nonterminals = __Pyx_PyInt_AsUnsignedInt(values[6]); if (unlikely((__pyx_v_max_nonterminals == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_max_nonterminals = __Pyx_PyInt_AsUnsignedInt(values[6]); if (unlikely((__pyx_v_max_nonterminals == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_max_nonterminals = ((unsigned int)2);
     }
     __pyx_v_max_target_chunks = values[7];
     __pyx_v_max_target_length = values[8];
     if (values[9]) {
-      __pyx_v_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[9]); if (unlikely((__pyx_v_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[9]); if (unlikely((__pyx_v_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_min_gap_size = ((unsigned int)2);
     }
     __pyx_v_precompute_file = values[10];
     if (values[11]) {
-      __pyx_v_precompute_secondary_rank = __Pyx_PyInt_AsUnsignedInt(values[11]); if (unlikely((__pyx_v_precompute_secondary_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_precompute_secondary_rank = __Pyx_PyInt_AsUnsignedInt(values[11]); if (unlikely((__pyx_v_precompute_secondary_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_precompute_secondary_rank = ((unsigned int)20);
     }
     if (values[12]) {
-      __pyx_v_precompute_rank = __Pyx_PyInt_AsUnsignedInt(values[12]); if (unlikely((__pyx_v_precompute_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_precompute_rank = __Pyx_PyInt_AsUnsignedInt(values[12]); if (unlikely((__pyx_v_precompute_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_precompute_rank = ((unsigned int)100);
     }
     if (values[13]) {
-      __pyx_v_require_aligned_terminal = __Pyx_PyObject_IsTrue(values[13]); if (unlikely((__pyx_v_require_aligned_terminal == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_require_aligned_terminal = __Pyx_PyObject_IsTrue(values[13]); if (unlikely((__pyx_v_require_aligned_terminal == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":291
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":293
  *             unsigned precompute_rank=100,
  *             # require extracted rules to have at least one aligned word
  *             bint require_aligned_terminal=True,             # <<<<<<<<<<<<<<
@@ -34546,10 +36645,10 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_require_aligned_terminal = ((int)1);
     }
     if (values[14]) {
-      __pyx_v_require_aligned_chunks = __Pyx_PyObject_IsTrue(values[14]); if (unlikely((__pyx_v_require_aligned_chunks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_require_aligned_chunks = __Pyx_PyObject_IsTrue(values[14]); if (unlikely((__pyx_v_require_aligned_chunks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":293
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":295
  *             bint require_aligned_terminal=True,
  *             # require each contiguous chunk of extracted rules to have at least one aligned word
  *             bint require_aligned_chunks=False,             # <<<<<<<<<<<<<<
@@ -34559,20 +36658,20 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_require_aligned_chunks = ((int)0);
     }
     if (values[15]) {
-      __pyx_v_train_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[15]); if (unlikely((__pyx_v_train_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_train_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[15]); if (unlikely((__pyx_v_train_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_train_max_initial_size = ((unsigned int)10);
     }
     if (values[16]) {
-      __pyx_v_train_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[16]); if (unlikely((__pyx_v_train_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_train_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[16]); if (unlikely((__pyx_v_train_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_train_min_gap_size = ((unsigned int)2);
     }
     if (values[17]) {
-      __pyx_v_tight_phrases = __Pyx_PyObject_IsTrue(values[17]); if (unlikely((__pyx_v_tight_phrases == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_tight_phrases = __Pyx_PyObject_IsTrue(values[17]); if (unlikely((__pyx_v_tight_phrases == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":299
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":301
  *             unsigned train_min_gap_size=2,
  *             # True if phrases should be tight, False otherwise (False == slower but better results)
  *             bint tight_phrases=False,             # <<<<<<<<<<<<<<
@@ -34582,10 +36681,10 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_tight_phrases = ((int)0);
     }
     if (values[18]) {
-      __pyx_v_use_baeza_yates = __Pyx_PyObject_IsTrue(values[18]); if (unlikely((__pyx_v_use_baeza_yates == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_use_baeza_yates = __Pyx_PyObject_IsTrue(values[18]); if (unlikely((__pyx_v_use_baeza_yates == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":301
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":303
  *             bint tight_phrases=False,
  *             # True to require use of double-binary alg, false otherwise
  *             bint use_baeza_yates=True,             # <<<<<<<<<<<<<<
@@ -34595,10 +36694,10 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_use_baeza_yates = ((int)1);
     }
     if (values[19]) {
-      __pyx_v_use_collocations = __Pyx_PyObject_IsTrue(values[19]); if (unlikely((__pyx_v_use_collocations == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_use_collocations = __Pyx_PyObject_IsTrue(values[19]); if (unlikely((__pyx_v_use_collocations == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":303
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":305
  *             bint use_baeza_yates=True,
  *             # True to enable used of precomputed collocations
  *             bint use_collocations=True,             # <<<<<<<<<<<<<<
@@ -34608,10 +36707,10 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_use_collocations = ((int)1);
     }
     if (values[20]) {
-      __pyx_v_use_index = __Pyx_PyObject_IsTrue(values[20]); if (unlikely((__pyx_v_use_index == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_use_index = __Pyx_PyObject_IsTrue(values[20]); if (unlikely((__pyx_v_use_index == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":305
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":307
  *             bint use_collocations=True,
  *             # True to enable use of precomputed inverted indices
  *             bint use_index=True):             # <<<<<<<<<<<<<<
@@ -34623,60 +36722,90 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 1, 21, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 1, 21, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_alignment), __pyx_ptype_3_sa_Alignment, 1, "alignment", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_alignment), __pyx_ptype_3_sa_Alignment, 1, "alignment", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_alignment, __pyx_v_by_slack_factor, __pyx_v_category, __pyx_v_max_chunks, __pyx_v_max_initial_size, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_max_target_chunks, __pyx_v_max_target_length, __pyx_v_min_gap_size, __pyx_v_precompute_file, __pyx_v_precompute_secondary_rank, __pyx_v_precompute_rank, __pyx_v_require_aligned_terminal, __pyx_v_require_aligned_chunks, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size, __pyx_v_tight_phrases, __pyx_v_use_baeza_yates, __pyx_v_use_collocations, __pyx_v_use_index);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":265
+ *     cdef IntList findexes1
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *             # compiled alignment object (REQUIRED)
+ *             Alignment alignment,
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":311
+static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment, float __pyx_v_by_slack_factor, char *__pyx_v_category, PyObject *__pyx_v_max_chunks, unsigned int __pyx_v_max_initial_size, unsigned int __pyx_v_max_length, unsigned int __pyx_v_max_nonterminals, PyObject *__pyx_v_max_target_chunks, PyObject *__pyx_v_max_target_length, unsigned int __pyx_v_min_gap_size, PyObject *__pyx_v_precompute_file, unsigned int __pyx_v_precompute_secondary_rank, unsigned int __pyx_v_precompute_rank, int __pyx_v_require_aligned_terminal, int __pyx_v_require_aligned_chunks, unsigned int __pyx_v_train_max_initial_size, unsigned int __pyx_v_train_min_gap_size, int __pyx_v_tight_phrases, int __pyx_v_use_baeza_yates, int __pyx_v_use_collocations, int __pyx_v_use_index) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":313
  *         respectively.    This is because Chiang's model does not require
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache             # <<<<<<<<<<<<<<
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieTable)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieTable)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->rules);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->rules));
+  __pyx_v_self->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":312
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":314
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root = __pyx_t_2;
+  __Pyx_GOTREF(__pyx_v_self->rules->root);
+  __Pyx_DECREF(__pyx_v_self->rules->root);
+  __pyx_v_self->rules->root = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":313
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":315
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:             # <<<<<<<<<<<<<<
@@ -34686,23 +36815,23 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (((PyObject *)__pyx_v_alignment) == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":314
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":316
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
  *         self.alignment = alignment
  * 
  */
-    __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_107), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_107), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":315
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":317
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")
  *         self.alignment = alignment             # <<<<<<<<<<<<<<
@@ -34711,94 +36840,94 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_alignment));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_alignment));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment = __pyx_v_alignment;
+  __Pyx_GOTREF(__pyx_v_self->alignment);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->alignment));
+  __pyx_v_self->alignment = __pyx_v_alignment;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":319
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":321
  *         # grammar parameters and settings
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length = __pyx_v_max_length;
+  __pyx_v_self->max_length = __pyx_v_max_length;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":320
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":322
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals = __pyx_v_max_nonterminals;
+  __pyx_v_self->max_nonterminals = __pyx_v_max_nonterminals;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":321
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":323
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size             # <<<<<<<<<<<<<<
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size = __pyx_v_max_initial_size;
+  __pyx_v_self->max_initial_size = __pyx_v_max_initial_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":322
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":324
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size = __pyx_v_train_max_initial_size;
+  __pyx_v_self->train_max_initial_size = __pyx_v_train_max_initial_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":323
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":325
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size             # <<<<<<<<<<<<<<
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->min_gap_size = __pyx_v_min_gap_size;
+  __pyx_v_self->min_gap_size = __pyx_v_min_gap_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":324
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":326
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size             # <<<<<<<<<<<<<<
  *         self.category = sym_fromstring(category, False)
  * 
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size = __pyx_v_train_min_gap_size;
+  __pyx_v_self->train_min_gap_size = __pyx_v_train_min_gap_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":325
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":327
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)             # <<<<<<<<<<<<<<
  * 
  *         if max_chunks is None:
  */
-  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = PyBytes_FromString(__pyx_v_category); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyBytes_FromString(__pyx_v_category); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_4 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   __pyx_t_1 = 0;
   __pyx_t_4 = 0;
-  __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-  __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category = __pyx_t_6;
+  __pyx_v_self->category = __pyx_t_6;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":327
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":329
  *         self.category = sym_fromstring(category, False)
  * 
  *         if max_chunks is None:             # <<<<<<<<<<<<<<
@@ -34808,31 +36937,31 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (__pyx_v_max_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":328
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":330
  * 
  *         if max_chunks is None:
  *             self.max_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_chunks = max_chunks
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_chunks = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals + 1);
-    goto __pyx_L7;
+    __pyx_v_self->max_chunks = (__pyx_v_self->max_nonterminals + 1);
+    goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":330
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":332
  *             self.max_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_chunks = max_chunks             # <<<<<<<<<<<<<<
  * 
  *         if max_target_chunks is None:
  */
-    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_chunks = __pyx_t_6;
+    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_self->max_chunks = __pyx_t_6;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":332
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":334
  *             self.max_chunks = max_chunks
  * 
  *         if max_target_chunks is None:             # <<<<<<<<<<<<<<
@@ -34842,31 +36971,31 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (__pyx_v_max_target_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":333
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":335
  * 
  *         if max_target_chunks is None:
  *             self.max_target_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_target_chunks = max_target_chunks
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_chunks = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals + 1);
-    goto __pyx_L8;
+    __pyx_v_self->max_target_chunks = (__pyx_v_self->max_nonterminals + 1);
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":335
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":337
  *             self.max_target_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_target_chunks = max_target_chunks             # <<<<<<<<<<<<<<
  * 
  *         if max_target_length is None:
  */
-    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_chunks = __pyx_t_6;
+    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_self->max_target_chunks = __pyx_t_6;
   }
-  __pyx_L8:;
+  __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":337
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":339
  *             self.max_target_chunks = max_target_chunks
  * 
  *         if max_target_length is None:             # <<<<<<<<<<<<<<
@@ -34876,94 +37005,94 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (__pyx_v_max_target_length == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":338
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":340
  * 
  *         if max_target_length is None:
  *             self.max_target_length = max_initial_size             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_target_length = max_target_length
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_length = __pyx_v_max_initial_size;
-    goto __pyx_L9;
+    __pyx_v_self->max_target_length = __pyx_v_max_initial_size;
+    goto __pyx_L6;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":340
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":342
  *             self.max_target_length = max_initial_size
  *         else:
  *             self.max_target_length = max_target_length             # <<<<<<<<<<<<<<
  * 
  *         # algorithmic parameters and settings
  */
-    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_length = __pyx_t_6;
+    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_self->max_target_length = __pyx_t_6;
   }
-  __pyx_L9:;
+  __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":343
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":345
  * 
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}             # <<<<<<<<<<<<<<
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  */
-  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
+  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
+  __pyx_v_self->precomputed_collocations = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":344
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":346
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}             # <<<<<<<<<<<<<<
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations
  */
-  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
+  __Pyx_DECREF(__pyx_v_self->precomputed_index);
+  __pyx_v_self->precomputed_index = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":345
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":347
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}
  *         self.use_index = use_index             # <<<<<<<<<<<<<<
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_index = __pyx_v_use_index;
+  __pyx_v_self->use_index = __pyx_v_use_index;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":346
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":348
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations             # <<<<<<<<<<<<<<
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_collocations = __pyx_v_use_collocations;
+  __pyx_v_self->use_collocations = __pyx_v_use_collocations;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":347
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":349
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}             # <<<<<<<<<<<<<<
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  */
-  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(__pyx_v_self->max_rank);
+  __Pyx_DECREF(__pyx_v_self->max_rank);
+  __pyx_v_self->max_rank = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":348
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":350
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file             # <<<<<<<<<<<<<<
@@ -34972,47 +37101,47 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   __Pyx_INCREF(__pyx_v_precompute_file);
   __Pyx_GIVEREF(__pyx_v_precompute_file);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file = __pyx_v_precompute_file;
+  __Pyx_GOTREF(__pyx_v_self->precompute_file);
+  __Pyx_DECREF(__pyx_v_self->precompute_file);
+  __pyx_v_self->precompute_file = __pyx_v_precompute_file;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":349
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":351
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_rank = __pyx_v_precompute_rank;
+  __pyx_v_self->precompute_rank = __pyx_v_precompute_rank;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":350
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":352
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
+  __pyx_v_self->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":351
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":353
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates             # <<<<<<<<<<<<<<
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_baeza_yates = __pyx_v_use_baeza_yates;
+  __pyx_v_self->use_baeza_yates = __pyx_v_use_baeza_yates;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":352
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":354
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor             # <<<<<<<<<<<<<<
  *         if tight_phrases:
  *             self.tight_phrases = 1
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->by_slack_factor = __pyx_v_by_slack_factor;
+  __pyx_v_self->by_slack_factor = __pyx_v_by_slack_factor;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":353
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":355
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:             # <<<<<<<<<<<<<<
@@ -35021,30 +37150,30 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   if (__pyx_v_tight_phrases) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":354
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":356
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  *             self.tight_phrases = 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.tight_phrases = 0
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->tight_phrases = 1;
-    goto __pyx_L10;
+    __pyx_v_self->tight_phrases = 1;
+    goto __pyx_L7;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":356
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":358
  *             self.tight_phrases = 1
  *         else:
  *             self.tight_phrases = 0             # <<<<<<<<<<<<<<
  * 
  *         if require_aligned_chunks:
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->tight_phrases = 0;
+    __pyx_v_self->tight_phrases = 0;
   }
-  __pyx_L10:;
+  __pyx_L7:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":358
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":360
  *             self.tight_phrases = 0
  * 
  *         if require_aligned_chunks:             # <<<<<<<<<<<<<<
@@ -35053,27 +37182,27 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   if (__pyx_v_require_aligned_chunks) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":360
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":362
  *         if require_aligned_chunks:
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 1;
+    __pyx_v_self->require_aligned_chunks = 1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":361
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":363
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 1;
-    goto __pyx_L11;
+    __pyx_v_self->require_aligned_terminal = 1;
+    goto __pyx_L8;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":362
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":364
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -35082,48 +37211,48 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   if (__pyx_v_require_aligned_terminal) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":363
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":365
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 1
  *         else:
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 0;
+    __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":364
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":366
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.require_aligned_chunks = 0
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 1;
-    goto __pyx_L11;
+    __pyx_v_self->require_aligned_terminal = 1;
+    goto __pyx_L8;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":366
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":368
  *             self.require_aligned_terminal = 1
  *         else:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 0
  * 
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 0;
+    __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":367
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":369
  *         else:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 0             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 0;
+    __pyx_v_self->require_aligned_terminal = 0;
   }
-  __pyx_L11:;
+  __pyx_L8:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":371
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":373
  * 
  *         # diagnostics
  *         self.prev_norm_prefix = ()             # <<<<<<<<<<<<<<
@@ -35132,46 +37261,46 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
+  __Pyx_GOTREF(__pyx_v_self->prev_norm_prefix);
+  __Pyx_DECREF(__pyx_v_self->prev_norm_prefix);
+  __pyx_v_self->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":373
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":375
  *         self.prev_norm_prefix = ()
  * 
  *         self.findexes = IntList(initial_len=10)             # <<<<<<<<<<<<<<
  *         self.findexes1 = IntList(initial_len=10)
  * 
  */
-  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-  if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_5 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
   __Pyx_GIVEREF(__pyx_t_5);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
+  __Pyx_GOTREF(__pyx_v_self->findexes);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->findexes));
+  __pyx_v_self->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
   __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":374
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":376
  * 
  *         self.findexes = IntList(initial_len=10)
  *         self.findexes1 = IntList(initial_len=10)             # <<<<<<<<<<<<<<
  * 
  *     def configure(self, SuffixArray fsarray, DataArray edarray,
  */
-  __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-  if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
   __Pyx_GIVEREF(__pyx_t_4);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_4);
+  __Pyx_GOTREF(__pyx_v_self->findexes1);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->findexes1));
+  __pyx_v_self->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_4);
   __pyx_t_4 = 0;
 
   __pyx_r = 0;
@@ -35188,35 +37317,24 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":376
- *         self.findexes1 = IntList(initial_len=10)
- * 
- *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
- *             Sampler sampler, Scorer scorer):
- *         '''This gives the RuleFactory access to the Context object.
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_23HieroCachingRuleFactory_1configure[] = "This gives the RuleFactory access to the Context object.\n        Here we also use it to precompute the most expensive intersections\n        in the corpus quickly.";
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_23HieroCachingRuleFactory_2configure[] = "This gives the RuleFactory access to the Context object.\n        Here we also use it to precompute the most expensive intersections\n        in the corpus quickly.";
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray = 0;
   struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray = 0;
   struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler = 0;
   struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer = 0;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
-  __Pyx_RefNannySetupContext("configure");
+  __Pyx_RefNannySetupContext("configure (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
     PyObject* values[4] = {0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -35225,32 +37343,28 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -35267,18 +37381,44 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.configure", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_edarray), __pyx_ptype_3_sa_DataArray, 1, "edarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sampler), __pyx_ptype_3_sa_Sampler, 1, "sampler", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_scorer), __pyx_ptype_3_sa_Scorer, 1, "scorer", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_edarray), __pyx_ptype_3_sa_DataArray, 1, "edarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sampler), __pyx_ptype_3_sa_Sampler, 1, "sampler", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_scorer), __pyx_ptype_3_sa_Scorer, 1, "scorer", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_edarray, __pyx_v_sampler, __pyx_v_scorer);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":381
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":378
+ *         self.findexes1 = IntList(initial_len=10)
+ * 
+ *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
+ *             Sampler sampler, Scorer scorer):
+ *         '''This gives the RuleFactory access to the Context object.
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray, struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray, struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler, struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("configure", 0);
+
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":383
  *         Here we also use it to precompute the most expensive intersections
  *         in the corpus quickly.'''
  *         self.fsa = fsarray             # <<<<<<<<<<<<<<
@@ -35287,11 +37427,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa = __pyx_v_fsarray;
+  __Pyx_GOTREF(__pyx_v_self->fsa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->fsa));
+  __pyx_v_self->fsa = __pyx_v_fsarray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":382
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":384
  *         in the corpus quickly.'''
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray             # <<<<<<<<<<<<<<
@@ -35300,11 +37440,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray->darray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray->darray));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda = __pyx_v_fsarray->darray;
+  __Pyx_GOTREF(__pyx_v_self->fda);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->fda));
+  __pyx_v_self->fda = __pyx_v_fsarray->darray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":383
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":385
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray
  *         self.eda = edarray             # <<<<<<<<<<<<<<
@@ -35313,63 +37453,63 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_edarray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_edarray));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda = __pyx_v_edarray;
+  __Pyx_GOTREF(__pyx_v_self->eda);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->eda));
+  __pyx_v_self->eda = __pyx_v_edarray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":384
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":386
  *         self.fda = fsarray.darray
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)             # <<<<<<<<<<<<<<
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  */
-  __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda);
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->fda);
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->__pyx_vtab)->set_idmap(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->fid2symid);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->fid2symid));
+  __pyx_v_self->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":385
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":387
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)             # <<<<<<<<<<<<<<
  *         self.precompute()
  *         self.sampler = sampler
  */
-  __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda);
+  __pyx_t_2 = ((PyObject *)__pyx_v_self->eda);
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->__pyx_vtab)->set_idmap(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->eid2symid);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->eid2symid));
+  __pyx_v_self->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":386
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":388
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()             # <<<<<<<<<<<<<<
  *         self.sampler = sampler
  *         self.scorer = scorer
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":387
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":389
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  *         self.sampler = sampler             # <<<<<<<<<<<<<<
@@ -35378,11 +37518,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_sampler));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_sampler));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler = __pyx_v_sampler;
+  __Pyx_GOTREF(__pyx_v_self->sampler);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sampler));
+  __pyx_v_self->sampler = __pyx_v_sampler;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":388
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":390
  *         self.precompute()
  *         self.sampler = sampler
  *         self.scorer = scorer             # <<<<<<<<<<<<<<
@@ -35391,9 +37531,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_scorer));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_scorer));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer = __pyx_v_scorer;
+  __Pyx_GOTREF(__pyx_v_self->scorer);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->scorer));
+  __pyx_v_self->scorer = __pyx_v_scorer;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -35408,7 +37548,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":390
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":392
  *         self.scorer = scorer
  * 
  *     cdef set_idmap(self, DataArray darray):             # <<<<<<<<<<<<<<
@@ -35416,7 +37556,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  *         cdef IntList idmap
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_DataArray *__pyx_v_darray) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_DataArray *__pyx_v_darray) {
   int __pyx_v_word_id;
   int __pyx_v_new_word_id;
   int __pyx_v_N;
@@ -35433,9 +37573,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set_idmap");
+  __Pyx_RefNannySetupContext("set_idmap", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":394
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":396
  *         cdef IntList idmap
  * 
  *         N = len(darray.id2word)             # <<<<<<<<<<<<<<
@@ -35444,30 +37584,30 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
  */
   __pyx_t_1 = __pyx_v_darray->id2word;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_N = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":395
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":397
  * 
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)             # <<<<<<<<<<<<<<
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_3 = PyInt_FromLong(__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromLong(__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_idmap = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":396
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":398
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:             # <<<<<<<<<<<<<<
@@ -35477,36 +37617,36 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_word_id = 0; __pyx_v_word_id < __pyx_t_4; __pyx_v_word_id++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":397
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":399
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             idmap.arr[word_id] = new_word_id
  *         return idmap
  */
-    __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_darray->id2word, __pyx_v_word_id, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_darray->id2word, __pyx_v_word_id, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_1 = 0;
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
-    __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_v_new_word_id = __pyx_t_7;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":398
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":400
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id             # <<<<<<<<<<<<<<
@@ -35516,7 +37656,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
     (__pyx_v_idmap->arr[__pyx_v_word_id]) = __pyx_v_new_word_id;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":399
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":401
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id
  *         return idmap             # <<<<<<<<<<<<<<
@@ -35544,7 +37684,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":402
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("pattern2phrase (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":404
  * 
  * 
  *     def pattern2phrase(self, pattern):             # <<<<<<<<<<<<<<
@@ -35552,8 +37703,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
  *         result = ()
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern) {
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_arity = NULL;
   PyObject *__pyx_v_word_id = NULL;
@@ -35572,9 +37722,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("pattern2phrase");
+  __Pyx_RefNannySetupContext("pattern2phrase", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":404
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":406
  *     def pattern2phrase(self, pattern):
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()             # <<<<<<<<<<<<<<
@@ -35584,7 +37734,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":405
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":407
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -35594,7 +37744,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":406
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":408
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -35605,23 +37755,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
     __pyx_t_1 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -35631,71 +37789,70 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":407
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":409
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":408
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":410
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  */
-      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_v_arity);
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":409
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":411
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_XDECREF(__pyx_v_new_id);
       __pyx_v_new_id = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":411
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":413
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             result = result + (new_id,)
  *         return Phrase(result)
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+      __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
       __Pyx_GIVEREF(__pyx_t_7);
       PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
       __Pyx_GIVEREF(__pyx_t_8);
       __pyx_t_7 = 0;
       __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
@@ -35703,21 +37860,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
       __pyx_v_new_id = __pyx_t_8;
       __pyx_t_8 = 0;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":412
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":414
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
  *         return Phrase(result)
  * 
  */
-    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_INCREF(__pyx_v_new_id);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_new_id);
     __Pyx_GIVEREF(__pyx_v_new_id);
-    __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_9));
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_result));
@@ -35726,7 +37883,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":413
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":415
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         return Phrase(result)             # <<<<<<<<<<<<<<
@@ -35734,12 +37891,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
  *     def pattern2phrase_plus(self, pattern):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_r = __pyx_t_9;
@@ -35766,7 +37923,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":415
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("pattern2phrase_plus (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":417
  *         return Phrase(result)
  * 
  *     def pattern2phrase_plus(self, pattern):             # <<<<<<<<<<<<<<
@@ -35774,8 +37942,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
  *         # suffixed/prefixed with the NT category.
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern) {
   PyObject *__pyx_v_patterns = NULL;
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_arity = NULL;
@@ -35796,21 +37963,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("pattern2phrase_plus");
+  __Pyx_RefNannySetupContext("pattern2phrase_plus", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":418
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":420
  *         # returns a list containing both the pattern, and pattern
  *         # suffixed/prefixed with the NT category.
  *         patterns = []             # <<<<<<<<<<<<<<
  *         result = ()
  *         arity = 0
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_patterns = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":419
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":421
  *         # suffixed/prefixed with the NT category.
  *         patterns = []
  *         result = ()             # <<<<<<<<<<<<<<
@@ -35820,7 +37987,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":420
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":422
  *         patterns = []
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -35830,7 +37997,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":421
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":423
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -35841,23 +38008,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
     __pyx_t_1 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -35867,71 +38042,70 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":422
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":424
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":423
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":425
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  */
-      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_v_arity);
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":424
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":426
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_XDECREF(__pyx_v_new_id);
       __pyx_v_new_id = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":426
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":428
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+      __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
       __Pyx_GIVEREF(__pyx_t_7);
       PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
       __Pyx_GIVEREF(__pyx_t_8);
       __pyx_t_7 = 0;
       __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
@@ -35939,21 +38113,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
       __pyx_v_new_id = __pyx_t_8;
       __pyx_t_8 = 0;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":427
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":429
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  */
-    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_INCREF(__pyx_v_new_id);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_new_id);
     __Pyx_GIVEREF(__pyx_v_new_id);
-    __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_9));
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_result));
@@ -35962,90 +38136,81 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":428
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":430
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  */
-  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":429
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":431
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns
  */
-  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9);
   __Pyx_GIVEREF(__pyx_t_9);
   __pyx_t_9 = 0;
-  __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_9));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_9));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
   __pyx_t_9 = 0;
-  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":430
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":432
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))             # <<<<<<<<<<<<<<
  *         return patterns
  * 
  */
-  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9);
   __Pyx_GIVEREF(__pyx_t_9);
   __pyx_t_9 = 0;
-  __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_t_1), ((PyObject *)__pyx_v_result)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_t_1), ((PyObject *)__pyx_v_result)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_9));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_9));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
   __pyx_t_9 = 0;
-  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":431
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":433
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns             # <<<<<<<<<<<<<<
@@ -36078,7 +38243,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":433
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("precompute (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":435
  *         return patterns
  * 
  *     def precompute(self):             # <<<<<<<<<<<<<<
@@ -36086,8 +38262,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self) {
   struct __pyx_obj_3_sa_Precomputation *__pyx_v_pre = 0;
   PyObject *__pyx_v_start_time = NULL;
   PyObject *__pyx_v_pattern = NULL;
@@ -36103,108 +38278,108 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   Py_ssize_t __pyx_t_6;
-  PyObject *(*__pyx_t_7)(PyObject *);
-  PyObject *__pyx_t_8 = NULL;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_t_9;
   Py_ssize_t __pyx_t_10;
   PyObject *(*__pyx_t_11)(PyObject *);
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("precompute");
+  __Pyx_RefNannySetupContext("precompute", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":436
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":438
  *         cdef Precomputation pre
  * 
  *         if self.precompute_file is not None:             # <<<<<<<<<<<<<<
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file != Py_None);
+  __pyx_t_1 = (__pyx_v_self->precompute_file != Py_None);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":437
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":439
  * 
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  *             pre = Precomputation(from_binary=self.precompute_file)
  */
-    __pyx_t_2 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_start_time = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":438
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":440
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)             # <<<<<<<<<<<<<<
  *             pre = Precomputation(from_binary=self.precompute_file)
  *             # check parameters of precomputation -- some are critical and some are not
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_108));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_108));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_108));
-    __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-    PyTuple_SET_ITEM(__pyx_t_2, 1, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-    __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-    __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_INCREF(__pyx_v_self->precompute_file);
+    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->precompute_file);
+    __Pyx_GIVEREF(__pyx_v_self->precompute_file);
+    __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":439
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":441
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  *             pre = Precomputation(from_binary=self.precompute_file)             # <<<<<<<<<<<<<<
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:
  */
-    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), __pyx_v_self->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_v_pre = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_t_2);
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":441
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":443
  *             pre = Precomputation(from_binary=self.precompute_file)
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:             # <<<<<<<<<<<<<<
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  */
-    __pyx_t_1 = (__pyx_v_pre->max_nonterminals != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals);
+    __pyx_t_1 = (__pyx_v_pre->max_nonterminals != __pyx_v_self->max_nonterminals);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":442
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":444
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)             # <<<<<<<<<<<<<<
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  */
-      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__warn); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__warn); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+      __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_109));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_s_109));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_109));
@@ -36214,43 +38389,43 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L6;
+      goto __pyx_L4;
     }
-    __pyx_L6:;
+    __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":443
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":445
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:             # <<<<<<<<<<<<<<
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  */
-    __pyx_t_1 = (__pyx_v_pre->max_length != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length);
+    __pyx_t_1 = (__pyx_v_pre->max_length != __pyx_v_self->max_length);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":444
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":446
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)             # <<<<<<<<<<<<<<
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  */
-      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_v_self->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+      __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_110));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_110));
@@ -36260,261 +38435,203 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_GIVEREF(__pyx_t_4);
       __pyx_t_3 = 0;
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":445
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":447
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:             # <<<<<<<<<<<<<<
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  */
-    __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size);
+    __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != __pyx_v_self->train_max_initial_size);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":446
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":448
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))             # <<<<<<<<<<<<<<
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  */
-      __pyx_t_4 = PyInt_FromLong(__pyx_v_pre->train_max_initial_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_v_pre->train_max_initial_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_4 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_111), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_111), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __Pyx_Raise(__pyx_t_2, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L8;
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      goto __pyx_L6;
     }
-    __pyx_L8:;
+    __pyx_L6:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":447
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":449
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:             # <<<<<<<<<<<<<<
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  */
-    __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size);
+    __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != __pyx_v_self->train_min_gap_size);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":448
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":450
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))             # <<<<<<<<<<<<<<
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  */
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(__pyx_v_self->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_2 = 0;
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_112), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_112), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_5));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_Raise(__pyx_t_5, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L9;
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      goto __pyx_L7;
     }
-    __pyx_L9:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":449
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":451
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:             # <<<<<<<<<<<<<<
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  */
-    if (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_index) {
+    if (__pyx_v_self->use_index) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":450
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":452
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))             # <<<<<<<<<<<<<<
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)
  */
-      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_5 = __pyx_v_pre->precomputed_index;
       __Pyx_INCREF(__pyx_t_5);
-      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_113));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_113));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_113));
       PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":451
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":453
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():             # <<<<<<<<<<<<<<
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  */
-      __pyx_t_5 = PyObject_GetAttr(__pyx_v_pre->precomputed_index, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
-        __pyx_t_5 = __pyx_t_2; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0;
-        __pyx_t_7 = NULL;
-      } else {
-        __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
+      __pyx_t_6 = 0;
+      if (unlikely(__pyx_v_pre->precomputed_index == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      for (;;) {
-        if (PyList_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_2 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++;
-        } else if (PyTuple_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++;
-        } else {
-          __pyx_t_2 = __pyx_t_7(__pyx_t_5);
-          if (unlikely(!__pyx_t_2)) {
-            if (PyErr_Occurred()) {
-              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            break;
-          }
-          __Pyx_GOTREF(__pyx_t_2);
-        }
-        if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
-          PyObject* sequence = __pyx_t_2;
-          if (likely(PyTuple_CheckExact(sequence))) {
-            if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-              if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
-            __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
-          } else {
-            if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-              if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
-            __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
-          }
-          __Pyx_INCREF(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_3);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        } else {
-          Py_ssize_t index = -1;
-          __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
-          index = 0; __pyx_t_4 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L13_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_4);
-          index = 1; __pyx_t_3 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_3)) goto __pyx_L13_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_3);
-          if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          goto __pyx_L14_unpacking_done;
-          __pyx_L13_unpacking_failed:;
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-          if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_L14_unpacking_done:;
-        }
+      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_index, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_XDECREF(__pyx_t_5);
+      __pyx_t_5 = __pyx_t_2;
+      __pyx_t_2 = 0;
+      while (1) {
+        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_7, &__pyx_t_6, &__pyx_t_2, &__pyx_t_4, NULL, __pyx_t_8);
+        if (unlikely(__pyx_t_9 == 0)) break;
+        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(__pyx_t_4);
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_4;
-        __pyx_t_4 = 0;
+        __pyx_v_pattern = __pyx_t_2;
+        __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_arr = __pyx_t_4;
+        __pyx_t_4 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":452
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":454
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)             # <<<<<<<<<<<<<<
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  */
-        __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_3));
         __Pyx_INCREF(__pyx_v_pattern);
-        PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_pattern);
+        PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
-        __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+        __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_v_phrases);
-        __pyx_v_phrases = __pyx_t_4;
-        __pyx_t_4 = 0;
+        __pyx_v_phrases = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":453
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":455
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:             # <<<<<<<<<<<<<<
@@ -36522,195 +38639,145 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  *             if self.use_collocations:
  */
         if (PyList_CheckExact(__pyx_v_phrases) || PyTuple_CheckExact(__pyx_v_phrases)) {
-          __pyx_t_4 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_4); __pyx_t_10 = 0;
+          __pyx_t_3 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
           __pyx_t_11 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_11 = Py_TYPE(__pyx_t_4)->tp_iternext;
+          __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
         }
         for (;;) {
-          if (PyList_CheckExact(__pyx_t_4)) {
-            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_4)) break;
-            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
-          } else if (PyTuple_CheckExact(__pyx_t_4)) {
-            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
+          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_3)) {
+            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_3)) {
+            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
           } else {
-            __pyx_t_3 = __pyx_t_11(__pyx_t_4);
-            if (unlikely(!__pyx_t_3)) {
+            __pyx_t_2 = __pyx_t_11(__pyx_t_3);
+            if (unlikely(!__pyx_t_2)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
-            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_GOTREF(__pyx_t_2);
           }
           __Pyx_XDECREF(__pyx_v_phrase);
-          __pyx_v_phrase = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __pyx_v_phrase = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":454
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":456
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr             # <<<<<<<<<<<<<<
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  */
-          if (PyObject_SetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyObject_SetItem(__pyx_v_self->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L10;
+      goto __pyx_L8;
     }
-    __pyx_L10:;
+    __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":455
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":457
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:             # <<<<<<<<<<<<<<
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  */
-    if (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_collocations) {
+    if (__pyx_v_self->use_collocations) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":456
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":458
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))             # <<<<<<<<<<<<<<
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)
  */
-      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_5 = __pyx_v_pre->precomputed_collocations;
       __Pyx_INCREF(__pyx_t_5);
-      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_114));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_114));
+      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_114));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_114));
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":457
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":459
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():             # <<<<<<<<<<<<<<
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  */
-      __pyx_t_5 = PyObject_GetAttr(__pyx_v_pre->precomputed_collocations, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-        __pyx_t_5 = __pyx_t_3; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0;
-        __pyx_t_7 = NULL;
-      } else {
-        __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
+      __pyx_t_7 = 0;
+      if (unlikely(__pyx_v_pre->precomputed_collocations == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      for (;;) {
-        if (PyList_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
-        } else if (PyTuple_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
-        } else {
-          __pyx_t_3 = __pyx_t_7(__pyx_t_5);
-          if (unlikely(!__pyx_t_3)) {
-            if (PyErr_Occurred()) {
-              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            break;
-          }
-          __Pyx_GOTREF(__pyx_t_3);
-        }
-        if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-          PyObject* sequence = __pyx_t_3;
-          if (likely(PyTuple_CheckExact(sequence))) {
-            if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-              if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
-            __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
-          } else {
-            if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-              if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
-            __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
-          }
-          __Pyx_INCREF(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        } else {
-          Py_ssize_t index = -1;
-          __pyx_t_8 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
-          index = 0; __pyx_t_4 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L20_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_4);
-          index = 1; __pyx_t_2 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_2)) goto __pyx_L20_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_2);
-          if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          goto __pyx_L21_unpacking_done;
-          __pyx_L20_unpacking_failed:;
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-          if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_L21_unpacking_done:;
-        }
+      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_6), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_XDECREF(__pyx_t_5);
+      __pyx_t_5 = __pyx_t_2;
+      __pyx_t_2 = 0;
+      while (1) {
+        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_6, &__pyx_t_7, &__pyx_t_2, &__pyx_t_3, NULL, __pyx_t_8);
+        if (unlikely(__pyx_t_9 == 0)) break;
+        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(__pyx_t_3);
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_4;
-        __pyx_t_4 = 0;
-        __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_2;
+        __pyx_v_pattern = __pyx_t_2;
         __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_v_arr);
+        __pyx_v_arr = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":458
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":460
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)             # <<<<<<<<<<<<<<
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  */
-        __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(__pyx_v_pattern);
         PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
-        __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -36718,62 +38785,62 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
         __pyx_v_phrase = __pyx_t_4;
         __pyx_t_4 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":459
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":461
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr             # <<<<<<<<<<<<<<
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)
  */
-        if (PyObject_SetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L17;
+      goto __pyx_L13;
     }
-    __pyx_L17:;
+    __pyx_L13:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":460
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":462
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)
  * 
  */
-    __pyx_t_5 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_v_stop_time = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":461
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":463
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_115));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_115));
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -36782,7 +38849,6 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -36798,7 +38864,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":464
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_precomputed_collocation (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_phrase));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":466
  * 
  * 
  *     def get_precomputed_collocation(self, phrase):             # <<<<<<<<<<<<<<
@@ -36806,8 +38883,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  *             arr = self.precomputed_collocations[phrase]
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_phrase) {
   PyObject *__pyx_v_arr = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -36819,31 +38895,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_colloc
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_precomputed_collocation");
+  __Pyx_RefNannySetupContext("get_precomputed_collocation", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":465
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":467
  * 
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:             # <<<<<<<<<<<<<<
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  */
-  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_phrase, __pyx_v_self->precomputed_collocations, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":466
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":468
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]             # <<<<<<<<<<<<<<
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None
  */
-    __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_arr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":467
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":469
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)             # <<<<<<<<<<<<<<
@@ -36851,36 +38927,36 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_colloc
  * 
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr), __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_3 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr), __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_phrase, __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_phrase, __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Add(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Add(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":468
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":470
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None             # <<<<<<<<<<<<<<
@@ -36907,7 +38983,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_colloc
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":471
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":473
  * 
  * 
  *     cdef int* baeza_yates_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -36951,9 +39027,9 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("baeza_yates_helper");
+  __Pyx_RefNannySetupContext("baeza_yates_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":484
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":486
  *         cdef Matching loc1, loc2
  * 
  *         result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -36962,7 +39038,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":486
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":488
  *         result = <int*> malloc(0*sizeof(int*))
  * 
  *         d_first = 0             # <<<<<<<<<<<<<<
@@ -36971,7 +39047,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_d_first = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":487
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":489
  * 
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:             # <<<<<<<<<<<<<<
@@ -36981,7 +39057,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_1 = ((__pyx_v_high1 - __pyx_v_low1) > (__pyx_v_high2 - __pyx_v_low2));
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":488
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":490
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:
  *             d_first = 1             # <<<<<<<<<<<<<<
@@ -36993,7 +39069,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":492
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":494
  *         # First, check to see if we are at any of the recursive base cases
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:             # <<<<<<<<<<<<<<
@@ -37009,7 +39085,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":493
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":495
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:
  *             return result             # <<<<<<<<<<<<<<
@@ -37022,7 +39098,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":496
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":498
  * 
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37031,7 +39107,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, (__pyx_v_high1 - __pyx_v_step1), __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":497
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":499
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37040,7 +39116,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_low2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":498
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":500
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:             # <<<<<<<<<<<<<<
@@ -37050,7 +39126,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == -1);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":499
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":501
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:
  *             return result             # <<<<<<<<<<<<<<
@@ -37063,7 +39139,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":501
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":503
  *             return result
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37072,7 +39148,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_low1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":502
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":504
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37081,7 +39157,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_high2 - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":503
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":505
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -37091,7 +39167,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":504
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":506
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *             return result             # <<<<<<<<<<<<<<
@@ -37104,7 +39180,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":508
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":510
  *         # Case 3: query set and data set do not meet size mismatch constraints;
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1             # <<<<<<<<<<<<<<
@@ -37114,15 +39190,15 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_4 = (__pyx_v_high1 - __pyx_v_low1);
   if (unlikely(__pyx_v_step1 == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_step1 == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_4))) {
     PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_v_qsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":509
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":511
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2             # <<<<<<<<<<<<<<
@@ -37132,15 +39208,15 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_4 = (__pyx_v_high2 - __pyx_v_low2);
   if (unlikely(__pyx_v_step2 == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_step2 == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_4))) {
     PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_v_dsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":510
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":512
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -37149,7 +39225,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":511
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":513
  *         dsetsize = (high2-low2) / step2
  *         if d_first:
  *             tmp = qsetsize             # <<<<<<<<<<<<<<
@@ -37158,7 +39234,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_qsetsize;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":512
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":514
  *         if d_first:
  *             tmp = qsetsize
  *             qsetsize = dsetsize             # <<<<<<<<<<<<<<
@@ -37167,7 +39243,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_qsetsize = __pyx_v_dsetsize;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":513
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":515
  *             tmp = qsetsize
  *             qsetsize = dsetsize
  *             dsetsize = tmp             # <<<<<<<<<<<<<<
@@ -37179,7 +39255,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L7:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":515
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":517
  *             dsetsize = tmp
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:             # <<<<<<<<<<<<<<
@@ -37190,12 +39266,12 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_6 = log(2.0);
   if (unlikely(__pyx_t_6 == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "float division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_t_3 = ((__pyx_t_5 / __pyx_t_6) > __pyx_v_dsetsize);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":516
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":518
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)             # <<<<<<<<<<<<<<
@@ -37204,7 +39280,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     free(__pyx_v_result);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":517
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":519
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)
  *             return self.merge_helper(low1, high1, arr1, step1, low2, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -37217,7 +39293,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L8:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":521
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":523
  *         # binary search.    There are two flavors, depending on
  *         # whether the queryset or dataset is first
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -37226,7 +39302,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":522
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":524
  *         # whether the queryset or dataset is first
  *         if d_first:
  *             med2 = median(low2, high2, step2)             # <<<<<<<<<<<<<<
@@ -37235,7 +39311,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_low2, __pyx_v_high2, __pyx_v_step2);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":523
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":525
  *         if d_first:
  *             med2 = median(low2, high2, step2)
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37244,7 +39320,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":525
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":527
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  * 
  *             search_low = low1             # <<<<<<<<<<<<<<
@@ -37253,7 +39329,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":526
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":528
  * 
  *             search_low = low1
  *             search_high = high1             # <<<<<<<<<<<<<<
@@ -37262,7 +39338,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":527
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":529
  *             search_low = low1
  *             search_high = high1
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -37273,7 +39349,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":528
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":530
  *             search_high = high1
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)             # <<<<<<<<<<<<<<
@@ -37282,7 +39358,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":529
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":531
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -37291,7 +39367,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":530
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":532
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -37300,7 +39376,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":533
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":535
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37309,7 +39385,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":531
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":533
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37318,7 +39394,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":532
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":534
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_low = med1_plus             # <<<<<<<<<<<<<<
@@ -37328,7 +39404,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_low = __pyx_v_med1_plus;
         break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":533
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":535
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37337,7 +39413,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":534
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":536
  *                     search_low = med1_plus
  *                 elif comparison == 1:
  *                     search_high = med1_minus             # <<<<<<<<<<<<<<
@@ -37348,7 +39424,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":536
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":538
  *                     search_high = med1_minus
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -37364,7 +39440,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":538
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":540
  *                     break
  *         else:
  *             med1 = median(low1, high1, step1)             # <<<<<<<<<<<<<<
@@ -37373,7 +39449,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_low1, __pyx_v_high1, __pyx_v_step1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":539
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":541
  *         else:
  *             med1 = median(low1, high1, step1)
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -37382,7 +39458,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":541
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":543
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  * 
  *             search_low = low2             # <<<<<<<<<<<<<<
@@ -37391,7 +39467,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":542
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":544
  * 
  *             search_low = low2
  *             search_high = high2             # <<<<<<<<<<<<<<
@@ -37400,7 +39476,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":543
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":545
  *             search_low = low2
  *             search_high = high2
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -37411,7 +39487,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":544
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":546
  *             search_high = high2
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)             # <<<<<<<<<<<<<<
@@ -37420,7 +39496,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step2);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":545
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":547
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37429,7 +39505,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":546
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":548
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -37438,7 +39514,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":549
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":551
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37447,7 +39523,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":547
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":549
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37456,7 +39532,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":548
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":550
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_high = med2             # <<<<<<<<<<<<<<
@@ -37466,7 +39542,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_high = __pyx_v_med2;
         break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":549
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":551
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37475,7 +39551,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":550
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":552
  *                     search_high = med2
  *                 elif comparison == 1:
  *                     search_low = med2 + step2             # <<<<<<<<<<<<<<
@@ -37486,7 +39562,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":552
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":554
  *                     search_low = med2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -37501,7 +39577,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L9:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":554
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":556
  *                     break
  * 
  *         med_result_len = 0             # <<<<<<<<<<<<<<
@@ -37510,7 +39586,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":555
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":557
  * 
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -37519,7 +39595,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":556
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":558
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))
  *         if search_high > search_low:             # <<<<<<<<<<<<<<
@@ -37529,7 +39605,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (__pyx_v_search_high > __pyx_v_search_low);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":562
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":564
  *             # want to store the bindings for all of those elements.    We can
  *             # subsequently throw all of them away.
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -37538,7 +39614,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":563
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":565
  *             # subsequently throw all of them away.
  *             med2_minus = med2
  *             med2_plus = med2 + step2             # <<<<<<<<<<<<<<
@@ -37547,7 +39623,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = (__pyx_v_med2 + __pyx_v_step2);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":564
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":566
  *             med2_minus = med2
  *             med2_plus = med2 + step2
  *             i1 = med1_minus             # <<<<<<<<<<<<<<
@@ -37556,7 +39632,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_i1 = __pyx_v_med1_minus;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":565
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":567
  *             med2_plus = med2 + step2
  *             i1 = med1_minus
  *             while i1 < med1_plus:             # <<<<<<<<<<<<<<
@@ -37567,7 +39643,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i1 < __pyx_v_med1_plus);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":566
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":568
  *             i1 = med1_minus
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37576,7 +39652,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":567
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":569
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:             # <<<<<<<<<<<<<<
@@ -37587,7 +39663,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = ((__pyx_v_med2_minus - __pyx_v_step2) >= __pyx_v_low2);
         if (!__pyx_t_3) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":568
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":570
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37596,7 +39672,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_med2_minus - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":569
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":571
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:             # <<<<<<<<<<<<<<
@@ -37606,7 +39682,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) < 1);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":570
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":572
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:
  *                         med2_minus = med2_minus - step2             # <<<<<<<<<<<<<<
@@ -37618,7 +39694,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":572
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":574
  *                         med2_minus = med2_minus - step2
  *                     else:
  *                         break             # <<<<<<<<<<<<<<
@@ -37631,7 +39707,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L18_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":573
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":575
  *                     else:
  *                         break
  *                 i2 = med2_minus             # <<<<<<<<<<<<<<
@@ -37640,7 +39716,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_i2 = __pyx_v_med2_minus;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":574
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":576
  *                         break
  *                 i2 = med2_minus
  *                 while i2 < high2:             # <<<<<<<<<<<<<<
@@ -37651,7 +39727,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
         if (!__pyx_t_3) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":575
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":577
  *                 i2 = med2_minus
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37660,7 +39736,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":576
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":578
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -37669,7 +39745,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":577
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":579
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -37679,7 +39755,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == 0);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":579
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":581
  *                     if comparison == 0:
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)             # <<<<<<<<<<<<<<
@@ -37691,7 +39767,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L22:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":580
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":582
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37701,7 +39777,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == -1);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":581
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":583
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -37713,7 +39789,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L23:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":582
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":584
  *                     if comparison == -1:
  *                         break
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -37724,7 +39800,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L21_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":583
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":585
  *                         break
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:             # <<<<<<<<<<<<<<
@@ -37734,7 +39810,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i2 > __pyx_v_med2_plus);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":584
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":586
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:
  *                     med2_plus = i2             # <<<<<<<<<<<<<<
@@ -37746,7 +39822,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L24:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":585
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":587
  *                 if i2 > med2_plus:
  *                     med2_plus = i2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -37756,7 +39832,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_v_i1 = (__pyx_v_i1 + __pyx_v_step1);
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":587
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":589
  *                 i1 = i1 + step1
  * 
  *             tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -37765,7 +39841,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_med1_minus;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":588
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":590
  * 
  *             tmp = med1_minus
  *             med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -37774,7 +39850,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":589
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":591
  *             tmp = med1_minus
  *             med1_minus = med1_plus
  *             med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -37786,7 +39862,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":592
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":594
  *         else:
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -37795,7 +39871,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":593
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":595
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2
  *             med2_plus = med2             # <<<<<<<<<<<<<<
@@ -37804,7 +39880,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = __pyx_v_med2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":594
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":596
  *             med2_minus = med2
  *             med2_plus = med2
  *             if d_first:             # <<<<<<<<<<<<<<
@@ -37813,7 +39889,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     if (__pyx_v_d_first) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":595
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":597
  *             med2_plus = med2
  *             if d_first:
  *                 med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -37822,7 +39898,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":596
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":598
  *             if d_first:
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37832,7 +39908,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == -1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":597
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":599
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:
  *                     med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -37844,7 +39920,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L26:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":598
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":600
  *                 if comparison == -1:
  *                     med1_minus = med1_plus
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -37854,7 +39930,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":599
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":601
  *                     med1_minus = med1_plus
  *                 if comparison == 1:
  *                     med1_plus = med1_minus             # <<<<<<<<<<<<<<
@@ -37869,7 +39945,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":601
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":603
  *                     med1_plus = med1_minus
  *             else:
  *                 tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -37878,7 +39954,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_tmp = __pyx_v_med1_minus;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":602
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":604
  *             else:
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -37887,7 +39963,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":603
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":605
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -37896,7 +39972,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_plus = __pyx_v_tmp;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":604
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":606
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -37906,7 +39982,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":605
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":607
  *                 med1_plus = tmp
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -37915,7 +39991,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":606
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":608
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2
  *                     med2_plus = med2_plus + step2             # <<<<<<<<<<<<<<
@@ -37931,7 +40007,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L14:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":608
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":610
  *                     med2_plus = med2_plus + step2
  * 
  *         low_result_len = 0             # <<<<<<<<<<<<<<
@@ -37940,7 +40016,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":609
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":611
  * 
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)             # <<<<<<<<<<<<<<
@@ -37949,7 +40025,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_low1, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, __pyx_v_low2, __pyx_v_med2_plus, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_low_result_len));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":610
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":612
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0             # <<<<<<<<<<<<<<
@@ -37958,7 +40034,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":611
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":613
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)             # <<<<<<<<<<<<<<
@@ -37967,7 +40043,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med2_minus, __pyx_v_high2, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_high_result_len));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":613
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":615
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)             # <<<<<<<<<<<<<<
@@ -37976,7 +40052,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_low_result, __pyx_v_low_result_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":614
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":616
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)             # <<<<<<<<<<<<<<
@@ -37985,7 +40061,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_med_result, __pyx_v_med_result_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":615
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":617
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)             # <<<<<<<<<<<<<<
@@ -37994,7 +40070,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_high_result, __pyx_v_high_result_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":616
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":618
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)             # <<<<<<<<<<<<<<
@@ -38003,7 +40079,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_low_result);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":617
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":619
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)
  *         free(med_result)             # <<<<<<<<<<<<<<
@@ -38012,7 +40088,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_med_result);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":618
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":620
  *         free(low_result)
  *         free(med_result)
  *         free(high_result)             # <<<<<<<<<<<<<<
@@ -38021,7 +40097,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_high_result);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":620
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":622
  *         free(high_result)
  * 
  *         return result             # <<<<<<<<<<<<<<
@@ -38041,7 +40117,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":624
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":626
  * 
  * 
  *     cdef long compare_matchings_set(self, int i1_minus, int i1_plus, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -38058,9 +40134,9 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   long __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("compare_matchings_set");
+  __Pyx_RefNannySetupContext("compare_matchings_set", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":635
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":637
  *         cdef Matching* loc1
  * 
  *         loc1 = &l1_stack             # <<<<<<<<<<<<<<
@@ -38069,7 +40145,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_loc1 = (&__pyx_v_l1_stack);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":637
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":639
  *         loc1 = &l1_stack
  * 
  *         i1 = i1_minus             # <<<<<<<<<<<<<<
@@ -38078,7 +40154,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_i1 = __pyx_v_i1_minus;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":638
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":640
  * 
  *         i1 = i1_minus
  *         while i1 < i1_plus:             # <<<<<<<<<<<<<<
@@ -38089,7 +40165,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 < __pyx_v_i1_plus);
     if (!__pyx_t_1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":639
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":641
  *         i1 = i1_minus
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38098,7 +40174,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_f_3_sa_assign_matching(__pyx_v_loc1, __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":640
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":642
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -38107,7 +40183,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, __pyx_v_loc1, __pyx_v_loc2, __pyx_v_offset_by_one, __pyx_v_len_last);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":641
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":643
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:             # <<<<<<<<<<<<<<
@@ -38117,7 +40193,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_comparison == 0);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":642
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":644
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:
  *                 prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -38126,7 +40202,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
       __pyx_v_prev_comparison = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":643
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":645
  *             if comparison == 0:
  *                 prev_comparison = 0
  *                 break             # <<<<<<<<<<<<<<
@@ -38137,7 +40213,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       goto __pyx_L5;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":644
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":646
  *                 prev_comparison = 0
  *                 break
  *             elif i1 == i1_minus:             # <<<<<<<<<<<<<<
@@ -38147,7 +40223,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 == __pyx_v_i1_minus);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":645
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":647
  *                 break
  *             elif i1 == i1_minus:
  *                 prev_comparison = comparison             # <<<<<<<<<<<<<<
@@ -38159,7 +40235,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":647
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":649
  *                 prev_comparison = comparison
  *             else:
  *                 if comparison != prev_comparison:             # <<<<<<<<<<<<<<
@@ -38169,7 +40245,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       __pyx_t_1 = (__pyx_v_comparison != __pyx_v_prev_comparison);
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":648
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":650
  *             else:
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -38178,7 +40254,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
         __pyx_v_prev_comparison = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":649
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":651
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -38192,7 +40268,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":650
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":652
  *                     prev_comparison = 0
  *                     break
  *             i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -38203,7 +40279,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   }
   __pyx_L4_break:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":651
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":653
  *                     break
  *             i1 = i1 + step1
  *         return prev_comparison             # <<<<<<<<<<<<<<
@@ -38219,7 +40295,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":654
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":656
  * 
  * 
  *     cdef long compare_matchings(self, Matching* loc1, Matching* loc2, int offset_by_one, int len_last):             # <<<<<<<<<<<<<<
@@ -38235,9 +40311,9 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("compare_matchings");
+  __Pyx_RefNannySetupContext("compare_matchings", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":657
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":659
  *         cdef int i
  * 
  *         if loc1.sent_id > loc2.sent_id:             # <<<<<<<<<<<<<<
@@ -38247,7 +40323,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc1->sent_id > __pyx_v_loc2->sent_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":658
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":660
  * 
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1             # <<<<<<<<<<<<<<
@@ -38260,7 +40336,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":659
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":661
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:             # <<<<<<<<<<<<<<
@@ -38270,7 +40346,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc2->sent_id > __pyx_v_loc1->sent_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":660
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":662
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:
  *             return -1             # <<<<<<<<<<<<<<
@@ -38283,7 +40359,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":662
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":664
  *             return -1
  * 
  *         if loc1.size == 1 and loc2.size == 1:             # <<<<<<<<<<<<<<
@@ -38299,7 +40375,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":663
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":665
  * 
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:             # <<<<<<<<<<<<<<
@@ -38309,7 +40385,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc2->arr[__pyx_v_loc2->start]) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) <= __pyx_v_self->train_min_gap_size);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":664
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":666
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -38324,7 +40400,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     goto __pyx_L5;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":666
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":668
  *                 return 1
  * 
  *         elif offset_by_one:             # <<<<<<<<<<<<<<
@@ -38333,7 +40409,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
  */
   if (__pyx_v_offset_by_one) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":667
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":669
  * 
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -38343,7 +40419,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":668
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":670
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -38353,7 +40429,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":669
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":671
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -38366,7 +40442,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L9:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":670
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":672
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -38376,7 +40452,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":671
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":673
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -38393,7 +40469,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":674
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":676
  * 
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -38403,7 +40479,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) > (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":675
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":677
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -38416,7 +40492,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L11:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":676
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":678
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -38426,7 +40502,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) < (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":677
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":679
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -38439,7 +40515,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L12:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":679
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":681
  *                 return -1
  * 
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -38449,7 +40525,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":680
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":682
  * 
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -38459,7 +40535,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":681
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":683
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -38472,7 +40548,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L15:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":682
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":684
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -38482,7 +40558,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":683
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":685
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -38498,7 +40574,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":685
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":687
  *                     return -1
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -38508,7 +40584,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_3 = ((((__pyx_v_loc2->arr[(__pyx_v_loc2->end - 1)]) + __pyx_v_len_last) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) > __pyx_v_self->train_max_initial_size);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":686
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":688
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1             # <<<<<<<<<<<<<<
@@ -38521,7 +40597,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L17:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":687
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":689
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1
  *         return 0             # <<<<<<<<<<<<<<
@@ -38537,7 +40613,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":690
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":692
  * 
  * 
  *     cdef int* merge_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -38559,9 +40635,9 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("merge_helper");
+  __Pyx_RefNannySetupContext("merge_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":698
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":700
  *         cdef Matching loc1, loc2
  * 
  *         result_len[0] = 0             # <<<<<<<<<<<<<<
@@ -38570,7 +40646,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   (__pyx_v_result_len[0]) = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":699
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":701
  * 
  *         result_len[0] = 0
  *         result = <int*> malloc(0*sizeof(int))             # <<<<<<<<<<<<<<
@@ -38579,7 +40655,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":701
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":703
  *         result = <int*> malloc(0*sizeof(int))
  * 
  *         i1 = low1             # <<<<<<<<<<<<<<
@@ -38588,7 +40664,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i1 = __pyx_v_low1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":702
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":704
  * 
  *         i1 = low1
  *         i2 = low2             # <<<<<<<<<<<<<<
@@ -38597,7 +40673,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i2 = __pyx_v_low2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":703
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":705
  *         i1 = low1
  *         i2 = low2
  *         while i1 < high1 and i2 < high2:             # <<<<<<<<<<<<<<
@@ -38614,7 +40690,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":706
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":708
  * 
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38623,7 +40699,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":707
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":709
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:             # <<<<<<<<<<<<<<
@@ -38634,7 +40710,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":708
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":710
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38643,7 +40719,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":709
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":711
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -38653,7 +40729,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":710
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":712
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -38665,7 +40741,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":712
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":714
  *                     i2 = i2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -38678,7 +40754,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     __pyx_L6_break:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":715
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":717
  * 
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1             # <<<<<<<<<<<<<<
@@ -38687,7 +40763,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_v_j1 = __pyx_v_i1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":716
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":718
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:             # <<<<<<<<<<<<<<
@@ -38704,7 +40780,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       if (!__pyx_t_2) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":717
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":719
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38713,7 +40789,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":718
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":720
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2             # <<<<<<<<<<<<<<
@@ -38722,7 +40798,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_v_j2 = __pyx_v_i2;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":719
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":721
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2
  *                 while j2 < high2:             # <<<<<<<<<<<<<<
@@ -38733,7 +40809,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_j2 < __pyx_v_high2);
         if (!__pyx_t_2) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":720
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":722
  *                 j2 = i2
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38742,7 +40818,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_j2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":721
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":723
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -38751,7 +40827,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":722
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":724
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -38761,7 +40837,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == 0);
         if (__pyx_t_2) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":723
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":725
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -38773,7 +40849,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L12:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":724
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":726
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)
  *                     if comparison == 1:             # <<<<<<<<<<<<<<
@@ -38786,7 +40862,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L13:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":726
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":728
  *                     if comparison == 1:
  *                         pass
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -38796,7 +40872,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == -1);
         if (__pyx_t_2) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":727
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":729
  *                         pass
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -38808,7 +40884,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":729
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":731
  *                         break
  *                     else:
  *                         j2 = j2 + step2             # <<<<<<<<<<<<<<
@@ -38821,7 +40897,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       __pyx_L11_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":730
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":732
  *                     else:
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -38832,7 +40908,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":731
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":733
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1
  *         return result             # <<<<<<<<<<<<<<
@@ -38848,7 +40924,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":734
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":736
  * 
  * 
  *     cdef void sort_phrase_loc(self, IntList arr, PhraseLocation loc, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -38868,28 +40944,28 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sort_phrase_loc");
+  __Pyx_RefNannySetupContext("sort_phrase_loc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":739
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":741
  *         cdef IntList result
  * 
  *         if phrase in self.precomputed_index:             # <<<<<<<<<<<<<<
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  */
-  __pyx_t_1 = ((PySequence_Contains(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 739; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_phrase), __pyx_v_self->precomputed_index, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":740
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":742
  * 
  *         if phrase in self.precomputed_index:
  *             loc.arr = self.precomputed_index[phrase]             # <<<<<<<<<<<<<<
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 740; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 740; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GIVEREF(__pyx_t_2);
     __Pyx_GOTREF(__pyx_v_loc->arr);
     __Pyx_DECREF(((PyObject *)__pyx_v_loc->arr));
@@ -38899,20 +40975,20 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":742
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":744
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)             # <<<<<<<<<<<<<<
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:
  */
-    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_loc->sa_high - __pyx_v_loc->sa_low)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_loc->sa_high - __pyx_v_loc->sa_low)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_GIVEREF(__pyx_t_3);
@@ -38921,27 +40997,27 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_v_loc->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":743
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":745
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)             # <<<<<<<<<<<<<<
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])
  */
-    __pyx_t_3 = PyInt_FromLong(__pyx_v_arr->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong(__pyx_v_arr->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_VEB)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_VEB)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":744
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":746
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:             # <<<<<<<<<<<<<<
@@ -38951,7 +41027,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = __pyx_v_loc->sa_high;
     for (__pyx_v_i = __pyx_v_loc->sa_low; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":745
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":747
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])             # <<<<<<<<<<<<<<
@@ -38961,7 +41037,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
       ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_v_veb->__pyx_vtab)->_insert(__pyx_v_veb, (__pyx_v_arr->arr[__pyx_v_i]));
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":746
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":748
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -38970,7 +41046,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
     __pyx_v_i = __pyx_v_veb->veb->min_val;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":747
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":749
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:             # <<<<<<<<<<<<<<
@@ -38980,7 +41056,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = (__pyx_v_loc->sa_high - __pyx_v_loc->sa_low);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":748
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":750
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i             # <<<<<<<<<<<<<<
@@ -38989,7 +41065,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
       (__pyx_v_loc->arr->arr[__pyx_v_j]) = __pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":749
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":751
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -39001,7 +41077,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":750
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":752
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0             # <<<<<<<<<<<<<<
@@ -39010,7 +41086,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
   __pyx_v_loc->arr_low = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":751
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":753
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0
  *         loc.arr_high = loc.arr.len             # <<<<<<<<<<<<<<
@@ -39029,7 +41105,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":754
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":756
  * 
  * 
  *     cdef intersect_helper(self, Phrase prefix, Phrase suffix,             # <<<<<<<<<<<<<<
@@ -39064,9 +41140,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("intersect_helper");
+  __Pyx_RefNannySetupContext("intersect_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":761
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":763
  *         cdef int* result_ptr
  * 
  *         result_len = 0             # <<<<<<<<<<<<<<
@@ -39075,21 +41151,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":763
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":765
  *         result_len = 0
  * 
  *         if sym_isvar(suffix[0]):             # <<<<<<<<<<<<<<
  *             offset_by_one = 1
  *         else:
  */
-  __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_suffix), 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_suffix), 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_t_2);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":764
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":766
  * 
  *         if sym_isvar(suffix[0]):
  *             offset_by_one = 1             # <<<<<<<<<<<<<<
@@ -39101,7 +41177,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":766
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":768
  *             offset_by_one = 1
  *         else:
  *             offset_by_one = 0             # <<<<<<<<<<<<<<
@@ -39112,34 +41188,34 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":768
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":770
  *             offset_by_one = 0
  * 
  *         len_last = len(suffix.getchunk(suffix.arity()))             # <<<<<<<<<<<<<<
  * 
  *         if prefix_loc.arr is None:
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__getchunk); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__getchunk); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
   __Pyx_GIVEREF(__pyx_t_5);
   __pyx_t_5 = 0;
-  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-  __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_len_last = __pyx_t_6;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":770
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":772
  *         len_last = len(suffix.getchunk(suffix.arity()))
  * 
  *         if prefix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -39149,7 +41225,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_prefix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":771
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":773
  * 
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)             # <<<<<<<<<<<<<<
@@ -39164,7 +41240,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":772
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":774
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr             # <<<<<<<<<<<<<<
@@ -39174,7 +41250,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_prefix_loc->arr));
   __pyx_v_arr1 = __pyx_v_prefix_loc->arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":773
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":775
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -39183,7 +41259,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low1 = __pyx_v_prefix_loc->arr_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":774
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":776
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -39192,7 +41268,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high1 = __pyx_v_prefix_loc->arr_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":775
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":777
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high
  *         step1 = prefix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -39201,7 +41277,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step1 = __pyx_v_prefix_loc->num_subpatterns;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":777
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":779
  *         step1 = prefix_loc.num_subpatterns
  * 
  *         if suffix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -39211,7 +41287,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_suffix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":778
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":780
  * 
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)             # <<<<<<<<<<<<<<
@@ -39226,7 +41302,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":779
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":781
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr             # <<<<<<<<<<<<<<
@@ -39236,7 +41312,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_suffix_loc->arr));
   __pyx_v_arr2 = __pyx_v_suffix_loc->arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":780
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":782
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -39245,7 +41321,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low2 = __pyx_v_suffix_loc->arr_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":781
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":783
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -39254,7 +41330,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high2 = __pyx_v_suffix_loc->arr_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":782
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":784
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high
  *         step2 = suffix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -39263,26 +41339,26 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step2 = __pyx_v_suffix_loc->num_subpatterns;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":784
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":786
  *         step2 = suffix_loc.num_subpatterns
  * 
  *         num_subpatterns = prefix.arity()+1             # <<<<<<<<<<<<<<
  * 
  *         if algorithm == MERGE:
  */
-  __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_prefix), __pyx_n_s__arity); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_prefix), __pyx_n_s__arity); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_num_subpatterns = __pyx_t_3;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":786
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":788
  *         num_subpatterns = prefix.arity()+1
  * 
  *         if algorithm == MERGE:             # <<<<<<<<<<<<<<
@@ -39292,7 +41368,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_algorithm == __pyx_v_3_sa_MERGE);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":789
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":791
  *             result_ptr = self.merge_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -39304,7 +41380,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":793
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":795
  *             result_ptr = self.baeza_yates_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -39315,7 +41391,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":795
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":797
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)
  * 
  *         if result_len == 0:             # <<<<<<<<<<<<<<
@@ -39325,7 +41401,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_result_len == 0);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":796
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":798
  * 
  *         if result_len == 0:
  *             free(result_ptr)             # <<<<<<<<<<<<<<
@@ -39334,7 +41410,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result_ptr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":797
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":799
  *         if result_len == 0:
  *             free(result_ptr)
  *             return None             # <<<<<<<<<<<<<<
@@ -39349,19 +41425,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":799
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":801
  *             return None
  *         else:
  *             result = IntList()             # <<<<<<<<<<<<<<
  *             free(result.arr)
  *             result.arr = result_ptr
  */
-    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_v_result = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":800
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":802
  *         else:
  *             result = IntList()
  *             free(result.arr)             # <<<<<<<<<<<<<<
@@ -39370,7 +41446,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":801
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":803
  *             result = IntList()
  *             free(result.arr)
  *             result.arr = result_ptr             # <<<<<<<<<<<<<<
@@ -39379,7 +41455,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->arr = __pyx_v_result_ptr;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":802
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":804
  *             free(result.arr)
  *             result.arr = result_ptr
  *             result.len = result_len             # <<<<<<<<<<<<<<
@@ -39388,7 +41464,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->len = __pyx_v_result_len;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":803
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":805
  *             result.arr = result_ptr
  *             result.len = result_len
  *             result.size = result_len             # <<<<<<<<<<<<<<
@@ -39397,7 +41473,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->size = __pyx_v_result_len;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":804
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":806
  *             result.len = result_len
  *             result.size = result_len
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)             # <<<<<<<<<<<<<<
@@ -39405,19 +41481,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  *     cdef loc2str(self, PhraseLocation loc):
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_result_len); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_result_len); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr), ((PyObject *)__pyx_v_result)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr), ((PyObject *)__pyx_v_result)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_r = __pyx_t_4;
@@ -39443,7 +41519,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":806
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":808
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)
  * 
  *     cdef loc2str(self, PhraseLocation loc):             # <<<<<<<<<<<<<<
@@ -39451,7 +41527,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  *         result = "{"
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_loc) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_loc) {
   int __pyx_v_i;
   int __pyx_v_j;
   PyObject *__pyx_v_result = NULL;
@@ -39464,9 +41540,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("loc2str");
+  __Pyx_RefNannySetupContext("loc2str", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":808
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":810
  *     cdef loc2str(self, PhraseLocation loc):
  *         cdef int i, j
  *         result = "{"             # <<<<<<<<<<<<<<
@@ -39476,7 +41552,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_116));
   __pyx_v_result = ((PyObject *)__pyx_kp_s_116);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":809
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":811
  *         cdef int i, j
  *         result = "{"
  *         i = 0             # <<<<<<<<<<<<<<
@@ -39485,7 +41561,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":810
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":812
  *         result = "{"
  *         i = 0
  *         while i < loc.arr_high:             # <<<<<<<<<<<<<<
@@ -39496,20 +41572,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_t_1 = (__pyx_v_i < __pyx_v_loc->arr_high);
     if (!__pyx_t_1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":811
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":813
  *         i = 0
  *         while i < loc.arr_high:
  *             result = result + "("             # <<<<<<<<<<<<<<
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  */
-    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_117)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_117)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_v_result);
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":812
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":814
  *         while i < loc.arr_high:
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -39519,19 +41595,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_t_3 = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
     for (__pyx_v_j = __pyx_v_i; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":813
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":815
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])             # <<<<<<<<<<<<<<
  *             result = result + ")"
  *             i = i + loc.num_subpatterns
  */
-      __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_loc->arr), __pyx_v_j, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_loc->arr), __pyx_v_j, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_v_result);
@@ -39539,20 +41615,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
       __pyx_t_2 = 0;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":814
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":816
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"             # <<<<<<<<<<<<<<
  *             i = i + loc.num_subpatterns
  *         result = result + "}"
  */
-    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_59)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_59)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_v_result);
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":815
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":817
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"
  *             i = i + loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -39562,20 +41638,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":816
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":818
  *             result = result + ")"
  *             i = i + loc.num_subpatterns
  *         result = result + "}"             # <<<<<<<<<<<<<<
  *         return result
  * 
  */
-  __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_118)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_118)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_v_result);
   __pyx_v_result = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":817
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":819
  *             i = i + loc.num_subpatterns
  *         result = result + "}"
  *         return result             # <<<<<<<<<<<<<<
@@ -39601,7 +41677,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":819
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":821
  *         return result
  * 
  *     cdef PhraseLocation intersect(self, prefix_node, suffix_node, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -39615,7 +41691,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_prefix_loc = 0;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_suffix_loc = 0;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_result = 0;
-  PyObject *__pyx_v_intersect_method = NULL;
+  CYTHON_UNUSED PyObject *__pyx_v_intersect_method = NULL;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -39625,83 +41701,83 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("intersect");
+  __Pyx_RefNannySetupContext("intersect", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":823
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":825
  *         cdef PhraseLocation prefix_loc, suffix_loc, result
  * 
  *         prefix = prefix_node.phrase             # <<<<<<<<<<<<<<
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_prefix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":824
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":826
  * 
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase             # <<<<<<<<<<<<<<
  *         prefix_loc = prefix_node.phrase_location
  *         suffix_loc = suffix_node.phrase_location
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_suffix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":825
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":827
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location             # <<<<<<<<<<<<<<
  *         suffix_loc = suffix_node.phrase_location
  * 
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_prefix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":826
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":828
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location
  *         suffix_loc = suffix_node.phrase_location             # <<<<<<<<<<<<<<
  * 
  *         result = self.get_precomputed_collocation(phrase)
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_suffix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":828
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":830
  *         suffix_loc = suffix_node.phrase_location
  * 
  *         result = self.get_precomputed_collocation(phrase)             # <<<<<<<<<<<<<<
  *         if result is not None:
  *             intersect_method = "precomputed"
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_119); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_119); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)__pyx_v_phrase));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_phrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_phrase));
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":829
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":831
  * 
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:             # <<<<<<<<<<<<<<
@@ -39711,7 +41787,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) != Py_None);
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":830
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":832
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:
  *             intersect_method = "precomputed"             # <<<<<<<<<<<<<<
@@ -39724,7 +41800,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":832
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":834
  *             intersect_method = "precomputed"
  * 
  *         if result is None:             # <<<<<<<<<<<<<<
@@ -39734,7 +41810,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) == Py_None);
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":833
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":835
  * 
  *         if result is None:
  *             if self.use_baeza_yates:             # <<<<<<<<<<<<<<
@@ -39743,21 +41819,21 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
  */
     if (__pyx_v_self->use_baeza_yates) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":834
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":836
  *         if result is None:
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)             # <<<<<<<<<<<<<<
  *                 intersect_method="double binary"
  *             else:
  */
-      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_BAEZA_YATES); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_BAEZA_YATES); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_v_result));
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":835
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":837
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)
  *                 intersect_method="double binary"             # <<<<<<<<<<<<<<
@@ -39771,21 +41847,21 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":837
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":839
  *                 intersect_method="double binary"
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)             # <<<<<<<<<<<<<<
  *                 intersect_method="merge"
  *         return result
  */
-      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_MERGE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_MERGE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_v_result));
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":838
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":840
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"             # <<<<<<<<<<<<<<
@@ -39801,7 +41877,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":839
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":841
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"
  *         return result             # <<<<<<<<<<<<<<
@@ -39833,56 +41909,22 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":841
- *         return result
- * 
- *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
- *         cdef unsigned na
- *         nf = []
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_frontier = 0;
   PyObject *__pyx_v_res = 0;
   PyObject *__pyx_v_fwords = 0;
-  unsigned int __pyx_v_na;
-  PyObject *__pyx_v_nf = NULL;
-  PyObject *__pyx_v_toskip = NULL;
-  PyObject *__pyx_v_i = NULL;
-  PyObject *__pyx_v_alt = NULL;
-  PyObject *__pyx_v_pathlen = NULL;
-  PyObject *__pyx_v_spanlen = NULL;
-  PyObject *__pyx_v_ni = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *(*__pyx_t_3)(PyObject *);
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  int __pyx_t_12;
-  Py_ssize_t __pyx_t_13;
-  int __pyx_t_14;
-  int __pyx_t_15;
-  unsigned int __pyx_t_16;
-  int __pyx_t_17;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
-  __Pyx_RefNannySetupContext("advance");
+  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -39890,26 +41932,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__frontier);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__frontier)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -39924,26 +41963,71 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_frontier, __pyx_v_res, __pyx_v_fwords);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":843
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":843
+ *         return result
+ * 
+ *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
+ *         cdef unsigned na
+ *         nf = []
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_frontier, PyObject *__pyx_v_res, PyObject *__pyx_v_fwords) {
+  unsigned int __pyx_v_na;
+  PyObject *__pyx_v_nf = NULL;
+  PyObject *__pyx_v_toskip = NULL;
+  PyObject *__pyx_v_i = NULL;
+  PyObject *__pyx_v_alt = NULL;
+  PyObject *__pyx_v_pathlen = NULL;
+  PyObject *__pyx_v_spanlen = NULL;
+  PyObject *__pyx_v_ni = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  Py_ssize_t __pyx_t_13;
+  int __pyx_t_14;
+  int __pyx_t_15;
+  unsigned int __pyx_t_16;
+  int __pyx_t_17;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("advance", 0);
+
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":845
  *     def advance(self, frontier, res, fwords):
  *         cdef unsigned na
  *         nf = []             # <<<<<<<<<<<<<<
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_nf = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":844
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":846
  *         cdef unsigned na
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:             # <<<<<<<<<<<<<<
@@ -39954,23 +42038,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_t_1 = __pyx_v_frontier; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_frontier); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_frontier); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -39978,66 +42070,74 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
       PyObject* sequence = __pyx_t_4;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 2)) {
+        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
+      #else
+      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
-      __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
-      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L8_unpacking_failed;
+      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_5);
-      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
+      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L9_unpacking_done;
-      __pyx_L8_unpacking_failed:;
+      goto __pyx_L6_unpacking_done;
+      __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L9_unpacking_done:;
+      __pyx_t_8 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_L6_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_toskip);
     __pyx_v_toskip = __pyx_t_5;
     __pyx_t_5 = 0;
     if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) {
       PyObject* sequence = __pyx_t_6;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 3)) {
+        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-          if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_7 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_9 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-          if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_7 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_9 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
@@ -40045,28 +42145,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_t_10);
+      #else
+      __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
-      __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_11)->tp_iternext;
-      index = 0; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L10_unpacking_failed;
+      index = 0; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      index = 1; __pyx_t_9 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_9)) goto __pyx_L10_unpacking_failed;
+      index = 1; __pyx_t_9 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_9)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_9);
-      index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L10_unpacking_failed;
+      index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_10);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      goto __pyx_L11_unpacking_done;
-      __pyx_L10_unpacking_failed:;
+      goto __pyx_L8_unpacking_done;
+      __pyx_L7_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L11_unpacking_done:;
+      __pyx_t_8 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_L8_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_7;
@@ -40078,47 +42185,46 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_v_pathlen = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":845
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":847
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))
  */
-    __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_i); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_i); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_6 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_XDECREF(__pyx_v_spanlen);
     __pyx_v_spanlen = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":846
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":848
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):             # <<<<<<<<<<<<<<
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":847
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":849
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))             # <<<<<<<<<<<<<<
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  */
-      __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_v_i);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
       __Pyx_GIVEREF(__pyx_v_i);
@@ -40128,52 +42234,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
       __Pyx_INCREF(__pyx_v_pathlen);
       PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_pathlen);
       __Pyx_GIVEREF(__pyx_v_pathlen);
-      __pyx_t_6 = __Pyx_PyObject_Append(__pyx_v_res, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Append(__pyx_v_res, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L12;
+      goto __pyx_L9;
     }
-    __pyx_L12:;
+    __pyx_L9:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":848
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":850
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen             # <<<<<<<<<<<<<<
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):
  */
-    __pyx_t_6 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_XDECREF(__pyx_v_ni);
     __pyx_v_ni = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":849
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":851
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):             # <<<<<<<<<<<<<<
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  */
-    __pyx_t_13 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
-      __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_6 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_15 = __pyx_t_14;
     } else {
@@ -40181,38 +42285,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     }
     if (__pyx_t_15) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":850
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":852
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):             # <<<<<<<<<<<<<<
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):
  */
-      __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ni); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ni); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_13 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_13 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_13; __pyx_t_16+=1) {
         __pyx_v_na = __pyx_t_16;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":851
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":853
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))             # <<<<<<<<<<<<<<
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)
  */
-        if (unlikely(((PyObject *)__pyx_v_nf) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
-        __pyx_t_5 = PyNumber_Subtract(__pyx_v_toskip, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyNumber_Subtract(__pyx_v_toskip, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_na); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_na); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+        __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_10);
         __Pyx_INCREF(__pyx_v_ni);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_ni);
         __Pyx_GIVEREF(__pyx_v_ni);
@@ -40222,38 +42323,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
         __Pyx_GIVEREF(__pyx_t_4);
         __pyx_t_6 = 0;
         __pyx_t_4 = 0;
-        __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+        __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
         PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_t_10));
         __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
         __pyx_t_5 = 0;
         __pyx_t_10 = 0;
-        __pyx_t_17 = PyList_Append(__pyx_v_nf, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = PyList_Append(__pyx_v_nf, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       }
-      goto __pyx_L13;
+      goto __pyx_L10;
     }
-    __pyx_L13:;
+    __pyx_L10:;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":852
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":854
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):             # <<<<<<<<<<<<<<
  *             return self.advance(nf, res, fwords)
  *         else:
  */
-  if (unlikely(((PyObject *)__pyx_v_nf) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); 
+  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_15 = (__pyx_t_2 > 0);
   if (__pyx_t_15) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":853
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":855
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)             # <<<<<<<<<<<<<<
@@ -40261,10 +42359,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
  *             return res
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_v_nf));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_nf));
     __Pyx_GIVEREF(((PyObject *)__pyx_v_nf));
@@ -40274,18 +42372,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
-    __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_r = __pyx_t_10;
     __pyx_t_10 = 0;
     goto __pyx_L0;
-    goto __pyx_L16;
+    goto __pyx_L13;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":855
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":857
  *             return self.advance(nf, res, fwords)
  *         else:
  *             return res             # <<<<<<<<<<<<<<
@@ -40297,7 +42395,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_r = __pyx_v_res;
     goto __pyx_L0;
   }
-  __pyx_L16:;
+  __pyx_L13:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -40325,16 +42423,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":857
- *             return res
- * 
- *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
- *         cdef unsigned alt_it
- *         frontier = []
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_skip = 0;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_spanlen = 0;
@@ -40342,39 +42433,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_next_states = 0;
   PyObject *__pyx_v_reachable_buffer = 0;
-  PyObject *__pyx_v_frontier = NULL;
-  PyObject *__pyx_v_key = NULL;
-  PyObject *__pyx_v_reachable = NULL;
-  PyObject *__pyx_v_nextreachable = NULL;
-  PyObject *__pyx_v_next_id = NULL;
-  PyObject *__pyx_v_jump = NULL;
-  Py_ssize_t __pyx_v_alt_id;
-  PyObject *__pyx_v_newel = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  PyObject *(*__pyx_t_6)(PyObject *);
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  Py_ssize_t __pyx_t_11;
-  Py_ssize_t __pyx_t_12;
-  int __pyx_t_13;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__skip,&__pyx_n_s__i,&__pyx_n_s__spanlen,&__pyx_n_s__pathlen,&__pyx_n_s__fwords,&__pyx_n_s__next_states,&__pyx_n_s__reachable_buffer,0};
-  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away");
+  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__skip,&__pyx_n_s__i,&__pyx_n_s__spanlen,&__pyx_n_s__pathlen,&__pyx_n_s__fwords,&__pyx_n_s__next_states,&__pyx_n_s__reachable_buffer,0};
     PyObject* values[7] = {0,0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
@@ -40386,50 +42454,43 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__skip);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__skip)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
-        values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[4])) kw_args--;
+        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
-        values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states);
-        if (likely(values[5])) kw_args--;
+        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  6:
-        values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer);
-        if (likely(values[6])) kw_args--;
+        if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 7) {
       goto __pyx_L5_argtuple_error;
@@ -40452,49 +42513,90 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_all_nodes_isteps_away", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_skip, __pyx_v_i, __pyx_v_spanlen, __pyx_v_pathlen, __pyx_v_fwords, __pyx_v_next_states, __pyx_v_reachable_buffer);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":859
+ *             return res
+ * 
+ *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
+ *         cdef unsigned alt_it
+ *         frontier = []
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_skip, PyObject *__pyx_v_i, PyObject *__pyx_v_spanlen, PyObject *__pyx_v_pathlen, PyObject *__pyx_v_fwords, PyObject *__pyx_v_next_states, PyObject *__pyx_v_reachable_buffer) {
+  PyObject *__pyx_v_frontier = NULL;
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_v_reachable = NULL;
+  PyObject *__pyx_v_nextreachable = NULL;
+  PyObject *__pyx_v_next_id = NULL;
+  PyObject *__pyx_v_jump = NULL;
+  PyObject *__pyx_v_alt_id = NULL;
+  PyObject *__pyx_v_newel = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  Py_ssize_t __pyx_t_11;
+  PyObject *(*__pyx_t_12)(PyObject *);
+  PyObject *__pyx_t_13 = NULL;
+  int __pyx_t_14;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":859
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":861
  *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):
  *         cdef unsigned alt_it
  *         frontier = []             # <<<<<<<<<<<<<<
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_frontier = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":860
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":862
  *         cdef unsigned alt_it
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):             # <<<<<<<<<<<<<<
  *             return frontier
  *         key = tuple([i,spanlen])
  */
-  __pyx_t_1 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_skip); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_skip); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = PyObject_Length(__pyx_v_next_states); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Length(__pyx_v_next_states); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":861
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":863
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier             # <<<<<<<<<<<<<<
@@ -40505,80 +42607,80 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __Pyx_INCREF(((PyObject *)__pyx_v_frontier));
     __pyx_r = ((PyObject *)__pyx_v_frontier);
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":862
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":864
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier
  *         key = tuple([i,spanlen])             # <<<<<<<<<<<<<<
  *         reachable = []
  *         if (key in reachable_buffer):
  */
-  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(__pyx_v_i);
   PyList_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
   __Pyx_INCREF(__pyx_v_spanlen);
   PyList_SET_ITEM(__pyx_t_4, 1, __pyx_v_spanlen);
   __Pyx_GIVEREF(__pyx_v_spanlen);
-  __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_t_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_t_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
   __pyx_v_key = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":863
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":865
  *             return frontier
  *         key = tuple([i,spanlen])
  *         reachable = []             # <<<<<<<<<<<<<<
  *         if (key in reachable_buffer):
  *             reachable = reachable_buffer[key]
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_reachable = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":864
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":866
  *         key = tuple([i,spanlen])
  *         reachable = []
  *         if (key in reachable_buffer):             # <<<<<<<<<<<<<<
  *             reachable = reachable_buffer[key]
  *         else:
  */
-  __pyx_t_5 = ((PySequence_Contains(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_key), __pyx_v_reachable_buffer, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":865
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":867
  *         reachable = []
  *         if (key in reachable_buffer):
  *             reachable = reachable_buffer[key]             # <<<<<<<<<<<<<<
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)
  */
-    __pyx_t_1 = PyObject_GetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_v_reachable);
     __pyx_v_reachable = __pyx_t_1;
     __pyx_t_1 = 0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":867
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":869
  *             reachable = reachable_buffer[key]
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)             # <<<<<<<<<<<<<<
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
@@ -40588,7 +42690,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __Pyx_INCREF(__pyx_v_spanlen);
     PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_spanlen);
     __Pyx_GIVEREF(__pyx_v_spanlen);
-    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -40596,18 +42698,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __pyx_v_reachable = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":868
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":870
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable             # <<<<<<<<<<<<<<
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:
  */
-    if (PyObject_SetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key), __pyx_v_reachable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key), __pyx_v_reachable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":869
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":871
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:             # <<<<<<<<<<<<<<
@@ -40618,23 +42720,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __pyx_t_2 = __pyx_v_reachable; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_6 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_reachable); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_reachable); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_6 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_6 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_6(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -40644,37 +42754,45 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __pyx_v_nextreachable = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":870
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":872
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:             # <<<<<<<<<<<<<<
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:
  */
-    __pyx_t_4 = PyObject_GetItem(__pyx_v_next_states, __pyx_v_nextreachable); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetItem(__pyx_v_next_states, __pyx_v_nextreachable); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
       __pyx_t_1 = __pyx_t_4; __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
       __pyx_t_8 = NULL;
     } else {
-      __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
     }
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_1)) {
+      if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
-      } else if (PyTuple_CheckExact(__pyx_t_1)) {
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
         __pyx_t_4 = __pyx_t_8(__pyx_t_1);
         if (unlikely(!__pyx_t_4)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -40684,17 +42802,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
       __pyx_v_next_id = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":871
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":873
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)             # <<<<<<<<<<<<<<
  *                 if jump < skip:
  *                     continue
  */
-      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+      __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_fwords);
       __Pyx_GIVEREF(__pyx_v_fwords);
@@ -40704,7 +42822,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
       __Pyx_INCREF(__pyx_v_next_id);
       PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_v_next_id);
       __Pyx_GIVEREF(__pyx_v_next_id);
-      __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
@@ -40712,169 +42830,206 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
       __pyx_v_jump = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":872
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":874
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:             # <<<<<<<<<<<<<<
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  */
-      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":873
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":875
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:
  *                     continue             # <<<<<<<<<<<<<<
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  */
-        goto __pyx_L10_continue;
-        goto __pyx_L12;
+        goto __pyx_L7_continue;
+        goto __pyx_L9;
       }
-      __pyx_L12:;
+      __pyx_L9:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":874
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":876
  *                 if jump < skip:
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  */
-      __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_9 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":875
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":877
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):             # <<<<<<<<<<<<<<
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)
  */
-        __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_11 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_9);
+        PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4);
+        __Pyx_GIVEREF(__pyx_t_4);
+        __pyx_t_4 = 0;
+        __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_11 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+        if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
+          __pyx_t_9 = __pyx_t_4; __Pyx_INCREF(__pyx_t_9); __pyx_t_11 = 0;
+          __pyx_t_12 = NULL;
+        } else {
+          __pyx_t_11 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_12 = Py_TYPE(__pyx_t_9)->tp_iternext;
+        }
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
-          __pyx_v_alt_id = __pyx_t_12;
+        for (;;) {
+          if (!__pyx_t_12 && PyList_CheckExact(__pyx_t_9)) {
+            if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_9)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else if (!__pyx_t_12 && PyTuple_CheckExact(__pyx_t_9)) {
+            if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else {
+            __pyx_t_4 = __pyx_t_12(__pyx_t_9);
+            if (unlikely(!__pyx_t_4)) {
+              if (PyErr_Occurred()) {
+                if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              break;
+            }
+            __Pyx_GOTREF(__pyx_t_4);
+          }
+          __Pyx_XDECREF(__pyx_v_alt_id);
+          __pyx_v_alt_id = __pyx_t_4;
+          __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":876
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":878
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:
  */
-          __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_10 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt_id); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_9, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyObject_RichCompare(__pyx_t_4, __pyx_t_9, Py_NE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_13 = PyObject_RichCompare(__pyx_t_4, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
           if (__pyx_t_5) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":877
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":879
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)             # <<<<<<<<<<<<<<
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  */
-            __pyx_t_10 = PyInt_FromSsize_t(__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
+            __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_4));
             __Pyx_INCREF(__pyx_v_next_id);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_next_id);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
             __Pyx_GIVEREF(__pyx_v_next_id);
-            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_9);
-            __Pyx_GIVEREF(__pyx_t_9);
-            __pyx_t_10 = 0;
-            __pyx_t_9 = 0;
+            __Pyx_INCREF(__pyx_v_alt_id);
+            PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_v_alt_id);
+            __Pyx_GIVEREF(__pyx_v_alt_id);
+            PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_13);
+            __Pyx_GIVEREF(__pyx_t_13);
+            __pyx_t_13 = 0;
             __Pyx_XDECREF(((PyObject *)__pyx_v_newel));
-            __pyx_v_newel = __pyx_t_4;
-            __pyx_t_4 = 0;
+            __pyx_v_newel = __pyx_t_10;
+            __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":878
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":880
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:             # <<<<<<<<<<<<<<
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier
  */
-            __pyx_t_5 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_frontier), ((PyObject *)__pyx_v_newel)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_newel), ((PyObject *)__pyx_v_frontier), Py_NE)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (__pyx_t_5) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":879
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":881
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))             # <<<<<<<<<<<<<<
  *         return frontier
  * 
  */
-              if (unlikely(((PyObject *)__pyx_v_frontier) == Py_None)) {
-                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-              }
-              __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_alt_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_4);
-              __pyx_t_9 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_9);
-              __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+              __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_10);
+              __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_13);
               __Pyx_INCREF(__pyx_v_next_id);
-              PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
+              PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_v_next_id);
               __Pyx_GIVEREF(__pyx_v_next_id);
-              PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_4);
-              __Pyx_GIVEREF(__pyx_t_4);
-              PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_9);
-              __Pyx_GIVEREF(__pyx_t_9);
-              __pyx_t_4 = 0;
-              __pyx_t_9 = 0;
-              __pyx_t_13 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_10)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-              goto __pyx_L17;
+              __Pyx_INCREF(__pyx_v_alt_id);
+              PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_v_alt_id);
+              __Pyx_GIVEREF(__pyx_v_alt_id);
+              PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
+              __Pyx_GIVEREF(__pyx_t_10);
+              __pyx_t_10 = 0;
+              __pyx_t_14 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+              goto __pyx_L14;
             }
-            __pyx_L17:;
-            goto __pyx_L16;
+            __pyx_L14:;
+            goto __pyx_L13;
           }
-          __pyx_L16:;
+          __pyx_L13:;
         }
-        goto __pyx_L13;
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        goto __pyx_L10;
       }
-      __pyx_L13:;
-      __pyx_L10_continue:;
+      __pyx_L10:;
+      __pyx_L7_continue:;
     }
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":880
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":882
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier             # <<<<<<<<<<<<<<
@@ -40894,6 +43049,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_13);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_all_nodes_isteps_away", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -40903,50 +43059,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __Pyx_XDECREF(__pyx_v_nextreachable);
   __Pyx_XDECREF(__pyx_v_next_id);
   __Pyx_XDECREF(__pyx_v_jump);
+  __Pyx_XDECREF(__pyx_v_alt_id);
   __Pyx_XDECREF(__pyx_v_newel);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":882
- *         return frontier
- * 
- *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
- *         ret = []
- *         if (ifrom >= len(fwords)):
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_dist = 0;
-  PyObject *__pyx_v_ret = NULL;
-  Py_ssize_t __pyx_v_alt_id;
-  PyObject *__pyx_v_ifromchild = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  Py_ssize_t __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  int __pyx_t_8;
-  Py_ssize_t __pyx_t_9;
-  PyObject *(*__pyx_t_10)(PyObject *);
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
-  __Pyx_RefNannySetupContext("reachable");
+  __Pyx_RefNannySetupContext("reachable (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -40954,26 +43089,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -40988,43 +43120,76 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.reachable", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_ifrom, __pyx_v_dist);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":884
+ *         return frontier
+ * 
+ *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
+ *         ret = []
+ *         if (ifrom >= len(fwords)):
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_dist) {
+  PyObject *__pyx_v_ret = NULL;
+  PyObject *__pyx_v_alt_id = NULL;
+  PyObject *__pyx_v_ifromchild = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  PyObject *(*__pyx_t_5)(PyObject *);
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  Py_ssize_t __pyx_t_10;
+  PyObject *(*__pyx_t_11)(PyObject *);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("reachable", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":883
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":885
  * 
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []             # <<<<<<<<<<<<<<
  *         if (ifrom >= len(fwords)):
  *             return ret
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":884
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":886
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []
  *         if (ifrom >= len(fwords)):             # <<<<<<<<<<<<<<
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):
  */
-  __pyx_t_2 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":885
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":887
  *         ret = []
  *         if (ifrom >= len(fwords)):
  *             return ret             # <<<<<<<<<<<<<<
@@ -41035,200 +43200,249 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
     __Pyx_INCREF(((PyObject *)__pyx_v_ret));
     __pyx_r = ((PyObject *)__pyx_v_ret);
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":886
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":888
  *         if (ifrom >= len(fwords)):
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
  *             if (fwords[ifrom][alt_id][0] == EPSILON):
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  */
-  __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_2 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+    __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+    __pyx_t_5 = NULL;
+  } else {
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_2; __pyx_t_5+=1) {
-    __pyx_v_alt_id = __pyx_t_5;
+  for (;;) {
+    if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else {
+      __pyx_t_3 = __pyx_t_5(__pyx_t_1);
+      if (unlikely(!__pyx_t_3)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    __Pyx_XDECREF(__pyx_v_alt_id);
+    __pyx_v_alt_id = __pyx_t_3;
+    __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":887
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":889
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):             # <<<<<<<<<<<<<<
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  *             else:
  */
-    __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_6 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, __pyx_t_1, Py_EQ); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_6 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":888
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":890
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))             # <<<<<<<<<<<<<<
  *             else:
  *                 if (dist==0):
  */
-      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_8 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_8, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fwords);
       __Pyx_GIVEREF(__pyx_v_fwords);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7);
-      __Pyx_GIVEREF(__pyx_t_7);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_8);
+      __Pyx_GIVEREF(__pyx_t_8);
       __Pyx_INCREF(__pyx_v_dist);
       PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_dist);
       __Pyx_GIVEREF(__pyx_v_dist);
-      __pyx_t_7 = 0;
-      __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7);
-      __Pyx_GIVEREF(__pyx_t_7);
-      __pyx_t_7 = 0;
-      __pyx_t_7 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_8 = 0;
+      __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_8);
+      __Pyx_GIVEREF(__pyx_t_8);
+      __pyx_t_8 = 0;
+      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L9;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L6;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":890
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":892
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  *             else:
  *                 if (dist==0):             # <<<<<<<<<<<<<<
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)
  */
-      __pyx_t_7 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_8 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":891
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":893
  *             else:
  *                 if (dist==0):
  *                     if (ifrom not in ret):             # <<<<<<<<<<<<<<
  *                         ret.append(ifrom)
  *                 else:
  */
-        __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_ret), __pyx_v_ifrom))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifrom, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":892
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":894
  *                 if (dist==0):
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)             # <<<<<<<<<<<<<<
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  */
-          if (unlikely(((PyObject *)__pyx_v_ret) == Py_None)) {
-            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_8 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          goto __pyx_L11;
+          __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          goto __pyx_L8;
         }
-        __pyx_L11:;
-        goto __pyx_L10;
+        __pyx_L8:;
+        goto __pyx_L7;
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":894
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":896
  *                         ret.append(ifrom)
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):             # <<<<<<<<<<<<<<
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)
  */
-        __pyx_t_7 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_7 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = PyNumber_Subtract(__pyx_v_dist, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyNumber_Subtract(__pyx_v_dist, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+        __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
         __Pyx_INCREF(__pyx_v_fwords);
-        PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fwords);
+        PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_fwords);
         __Pyx_GIVEREF(__pyx_v_fwords);
-        PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_6);
-        __Pyx_GIVEREF(__pyx_t_6);
-        PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_3);
+        PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7);
+        __Pyx_GIVEREF(__pyx_t_7);
+        PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
-        __pyx_t_6 = 0;
+        __pyx_t_7 = 0;
         __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
         if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-          __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_9 = 0;
-          __pyx_t_10 = NULL;
+          __pyx_t_6 = __pyx_t_3; __Pyx_INCREF(__pyx_t_6); __pyx_t_10 = 0;
+          __pyx_t_11 = NULL;
         } else {
-          __pyx_t_9 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_10 = Py_TYPE(__pyx_t_1)->tp_iternext;
+          __pyx_t_10 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext;
         }
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         for (;;) {
-          if (PyList_CheckExact(__pyx_t_1)) {
-            if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_1)) break;
-            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++;
-          } else if (PyTuple_CheckExact(__pyx_t_1)) {
-            if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++;
+          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_6)) {
+            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_6)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_6)) {
+            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
           } else {
-            __pyx_t_3 = __pyx_t_10(__pyx_t_1);
+            __pyx_t_3 = __pyx_t_11(__pyx_t_6);
             if (unlikely(!__pyx_t_3)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
@@ -41238,39 +43452,37 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
           __pyx_v_ifromchild = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":895
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":897
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):             # <<<<<<<<<<<<<<
  *                             ret.append(ifromchild)
  * 
  */
-          __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_ret), __pyx_v_ifromchild))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifromchild, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_4) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":896
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":898
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)             # <<<<<<<<<<<<<<
  * 
  *         return ret
  */
-            if (unlikely(((PyObject *)__pyx_v_ret) == Py_None)) {
-              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-            }
-            __pyx_t_8 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            goto __pyx_L14;
+            __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            goto __pyx_L11;
           }
-          __pyx_L14:;
+          __pyx_L11:;
         }
-        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       }
-      __pyx_L10:;
+      __pyx_L7:;
     }
-    __pyx_L9:;
+    __pyx_L6:;
   }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":898
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":900
  *                             ret.append(ifromchild)
  * 
  *         return ret             # <<<<<<<<<<<<<<
@@ -41289,50 +43501,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_6);
   __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.reachable", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_v_ret);
+  __Pyx_XDECREF(__pyx_v_alt_id);
   __Pyx_XDECREF(__pyx_v_ifromchild);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":900
- *         return ret
- * 
- *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
- *         cdef unsigned alt_id
- *         min = 1000
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_ito = 0;
-  unsigned int __pyx_v_alt_id;
-  PyObject *__pyx_v_min = NULL;
-  PyObject *__pyx_v_currmin = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  Py_ssize_t __pyx_t_3;
-  unsigned int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
-  __Pyx_RefNannySetupContext("shortest");
+  __Pyx_RefNannySetupContext("shortest (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -41340,26 +43536,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -41374,14 +43567,43 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.shortest", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_ifrom, __pyx_v_ito);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":902
+ *         return ret
+ * 
+ *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
+ *         cdef unsigned alt_id
+ *         min = 1000
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":902
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_ito) {
+  unsigned int __pyx_v_alt_id;
+  PyObject *__pyx_v_min = NULL;
+  PyObject *__pyx_v_currmin = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  Py_ssize_t __pyx_t_3;
+  unsigned int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("shortest", 0);
+
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":904
  *     def shortest(self, fwords, ifrom, ito):
  *         cdef unsigned alt_id
  *         min = 1000             # <<<<<<<<<<<<<<
@@ -41391,20 +43613,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   __Pyx_INCREF(__pyx_int_1000);
   __pyx_v_min = __pyx_int_1000;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":903
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":905
  *         cdef unsigned alt_id
  *         min = 1000
  *         if (ifrom > ito):             # <<<<<<<<<<<<<<
  *             return min
  *         if (ifrom == ito):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":904
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":906
  *         min = 1000
  *         if (ifrom > ito):
  *             return min             # <<<<<<<<<<<<<<
@@ -41415,24 +43636,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __Pyx_INCREF(__pyx_v_min);
     __pyx_r = __pyx_v_min;
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":905
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":907
  *         if (ifrom > ito):
  *             return min
  *         if (ifrom == ito):             # <<<<<<<<<<<<<<
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":906
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":908
  *             return min
  *         if (ifrom == ito):
  *             return 0             # <<<<<<<<<<<<<<
@@ -41443,46 +43663,46 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __Pyx_INCREF(__pyx_int_0);
     __pyx_r = __pyx_int_0;
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":907
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":909
  *         if (ifrom == ito):
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  */
-  __pyx_t_1 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_alt_id = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":908
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":910
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)             # <<<<<<<<<<<<<<
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
@@ -41492,7 +43712,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_ito);
     __Pyx_GIVEREF(__pyx_v_ito);
     __pyx_t_6 = 0;
-    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -41500,61 +43720,59 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __pyx_v_currmin = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":909
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":911
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
  *                 currmin += 1
  *             if (currmin<min):
  */
-    __pyx_t_6 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":910
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":912
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1             # <<<<<<<<<<<<<<
  *             if (currmin<min):
  *                 min = currmin
  */
-      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_currmin, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_currmin, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_v_currmin);
       __pyx_v_currmin = __pyx_t_1;
       __pyx_t_1 = 0;
-      goto __pyx_L10;
+      goto __pyx_L7;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":911
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":913
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  *             if (currmin<min):             # <<<<<<<<<<<<<<
  *                 min = currmin
  *         return min
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":912
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":914
  *                 currmin += 1
  *             if (currmin<min):
  *                 min = currmin             # <<<<<<<<<<<<<<
@@ -41564,12 +43782,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
       __Pyx_INCREF(__pyx_v_currmin);
       __Pyx_DECREF(__pyx_v_min);
       __pyx_v_min = __pyx_v_currmin;
-      goto __pyx_L11;
+      goto __pyx_L8;
     }
-    __pyx_L11:;
+    __pyx_L8:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":913
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":915
  *             if (currmin<min):
  *                 min = currmin
  *         return min             # <<<<<<<<<<<<<<
@@ -41597,49 +43815,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":915
- *         return min
- * 
- *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
- *         result = []
- *         candidate = [[curr_idx,0]]
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v__columns = 0;
   PyObject *__pyx_v_curr_idx = 0;
   PyObject *__pyx_v_min_dist = 0;
-  PyObject *__pyx_v_result = NULL;
-  PyObject *__pyx_v_candidate = NULL;
-  PyObject *__pyx_v_curr = NULL;
-  PyObject *__pyx_v_curr_col = NULL;
-  PyObject *__pyx_v_alt = NULL;
-  PyObject *__pyx_v_next_id = NULL;
-  PyObject *__pyx_v_jump = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
-  PyObject *__pyx_t_10 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__min_dist,0};
-  __Pyx_RefNannySetupContext("get_next_states");
+  __Pyx_RefNannySetupContext("get_next_states (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__min_dist,0};
     PyObject* values[3] = {0,0,0};
     values[2] = ((PyObject *)__pyx_int_2);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -41647,16 +43839,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s___columns);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s___columns)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (kw_args > 0) {
@@ -41665,7 +43855,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -41682,49 +43872,86 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_next_states", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v__columns, __pyx_v_curr_idx, __pyx_v_min_dist);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":917
+ *         return min
+ * 
+ *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
+ *         result = []
+ *         candidate = [[curr_idx,0]]
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v__columns, PyObject *__pyx_v_curr_idx, PyObject *__pyx_v_min_dist) {
+  PyObject *__pyx_v_result = NULL;
+  PyObject *__pyx_v_candidate = NULL;
+  PyObject *__pyx_v_curr = NULL;
+  PyObject *__pyx_v_curr_col = NULL;
+  PyObject *__pyx_v_alt = NULL;
+  PyObject *__pyx_v_next_id = NULL;
+  PyObject *__pyx_v_jump = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_next_states", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":916
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":918
  * 
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []             # <<<<<<<<<<<<<<
  *         candidate = [[curr_idx,0]]
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 916; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":917
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":919
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []
  *         candidate = [[curr_idx,0]]             # <<<<<<<<<<<<<<
  * 
  *         while len(candidate) > 0:
  */
-  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_v_curr_idx);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_curr_idx);
   __Pyx_GIVEREF(__pyx_v_curr_idx);
   __Pyx_INCREF(__pyx_int_0);
   PyList_SET_ITEM(__pyx_t_1, 1, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
-  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_t_1 = 0;
   __pyx_v_candidate = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":919
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":921
  *         candidate = [[curr_idx,0]]
  * 
  *         while len(candidate) > 0:             # <<<<<<<<<<<<<<
@@ -41732,84 +43959,78 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  *             if curr[0] >= len(_columns):
  */
   while (1) {
-    if (unlikely(((PyObject *)__pyx_v_candidate) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); 
+    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_4 = (__pyx_t_3 > 0);
     if (!__pyx_t_4) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":920
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":922
  * 
  *         while len(candidate) > 0:
  *             curr = candidate.pop()             # <<<<<<<<<<<<<<
  *             if curr[0] >= len(_columns):
  *                 continue
  */
-    __pyx_t_2 = __Pyx_PyObject_Pop(((PyObject *)__pyx_v_candidate)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Pop(((PyObject *)__pyx_v_candidate)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 922; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_XDECREF(__pyx_v_curr);
     __pyx_v_curr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":921
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":923
  *         while len(candidate) > 0:
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):             # <<<<<<<<<<<<<<
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  */
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyObject_Length(__pyx_v__columns); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Length(__pyx_v__columns); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":922
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":924
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):
  *                 continue             # <<<<<<<<<<<<<<
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  */
-      goto __pyx_L6_continue;
-      goto __pyx_L8;
+      goto __pyx_L3_continue;
+      goto __pyx_L5;
     }
-    __pyx_L8:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":923
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":925
  *             if curr[0] >= len(_columns):
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]
  */
-    __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_result), __pyx_t_5))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_t_5, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
-      __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
         __Pyx_DECREF(__pyx_t_1);
-        __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __pyx_t_7 = __pyx_t_6;
     } else {
@@ -41817,41 +44038,38 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":924
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":926
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);             # <<<<<<<<<<<<<<
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  */
-      if (unlikely(((PyObject *)__pyx_v_result) == Py_None)) {
-        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-      }
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_8 = PyList_Append(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyList_Append(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L9;
+      goto __pyx_L6;
     }
-    __pyx_L9:;
+    __pyx_L6:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":925
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":927
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]             # <<<<<<<<<<<<<<
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_GetItem(__pyx_v__columns, __pyx_t_1); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetItem(__pyx_v__columns, __pyx_t_1); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_XDECREF(__pyx_v_curr_col);
     __pyx_v_curr_col = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":926
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":928
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:             # <<<<<<<<<<<<<<
@@ -41862,23 +44080,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __pyx_t_5 = __pyx_v_curr_col; __Pyx_INCREF(__pyx_t_5); __pyx_t_3 = 0;
       __pyx_t_9 = NULL;
     } else {
-      __pyx_t_3 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_curr_col); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_curr_col); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_9 = Py_TYPE(__pyx_t_5)->tp_iternext;
     }
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_5)) {
+      if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_5)) break;
-        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
-      } else if (PyTuple_CheckExact(__pyx_t_5)) {
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
         __pyx_t_1 = __pyx_t_9(__pyx_t_5);
         if (unlikely(!__pyx_t_1)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -41888,18 +44114,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __pyx_v_alt = __pyx_t_1;
       __pyx_t_1 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":927
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":929
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]             # <<<<<<<<<<<<<<
  *                 jump = 1
  *                 if (alt[0] == EPSILON):
  */
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_alt, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_alt, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_10 = PyNumber_Add(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyNumber_Add(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -41907,7 +44133,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __pyx_v_next_id = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":928
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":930
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1             # <<<<<<<<<<<<<<
@@ -41918,26 +44144,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __Pyx_XDECREF(__pyx_v_jump);
       __pyx_v_jump = __pyx_int_1;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":929
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":931
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1
  *                 if (alt[0] == EPSILON):             # <<<<<<<<<<<<<<
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  */
-      __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_alt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_alt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":930
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":932
  *                 jump = 1
  *                 if (alt[0] == EPSILON):
  *                     jump = 0             # <<<<<<<<<<<<<<
@@ -41947,36 +44172,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
         __Pyx_INCREF(__pyx_int_0);
         __Pyx_DECREF(__pyx_v_jump);
         __pyx_v_jump = __pyx_int_0;
-        goto __pyx_L12;
+        goto __pyx_L9;
       }
-      __pyx_L12:;
+      __pyx_L9:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":931
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":933
  *                 if (alt[0] == EPSILON):
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:             # <<<<<<<<<<<<<<
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);
  */
-      __pyx_t_7 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_result), __pyx_v_next_id))); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = (__Pyx_PySequence_Contains(__pyx_v_next_id, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_7) {
-        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
           __Pyx_DECREF(__pyx_t_1);
-          __pyx_t_10 = PyInt_FromLong((((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_v_self->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __pyx_t_6 = __pyx_t_4;
       } else {
@@ -41984,40 +44207,37 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       }
       if (__pyx_t_6) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":932
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":934
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])             # <<<<<<<<<<<<<<
  *         return sorted(result);
  * 
  */
-        if (unlikely(((PyObject *)__pyx_v_candidate) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
-        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+        __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
         __Pyx_INCREF(__pyx_v_next_id);
         PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_next_id);
         __Pyx_GIVEREF(__pyx_v_next_id);
         PyList_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
         __Pyx_GIVEREF(__pyx_t_2);
         __pyx_t_2 = 0;
-        __pyx_t_8 = PyList_Append(__pyx_v_candidate, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyList_Append(__pyx_v_candidate, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-        goto __pyx_L13;
+        goto __pyx_L10;
       }
-      __pyx_L13:;
+      __pyx_L10:;
     }
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_L6_continue:;
+    __pyx_L3_continue:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":933
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":935
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);             # <<<<<<<<<<<<<<
@@ -42025,12 +44245,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  *     def input(self, fwords):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
   __pyx_r = __pyx_t_1;
@@ -42058,9 +44278,45 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1095
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
+static char __pyx_doc_3_sa_23HieroCachingRuleFactory_22input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("input (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_22input(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_fwords));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1 = {__Pyx_NAMESTR("lambda1"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1, METH_NOARGS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("lambda1 (wrapper)", 0);
+  __pyx_r = __pyx_lambda_funcdef_lambda1(__pyx_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2 = {__Pyx_NAMESTR("lambda2"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, METH_NOARGS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("lambda2 (wrapper)", 0);
+  __pyx_r = __pyx_lambda_funcdef_lambda2(__pyx_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1097
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
@@ -42068,9 +44324,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                                 fcount[f] += count
  */
 
-static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_lambda_methdef_lambda2 = {__Pyx_NAMESTR("lambda2"), (PyCFunction)__pyx_lambda_funcdef_lambda2, METH_NOARGS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -42079,17 +44333,16 @@ static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSE
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda2");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("lambda2", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyList_Type))));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)(&PyList_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyList_Type))));
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -42103,7 +44356,7 @@ static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSE
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.input.lambda1.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda1.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -42111,9 +44364,7 @@ static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_lambda_methdef_lambda1 = {__Pyx_NAMESTR("lambda1"), (PyCFunction)__pyx_lambda_funcdef_lambda1, METH_NOARGS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -42122,19 +44373,18 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda1");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("lambda1", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda2, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -42148,7 +44398,7 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.input.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -42156,7 +44406,19 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1101
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3 = {__Pyx_NAMESTR("lambda3"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("lambda3 (wrapper)", 0);
+  __pyx_r = __pyx_lambda_funcdef_lambda3(__pyx_self, ((PyObject *)__pyx_v_x));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1103
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]             # <<<<<<<<<<<<<<
@@ -42164,9 +44426,7 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
  *                                     count = len(locs)
  */
 
-static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x); /*proto*/
-static PyMethodDef __pyx_lambda_methdef_lambda3 = {__Pyx_NAMESTR("lambda3"), (PyCFunction)__pyx_lambda_funcdef_lambda3, METH_O, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x) {
+static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -42174,14 +44434,13 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda3");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("lambda3", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -42191,7 +44450,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_sa.input.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -42199,7 +44458,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":935
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":937
  *         return sorted(result);
  * 
  *     def input(self, fwords):             # <<<<<<<<<<<<<<
@@ -42207,40 +44466,48 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
  *         it looks up all of the rules that can be used to translate
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_11input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
-static char __pyx_doc_3_sa_23HieroCachingRuleFactory_11input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_11input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("input");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("input", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)__pyx_ptype_3_sa___pyx_scope_struct_8_input->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_8_input, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF(__pyx_v_fwords);
-  __pyx_cur_scope->__pyx_v_fwords = __pyx_v_fwords;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_fwords = __pyx_v_fwords;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
@@ -42264,33 +44531,34 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   PyObject *(*__pyx_t_20)(PyObject *);
   float __pyx_t_21;
   Py_ssize_t __pyx_t_22;
-  PyObject *(*__pyx_t_23)(PyObject *);
+  Py_ssize_t __pyx_t_23;
   Py_ssize_t __pyx_t_24;
-  int __pyx_t_25;
+  Py_ssize_t __pyx_t_25;
   int __pyx_t_26;
+  int __pyx_t_27;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
-    case 1: goto __pyx_L62_resume_from_yield;
+    case 1: goto __pyx_L58_resume_from_yield;
     default: /* CPython raises the right error here */
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __pyx_L3_first_run:;
-  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":946
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":948
  *         cdef Phrase hiero_phrase
  * 
  *         flen = len(fwords)             # <<<<<<<<<<<<<<
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 948; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_cur_scope->__pyx_v_flen = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":947
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":949
  * 
  *         flen = len(fwords)
  *         start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -42299,29 +44567,29 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
   __pyx_cur_scope->__pyx_v_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":948
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":950
  *         flen = len(fwords)
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0             # <<<<<<<<<<<<<<
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time = 0.0;
+  __pyx_cur_scope->__pyx_v_self->extract_time = 0.0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":949
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":951
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}             # <<<<<<<<<<<<<<
  *         hit = 0
  *         reachable_buffer = {}
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":950
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":952
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}
  *         hit = 0             # <<<<<<<<<<<<<<
@@ -42330,124 +44598,120 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
   __pyx_cur_scope->__pyx_v_hit = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":951
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":953
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  *         reachable_buffer = {}             # <<<<<<<<<<<<<<
  * 
  *         # Do not cache between sentences
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_cur_scope->__pyx_v_reachable_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":954
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":956
  * 
  *         # Do not cache between sentences
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
  * 
  *         frontier = []
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root = __pyx_t_3;
+  __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+  __Pyx_DECREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+  __pyx_cur_scope->__pyx_v_self->rules->root = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":956
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":958
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  * 
  *         frontier = []             # <<<<<<<<<<<<<<
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  */
-  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
   __pyx_cur_scope->__pyx_v_frontier = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":957
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":959
  * 
  *         frontier = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":958
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":960
  *         frontier = []
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
  */
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":959
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":961
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
  * 
  */
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":960
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":962
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))             # <<<<<<<<<<<<<<
  * 
  *         xroot = None
  */
-        if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
-        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_9 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_10 = PyTuple_New(7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+        __pyx_t_10 = PyTuple_New(7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_10);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
@@ -42457,9 +44721,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_INCREF(__pyx_int_0);
         PyTuple_SET_ITEM(__pyx_t_10, 3, __pyx_int_0);
         __Pyx_GIVEREF(__pyx_int_0);
-        __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-        PyTuple_SET_ITEM(__pyx_t_10, 4, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-        __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+        __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+        PyTuple_SET_ITEM(__pyx_t_10, 4, __pyx_cur_scope->__pyx_v_self->rules->root);
+        __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
         __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
         PyTuple_SET_ITEM(__pyx_t_10, 5, ((PyObject *)__pyx_empty_tuple));
         __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
@@ -42469,7 +44733,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_2 = 0;
         __pyx_t_3 = 0;
         __pyx_t_9 = 0;
-        __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_10)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_10)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
         goto __pyx_L8;
       }
@@ -42477,7 +44741,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":962
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":964
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
  * 
  *         xroot = None             # <<<<<<<<<<<<<<
@@ -42488,41 +44752,41 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_GIVEREF(Py_None);
   __pyx_cur_scope->__pyx_v_xroot = Py_None;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":963
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":965
  * 
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)             # <<<<<<<<<<<<<<
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]
  */
-  __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, 1);
+  __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":964
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":966
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:             # <<<<<<<<<<<<<<
  *             xroot = self.rules.root.children[x1]
  *         else:
  */
-  __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_8 = ((PySequence_Contains(__pyx_t_9, __pyx_t_10))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_t_10, __pyx_t_9, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   if (__pyx_t_8) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":965
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":967
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]             # <<<<<<<<<<<<<<
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  */
-    __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
-    __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
@@ -42534,21 +44798,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":967
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":969
  *             xroot = self.rules.root.children[x1]
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
  *             self.rules.root.children[x1] = xroot
  * 
  */
-    __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
-    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-    __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
@@ -42557,99 +44821,95 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     __pyx_cur_scope->__pyx_v_xroot = __pyx_t_9;
     __pyx_t_9 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":968
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":970
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  *             self.rules.root.children[x1] = xroot             # <<<<<<<<<<<<<<
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  */
-    __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
-    if (__Pyx_SetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   }
   __pyx_L9:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":970
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":972
  *             self.rules.root.children[x1] = xroot
  * 
  *         for i in range(self.min_gap_size, len(fwords)):             # <<<<<<<<<<<<<<
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  for (__pyx_t_4 = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  for (__pyx_t_4 = __pyx_cur_scope->__pyx_v_self->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":971
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":973
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
  */
-    __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
-    __pyx_t_5 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":972
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":974
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
  * 
  */
-      __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-      __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":973
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":975
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))             # <<<<<<<<<<<<<<
  * 
  *         next_states = []
  */
-        if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
-        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+        __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_12);
         PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         __pyx_t_7 = 0;
-        __pyx_t_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+        __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_13);
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
         PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_10);
@@ -42671,7 +44931,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_2 = 0;
         __pyx_t_12 = 0;
         __pyx_t_7 = 0;
-        __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
         goto __pyx_L14;
       }
@@ -42679,48 +44939,45 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":975
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":977
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
  * 
  *         next_states = []             # <<<<<<<<<<<<<<
  *         for i in range(len(fwords)):
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  */
-  __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+  __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
   __pyx_cur_scope->__pyx_v_next_states = __pyx_t_13;
   __pyx_t_13 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":976
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":978
  * 
  *         next_states = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  * 
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 978; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":977
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":979
  *         next_states = []
  *         for i in range(len(fwords)):
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))             # <<<<<<<<<<<<<<
  * 
  *         while len(frontier) > 0:
  */
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_next_states) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self, __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
-    __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_12 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
-    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
@@ -42730,15 +44987,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     __Pyx_GIVEREF(__pyx_t_12);
     __pyx_t_7 = 0;
     __pyx_t_12 = 0;
-    __pyx_t_12 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
     __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_next_states, __pyx_t_12); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_next_states, __pyx_t_12); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":979
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":981
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  * 
  *         while len(frontier) > 0:             # <<<<<<<<<<<<<<
@@ -42746,50 +45003,54 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  */
   while (1) {
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); 
+    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_8 = (__pyx_t_1 > 0);
     if (!__pyx_t_8) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":980
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":982
  * 
  *         while len(frontier) > 0:
  *             new_frontier = []             # <<<<<<<<<<<<<<
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]
  */
-    __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+    __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_12);
     __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
     __pyx_cur_scope->__pyx_v_new_frontier = __pyx_t_12;
     __pyx_t_12 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":981
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":983
  *         while len(frontier) > 0:
  *             new_frontier = []
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:             # <<<<<<<<<<<<<<
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]
  */
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_12 = ((PyObject *)__pyx_cur_scope->__pyx_v_frontier); __Pyx_INCREF(__pyx_t_12); __pyx_t_1 = 0;
     for (;;) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_12)) break;
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_12, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
         PyObject* sequence = __pyx_t_2;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        Py_ssize_t size = Py_SIZE(sequence);
+        #else
+        Py_ssize_t size = PySequence_Size(sequence);
+        #endif
+        if (unlikely(size != 7)) {
+          if (size > 7) __Pyx_RaiseTooManyValuesError(7);
+          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        #if CYTHON_COMPILING_IN_CPYTHON
         if (likely(PyTuple_CheckExact(sequence))) {
-          if (unlikely(PyTuple_GET_SIZE(sequence) != 7)) {
-            if (PyTuple_GET_SIZE(sequence) > 7) __Pyx_RaiseTooManyValuesError(7);
-            else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          }
           __pyx_t_13 = PyTuple_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
           __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
@@ -42798,11 +45059,6 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_14 = PyTuple_GET_ITEM(sequence, 5); 
           __pyx_t_15 = PyTuple_GET_ITEM(sequence, 6); 
         } else {
-          if (unlikely(PyList_GET_SIZE(sequence) != 7)) {
-            if (PyList_GET_SIZE(sequence) > 7) __Pyx_RaiseTooManyValuesError(7);
-            else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          }
           __pyx_t_13 = PyList_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
           __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
@@ -42818,42 +45074,44 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_INCREF(__pyx_t_3);
         __Pyx_INCREF(__pyx_t_14);
         __Pyx_INCREF(__pyx_t_15);
+        #else
+        Py_ssize_t i;
+        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
+        for (i=0; i < 7; i++) {
+          PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          *(temps[i]) = item;
+        }
+        #endif
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      } else {
+      } else
+      {
         Py_ssize_t index = -1;
-        __pyx_t_16 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
+        __pyx_t_16 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_16);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-        index = 0; __pyx_t_13 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_13)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_13);
-        index = 1; __pyx_t_7 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_7)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_7);
-        index = 2; __pyx_t_9 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_9)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_9);
-        index = 3; __pyx_t_10 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_10);
-        index = 4; __pyx_t_3 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_3)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_3);
-        index = 5; __pyx_t_14 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_14)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_14);
-        index = 6; __pyx_t_15 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_15);
-        if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 7) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        for (index=0; index < 7; index++) {
+          PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L21_unpacking_failed;
+          __Pyx_GOTREF(item);
+          *(temps[index]) = item;
+        }
+        if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 7) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = NULL;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         goto __pyx_L22_unpacking_done;
         __pyx_L21_unpacking_failed:;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-        if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-        if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = NULL;
+        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_L22_unpacking_done:;
       }
-      __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_13); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_13); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __pyx_cur_scope->__pyx_v_k = __pyx_t_4;
       __pyx_cur_scope->__pyx_v_i = __pyx_t_6;
@@ -42879,19 +45137,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_is_shadow_path = __pyx_t_15;
       __pyx_t_15 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":982
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":984
  *             new_frontier = []
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]             # <<<<<<<<<<<<<<
  *                 spanlen = fwords[i][alt][2]
  *                 # TODO get rid of k -- pathlen is replacing it
  */
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_15, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_15, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_word_id);
@@ -42900,19 +45158,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_word_id = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":983
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":985
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
  *                 # TODO get rid of k -- pathlen is replacing it
  *                 if word_id == EPSILON:
  */
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_15, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_15, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_spanlen);
@@ -42921,46 +45179,44 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":985
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":987
  *                 spanlen = fwords[i][alt][2]
  *                 # TODO get rid of k -- pathlen is replacing it
  *                 if word_id == EPSILON:             # <<<<<<<<<<<<<<
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):
  */
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
+      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":987
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":989
  *                 if word_id == EPSILON:
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):             # <<<<<<<<<<<<<<
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  */
-        __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_2 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_15 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_14);
+        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":988
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":990
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):
  *                         continue             # <<<<<<<<<<<<<<
@@ -42972,47 +45228,44 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         __pyx_L24:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":989
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":991
  *                     if i+spanlen >= len(fwords):
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue
  */
-        __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_14);
-        __pyx_t_15 = PyNumber_Add(__pyx_t_14, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyNumber_Add(__pyx_t_14, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
         __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-        __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_15); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_15); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_14);
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_t_14); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Length(__pyx_t_14); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
         for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_nualt = __pyx_t_18;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":990
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":992
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     continue
  * 
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
-          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_2 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_14);
           __Pyx_GIVEREF(__pyx_t_14);
           PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -43034,11 +45287,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_14 = 0;
           __pyx_t_2 = 0;
           __pyx_t_15 = 0;
-          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":991
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":993
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue             # <<<<<<<<<<<<<<
@@ -43050,19 +45303,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       __pyx_L23:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":993
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":995
  *                     continue
  * 
  *                 phrase = prefix + (word_id,)             # <<<<<<<<<<<<<<
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()
  */
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_word_id);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_word_id);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_word_id);
-      __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_prefix, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_prefix, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_phrase);
@@ -43071,19 +45324,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_phrase = __pyx_t_15;
       __pyx_t_15 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":994
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":996
  * 
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)             # <<<<<<<<<<<<<<
  *                 arity = hiero_phrase.arity()
  * 
  */
-      __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+      __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_15);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
-      __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
       __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase));
@@ -43092,23 +45345,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_hiero_phrase = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":995
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":997
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()             # <<<<<<<<<<<<<<
  * 
  *                 lookup_required = False
  */
-      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase), __pyx_n_s__arity); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase), __pyx_n_s__arity); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_15 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_15); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_15); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       __pyx_cur_scope->__pyx_v_arity = __pyx_t_18;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":997
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":999
  *                 arity = hiero_phrase.arity()
  * 
  *                 lookup_required = False             # <<<<<<<<<<<<<<
@@ -43117,36 +45370,36 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
       __pyx_cur_scope->__pyx_v_lookup_required = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":998
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1000
  * 
  *                 lookup_required = False
  *                 if word_id in node.children:             # <<<<<<<<<<<<<<
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  */
-      __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_8 = ((PySequence_Contains(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_15, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":999
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1001
  *                 lookup_required = False
  *                 if word_id in node.children:
  *                     if node.children[word_id] is None:             # <<<<<<<<<<<<<<
  *                         # Path dead-ends at this node
  *                         continue
  */
-        __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_3 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         __pyx_t_8 = (__pyx_t_3 == Py_None);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1001
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1003
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  *                         continue             # <<<<<<<<<<<<<<
@@ -43158,16 +45411,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1004
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1006
  *                     else:
  *                         # Path continues at this node
  *                         node = node.children[word_id]             # <<<<<<<<<<<<<<
  *                 else:
  *                     if node.suffix_link is None:
  */
-          __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_15 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_node);
@@ -43181,20 +45434,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1006
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1008
  *                         node = node.children[word_id]
  *                 else:
  *                     if node.suffix_link is None:             # <<<<<<<<<<<<<<
  *                         # Current node is root; lookup required
  *                         lookup_required = True
  */
-        __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
         __pyx_t_8 = (__pyx_t_15 == Py_None);
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1008
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1010
  *                     if node.suffix_link is None:
  *                         # Current node is root; lookup required
  *                         lookup_required = True             # <<<<<<<<<<<<<<
@@ -43206,54 +45459,54 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1010
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1012
  *                         lookup_required = True
  *                     else:
  *                         if word_id in node.suffix_link.children:             # <<<<<<<<<<<<<<
  *                             if node.suffix_link.children[word_id] is None:
  *                                 # Suffix link reports path is dead end
  */
-          __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_3 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_8 = ((PySequence_Contains(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1011
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1013
  *                     else:
  *                         if word_id in node.suffix_link.children:
  *                             if node.suffix_link.children[word_id] is None:             # <<<<<<<<<<<<<<
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_15 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             __pyx_t_8 = (__pyx_t_3 == Py_None);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             if (__pyx_t_8) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1013
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1015
  *                             if node.suffix_link.children[word_id] is None:
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None             # <<<<<<<<<<<<<<
  *                                 continue
  *                             else:
  */
-              __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
-              if (PyObject_SetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyObject_SetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1014
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1016
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None
  *                                 continue             # <<<<<<<<<<<<<<
@@ -43265,7 +45518,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             /*else*/ {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1017
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1019
  *                             else:
  *                                 # Suffix link indicates lookup is reqired
  *                                 lookup_required = True             # <<<<<<<<<<<<<<
@@ -43279,18 +45532,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1020
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1022
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-            __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_122), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_122), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_Raise(__pyx_t_3, 0, 0, 0);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_L30:;
         }
@@ -43298,7 +45551,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       __pyx_L27:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1022
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1024
  *                             raise Exception("Keyword trie error")
  *                 # checking whether lookup_required
  *                 if lookup_required:             # <<<<<<<<<<<<<<
@@ -43307,7 +45560,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
       if (__pyx_cur_scope->__pyx_v_lookup_required) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1023
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1025
  *                 # checking whether lookup_required
  *                 if lookup_required:
  *                     new_node = None             # <<<<<<<<<<<<<<
@@ -43320,66 +45573,66 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_GIVEREF(Py_None);
         __pyx_cur_scope->__pyx_v_new_node = Py_None;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1024
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1026
  *                 if lookup_required:
  *                     new_node = None
  *                     if is_shadow_path:             # <<<<<<<<<<<<<<
  *                         # Extending shadow path
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1027
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1029
  *                         # Extending shadow path
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=node.suffix_link.children[word_id],
  *                                 phrase=hiero_phrase)
  */
-          __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-          __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_15 = PyObject_GetItem(__pyx_t_2, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyObject_GetItem(__pyx_t_2, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1028
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1030
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],             # <<<<<<<<<<<<<<
  *                                 phrase=hiero_phrase)
  *                     else:
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_15 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1029
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1031
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
  *                     else:
  *                         if arity > 0:
  */
-          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -43391,7 +45644,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1031
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1033
  *                                 phrase=hiero_phrase)
  *                     else:
  *                         if arity > 0:             # <<<<<<<<<<<<<<
@@ -43401,22 +45654,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity > 0);
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1033
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1035
  *                         if arity > 0:
  *                             # Intersecting because of arity > 0
  *                             phrase_location = self.intersect(node, node.suffix_link.children[word_id], hiero_phrase)             # <<<<<<<<<<<<<<
  *                         else:
  *                             # Suffix array search
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->__pyx_vtab)->intersect(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->intersect(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -43428,46 +45681,46 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1036
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1038
  *                         else:
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location             # <<<<<<<<<<<<<<
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
             __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_cur_scope->__pyx_v_phrase_location = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1037
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1039
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)             # <<<<<<<<<<<<<<
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_2 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_18)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_18)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __pyx_t_15 = PyInt_FromSsize_t((__pyx_t_5 - 1)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyInt_FromSsize_t((__pyx_t_5 - 1)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_low); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_low); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+            __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_2));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
             PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_15);
@@ -43480,7 +45733,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_15 = 0;
             __pyx_t_14 = 0;
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
@@ -43490,7 +45743,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_sa_range = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1038
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1040
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:             # <<<<<<<<<<<<<<
@@ -43500,24 +45753,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_8 = (__pyx_cur_scope->__pyx_v_sa_range != Py_None);
             if (__pyx_t_8) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1039
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1041
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])             # <<<<<<<<<<<<<<
  *                             else:
  *                                 phrase_location = None
  */
-              __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_low), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_low), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
               __Pyx_GOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -43529,7 +45782,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             /*else*/ {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1041
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1043
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  *                             else:
  *                                 phrase_location = None             # <<<<<<<<<<<<<<
@@ -43546,7 +45799,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L34:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1043
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1045
  *                                 phrase_location = None
  * 
  *                         if phrase_location is None:             # <<<<<<<<<<<<<<
@@ -43556,19 +45809,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_8 = (((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location) == Py_None);
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1044
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1046
  * 
  *                         if phrase_location is None:
  *                             node.children[word_id] = None             # <<<<<<<<<<<<<<
  *                             # Search failed
  *                             continue
  */
-            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            if (PyObject_SetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (PyObject_SetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1046
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1048
  *                             node.children[word_id] = None
  *                             # Search failed
  *                             continue             # <<<<<<<<<<<<<<
@@ -43580,45 +45833,45 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L36:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1048
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1050
  *                             continue
  *                         # Search succeeded
  *                         suffix_link = self.rules.root             # <<<<<<<<<<<<<<
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  */
-          __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+          __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_suffix_link);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_suffix_link);
-          __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-          __pyx_cur_scope->__pyx_v_suffix_link = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root;
+          __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+          __pyx_cur_scope->__pyx_v_suffix_link = __pyx_cur_scope->__pyx_v_self->rules->root;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1049
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1051
  *                         # Search succeeded
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:             # <<<<<<<<<<<<<<
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1049; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_8 = (__pyx_t_9 != Py_None);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1050
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1052
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]             # <<<<<<<<<<<<<<
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,
  */
-            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            __pyx_t_9 = PyObject_GetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_suffix_link);
@@ -43630,35 +45883,35 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L37:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1051
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1053
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)
  */
-          __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1052
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1054
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,             # <<<<<<<<<<<<<<
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node
  */
-          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1053
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1055
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
  *                     node.children[word_id] = new_node
  *                     node = new_node
  */
-          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_10 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -43669,19 +45922,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         __pyx_L33:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1054
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1056
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node             # <<<<<<<<<<<<<<
  *                     node = new_node
  * 
  */
-        __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        if (PyObject_SetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyObject_SetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1055
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1057
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node
  *                     node = new_node             # <<<<<<<<<<<<<<
@@ -43694,24 +45947,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_new_node);
         __pyx_cur_scope->__pyx_v_node = __pyx_cur_scope->__pyx_v_new_node;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1060
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1062
  *                     This should happen before we get to extraction (so that
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:             # <<<<<<<<<<<<<<
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  */
-        __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_nonterminals);
+        __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1061
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1063
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1             # <<<<<<<<<<<<<<
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index
  */
-          __pyx_t_10 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_arity + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1061; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_arity + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xcat_index);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_xcat_index);
@@ -43719,17 +45972,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_xcat_index = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1062
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1064
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)             # <<<<<<<<<<<<<<
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:
  */
-          __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1062; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, __pyx_t_18);
+          __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1063
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1065
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index             # <<<<<<<<<<<<<<
@@ -43742,24 +45995,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xcat_index);
           __pyx_cur_scope->__pyx_v_suffix_link_xcat_index = __pyx_cur_scope->__pyx_v_xcat_index;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1064
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1066
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:             # <<<<<<<<<<<<<<
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  */
-          __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1065
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1067
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1             # <<<<<<<<<<<<<<
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  */
-            __pyx_t_10 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_xcat_index, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1065; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_xcat_index, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index);
@@ -43770,159 +46023,159 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L39:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1066
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1068
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)             # <<<<<<<<<<<<<<
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  */
-          __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, __pyx_t_18);
+          __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1067
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1069
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))
  */
-          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1068
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1070
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],             # <<<<<<<<<<<<<<
  *                                 phrase= Phrase(phrase + (xcat,)))
  * 
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_3 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_suffix_link_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_suffix_link_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1069
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1071
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))             # <<<<<<<<<<<<<<
  * 
  *                     # sample from range
  */
-          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
-          __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
-          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1067
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1069
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))
  */
-          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          if (__Pyx_SetItemInt(__pyx_t_10, __pyx_cur_scope->__pyx_v_xcat, __pyx_t_9, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (__Pyx_SetItemInt(__pyx_t_10, __pyx_cur_scope->__pyx_v_xcat, __pyx_t_9, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           goto __pyx_L38;
         }
         __pyx_L38:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1072
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1074
  * 
  *                     # sample from range
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1074; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1073
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1075
  *                     # sample from range
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)             # <<<<<<<<<<<<<<
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  */
-          __pyx_t_9 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_t_10 = 0;
-          __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-          if (!(likely(((__pyx_t_10) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_10, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (!(likely(((__pyx_t_10) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_10, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_sample));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_sample));
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_cur_scope->__pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_10);
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1074
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1076
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns             # <<<<<<<<<<<<<<
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:
  */
-          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1074; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_cur_scope->__pyx_v_num_subpatterns = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_10)->num_subpatterns;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1075
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1077
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)             # <<<<<<<<<<<<<<
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  */
-          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_chunklen));
@@ -43931,7 +46184,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_chunklen = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1076
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1078
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:             # <<<<<<<<<<<<<<
@@ -43941,7 +46194,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_18 = __pyx_cur_scope->__pyx_v_num_subpatterns;
           for (__pyx_cur_scope->__pyx_v_j = 0; __pyx_cur_scope->__pyx_v_j < __pyx_t_18; __pyx_cur_scope->__pyx_v_j++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1077
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1079
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)             # <<<<<<<<<<<<<<
@@ -43951,22 +46204,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             (__pyx_cur_scope->__pyx_v_chunklen->arr[__pyx_cur_scope->__pyx_v_j]) = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_hiero_phrase->__pyx_vtab)->chunklen(__pyx_cur_scope->__pyx_v_hiero_phrase, __pyx_cur_scope->__pyx_v_j);
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1078
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1080
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []             # <<<<<<<<<<<<<<
  *                         j = 0
  *                         extract_start = monitor_cpu()
  */
-          __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
           __pyx_cur_scope->__pyx_v_extracts = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1079
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1081
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []
  *                         j = 0             # <<<<<<<<<<<<<<
@@ -43975,14 +46228,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
           __pyx_cur_scope->__pyx_v_j = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1080
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1082
  *                         extracts = []
  *                         j = 0
  *                         extract_start = monitor_cpu()             # <<<<<<<<<<<<<<
  *                         while j < sample.len:
  *                             extract = []
  */
-          __pyx_t_3 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract_start);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract_start);
@@ -43990,7 +46243,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_extract_start = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1081
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1083
  *                         j = 0
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:             # <<<<<<<<<<<<<<
@@ -44001,45 +46254,45 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_19 = (__pyx_cur_scope->__pyx_v_j < __pyx_cur_scope->__pyx_v_sample->len);
             if (!__pyx_t_19) break;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1082
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1084
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:
  *                             extract = []             # <<<<<<<<<<<<<<
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  */
-            __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
             __pyx_cur_scope->__pyx_v_extract = ((PyObject *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1084
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1086
  *                             extract = []
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  */
-            __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda->sent_id->arr);
+            __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, __pyx_cur_scope->__pyx_v_self->fda->sent_id->arr);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1085
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1087
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])             # <<<<<<<<<<<<<<
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])
  */
-            __pyx_t_3 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1085; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1085; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_t_3 = 0;
-            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1085; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_loc);
@@ -44048,14 +46301,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_loc = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1086
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1088
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)             # <<<<<<<<<<<<<<
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns
  */
-            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->__pyx_vtab)->extract(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->extract(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -44063,38 +46316,46 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_extract = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1087
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1089
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])             # <<<<<<<<<<<<<<
  *                             j = j + num_subpatterns
  * 
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_10 = PyList_New(0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            __pyx_t_10 = PyList_New(0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_10);
             if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_extract) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_extract)) {
               __pyx_t_9 = __pyx_cur_scope->__pyx_v_extract; __Pyx_INCREF(__pyx_t_9); __pyx_t_5 = 0;
               __pyx_t_20 = NULL;
             } else {
-              __pyx_t_5 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_extract); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_5 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_extract); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __pyx_t_20 = Py_TYPE(__pyx_t_9)->tp_iternext;
             }
             for (;;) {
-              if (PyList_CheckExact(__pyx_t_9)) {
+              if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_9)) break;
-                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++;
-              } else if (PyTuple_CheckExact(__pyx_t_9)) {
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #else
+                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #endif
+              } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #else
+                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #endif
               } else {
                 __pyx_t_14 = __pyx_t_20(__pyx_t_9);
                 if (unlikely(!__pyx_t_14)) {
                   if (PyErr_Occurred()) {
                     if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   break;
                 }
@@ -44105,31 +46366,31 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __Pyx_GIVEREF(__pyx_t_14);
               __pyx_cur_scope->__pyx_v_e = __pyx_t_14;
               __pyx_t_14 = 0;
-              __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+              __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
               PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_cur_scope->__pyx_v_e);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loc);
               PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_cur_scope->__pyx_v_loc);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loc);
-              if (unlikely(PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (unlikely(__Pyx_PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
             }
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+            __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __Pyx_INCREF(((PyObject *)__pyx_t_10));
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1088
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1090
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns             # <<<<<<<<<<<<<<
@@ -44139,7 +46400,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns);
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1090
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1092
  *                             j = j + num_subpatterns
  * 
  *                         num_samples = sample.len/num_subpatterns             # <<<<<<<<<<<<<<
@@ -44148,22 +46409,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
           if (unlikely(__pyx_cur_scope->__pyx_v_num_subpatterns == 0)) {
             PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           else if (sizeof(int) == sizeof(long) && unlikely(__pyx_cur_scope->__pyx_v_num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_cur_scope->__pyx_v_sample->len))) {
             PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_cur_scope->__pyx_v_num_samples = __Pyx_div_int(__pyx_cur_scope->__pyx_v_sample->len, __pyx_cur_scope->__pyx_v_num_subpatterns);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1091
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1093
  * 
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()             # <<<<<<<<<<<<<<
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:
  */
-          __pyx_t_10 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract_stop);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract_stop);
@@ -44171,49 +46432,46 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_extract_stop = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1092
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1094
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start             # <<<<<<<<<<<<<<
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  */
-          __pyx_t_10 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyNumber_Subtract(__pyx_t_9, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyNumber_Subtract(__pyx_t_9, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_21 = __pyx_PyFloat_AsDouble(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_21 = __pyx_PyFloat_AsFloat(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time = __pyx_t_21;
+          __pyx_cur_scope->__pyx_v_self->extract_time = __pyx_t_21;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1093
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1095
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:             # <<<<<<<<<<<<<<
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_extracts) == Py_None)) {
-            PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); 
+          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_19 = (__pyx_t_5 > 0);
           if (__pyx_t_19) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1094
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1096
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:
  *                             fcount = Counter()             # <<<<<<<<<<<<<<
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:
  */
-            __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__Counter); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__Counter); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_fcount);
@@ -44222,23 +46480,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_fcount = __pyx_t_9;
             __pyx_t_9 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1095
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1097
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count
  */
-            __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda1, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -44248,45 +46506,52 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_fphrases = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1096
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1098
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:             # <<<<<<<<<<<<<<
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  */
-            if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_extracts) == Py_None)) {
-              PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-            }
             __pyx_t_10 = ((PyObject *)__pyx_cur_scope->__pyx_v_extracts); __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
             for (;;) {
               if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_3 = PySequence_ITEM(__pyx_t_10, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
               if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
                 PyObject* sequence = __pyx_t_3;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                Py_ssize_t size = Py_SIZE(sequence);
+                #else
+                Py_ssize_t size = PySequence_Size(sequence);
+                #endif
+                if (unlikely(size != 2)) {
+                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
+                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
                 }
                 __Pyx_INCREF(__pyx_t_9);
                 __Pyx_INCREF(__pyx_t_14);
+                #else
+                __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #endif
                 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              } else {
+              } else
+              {
                 Py_ssize_t index = -1;
-                __pyx_t_15 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
                 __pyx_t_17 = Py_TYPE(__pyx_t_15)->tp_iternext;
@@ -44294,34 +46559,36 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_GOTREF(__pyx_t_9);
                 index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_15); if (unlikely(!__pyx_t_14)) goto __pyx_L50_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_14);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_15), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_15), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 goto __pyx_L51_unpacking_done;
                 __pyx_L50_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_17 = NULL;
+                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L51_unpacking_done:;
               }
               if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
                 PyObject* sequence = __pyx_t_9;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                Py_ssize_t size = Py_SIZE(sequence);
+                #else
+                Py_ssize_t size = PySequence_Size(sequence);
+                #endif
+                if (unlikely(size != 4)) {
+                  if (size > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
+                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
-                    if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   __pyx_t_7 = PyTuple_GET_ITEM(sequence, 2); 
                   __pyx_t_13 = PyTuple_GET_ITEM(sequence, 3); 
                 } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
-                    if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   __pyx_t_7 = PyList_GET_ITEM(sequence, 2); 
@@ -44331,29 +46598,37 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_INCREF(__pyx_t_2);
                 __Pyx_INCREF(__pyx_t_7);
                 __Pyx_INCREF(__pyx_t_13);
+                #else
+                Py_ssize_t i;
+                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
+                for (i=0; i < 4; i++) {
+                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  *(temps[i]) = item;
+                }
+                #endif
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              } else {
+              } else
+              {
                 Py_ssize_t index = -1;
-                __pyx_t_16 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
+                __pyx_t_16 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
                 __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-                index = 0; __pyx_t_15 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_15);
-                index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_2)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_2);
-                index = 2; __pyx_t_7 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_7)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_7);
-                index = 3; __pyx_t_13 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_13)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_13);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                for (index=0; index < 4; index++) {
+                  PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L52_unpacking_failed;
+                  __Pyx_GOTREF(item);
+                  *(temps[index]) = item;
+                }
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
                 goto __pyx_L53_unpacking_done;
                 __pyx_L52_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_17 = NULL;
+                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L53_unpacking_done:;
               }
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
@@ -44382,7 +46657,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __pyx_cur_scope->__pyx_v_loc = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1097
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1099
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count             # <<<<<<<<<<<<<<
@@ -44391,309 +46666,190 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
               __pyx_t_3 = __pyx_cur_scope->__pyx_v_f;
-              __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_9 = PyNumber_InPlaceAdd(__pyx_t_14, __pyx_cur_scope->__pyx_v_count); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyNumber_InPlaceAdd(__pyx_t_14, __pyx_cur_scope->__pyx_v_count); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-              if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1098
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1100
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)             # <<<<<<<<<<<<<<
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  */
-              __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fphrases, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fphrases, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
-              __pyx_t_9 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_e); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_e); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              __pyx_t_3 = PyObject_GetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_als); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyObject_GetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_als); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_cur_scope->__pyx_v_loc); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_cur_scope->__pyx_v_loc); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1099
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1101
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():             # <<<<<<<<<<<<<<
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_fphrases, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            if (PyList_CheckExact(__pyx_t_9) || PyTuple_CheckExact(__pyx_t_9)) {
-              __pyx_t_10 = __pyx_t_9; __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
-              __pyx_t_20 = NULL;
-            } else {
-              __pyx_t_5 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_20 = Py_TYPE(__pyx_t_10)->tp_iternext;
+            __pyx_t_5 = 0;
+            if (unlikely(__pyx_cur_scope->__pyx_v_fphrases == Py_None)) {
+              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            for (;;) {
-              if (PyList_CheckExact(__pyx_t_10)) {
-                if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
-                __pyx_t_9 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_9); __pyx_t_5++;
-              } else if (PyTuple_CheckExact(__pyx_t_10)) {
-                if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_10)) break;
-                __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_9); __pyx_t_5++;
-              } else {
-                __pyx_t_9 = __pyx_t_20(__pyx_t_10);
-                if (unlikely(!__pyx_t_9)) {
-                  if (PyErr_Occurred()) {
-                    if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  break;
-                }
-                __Pyx_GOTREF(__pyx_t_9);
-              }
-              if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
-                PyObject* sequence = __pyx_t_9;
-                if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
-                  __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
-                } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
-                  __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
-                }
-                __Pyx_INCREF(__pyx_t_3);
-                __Pyx_INCREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              } else {
-                Py_ssize_t index = -1;
-                __pyx_t_13 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-                __pyx_t_17 = Py_TYPE(__pyx_t_13)->tp_iternext;
-                index = 0; __pyx_t_3 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L56_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_3);
-                index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_14)) goto __pyx_L56_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_14);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                goto __pyx_L57_unpacking_done;
-                __pyx_L56_unpacking_failed:;
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_L57_unpacking_done:;
-              }
+            __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_fphrases, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_22), (&__pyx_t_18)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_XDECREF(__pyx_t_10);
+            __pyx_t_10 = __pyx_t_9;
+            __pyx_t_9 = 0;
+            while (1) {
+              __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_10, __pyx_t_22, &__pyx_t_5, &__pyx_t_9, &__pyx_t_3, NULL, __pyx_t_18);
+              if (unlikely(__pyx_t_6 == 0)) break;
+              if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_9);
+              __Pyx_GOTREF(__pyx_t_3);
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_f);
-              __Pyx_GIVEREF(__pyx_t_3);
-              __pyx_cur_scope->__pyx_v_f = __pyx_t_3;
-              __pyx_t_3 = 0;
+              __Pyx_GIVEREF(__pyx_t_9);
+              __pyx_cur_scope->__pyx_v_f = __pyx_t_9;
+              __pyx_t_9 = 0;
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_elist);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_elist);
-              __Pyx_GIVEREF(__pyx_t_14);
-              __pyx_cur_scope->__pyx_v_elist = __pyx_t_14;
-              __pyx_t_14 = 0;
+              __Pyx_GIVEREF(__pyx_t_3);
+              __pyx_cur_scope->__pyx_v_elist = __pyx_t_3;
+              __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1100
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1102
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():             # <<<<<<<<<<<<<<
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  */
-              __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_elist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_23 = 0;
+              if (unlikely(__pyx_cur_scope->__pyx_v_elist == Py_None)) {
+                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_elist, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_24), (&__pyx_t_6)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              __pyx_t_14 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              if (PyList_CheckExact(__pyx_t_14) || PyTuple_CheckExact(__pyx_t_14)) {
-                __pyx_t_9 = __pyx_t_14; __Pyx_INCREF(__pyx_t_9); __pyx_t_22 = 0;
-                __pyx_t_23 = NULL;
-              } else {
-                __pyx_t_22 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_XDECREF(__pyx_t_3);
+              __pyx_t_3 = __pyx_t_9;
+              __pyx_t_9 = 0;
+              while (1) {
+                __pyx_t_4 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_24, &__pyx_t_23, &__pyx_t_9, &__pyx_t_14, NULL, __pyx_t_6);
+                if (unlikely(__pyx_t_4 == 0)) break;
+                if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __pyx_t_23 = Py_TYPE(__pyx_t_9)->tp_iternext;
-              }
-              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-              for (;;) {
-                if (PyList_CheckExact(__pyx_t_9)) {
-                  if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_9)) break;
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_22); __Pyx_INCREF(__pyx_t_14); __pyx_t_22++;
-                } else if (PyTuple_CheckExact(__pyx_t_9)) {
-                  if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_22); __Pyx_INCREF(__pyx_t_14); __pyx_t_22++;
-                } else {
-                  __pyx_t_14 = __pyx_t_23(__pyx_t_9);
-                  if (unlikely(!__pyx_t_14)) {
-                    if (PyErr_Occurred()) {
-                      if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    break;
-                  }
-                  __Pyx_GOTREF(__pyx_t_14);
-                }
-                if ((likely(PyTuple_CheckExact(__pyx_t_14))) || (PyList_CheckExact(__pyx_t_14))) {
-                  PyObject* sequence = __pyx_t_14;
-                  if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
-                    __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
-                  } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
-                    __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
-                  }
-                  __Pyx_INCREF(__pyx_t_3);
-                  __Pyx_INCREF(__pyx_t_13);
-                  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                } else {
-                  Py_ssize_t index = -1;
-                  __pyx_t_7 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __Pyx_GOTREF(__pyx_t_7);
-                  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                  __pyx_t_17 = Py_TYPE(__pyx_t_7)->tp_iternext;
-                  index = 0; __pyx_t_3 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L60_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_3);
-                  index = 1; __pyx_t_13 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_13)) goto __pyx_L60_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_13);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  goto __pyx_L61_unpacking_done;
-                  __pyx_L60_unpacking_failed:;
-                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_L61_unpacking_done:;
-                }
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
-                __Pyx_GIVEREF(__pyx_t_3);
-                __pyx_cur_scope->__pyx_v_e = __pyx_t_3;
-                __pyx_t_3 = 0;
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_v_e = __pyx_t_9;
+                __pyx_t_9 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alslist);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alslist);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_13;
-                __pyx_t_13 = 0;
+                __Pyx_GIVEREF(__pyx_t_14);
+                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_14;
+                __pyx_t_14 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1101
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1103
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]             # <<<<<<<<<<<<<<
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  *                                     count = len(locs)
  */
-                __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_13 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
+                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
-                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_t_13 = 0;
-                __pyx_t_13 = PyDict_New(); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-                __pyx_t_3 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda3, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
-                if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__key), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                __pyx_t_3 = PyEval_CallObjectWithKeywords(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
-                __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-                __pyx_t_13 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
+                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_t_9 = 0;
+                __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+                __pyx_t_13 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__key), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __pyx_t_13 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
+                __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+                __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_13, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alignment);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_13;
-                __pyx_t_13 = 0;
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_9;
+                __pyx_t_9 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1102
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1104
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))             # <<<<<<<<<<<<<<
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  */
-                __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_3 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__chain); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
+                __pyx_t_13 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__chain); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_14 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+                __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
+                __pyx_t_14 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_14);
+                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+                __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
+                PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_14);
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_t_14 = 0;
-                __pyx_t_14 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-                __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_14);
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+                __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
+                PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_14);
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_t_14 = 0;
-                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_14);
                 __pyx_t_14 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1103
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1105
  *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  *                                     count = len(locs)             # <<<<<<<<<<<<<<
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  */
-                if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_locs) == Py_None)) {
-                  PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-                }
-                __pyx_t_24 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); 
-                __pyx_t_14 = PyInt_FromSsize_t(__pyx_t_24); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_25 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); if (unlikely(__pyx_t_25 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
@@ -44701,60 +46857,52 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __pyx_cur_scope->__pyx_v_count = __pyx_t_14;
                 __pyx_t_14 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1104
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1106
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(             # <<<<<<<<<<<<<<
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i+spanlen), locs, fwords
+ *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  */
-                __pyx_t_14 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1105
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1107
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,             # <<<<<<<<<<<<<<
- *                                                (k,i+spanlen), locs, fwords
+ *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  *                                                ))
  */
-                __pyx_t_13 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
+                __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1106
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1108
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i+spanlen), locs, fwords             # <<<<<<<<<<<<<<
+ *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda             # <<<<<<<<<<<<<<
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)
  */
-                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_7);
-                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyNumber_Add(__pyx_t_2, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyNumber_Add(__pyx_t_2, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-                __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+                __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_2);
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7);
                 __Pyx_GIVEREF(__pyx_t_7);
                 PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_15);
                 __Pyx_GIVEREF(__pyx_t_15);
                 __pyx_t_7 = 0;
                 __pyx_t_15 = 0;
-
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1107
- *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i+spanlen), locs, fwords
- *                                                ))             # <<<<<<<<<<<<<<
- *                                     yield Rule(self.category, f, e, scores, alignment)
- * 
- */
-                __pyx_t_15 = PyTuple_New(8); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+                __pyx_t_15 = PyTuple_New(10); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                 PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_f);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f);
@@ -44764,10 +46912,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_count);
                 PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_cur_scope->__pyx_v_count);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_count);
-                PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_13);
+                PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_9);
+                __Pyx_GIVEREF(__pyx_t_9);
+                PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_13);
                 __Pyx_GIVEREF(__pyx_t_13);
-                PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_3);
-                __Pyx_GIVEREF(__pyx_t_3);
                 PyTuple_SET_ITEM(__pyx_t_15, 5, ((PyObject *)__pyx_t_2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
@@ -44776,14 +46924,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
                 PyTuple_SET_ITEM(__pyx_t_15, 7, __pyx_cur_scope->__pyx_v_fwords);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
+                __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
+                PyTuple_SET_ITEM(__pyx_t_15, 8, ((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
+                __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
+                __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
+                PyTuple_SET_ITEM(__pyx_t_15, 9, ((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
+                __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
+                __pyx_t_9 = 0;
                 __pyx_t_13 = 0;
-                __pyx_t_3 = 0;
                 __pyx_t_2 = 0;
-                __pyx_t_2 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer->__pyx_vtab)->score(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
@@ -44792,17 +46946,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_15);
                 __pyx_t_15 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1108
- *                                                (k,i+spanlen), locs, fwords
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1110
+ *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)             # <<<<<<<<<<<<<<
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  */
-                __pyx_t_15 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+                __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_2);
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_15);
                 __Pyx_GIVEREF(__pyx_t_15);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
@@ -44818,45 +46972,49 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_alignment);
                 __pyx_t_15 = 0;
-                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
                 __pyx_r = __pyx_t_15;
                 __pyx_t_15 = 0;
                 __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
-                __pyx_cur_scope->__pyx_t_1 = __pyx_t_5;
-                __Pyx_XGIVEREF(__pyx_t_9);
-                __pyx_cur_scope->__pyx_t_2 = __pyx_t_9;
+                __Pyx_XGIVEREF(__pyx_t_3);
+                __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
+                __pyx_cur_scope->__pyx_t_2 = __pyx_t_5;
+                __pyx_cur_scope->__pyx_t_3 = __pyx_t_6;
                 __Pyx_XGIVEREF(__pyx_t_10);
-                __pyx_cur_scope->__pyx_t_3 = __pyx_t_10;
+                __pyx_cur_scope->__pyx_t_4 = __pyx_t_10;
                 __Pyx_XGIVEREF(__pyx_t_12);
-                __pyx_cur_scope->__pyx_t_4 = __pyx_t_12;
-                __pyx_cur_scope->__pyx_t_5 = __pyx_t_20;
-                __pyx_cur_scope->__pyx_t_6 = __pyx_t_22;
-                __pyx_cur_scope->__pyx_t_7 = __pyx_t_23;
+                __pyx_cur_scope->__pyx_t_5 = __pyx_t_12;
+                __pyx_cur_scope->__pyx_t_6 = __pyx_t_18;
+                __pyx_cur_scope->__pyx_t_7 = __pyx_t_22;
+                __pyx_cur_scope->__pyx_t_8 = __pyx_t_23;
+                __pyx_cur_scope->__pyx_t_9 = __pyx_t_24;
                 __Pyx_XGIVEREF(__pyx_r);
                 __Pyx_RefNannyFinishContext();
                 /* return from generator, yielding value */
-                __pyx_cur_scope->__pyx_base.resume_label = 1;
+                __pyx_generator->resume_label = 1;
                 return __pyx_r;
-                __pyx_L62_resume_from_yield:;
+                __pyx_L58_resume_from_yield:;
                 __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
-                __pyx_t_5 = __pyx_cur_scope->__pyx_t_1;
-                __pyx_t_9 = __pyx_cur_scope->__pyx_t_2;
-                __pyx_cur_scope->__pyx_t_2 = 0;
-                __Pyx_XGOTREF(__pyx_t_9);
-                __pyx_t_10 = __pyx_cur_scope->__pyx_t_3;
-                __pyx_cur_scope->__pyx_t_3 = 0;
-                __Pyx_XGOTREF(__pyx_t_10);
-                __pyx_t_12 = __pyx_cur_scope->__pyx_t_4;
+                __pyx_t_3 = __pyx_cur_scope->__pyx_t_1;
+                __pyx_cur_scope->__pyx_t_1 = 0;
+                __Pyx_XGOTREF(__pyx_t_3);
+                __pyx_t_5 = __pyx_cur_scope->__pyx_t_2;
+                __pyx_t_6 = __pyx_cur_scope->__pyx_t_3;
+                __pyx_t_10 = __pyx_cur_scope->__pyx_t_4;
                 __pyx_cur_scope->__pyx_t_4 = 0;
+                __Pyx_XGOTREF(__pyx_t_10);
+                __pyx_t_12 = __pyx_cur_scope->__pyx_t_5;
+                __pyx_cur_scope->__pyx_t_5 = 0;
                 __Pyx_XGOTREF(__pyx_t_12);
-                __pyx_t_20 = __pyx_cur_scope->__pyx_t_5;
-                __pyx_t_22 = __pyx_cur_scope->__pyx_t_6;
-                __pyx_t_23 = __pyx_cur_scope->__pyx_t_7;
-                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_18 = __pyx_cur_scope->__pyx_t_6;
+                __pyx_t_22 = __pyx_cur_scope->__pyx_t_7;
+                __pyx_t_23 = __pyx_cur_scope->__pyx_t_8;
+                __pyx_t_24 = __pyx_cur_scope->__pyx_t_9;
+                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             goto __pyx_L47;
@@ -44869,96 +47027,91 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       __pyx_L32:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1110
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1112
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  */
-      __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (__pyx_t_5 < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_length);
+      __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = (__pyx_t_22 < __pyx_cur_scope->__pyx_v_self->max_length);
       if (__pyx_t_19) {
-        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_3 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_22); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_15 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_LT); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_15);
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __pyx_t_15 = PyObject_RichCompare(__pyx_t_3, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
-          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_9 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_3 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_25 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_25 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_26 = __pyx_t_25;
+          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __pyx_t_27 = __pyx_t_26;
         } else {
-          __pyx_t_26 = __pyx_t_8;
+          __pyx_t_27 = __pyx_t_8;
         }
-        __pyx_t_8 = __pyx_t_26;
+        __pyx_t_8 = __pyx_t_27;
       } else {
         __pyx_t_8 = __pyx_t_19;
       }
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1111
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1113
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  */
-        __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_10 = PyNumber_Add(__pyx_t_9, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_10 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        __pyx_t_9 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
+        __pyx_t_22 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_22; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_alt_id = __pyx_t_18;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1112
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1114
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
-            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_15 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_14 = PyTuple_New(7); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_14));
-          PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
-          __Pyx_GIVEREF(__pyx_t_9);
+          __pyx_t_14 = PyTuple_New(7); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_14);
+          PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_3);
+          __Pyx_GIVEREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_15);
           __Pyx_GIVEREF(__pyx_t_15);
           PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_t_10);
@@ -44974,15 +47127,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
           PyTuple_SET_ITEM(__pyx_t_14, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          __pyx_t_9 = 0;
+          __pyx_t_3 = 0;
           __pyx_t_15 = 0;
           __pyx_t_10 = 0;
           __pyx_t_2 = 0;
-          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_14)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_14)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1113
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1115
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity             # <<<<<<<<<<<<<<
@@ -44991,18 +47144,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
         __pyx_cur_scope->__pyx_v_num_subpatterns = __pyx_cur_scope->__pyx_v_arity;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1114
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1116
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1115
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1117
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1             # <<<<<<<<<<<<<<
@@ -45010,52 +47163,52 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         xcat = sym_setindex(self.category, arity+1)
  */
           __pyx_cur_scope->__pyx_v_num_subpatterns = (__pyx_cur_scope->__pyx_v_num_subpatterns + 1);
-          goto __pyx_L66;
+          goto __pyx_L62;
         }
-        __pyx_L66:;
+        __pyx_L62:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1116
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1118
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:             # <<<<<<<<<<<<<<
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]
  */
-        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = ((__pyx_t_5 + 1) < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_length);
+        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = ((__pyx_t_22 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
         if (__pyx_t_19) {
-          __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_nonterminals);
+          __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
           if (__pyx_t_8) {
-            __pyx_t_26 = (__pyx_cur_scope->__pyx_v_num_subpatterns < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_chunks);
-            __pyx_t_25 = __pyx_t_26;
+            __pyx_t_27 = (__pyx_cur_scope->__pyx_v_num_subpatterns < __pyx_cur_scope->__pyx_v_self->max_chunks);
+            __pyx_t_26 = __pyx_t_27;
           } else {
-            __pyx_t_25 = __pyx_t_8;
+            __pyx_t_26 = __pyx_t_8;
           }
-          __pyx_t_8 = __pyx_t_25;
+          __pyx_t_8 = __pyx_t_26;
         } else {
           __pyx_t_8 = __pyx_t_19;
         }
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1117
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1119
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)             # <<<<<<<<<<<<<<
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  */
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, (__pyx_cur_scope->__pyx_v_arity + 1));
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, (__pyx_cur_scope->__pyx_v_arity + 1));
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1118
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1120
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]             # <<<<<<<<<<<<<<
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  */
-          __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
-          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_14, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_14, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xnode);
@@ -45064,19 +47217,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_xnode = __pyx_t_2;
           __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1120
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1122
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])             # <<<<<<<<<<<<<<
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  */
-          __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
-          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_10);
           PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_14);
@@ -45089,7 +47242,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
           __pyx_t_2 = 0;
           __pyx_t_14 = 0;
-          __pyx_t_14 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_14 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_14));
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
@@ -45098,67 +47251,64 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_key = __pyx_t_14;
           __pyx_t_14 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1121
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1123
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []             # <<<<<<<<<<<<<<
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  */
-          __pyx_t_14 = PyList_New(0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+          __pyx_t_14 = PyList_New(0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_14);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_GIVEREF(((PyObject *)__pyx_t_14));
           __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_14);
           __pyx_t_14 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1122
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1124
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):             # <<<<<<<<<<<<<<
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer) == Py_None)) {
-            PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_8 = ((PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1123
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1125
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]             # <<<<<<<<<<<<<<
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  */
-            __pyx_t_14 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_GIVEREF(__pyx_t_14);
             __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_14;
             __pyx_t_14 = 0;
-            goto __pyx_L68;
+            goto __pyx_L64;
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1125
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1127
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)             # <<<<<<<<<<<<<<
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  */
-            __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self, __pyx_n_s_123); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_123); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_15 = PyTuple_New(7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __pyx_t_15 = PyTuple_New(7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
@@ -45180,7 +47330,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
             __pyx_t_10 = 0;
             __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
@@ -45190,18 +47340,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1126
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1128
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  *                             nodes_isteps_away_buffer[key] = frontier_nodes             # <<<<<<<<<<<<<<
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  */
-            if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
-          __pyx_L68:;
+          __pyx_L64:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1128
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1130
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:             # <<<<<<<<<<<<<<
@@ -45209,26 +47359,34 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             frontier = new_frontier
  */
           if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes)) {
-            __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_5 = 0;
+            __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_22 = 0;
             __pyx_t_20 = NULL;
           } else {
-            __pyx_t_5 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_22 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_20 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_15); __pyx_t_5++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_15); __pyx_t_5++;
+            if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
+            } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
             } else {
               __pyx_t_15 = __pyx_t_20(__pyx_t_2);
               if (unlikely(!__pyx_t_15)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -45236,127 +47394,132 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
               PyObject* sequence = __pyx_t_15;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 3)) {
+                if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
                 __pyx_t_14 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
-                __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
+                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-                  if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
                 __pyx_t_14 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
-                __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
+                __pyx_t_3 = PyList_GET_ITEM(sequence, 2); 
               }
               __Pyx_INCREF(__pyx_t_14);
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_9);
+              __Pyx_INCREF(__pyx_t_3);
+              #else
+              __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-            } else {
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_3 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_13);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-              __pyx_t_17 = Py_TYPE(__pyx_t_3)->tp_iternext;
-              index = 0; __pyx_t_14 = __pyx_t_17(__pyx_t_3); if (unlikely(!__pyx_t_14)) goto __pyx_L71_unpacking_failed;
+              __pyx_t_17 = Py_TYPE(__pyx_t_13)->tp_iternext;
+              index = 0; __pyx_t_14 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_14)) goto __pyx_L67_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_14);
-              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_3); if (unlikely(!__pyx_t_10)) goto __pyx_L71_unpacking_failed;
+              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L67_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_9 = __pyx_t_17(__pyx_t_3); if (unlikely(!__pyx_t_9)) goto __pyx_L71_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_9);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_3), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              goto __pyx_L72_unpacking_done;
-              __pyx_L71_unpacking_failed:;
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_L72_unpacking_done:;
+              index = 2; __pyx_t_3 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L67_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_3);
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_17 = NULL;
+              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+              goto __pyx_L68_unpacking_done;
+              __pyx_L67_unpacking_failed:;
+              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+              __pyx_t_17 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_L68_unpacking_done:;
             }
-            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_14); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_14); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-            __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __pyx_cur_scope->__pyx_v_i = __pyx_t_18;
             __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_pathlen);
-            __Pyx_GIVEREF(__pyx_t_9);
-            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_9;
-            __pyx_t_9 = 0;
+            __Pyx_GIVEREF(__pyx_t_3);
+            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1129
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1131
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))             # <<<<<<<<<<<<<<
  *             frontier = new_frontier
  * 
  */
-            if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
-              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-            }
-            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_14);
+            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
+            PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_14);
             __Pyx_GIVEREF(__pyx_t_14);
             __pyx_t_14 = 0;
-            __pyx_t_14 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-            __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_15);
+            __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+            __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
+            PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_15);
             __Pyx_GIVEREF(__pyx_t_15);
-            PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_9);
-            __Pyx_GIVEREF(__pyx_t_9);
-            PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_3);
+            PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
-            PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_cur_scope->__pyx_v_pathlen);
+            PyTuple_SET_ITEM(__pyx_t_13, 3, __pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_cur_scope->__pyx_v_xnode);
+            PyTuple_SET_ITEM(__pyx_t_13, 4, __pyx_cur_scope->__pyx_v_xnode);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_t_14);
+            PyTuple_SET_ITEM(__pyx_t_13, 5, __pyx_t_14);
             __Pyx_GIVEREF(__pyx_t_14);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-            PyTuple_SET_ITEM(__pyx_t_3, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
+            PyTuple_SET_ITEM(__pyx_t_13, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
             __pyx_t_15 = 0;
-            __pyx_t_9 = 0;
+            __pyx_t_3 = 0;
             __pyx_t_10 = 0;
             __pyx_t_14 = 0;
-            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L67;
+          goto __pyx_L63;
         }
-        __pyx_L67:;
-        goto __pyx_L63;
+        __pyx_L63:;
+        goto __pyx_L59;
       }
-      __pyx_L63:;
+      __pyx_L59:;
       __pyx_L19_continue:;
     }
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1130
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1132
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
  *             frontier = new_frontier             # <<<<<<<<<<<<<<
@@ -45370,95 +47533,95 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     __pyx_cur_scope->__pyx_v_frontier = __pyx_cur_scope->__pyx_v_new_frontier;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1132
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1134
  *             frontier = new_frontier
  * 
  *         stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  */
-  __pyx_t_12 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_GIVEREF(__pyx_t_12);
   __pyx_cur_scope->__pyx_v_stop_time = __pyx_t_12;
   __pyx_t_12 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1133
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1135
  * 
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  */
-  __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_3 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_13 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+  __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_12);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_124));
   PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_124));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_124));
-  PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_3);
-  __Pyx_GIVEREF(__pyx_t_3);
-  __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_13);
+  __Pyx_GIVEREF(__pyx_t_13);
+  __pyx_t_13 = 0;
+  __pyx_t_13 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1134
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1136
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()             # <<<<<<<<<<<<<<
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  * 
  */
-  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1135
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1137
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __pyx_t_13 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_125));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
-  __Pyx_GIVEREF(__pyx_t_3);
-  __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_13);
+  __Pyx_GIVEREF(__pyx_t_13);
+  __pyx_t_13 = 0;
+  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
@@ -45474,12 +47637,13 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_AddTraceback("input", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1138
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1140
  * 
  * 
  *     cdef int find_fixpoint(self,             # <<<<<<<<<<<<<<
@@ -45487,7 +47651,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         int* f_links_low, int* f_links_high,
  */
 
-static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_f_low, PyObject *__pyx_v_f_high, int *__pyx_v_f_links_low, int *__pyx_v_f_links_high, int *__pyx_v_e_links_low, int *__pyx_v_e_links_high, int __pyx_v_e_in_low, int __pyx_v_e_in_high, int *__pyx_v_e_low, int *__pyx_v_e_high, int *__pyx_v_f_back_low, int *__pyx_v_f_back_high, int __pyx_v_f_sent_len, int __pyx_v_e_sent_len, int __pyx_v_max_f_len, int __pyx_v_max_e_len, int __pyx_v_min_fx_size, int __pyx_v_min_ex_size, int __pyx_v_max_new_x, int __pyx_v_allow_low_x, int __pyx_v_allow_high_x, int __pyx_v_allow_arbitrary_x, int __pyx_v_write_log) {
+static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_f_low, PyObject *__pyx_v_f_high, int *__pyx_v_f_links_low, int *__pyx_v_f_links_high, int *__pyx_v_e_links_low, int *__pyx_v_e_links_high, int __pyx_v_e_in_low, int __pyx_v_e_in_high, int *__pyx_v_e_low, int *__pyx_v_e_high, int *__pyx_v_f_back_low, int *__pyx_v_f_back_high, int __pyx_v_f_sent_len, int __pyx_v_e_sent_len, int __pyx_v_max_f_len, int __pyx_v_max_e_len, int __pyx_v_min_fx_size, int __pyx_v_min_ex_size, int __pyx_v_max_new_x, int __pyx_v_allow_low_x, int __pyx_v_allow_high_x, int __pyx_v_allow_arbitrary_x, CYTHON_UNUSED int __pyx_v_write_log) {
   int __pyx_v_e_low_prev;
   int __pyx_v_e_high_prev;
   int __pyx_v_f_low_prev;
@@ -45507,9 +47671,9 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("find_fixpoint");
+  __Pyx_RefNannySetupContext("find_fixpoint", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1153
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1155
  *         cdef int e_low_prev, e_high_prev, f_low_prev, f_high_prev, new_x, new_low_x, new_high_x
  * 
  *         e_low[0] = e_in_low             # <<<<<<<<<<<<<<
@@ -45518,7 +47682,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_low[0]) = __pyx_v_e_in_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1154
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1156
  * 
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high             # <<<<<<<<<<<<<<
@@ -45527,19 +47691,19 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_high[0]) = __pyx_v_e_in_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1155
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1157
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *         if e_low[0] == -1:
  *             # low-priority corner case: if phrase w is unaligned,
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1156
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1158
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)
  *         if e_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -45549,7 +47713,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_3 = ((__pyx_v_e_low[0]) == -1);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1162
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1164
  *             # rule X -> X_1 w X_2 / X_1 X_2.    This is probably
  *             # not worth the bother, though.
  *             return 0             # <<<<<<<<<<<<<<
@@ -45561,7 +47725,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1163
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1165
  *             # not worth the bother, though.
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:             # <<<<<<<<<<<<<<
@@ -45577,7 +47741,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1164
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1166
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:             # <<<<<<<<<<<<<<
@@ -45587,7 +47751,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = ((__pyx_v_e_in_low - (__pyx_v_e_low[0])) < __pyx_v_min_ex_size);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1165
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1167
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size             # <<<<<<<<<<<<<<
@@ -45596,7 +47760,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_low[0]) = (__pyx_v_e_in_low - __pyx_v_min_ex_size);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1166
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1168
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -45606,7 +47770,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_5 = ((__pyx_v_e_low[0]) < 0);
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1167
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1169
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -45625,7 +47789,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1169
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1171
  *                     return 0
  * 
  *         if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -45635,7 +47799,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_5 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1170
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1172
  * 
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0             # <<<<<<<<<<<<<<
@@ -45647,7 +47811,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L6;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1171
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1173
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:             # <<<<<<<<<<<<<<
@@ -45663,7 +47827,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1172
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1174
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:             # <<<<<<<<<<<<<<
@@ -45673,7 +47837,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (((__pyx_v_e_high[0]) - __pyx_v_e_in_high) < __pyx_v_min_ex_size);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1173
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1175
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size             # <<<<<<<<<<<<<<
@@ -45682,7 +47846,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_high[0]) = (__pyx_v_e_in_high + __pyx_v_min_ex_size);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1174
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1176
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:             # <<<<<<<<<<<<<<
@@ -45692,7 +47856,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_e_high[0]) > __pyx_v_e_sent_len);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1175
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1177
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -45711,7 +47875,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1179
  *                     return 0
  * 
  *         f_back_low[0] = -1             # <<<<<<<<<<<<<<
@@ -45720,7 +47884,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_low[0]) = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1178
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1180
  * 
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1             # <<<<<<<<<<<<<<
@@ -45729,7 +47893,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_high[0]) = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1179
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1181
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1
  *         f_low_prev = f_low             # <<<<<<<<<<<<<<
@@ -45738,17 +47902,17 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_f_low_prev = __pyx_v_f_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1180
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1182
  *         f_back_high[0] = -1
  *         f_low_prev = f_low
  *         f_high_prev = f_high             # <<<<<<<<<<<<<<
  *         new_x = 0
  *         new_low_x = 0
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_f_high_prev = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1183
  *         f_low_prev = f_low
  *         f_high_prev = f_high
  *         new_x = 0             # <<<<<<<<<<<<<<
@@ -45757,7 +47921,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_x = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1182
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1184
  *         f_high_prev = f_high
  *         new_x = 0
  *         new_low_x = 0             # <<<<<<<<<<<<<<
@@ -45766,7 +47930,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_low_x = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1185
  *         new_x = 0
  *         new_low_x = 0
  *         new_high_x = 0             # <<<<<<<<<<<<<<
@@ -45775,7 +47939,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_high_x = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1187
  *         new_high_x = 0
  * 
  *         while True:             # <<<<<<<<<<<<<<
@@ -45785,7 +47949,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   while (1) {
     if (!1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1187
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1189
  *         while True:
  * 
  *             if f_back_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -45795,45 +47959,45 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) == -1);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1188
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1190
  * 
  *             if f_back_low[0] == -1:
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       goto __pyx_L11;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1190
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1192
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), __pyx_v_e_low_prev, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), __pyx_v_e_low_prev, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1191
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1193
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  * 
  *             if f_back_low[0] > f_low:
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_e_high_prev, (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_e_high_prev, (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     }
     __pyx_L11:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1193
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1195
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  *             if f_back_low[0] > f_low:             # <<<<<<<<<<<<<<
@@ -45843,7 +48007,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) > __pyx_v_f_low);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1194
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1196
  * 
  *             if f_back_low[0] > f_low:
  *                 f_back_low[0] = f_low             # <<<<<<<<<<<<<<
@@ -45855,36 +48019,35 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L12:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1196
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1198
  *                 f_back_low[0] = f_low
  * 
  *             if f_back_high[0] < f_high:             # <<<<<<<<<<<<<<
  *                 f_back_high[0] = f_high
  * 
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1197
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1199
  * 
  *             if f_back_high[0] < f_high:
  *                 f_back_high[0] = f_high             # <<<<<<<<<<<<<<
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  */
-      __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       (__pyx_v_f_back_high[0]) = __pyx_t_1;
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1199
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1201
  *                 f_back_high[0] = f_high
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:             # <<<<<<<<<<<<<<
@@ -45900,7 +48063,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1200
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1202
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -45913,7 +48076,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1202
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1204
  *                 return 1
  * 
  *             if allow_low_x == 0 and f_back_low[0] < f_low:             # <<<<<<<<<<<<<<
@@ -45929,7 +48092,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1204
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1206
  *             if allow_low_x == 0 and f_back_low[0] < f_low:
  *                 # FAIL: f phrase is not tight
  *                 return 0             # <<<<<<<<<<<<<<
@@ -45942,7 +48105,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1206
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1208
  *                 return 0
  * 
  *             if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -45952,7 +48115,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1208
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1210
  *             if f_back_high[0] - f_back_low[0] > max_f_len:
  *                 # FAIL: f back projection is too wide
  *                 return 0             # <<<<<<<<<<<<<<
@@ -45965,7 +48128,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1210
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1212
  *                 return 0
  * 
  *             if allow_high_x == 0 and f_back_high[0] > f_high:             # <<<<<<<<<<<<<<
@@ -45974,12 +48137,11 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_5 = (__pyx_v_allow_high_x == 0);
     if (__pyx_t_5) {
-      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_4 = __pyx_t_3;
     } else {
@@ -45987,7 +48149,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1212
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1214
  *             if allow_high_x == 0 and f_back_high[0] > f_high:
  *                 # FAIL: extension on high side not allowed
  *                 return 0             # <<<<<<<<<<<<<<
@@ -46000,7 +48162,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1214
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1216
  *                 return 0
  * 
  *             if f_low != f_back_low[0]:             # <<<<<<<<<<<<<<
@@ -46010,7 +48172,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (__pyx_v_f_low != (__pyx_v_f_back_low[0]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1215
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1217
  * 
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:             # <<<<<<<<<<<<<<
@@ -46020,7 +48182,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_low_x == 0);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1216
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1218
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -46030,7 +48192,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1218
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1220
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on low side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46043,7 +48205,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1220
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1222
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -46052,7 +48214,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1221
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1223
  *                     else:
  *                         new_x = new_x + 1
  *                         new_low_x = 1             # <<<<<<<<<<<<<<
@@ -46066,7 +48228,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L19:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1222
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1224
  *                         new_x = new_x + 1
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:             # <<<<<<<<<<<<<<
@@ -46076,7 +48238,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_f_low - (__pyx_v_f_back_low[0])) < __pyx_v_min_fx_size);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1223
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1225
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size             # <<<<<<<<<<<<<<
@@ -46085,7 +48247,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
         (__pyx_v_f_back_low[0]) = (__pyx_v_f_low - __pyx_v_min_fx_size);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1224
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1226
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -46095,7 +48257,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1226
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1228
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46108,7 +48270,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L22:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1227
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1229
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0
  *                     if f_back_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -46118,7 +48280,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_low[0]) < 0);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1229
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1231
  *                     if f_back_low[0] < 0:
  *                         # FAIL: extension required on low side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46137,23 +48299,22 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L18:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1231
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1233
  *                         return 0
  * 
  *             if f_high != f_back_high[0]:             # <<<<<<<<<<<<<<
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1232
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1234
  * 
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:             # <<<<<<<<<<<<<<
@@ -46163,7 +48324,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_high_x == 0);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1233
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1235
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -46173,7 +48334,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1235
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1237
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on high side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46186,7 +48347,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1237
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1239
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -46195,7 +48356,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1238
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1240
  *                     else:
  *                         new_x = new_x + 1
  *                         new_high_x = 1             # <<<<<<<<<<<<<<
@@ -46209,45 +48370,44 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L25:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1239
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1241
  *                         new_x = new_x + 1
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:             # <<<<<<<<<<<<<<
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  */
-      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_f_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_f_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1240
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1242
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size             # <<<<<<<<<<<<<<
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  */
-        __pyx_t_7 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_6 = PyNumber_Add(__pyx_v_f_high, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyNumber_Add(__pyx_v_f_high, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         (__pyx_v_f_back_high[0]) = __pyx_t_1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1241
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1243
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -46257,7 +48417,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1243
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1245
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46270,7 +48430,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L28:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1244
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1246
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0
  *                     if f_back_high[0] > f_sent_len:             # <<<<<<<<<<<<<<
@@ -46280,7 +48440,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_high[0]) > __pyx_v_f_sent_len);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1246
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1248
  *                     if f_back_high[0] > f_sent_len:
  *                         # FAIL: extension required on high side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46299,7 +48459,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L24:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1248
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1250
  *                         return 0
  * 
  *             e_low_prev = e_low[0]             # <<<<<<<<<<<<<<
@@ -46308,7 +48468,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_low_prev = (__pyx_v_e_low[0]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1249
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1251
  * 
  *             e_low_prev = e_low[0]
  *             e_high_prev = e_high[0]             # <<<<<<<<<<<<<<
@@ -46317,29 +48477,29 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_high_prev = (__pyx_v_e_high[0]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1251
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1253
  *             e_high_prev = e_high[0]
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  */
-    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_f_back_low[0]), __pyx_v_f_low_prev, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_f_back_low[0]), __pyx_v_f_low_prev, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1252
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1254
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  */
-    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_high_prev, (__pyx_v_f_back_high[0]), __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_high_prev, (__pyx_v_f_back_high[0]), __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1253
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1255
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:             # <<<<<<<<<<<<<<
@@ -46355,7 +48515,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1254
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1256
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -46368,7 +48528,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L30:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1255
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1257
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  *             if allow_arbitrary_x == 0:             # <<<<<<<<<<<<<<
@@ -46378,7 +48538,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (__pyx_v_allow_arbitrary_x == 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1257
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1259
  *             if allow_arbitrary_x == 0:
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0             # <<<<<<<<<<<<<<
@@ -46391,7 +48551,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L31:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1258
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1260
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0
  *             if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -46401,7 +48561,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1260
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1262
  *             if e_high[0] - e_low[0] > max_e_len:
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0             # <<<<<<<<<<<<<<
@@ -46414,7 +48574,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L32:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1261
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1263
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0
  *             f_low_prev = f_back_low[0]             # <<<<<<<<<<<<<<
@@ -46423,7 +48583,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_f_low_prev = (__pyx_v_f_back_low[0]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1262
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1264
  *                 return 0
  *             f_low_prev = f_back_low[0]
  *             f_high_prev = f_back_high[0]             # <<<<<<<<<<<<<<
@@ -46446,7 +48606,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1265
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1267
  * 
  * 
  *     cdef find_projection(self, int in_low, int in_high, int* in_links_low, int* in_links_high,             # <<<<<<<<<<<<<<
@@ -46454,7 +48614,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  *         cdef int i
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_in_low, int __pyx_v_in_high, int *__pyx_v_in_links_low, int *__pyx_v_in_links_high, int *__pyx_v_out_low, int *__pyx_v_out_high) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_in_low, int __pyx_v_in_high, int *__pyx_v_in_links_low, int *__pyx_v_in_links_high, int *__pyx_v_out_low, int *__pyx_v_out_high) {
   int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -46462,9 +48622,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("find_projection");
+  __Pyx_RefNannySetupContext("find_projection", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1268
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1270
  *                         int* out_low, int* out_high):
  *         cdef int i
  *         for i from in_low <= i < in_high:             # <<<<<<<<<<<<<<
@@ -46474,7 +48634,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
   __pyx_t_1 = __pyx_v_in_high;
   for (__pyx_v_i = __pyx_v_in_low; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1269
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1271
  *         cdef int i
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:             # <<<<<<<<<<<<<<
@@ -46484,7 +48644,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
     __pyx_t_2 = ((__pyx_v_in_links_low[__pyx_v_i]) != -1);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1270
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1272
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:             # <<<<<<<<<<<<<<
@@ -46500,7 +48660,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
       }
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1271
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1273
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]             # <<<<<<<<<<<<<<
@@ -46512,7 +48672,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
       }
       __pyx_L6:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1272
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1274
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:             # <<<<<<<<<<<<<<
@@ -46528,7 +48688,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
       }
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1273
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1275
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:
  *                     out_high[0] = in_links_high[i]             # <<<<<<<<<<<<<<
@@ -46550,7 +48710,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1276
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1278
  * 
  * 
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):             # <<<<<<<<<<<<<<
@@ -46558,13 +48718,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
  *         new_len = arr_len[0] + data_len
  */
 
-static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_arr, int *__pyx_v_arr_len, int *__pyx_v_data, int __pyx_v_data_len) {
+static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_arr, int *__pyx_v_arr_len, int *__pyx_v_data, int __pyx_v_data_len) {
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("int_arr_extend");
+  __Pyx_RefNannySetupContext("int_arr_extend", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1278
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1280
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len             # <<<<<<<<<<<<<<
@@ -46573,7 +48733,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_data_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1279
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1281
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -46582,7 +48742,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1280
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1282
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -46591,7 +48751,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_data, (__pyx_v_data_len * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1281
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1283
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -46600,7 +48760,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1282
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1284
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len
  *         return arr             # <<<<<<<<<<<<<<
@@ -46616,7 +48776,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1285
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1287
  * 
  * 
  *     cdef extract_phrases(self, int e_low, int e_high, int* e_gap_low, int* e_gap_high, int* e_links_low, int num_gaps,             # <<<<<<<<<<<<<<
@@ -46624,7 +48784,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  *                         int sent_id, int e_sent_len, int e_sent_start):
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_e_low, int __pyx_v_e_high, int *__pyx_v_e_gap_low, int *__pyx_v_e_gap_high, int *__pyx_v_e_links_low, int __pyx_v_num_gaps, int __pyx_v_f_low, int __pyx_v_f_high, int *__pyx_v_f_gap_low, int *__pyx_v_f_gap_high, int *__pyx_v_f_links_low, int __pyx_v_sent_id, int __pyx_v_e_sent_len, int __pyx_v_e_sent_start) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_e_low, int __pyx_v_e_high, int *__pyx_v_e_gap_low, int *__pyx_v_e_gap_high, int *__pyx_v_e_links_low, int __pyx_v_num_gaps, CYTHON_UNUSED int __pyx_v_f_low, CYTHON_UNUSED int __pyx_v_f_high, CYTHON_UNUSED int *__pyx_v_f_gap_low, CYTHON_UNUSED int *__pyx_v_f_gap_high, CYTHON_UNUSED int *__pyx_v_f_links_low, CYTHON_UNUSED int __pyx_v_sent_id, int __pyx_v_e_sent_len, int __pyx_v_e_sent_start) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -46660,21 +48820,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extract_phrases");
+  __Pyx_RefNannySetupContext("extract_phrases", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1293
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1295
  *         cdef result
  * 
  *         result = []             # <<<<<<<<<<<<<<
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1294
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1296
  * 
  *         result = []
  *         len1 = 0             # <<<<<<<<<<<<<<
@@ -46683,7 +48843,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1295
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1297
  *         result = []
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -46692,19 +48852,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = ((int *)malloc(0));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1296
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1298
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  *         ephr_arr = IntList()             # <<<<<<<<<<<<<<
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ephr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1298
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1300
  *         ephr_arr = IntList()
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))             # <<<<<<<<<<<<<<
@@ -46713,7 +48873,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gap_order = ((int *)malloc((__pyx_v_num_gaps * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1299
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1301
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:             # <<<<<<<<<<<<<<
@@ -46723,7 +48883,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_num_gaps > 0);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1300
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1302
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0             # <<<<<<<<<<<<<<
@@ -46732,7 +48892,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     (__pyx_v_e_gap_order[0]) = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1301
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1303
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -46742,7 +48902,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_3 = __pyx_v_num_gaps;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1302
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1304
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:             # <<<<<<<<<<<<<<
@@ -46752,7 +48912,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = __pyx_v_i;
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1303
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1305
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -46762,7 +48922,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_2 = ((__pyx_v_e_gap_low[__pyx_v_i]) < (__pyx_v_e_gap_low[__pyx_v_j]));
         if (__pyx_t_2) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1304
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1306
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:             # <<<<<<<<<<<<<<
@@ -46772,7 +48932,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_i;
           for (__pyx_v_k = __pyx_v_j; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1305
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1307
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]             # <<<<<<<<<<<<<<
@@ -46782,7 +48942,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             (__pyx_v_e_gap_order[(__pyx_v_k + 1)]) = (__pyx_v_e_gap_order[__pyx_v_k]);
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1306
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1308
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i             # <<<<<<<<<<<<<<
@@ -46791,7 +48951,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
           (__pyx_v_e_gap_order[__pyx_v_j]) = __pyx_v_i;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1307
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1309
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i
  *                         break             # <<<<<<<<<<<<<<
@@ -46805,7 +48965,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1309
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1311
  *                         break
  *                 else:
  *                     e_gap_order[i] = i             # <<<<<<<<<<<<<<
@@ -46820,7 +48980,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1311
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1313
  *                     e_gap_order[i] = i
  * 
  *         e_x_low = e_low             # <<<<<<<<<<<<<<
@@ -46829,7 +48989,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_low = __pyx_v_e_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1312
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1314
  * 
  *         e_x_low = e_low
  *         e_x_high = e_high             # <<<<<<<<<<<<<<
@@ -46838,7 +48998,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_high = __pyx_v_e_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1313
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1315
  *         e_x_low = e_low
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -46848,7 +49008,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1314
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1316
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -46871,7 +49031,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_6) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1315
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1317
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1             # <<<<<<<<<<<<<<
@@ -46881,7 +49041,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_e_x_low = (__pyx_v_e_x_low - 1);
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1316
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1318
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:             # <<<<<<<<<<<<<<
@@ -46904,7 +49064,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_2) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1317
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1319
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:
  *                 e_x_high = e_x_high + 1             # <<<<<<<<<<<<<<
@@ -46917,7 +49077,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L11:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1319
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1321
  *                 e_x_high = e_x_high + 1
  * 
  *         for i from e_x_low <= i <= e_low:             # <<<<<<<<<<<<<<
@@ -46927,7 +49087,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_low;
   for (__pyx_v_i = __pyx_v_e_x_low; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1320
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1322
  * 
  *         for i from e_x_low <= i <= e_low:
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)             # <<<<<<<<<<<<<<
@@ -46937,7 +49097,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_e_gaps1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps1, (&__pyx_v_len1), (&__pyx_v_i), 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1322
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1324
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)
  * 
  *         for i from 0 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -46947,7 +49107,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_num_gaps;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1323
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1325
  * 
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -46956,7 +49116,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1324
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1326
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)
  *             len2 = 0             # <<<<<<<<<<<<<<
@@ -46965,7 +49125,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_len2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1326
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1328
  *             len2 = 0
  * 
  *             j = e_gap_order[i]             # <<<<<<<<<<<<<<
@@ -46974,7 +49134,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = (__pyx_v_e_gap_order[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1327
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1329
  * 
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]             # <<<<<<<<<<<<<<
@@ -46983,7 +49143,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_low = (__pyx_v_e_gap_low[__pyx_v_j]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1328
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1330
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]             # <<<<<<<<<<<<<<
@@ -46992,7 +49152,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_high = (__pyx_v_e_gap_high[__pyx_v_j]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1329
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1331
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -47002,7 +49162,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1330
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1332
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -47019,7 +49179,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_7) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1331
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1333
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1             # <<<<<<<<<<<<<<
@@ -47029,7 +49189,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_v_e_x_gap_low = (__pyx_v_e_x_gap_low - 1);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1332
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1334
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:             # <<<<<<<<<<<<<<
@@ -47046,7 +49206,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_6) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1333
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1335
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:
  *                     e_x_gap_high = e_x_gap_high + 1             # <<<<<<<<<<<<<<
@@ -47059,7 +49219,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     __pyx_L20:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1335
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1337
  *                     e_x_gap_high = e_x_gap_high + 1
  * 
  *             k = 0             # <<<<<<<<<<<<<<
@@ -47068,7 +49228,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_k = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1336
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1338
  * 
  *             k = 0
  *             step = 1+(i*2)             # <<<<<<<<<<<<<<
@@ -47077,7 +49237,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_step = (1 + (__pyx_v_i * 2));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1337
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1339
  *             k = 0
  *             step = 1+(i*2)
  *             while k < len1:             # <<<<<<<<<<<<<<
@@ -47088,7 +49248,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_k < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1338
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1340
  *             step = 1+(i*2)
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -47098,7 +49258,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = (__pyx_v_e_gap_low[__pyx_v_j]);
       for (__pyx_v_m = __pyx_v_e_x_gap_low; __pyx_v_m <= __pyx_t_4; __pyx_v_m++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1339
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1341
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:             # <<<<<<<<<<<<<<
@@ -47108,7 +49268,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_6 = (__pyx_v_m >= (__pyx_v_e_gaps1[((__pyx_v_k + __pyx_v_step) - 1)]));
         if (__pyx_t_6) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1340
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1342
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:             # <<<<<<<<<<<<<<
@@ -47118,7 +49278,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_e_x_gap_high;
           for (__pyx_v_n = (__pyx_v_e_gap_high[__pyx_v_j]); __pyx_v_n <= __pyx_t_5; __pyx_v_n++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1341
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1343
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length             # <<<<<<<<<<<<<<
@@ -47128,7 +49288,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             __pyx_t_6 = ((__pyx_v_n - __pyx_v_m) >= 1);
             if (__pyx_t_6) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1342
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1344
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)             # <<<<<<<<<<<<<<
@@ -47137,7 +49297,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_k), __pyx_v_step);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1343
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1345
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)             # <<<<<<<<<<<<<<
@@ -47146,7 +49306,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (&__pyx_v_m), 1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1344
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1346
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)             # <<<<<<<<<<<<<<
@@ -47163,7 +49323,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_L29:;
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1345
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1347
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step             # <<<<<<<<<<<<<<
@@ -47173,7 +49333,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_k = (__pyx_v_k + __pyx_v_step);
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1346
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1348
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step
  *             free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -47182,7 +49342,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     free(__pyx_v_e_gaps1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1347
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1349
  *                 k = k + step
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -47191,7 +49351,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1348
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1350
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2
  *             len1 = len2             # <<<<<<<<<<<<<<
@@ -47201,7 +49361,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_len1 = __pyx_v_len2;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1350
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1352
  *             len1 = len2
  * 
  *         step = 1+(num_gaps*2)             # <<<<<<<<<<<<<<
@@ -47210,7 +49370,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = (1 + (__pyx_v_num_gaps * 2));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1351
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1353
  * 
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -47219,7 +49379,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1352
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1354
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0             # <<<<<<<<<<<<<<
@@ -47228,7 +49388,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1353
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1355
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:             # <<<<<<<<<<<<<<
@@ -47238,7 +49398,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_x_high;
   for (__pyx_v_i = __pyx_v_e_high; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1354
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1356
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:
  *             j = 0             # <<<<<<<<<<<<<<
@@ -47247,7 +49407,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1355
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1357
  *         for i from e_high <= i <= e_x_high:
  *             j = 0
  *             while j < len1:             # <<<<<<<<<<<<<<
@@ -47258,7 +49418,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_j < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1356
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1358
  *             j = 0
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:             # <<<<<<<<<<<<<<
@@ -47274,7 +49434,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (__pyx_t_2) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1357
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1359
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)             # <<<<<<<<<<<<<<
@@ -47283,7 +49443,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
         __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_j), __pyx_v_step);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1358
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1360
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)             # <<<<<<<<<<<<<<
@@ -47295,7 +49455,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L37:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1359
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1361
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step             # <<<<<<<<<<<<<<
@@ -47306,7 +49466,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1360
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1362
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -47315,7 +49475,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1361
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1363
  *                 j = j + step
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -47324,7 +49484,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1362
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1364
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2
  *         len1 = len2             # <<<<<<<<<<<<<<
@@ -47333,7 +49493,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = __pyx_v_len2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1364
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1366
  *         len1 = len2
  * 
  *         step = (num_gaps+1)*2             # <<<<<<<<<<<<<<
@@ -47342,7 +49502,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = ((__pyx_v_num_gaps + 1) * 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1365
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1367
  * 
  *         step = (num_gaps+1)*2
  *         i = 0             # <<<<<<<<<<<<<<
@@ -47351,7 +49511,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_i = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1367
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1369
  *         i = 0
  * 
  *         while i < len1:             # <<<<<<<<<<<<<<
@@ -47362,7 +49522,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_i < __pyx_v_len1);
     if (!__pyx_t_2) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1368
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1370
  * 
  *         while i < len1:
  *             ephr_arr._clear()             # <<<<<<<<<<<<<<
@@ -47371,7 +49531,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_clear(__pyx_v_ephr_arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1369
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1371
  *         while i < len1:
  *             ephr_arr._clear()
  *             num_chunks = 0             # <<<<<<<<<<<<<<
@@ -47380,20 +49540,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_num_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1370
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1372
  *             ephr_arr._clear()
  *             num_chunks = 0
  *             indexes = []             # <<<<<<<<<<<<<<
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  */
-    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1370; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1372; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(((PyObject *)__pyx_v_indexes));
     __pyx_v_indexes = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1371
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1373
  *             num_chunks = 0
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:             # <<<<<<<<<<<<<<
@@ -47403,7 +49563,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_9 = (__pyx_v_num_gaps + 1);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_9; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1372
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1374
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -47413,7 +49573,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = ((__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]) < (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]));
       if (__pyx_t_2) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1373
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1375
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1             # <<<<<<<<<<<<<<
@@ -47425,7 +49585,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L42:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1374
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1376
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -47435,22 +49595,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_3 = (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]);
       for (__pyx_v_k = (__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1375
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1377
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  */
-        if (unlikely(((PyObject *)__pyx_v_indexes) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
-        __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1376
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1378
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])             # <<<<<<<<<<<<<<
@@ -47458,14 +49615,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  */
         __pyx_t_4 = (__pyx_v_self->eda->data->arr[(__pyx_v_e_sent_start + __pyx_v_k)]);
-        __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->eid2symid), __pyx_t_4, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->eid2symid), __pyx_t_4, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_append(__pyx_v_ephr_arr, __pyx_t_4);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1377
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1379
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:             # <<<<<<<<<<<<<<
@@ -47475,22 +49632,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = (__pyx_v_j < __pyx_v_num_gaps);
       if (__pyx_t_2) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1378
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1380
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  */
-        if (unlikely(((PyObject *)__pyx_v_indexes) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
-        __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1379
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1381
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
@@ -47503,7 +49657,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_L45:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1380
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1382
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step             # <<<<<<<<<<<<<<
@@ -47512,7 +49666,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_i = (__pyx_v_i + __pyx_v_step);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1381
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1383
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:             # <<<<<<<<<<<<<<
@@ -47528,30 +49682,30 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1382
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1384
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:
  *                 result.append((Phrase(ephr_arr),indexes))             # <<<<<<<<<<<<<<
  * 
  *         free(e_gaps1)
  */
-      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(((PyObject *)__pyx_v_ephr_arr));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_ephr_arr));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_ephr_arr));
-      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
       __Pyx_GIVEREF(__pyx_t_11);
       __Pyx_INCREF(((PyObject *)__pyx_v_indexes));
       PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_indexes));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_indexes));
       __pyx_t_11 = 0;
-      __pyx_t_11 = __Pyx_PyObject_Append(__pyx_v_result, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = __Pyx_PyObject_Append(__pyx_v_result, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
@@ -47560,7 +49714,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_L46:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1384
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1386
  *                 result.append((Phrase(ephr_arr),indexes))
  * 
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -47569,7 +49723,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1385
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1387
  * 
  *         free(e_gaps1)
  *         free(e_gap_order)             # <<<<<<<<<<<<<<
@@ -47578,7 +49732,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gap_order);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1386
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1388
  *         free(e_gaps1)
  *         free(e_gap_order)
  *         return result             # <<<<<<<<<<<<<<
@@ -47606,7 +49760,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1388
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1390
  *         return result
  * 
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):             # <<<<<<<<<<<<<<
@@ -47614,7 +49768,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         cdef IntList ret = IntList()
  */
 
-static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_sent_links, int __pyx_v_num_links, PyObject *__pyx_v_findexes, PyObject *__pyx_v_eindexes) {
+static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_sent_links, int __pyx_v_num_links, PyObject *__pyx_v_findexes, PyObject *__pyx_v_eindexes) {
   unsigned int __pyx_v_i;
   struct __pyx_obj_3_sa_IntList *__pyx_v_ret = 0;
   PyObject *__pyx_v_s = NULL;
@@ -47632,58 +49786,57 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("create_alignments");
+  __Pyx_RefNannySetupContext("create_alignments", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1390
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1392
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):
  *         cdef unsigned i
  *         cdef IntList ret = IntList()             # <<<<<<<<<<<<<<
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1391
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1393
  *         cdef unsigned i
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):             # <<<<<<<<<<<<<<
  *             s = findexes[i]
  *             if (s<0):
  */
-  __pyx_t_2 = PyObject_Length(__pyx_v_findexes); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_v_findexes); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
     __pyx_v_i = __pyx_t_3;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1392
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1394
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):
  *             s = findexes[i]             # <<<<<<<<<<<<<<
  *             if (s<0):
  *                 continue
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_findexes, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_findexes, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_s);
     __pyx_v_s = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1393
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1395
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  *             if (s<0):             # <<<<<<<<<<<<<<
  *                 continue
  *             idx = 0
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1394
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1396
  *             s = findexes[i]
  *             if (s<0):
  *                 continue             # <<<<<<<<<<<<<<
@@ -47695,7 +49848,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1395
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1397
  *             if (s<0):
  *                 continue
  *             idx = 0             # <<<<<<<<<<<<<<
@@ -47706,7 +49859,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __Pyx_XDECREF(__pyx_v_idx);
     __pyx_v_idx = __pyx_int_0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1396
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1398
  *                 continue
  *             idx = 0
  *             while (idx < num_links*2):             # <<<<<<<<<<<<<<
@@ -47714,53 +49867,51 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
  *                     j = eindexes.index(sent_links[idx+1])
  */
     while (1) {
-      __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (!__pyx_t_4) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1397
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1399
  *             idx = 0
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):             # <<<<<<<<<<<<<<
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  */
-      __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1398
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1400
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])             # <<<<<<<<<<<<<<
  *                     ret.append(i*65536+j)
  *                 idx += 2
  */
-        __pyx_t_1 = PyObject_GetAttr(__pyx_v_eindexes, __pyx_n_s__index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(__pyx_v_eindexes, __pyx_n_s__index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_5 = PyNumber_Add(__pyx_v_idx, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyNumber_Add(__pyx_v_idx, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_7));
+        __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         __pyx_t_5 = 0;
-        __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
@@ -47768,19 +49919,19 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
         __pyx_v_j = __pyx_t_5;
         __pyx_t_5 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1399
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1401
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)             # <<<<<<<<<<<<<<
  *                 idx += 2
  *         return ret
  */
-        __pyx_t_5 = PyInt_FromLong((__pyx_v_i * 65536)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyInt_FromLong((__pyx_v_i * 65536)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_v_j); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_v_j); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_t_5 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_ret), __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_ret), __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -47788,14 +49939,14 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       }
       __pyx_L8:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1400
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1402
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  *                 idx += 2             # <<<<<<<<<<<<<<
  *         return ret
  * 
  */
-      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_idx, __pyx_int_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_idx, __pyx_int_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_v_idx);
       __pyx_v_idx = __pyx_t_5;
@@ -47804,7 +49955,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __pyx_L3_continue:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1401
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1403
  *                     ret.append(i*65536+j)
  *                 idx += 2
  *         return ret             # <<<<<<<<<<<<<<
@@ -47834,7 +49985,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1403
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1405
  *         return ret
  * 
  *     cdef extract(self, Phrase phrase, Matching* matching, int* chunklen, int num_chunks):             # <<<<<<<<<<<<<<
@@ -47874,7 +50025,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_v_f_sent_end;
   int __pyx_v_e_sent_len;
   int __pyx_v_f_sent_len;
-  int __pyx_v_e_word_count;
+  CYTHON_UNUSED int __pyx_v_e_word_count;
   int __pyx_v_f_x_low;
   int __pyx_v_f_x_high;
   int __pyx_v_e_x_low;
@@ -47885,7 +50036,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   PyObject *__pyx_v_phrase_list = 0;
   struct __pyx_obj_3_sa_IntList *__pyx_v_fphr_arr = 0;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_fphr = 0;
-  PyObject *__pyx_v_reason_for_failure = 0;
+  CYTHON_UNUSED PyObject *__pyx_v_reason_for_failure = 0;
   PyObject *__pyx_v_sofar = NULL;
   PyObject *__pyx_v_als = NULL;
   PyObject *__pyx_v_al = NULL;
@@ -47926,21 +50077,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extract");
+  __Pyx_RefNannySetupContext("extract", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1416
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1418
  *         cdef reason_for_failure
  * 
  *         fphr_arr = IntList()             # <<<<<<<<<<<<<<
  *         phrase_len = phrase.n
  *         extracts = []
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_fphr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1417
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1419
  * 
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n             # <<<<<<<<<<<<<<
@@ -47949,19 +50100,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_phrase_len = __pyx_v_phrase->n;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1418
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1420
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n
  *         extracts = []             # <<<<<<<<<<<<<<
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_extracts = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1419
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1421
  *         phrase_len = phrase.n
  *         extracts = []
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -47970,7 +50121,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_sent_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->alignment->__pyx_vtab)->_get_sent_links(__pyx_v_self->alignment, __pyx_v_matching->sent_id, (&__pyx_v_num_links));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1421
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1423
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -47979,7 +50130,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_start = (__pyx_v_self->eda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1422
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1424
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -47988,7 +50139,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_end = (__pyx_v_self->eda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1423
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1425
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1             # <<<<<<<<<<<<<<
@@ -47997,7 +50148,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_len = ((__pyx_v_e_sent_end - __pyx_v_e_sent_start) - 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1424
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1426
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -48006,7 +50157,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_start = (__pyx_v_self->fda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1425
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1427
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -48015,7 +50166,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_end = (__pyx_v_self->fda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1426
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1428
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]
  *         f_sent_len = f_sent_end - f_sent_start - 1             # <<<<<<<<<<<<<<
@@ -48024,21 +50175,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_len = ((__pyx_v_f_sent_end - __pyx_v_f_sent_start) - 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1428
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1430
  *         f_sent_len = f_sent_end - f_sent_start - 1
  * 
  *         self.findexes1.reset()             # <<<<<<<<<<<<<<
  *         sofar = 0
  *         for i in range(num_chunks):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes1), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes1), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1429
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1431
  * 
  *         self.findexes1.reset()
  *         sofar = 0             # <<<<<<<<<<<<<<
@@ -48048,7 +50199,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_sofar = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1430
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1432
  *         self.findexes1.reset()
  *         sofar = 0
  *         for i in range(num_chunks):             # <<<<<<<<<<<<<<
@@ -48059,7 +50210,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1431
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1433
  *         sofar = 0
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):             # <<<<<<<<<<<<<<
@@ -48070,35 +50221,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_v_j = __pyx_t_6;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1432
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1434
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);             # <<<<<<<<<<<<<<
  *                 sofar += 1
  *             if (i+1<num_chunks):
  */
-      __pyx_t_2 = PyInt_FromLong((((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong((((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1433
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1435
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1             # <<<<<<<<<<<<<<
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  */
-      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_1;
       __pyx_t_1 = 0;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1434
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1436
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1
  *             if (i+1<num_chunks):             # <<<<<<<<<<<<<<
@@ -48108,28 +50259,28 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = ((__pyx_v_i + 1) < __pyx_v_num_chunks);
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1435
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1437
  *                 sofar += 1
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])             # <<<<<<<<<<<<<<
  *                 sofar += 1
  * 
  */
-      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_phrase), __pyx_v_sofar); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_phrase), __pyx_v_sofar); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1436
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1438
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  *                 sofar += 1             # <<<<<<<<<<<<<<
  * 
  * 
  */
-      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_2;
@@ -48139,7 +50290,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_L7:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1439
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1441
  * 
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48148,7 +50299,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_low = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1440
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1442
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48157,7 +50308,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_high = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1441
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1443
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48166,7 +50317,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_low = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1442
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1444
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48175,7 +50326,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_high = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1443
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1445
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48184,7 +50335,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1444
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1446
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48193,7 +50344,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1445
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1447
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48202,7 +50353,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1446
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1448
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48211,7 +50362,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1447
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1449
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48220,7 +50371,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1448
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1450
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48229,7 +50380,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1449
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1451
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48238,7 +50389,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1450
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1452
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48247,7 +50398,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1452
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1454
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))
  * 
  *         reason_for_failure = ""             # <<<<<<<<<<<<<<
@@ -48257,7 +50408,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_45);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1454
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1456
  *         reason_for_failure = ""
  * 
  *         for i from 0 <= i < e_sent_len:             # <<<<<<<<<<<<<<
@@ -48267,7 +50418,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_e_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1455
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1457
  * 
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -48276,7 +50427,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_e_links_low[__pyx_v_i]) = -1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1456
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1458
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -48286,7 +50437,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_e_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1457
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1459
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:             # <<<<<<<<<<<<<<
@@ -48296,7 +50447,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_f_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1458
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1460
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -48305,7 +50456,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_f_links_low[__pyx_v_i]) = -1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1459
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1461
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1
  *             f_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -48315,7 +50466,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_f_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1465
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1467
  *         # links that we care about (but then how to look up
  *         # when we want to check something on the e side?)
  *         i = 0             # <<<<<<<<<<<<<<
@@ -48324,7 +50475,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1466
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1468
  *         # when we want to check something on the e side?)
  *         i = 0
  *         while i < num_links*2:             # <<<<<<<<<<<<<<
@@ -48335,7 +50486,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = (__pyx_v_i < (__pyx_v_num_links * 2));
     if (!__pyx_t_7) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1467
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1469
  *         i = 0
  *         while i < num_links*2:
  *             f_i = sent_links[i]             # <<<<<<<<<<<<<<
@@ -48344,7 +50495,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_f_i = (__pyx_v_sent_links[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1468
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1470
  *         while i < num_links*2:
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]             # <<<<<<<<<<<<<<
@@ -48353,7 +50504,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_e_i = (__pyx_v_sent_links[(__pyx_v_i + 1)]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1469
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1471
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:             # <<<<<<<<<<<<<<
@@ -48369,7 +50520,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1470
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1472
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i             # <<<<<<<<<<<<<<
@@ -48381,7 +50532,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1471
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1473
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:             # <<<<<<<<<<<<<<
@@ -48397,7 +50548,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_8) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1472
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1474
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1             # <<<<<<<<<<<<<<
@@ -48409,7 +50560,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1473
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1475
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:             # <<<<<<<<<<<<<<
@@ -48425,7 +50576,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1474
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1476
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i             # <<<<<<<<<<<<<<
@@ -48437,7 +50588,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1475
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1477
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:             # <<<<<<<<<<<<<<
@@ -48453,7 +50604,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1476
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1478
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1             # <<<<<<<<<<<<<<
@@ -48465,7 +50616,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1477
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1479
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1
  *             i = i + 2             # <<<<<<<<<<<<<<
@@ -48475,19 +50626,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + 2);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1479
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1481
  *             i = i + 2
  * 
  *         als = []             # <<<<<<<<<<<<<<
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  */
-  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_als = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1480
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1482
  * 
  *         als = []
  *         for x in range(matching.start,matching.end):             # <<<<<<<<<<<<<<
@@ -48498,19 +50649,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = __pyx_v_matching->start; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_x = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1481
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1483
  *         als = []
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])             # <<<<<<<<<<<<<<
  *             als.append(al)
  *         # check all source-side alignment constraints
  */
-    __pyx_t_2 = PyInt_FromLong(((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_10);
     PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
@@ -48521,20 +50672,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_al = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1482
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1484
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  *             als.append(al)             # <<<<<<<<<<<<<<
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  */
-    if (unlikely(((PyObject *)__pyx_v_als) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1484
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1486
  *             als.append(al)
  *         # check all source-side alignment constraints
  *         met_constraints = 1             # <<<<<<<<<<<<<<
@@ -48543,7 +50691,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_met_constraints = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1485
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1487
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  *         if self.require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -48552,7 +50700,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_self->require_aligned_terminal) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1486
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1488
  *         met_constraints = 1
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -48561,7 +50709,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_num_aligned_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1487
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1489
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:             # <<<<<<<<<<<<<<
@@ -48571,7 +50719,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_3 = __pyx_v_num_chunks;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1488
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1490
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:             # <<<<<<<<<<<<<<
@@ -48581,7 +50729,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_chunklen[__pyx_v_i]);
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1489
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1491
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:             # <<<<<<<<<<<<<<
@@ -48591,7 +50739,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_9 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)]) > -1);
         if (__pyx_t_9) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1490
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1492
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1             # <<<<<<<<<<<<<<
@@ -48600,7 +50748,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_num_aligned_chunks = (__pyx_v_num_aligned_chunks + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1491
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1493
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break             # <<<<<<<<<<<<<<
@@ -48615,7 +50763,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_L24_break:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1492
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1494
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break
  *             if num_aligned_chunks == 0:             # <<<<<<<<<<<<<<
@@ -48625,7 +50773,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_9 = (__pyx_v_num_aligned_chunks == 0);
     if (__pyx_t_9) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1493
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1495
  *                         break
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"             # <<<<<<<<<<<<<<
@@ -48636,7 +50784,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_126);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1494
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1496
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48648,7 +50796,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L26:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1495
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1497
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:             # <<<<<<<<<<<<<<
@@ -48663,7 +50811,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1496
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1498
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"             # <<<<<<<<<<<<<<
@@ -48674,7 +50822,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_127);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1497
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1499
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48689,7 +50837,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L20:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1499
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1501
  *                 met_constraints = 0
  * 
  *         if met_constraints and self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -48703,7 +50851,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1501
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1503
  *         if met_constraints and self.tight_phrases:
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:             # <<<<<<<<<<<<<<
@@ -48713,7 +50861,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_12 = (__pyx_v_num_chunks - 1);
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1502
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1504
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -48723,7 +50871,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1503
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1505
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -48734,7 +50882,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1504
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1506
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48743,7 +50891,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1505
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1507
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -48755,7 +50903,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L31:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1506
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1508
  *                     met_constraints = 0
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -48765,7 +50913,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - 1) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1507
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1509
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -48776,7 +50924,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1508
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1510
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48785,7 +50933,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1509
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1511
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -48802,7 +50950,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L28:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1511
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1513
  *                     break
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start             # <<<<<<<<<<<<<<
@@ -48811,7 +50959,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_low = ((__pyx_v_matching->arr[__pyx_v_matching->start]) - __pyx_v_f_sent_start);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1512
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1514
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -48820,7 +50968,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_high = (((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_matching->size) - 1)]) + (__pyx_v_chunklen[(__pyx_v_num_chunks - 1)])) - __pyx_v_f_sent_start);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1513
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1515
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start
  *         if met_constraints:             # <<<<<<<<<<<<<<
@@ -48829,17 +50977,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_met_constraints) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1515
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1517
  *         if met_constraints:
  * 
  *             if self.find_fixpoint(f_low, f_high, f_links_low, f_links_high, e_links_low, e_links_high,             # <<<<<<<<<<<<<<
  *                                 -1, -1, &e_low, &e_high, &f_back_low, &f_back_high, f_sent_len, e_sent_len,
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  */
-    __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1519
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1521
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):             # <<<<<<<<<<<<<<
@@ -48850,7 +50998,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1520
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1522
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0             # <<<<<<<<<<<<<<
@@ -48859,7 +51007,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_gap_error = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1521
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1523
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0
  *                 num_gaps = 0             # <<<<<<<<<<<<<<
@@ -48868,7 +51016,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_num_gaps = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1523
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1525
  *                 num_gaps = 0
  * 
  *                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -48878,7 +51026,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1524
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1526
  * 
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low             # <<<<<<<<<<<<<<
@@ -48887,7 +51035,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[0]) = __pyx_v_f_back_low;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1525
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1527
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low             # <<<<<<<<<<<<<<
@@ -48896,7 +51044,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[0]) = __pyx_v_f_low;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1526
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1528
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1             # <<<<<<<<<<<<<<
@@ -48905,7 +51053,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1527
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1529
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1
  *                     gap_start = 0             # <<<<<<<<<<<<<<
@@ -48914,7 +51062,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1528
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1530
  *                     num_gaps = 1
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -48923,7 +51071,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1529
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1531
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -48933,7 +51081,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1530
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1532
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -48945,7 +51093,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L36:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1531
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1533
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -48954,7 +51102,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1532
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1534
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -48970,7 +51118,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1533
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1535
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -48979,7 +51127,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1534
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1536
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -48999,7 +51147,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1536
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1538
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"
  *                 else:
  *                     gap_start = 1             # <<<<<<<<<<<<<<
@@ -49008,7 +51156,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1537
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1539
  *                 else:
  *                     gap_start = 1
  *                     if self.tight_phrases and f_links_low[f_low] == -1:             # <<<<<<<<<<<<<<
@@ -49023,7 +51171,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1540
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1542
  *                         # this is not a hard error.    we can't extract this phrase
  *                         # but we still might be able to extract a superphrase
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -49037,7 +51185,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L35:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1542
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1544
  *                         met_constraints = 0
  * 
  *                 for i from 0 <= i < matching.size - 1:             # <<<<<<<<<<<<<<
@@ -49047,7 +51195,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_12 = (__pyx_v_matching->size - 1);
       for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1543
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1545
  * 
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start             # <<<<<<<<<<<<<<
@@ -49056,7 +51204,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(1 + __pyx_v_i)]) = (((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1544
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1546
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -49065,7 +51213,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(1 + __pyx_v_i)]) = ((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - __pyx_v_f_sent_start);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1545
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1547
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -49075,7 +51223,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1547
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1549
  *                     num_gaps = num_gaps + 1
  * 
  *                 if f_high < f_back_high:             # <<<<<<<<<<<<<<
@@ -49085,7 +51233,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_high < __pyx_v_f_back_high);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1548
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1550
  * 
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high             # <<<<<<<<<<<<<<
@@ -49094,7 +51242,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_high;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1549
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1551
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high             # <<<<<<<<<<<<<<
@@ -49103,7 +51251,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_back_high;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1550
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1552
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -49112,7 +51260,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1551
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1553
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -49121,7 +51269,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1552
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1554
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -49131,7 +51279,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1553
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1555
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -49143,7 +51291,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L43:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1554
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1556
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -49152,7 +51300,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1555
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1557
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:             # <<<<<<<<<<<<<<
@@ -49168,7 +51316,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1556
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1558
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -49177,7 +51325,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1557
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1559
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -49197,7 +51345,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1559
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1561
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -49212,7 +51360,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1560
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1562
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -49226,7 +51374,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L42:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1562
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1564
  *                         met_constraints = 0
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -49236,7 +51384,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1563
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1565
  * 
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low             # <<<<<<<<<<<<<<
@@ -49245,7 +51393,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_e_word_count = (__pyx_v_e_high - __pyx_v_e_low);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1564
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1566
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases             # <<<<<<<<<<<<<<
@@ -49255,17 +51403,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_num_gaps;
         for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1565
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1567
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases
  *                         if self.find_fixpoint(f_gap_low[gap_start+i], f_gap_high[gap_start+i],             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low+gap_start+i, e_gap_high+gap_start+i,
  */
-          __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1570
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1572
  *                                             f_gap_low+gap_start+i, f_gap_high+gap_start+i,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -49276,7 +51424,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1572
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1574
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -49285,33 +51433,33 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1573
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1575
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])             # <<<<<<<<<<<<<<
  *                             break
  * 
  */
-            __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_10 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_131), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_131), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
             __pyx_v_reason_for_failure = ((PyObject *)__pyx_t_1);
             __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1574
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1576
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])
  *                             break             # <<<<<<<<<<<<<<
@@ -49328,7 +51476,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L47:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1576
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1578
  *                             break
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -49338,7 +51486,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1577
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1579
  * 
  *                 if gap_error == 0:
  *                     i = 1             # <<<<<<<<<<<<<<
@@ -49347,21 +51495,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_i = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1578
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1580
  *                 if gap_error == 0:
  *                     i = 1
  *                     self.findexes.reset()             # <<<<<<<<<<<<<<
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  */
-        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1579
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1581
  *                     i = 1
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -49371,7 +51519,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1580
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1582
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49380,7 +51528,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1581
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1583
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1             # <<<<<<<<<<<<<<
@@ -49389,16 +51537,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_i = (__pyx_v_i + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1582
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1584
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1582; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1582; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -49406,27 +51554,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L52:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1583
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1585
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  */
-        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->findexes1));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-        __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1584
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1586
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -49436,7 +51584,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_phrase->n;
         for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1585
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1587
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -49446,7 +51594,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
           if (__pyx_t_4) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1586
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1588
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49455,7 +51603,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1587
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1589
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))
  *                             i = i + 1             # <<<<<<<<<<<<<<
@@ -49467,7 +51615,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1589
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1591
  *                             i = i + 1
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -49479,7 +51627,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_L55:;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1590
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1592
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -49489,7 +51637,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_high > __pyx_v_f_high);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1591
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1593
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49498,16 +51646,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1592
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1594
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  * 
  *                     fphr = Phrase(fphr_arr)
  */
-          __pyx_t_10 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -49515,25 +51663,25 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L56:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1594
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1596
  *                         self.findexes.append(sym_setindex(self.category, i))
  * 
  *                     fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                     if met_constraints:
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  */
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1596; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_fphr_arr));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-        __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1596; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_10);
         __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1595
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1597
  * 
  *                     fphr = Phrase(fphr_arr)
  *                     if met_constraints:             # <<<<<<<<<<<<<<
@@ -49542,47 +51690,47 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_met_constraints) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1598
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1600
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)
  */
-          __pyx_t_10 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_low, __pyx_v_e_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, __pyx_v_num_gaps, __pyx_v_f_back_low, __pyx_v_f_back_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1596; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_low, __pyx_v_e_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, __pyx_v_num_gaps, __pyx_v_f_back_low, __pyx_v_f_back_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_v_phrase_list = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1599
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1601
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  */
-          __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_7 = (__pyx_t_13 > 0);
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1600
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1602
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                         else:
  *                             pair_count = 0
  */
-            __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (unlikely(__pyx_t_13 == 0)) {
               PyErr_Format(PyExc_ZeroDivisionError, "float division");
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             __pyx_v_pair_count = (1.0 / __pyx_t_13);
             goto __pyx_L58;
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1602
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1604
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  *                             pair_count = 0             # <<<<<<<<<<<<<<
@@ -49591,23 +51739,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_pair_count = 0.0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1603
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1605
  *                         else:
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  */
-            __pyx_t_10 = PyInt_FromLong(__pyx_v_f_back_low); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_v_f_back_low); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyInt_FromLong(__pyx_v_e_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromLong(__pyx_v_e_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
@@ -49620,7 +51768,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
             __pyx_t_14 = 0;
-            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_14));
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
@@ -49629,7 +51777,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L58:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1604
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1606
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:             # <<<<<<<<<<<<<<
@@ -49640,23 +51788,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_14 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_14); __pyx_t_13 = 0;
             __pyx_t_16 = NULL;
           } else {
-            __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
             __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_14)) {
+            if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
-            } else if (PyTuple_CheckExact(__pyx_t_14)) {
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
+            } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
             } else {
               __pyx_t_15 = __pyx_t_16(__pyx_t_14);
               if (unlikely(!__pyx_t_15)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -49664,29 +51820,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
               PyObject* sequence = __pyx_t_15;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 2)) {
+                if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                  if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
                 __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                  if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
                 __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
               }
               __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_2);
+              #else
+              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-            } else {
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -49694,14 +51856,15 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_GOTREF(__pyx_t_1);
               index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L61_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_2);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               goto __pyx_L62_unpacking_done;
               __pyx_L61_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_17 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L62_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_phrase2);
@@ -49711,7 +51874,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_eindexes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1605
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1607
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -49720,32 +51883,32 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_t_15 = ((PyObject *)__pyx_v_self->findexes);
             __Pyx_INCREF(__pyx_t_15);
-            __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             __Pyx_XDECREF(((PyObject *)__pyx_v_als1));
             __pyx_v_als1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
             __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1606
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1608
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))             # <<<<<<<<<<<<<<
  * 
  *                     if (num_gaps < self.max_nonterminals and
  */
-            __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_als1));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als1));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_als1));
-            __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -49758,7 +51921,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -49768,7 +51931,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L57:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1608
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1610
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))
  * 
  *                     if (num_gaps < self.max_nonterminals and             # <<<<<<<<<<<<<<
@@ -49778,7 +51941,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_num_gaps < __pyx_v_self->max_nonterminals);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1609
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1611
  * 
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and             # <<<<<<<<<<<<<<
@@ -49788,7 +51951,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_phrase_len < __pyx_v_self->max_length);
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1610
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1612
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):             # <<<<<<<<<<<<<<
@@ -49806,7 +51969,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_9) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1611
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1613
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -49816,7 +51979,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_low == __pyx_v_f_low);
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1612
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1614
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -49826,7 +51989,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1613
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1615
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):             # <<<<<<<<<<<<<<
@@ -49856,7 +52019,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1614
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1616
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -49865,7 +52028,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1615
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1617
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -49874,7 +52037,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1616
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1618
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -49883,7 +52046,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1617
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1619
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -49900,7 +52063,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1618
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1620
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -49913,7 +52076,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L65:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1619
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1621
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -49929,7 +52092,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1620
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1622
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -49941,7 +52104,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L68:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1622
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1624
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -49950,17 +52113,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1623
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1625
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_back_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1625; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1627
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1629
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -49970,7 +52133,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_14, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 1, 0, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1629
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1631
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and             # <<<<<<<<<<<<<<
@@ -49986,17 +52149,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1630
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1632
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and
  *                                 self.find_fixpoint(f_x_low, f_low,    # check integrity of new subphrase             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  */
-                  __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1632; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_1);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1634
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1636
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -50019,7 +52182,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1636
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1638
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -50028,7 +52191,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1637
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1639
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -50037,35 +52200,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1638
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1640
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_1 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1639
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1641
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1640
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1642
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50074,7 +52237,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1641
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1643
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -50083,27 +52246,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1642
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1644
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1643
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1645
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -50113,7 +52276,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1644
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1646
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -50123,7 +52286,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1645
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1647
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50132,7 +52295,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1646
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1648
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -50144,7 +52307,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1648
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1650
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -50156,7 +52319,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L72:;
               }
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1649
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1651
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -50166,7 +52329,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_high > __pyx_v_f_high);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1650
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1652
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50175,16 +52338,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1651
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1653
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  */
-                __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1651; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1651; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -50192,67 +52355,67 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L73:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1652
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1654
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  */
-              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_15);
               __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1655
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1657
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_15 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_15;
               __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1656
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1658
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1658; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1657
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1659
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1657; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1657; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L74;
               }
               /*else*/ {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1659
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1661
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -50263,7 +52426,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L74:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1660
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1662
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -50274,23 +52437,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_15 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_15); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __pyx_t_16 = Py_TYPE(__pyx_t_15)->tp_iternext;
               }
               for (;;) {
-                if (PyList_CheckExact(__pyx_t_15)) {
+                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_15)) break;
-                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
-                } else if (PyTuple_CheckExact(__pyx_t_15)) {
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
-                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                 } else {
                   __pyx_t_1 = __pyx_t_16(__pyx_t_15);
                   if (unlikely(!__pyx_t_1)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -50298,29 +52469,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
                   PyObject* sequence = __pyx_t_1;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_14 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_14 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_14);
                   __Pyx_INCREF(__pyx_t_2);
+                  #else
+                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-                } else {
+                } else
+                {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -50328,14 +52505,15 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_14);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L77_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L78_unpacking_done;
                   __pyx_L77_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L78_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -50345,7 +52523,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1661
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1663
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -50354,32 +52532,32 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_1 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_1);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_1, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_1, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als2));
                 __pyx_v_als2 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1662
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1664
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))             # <<<<<<<<<<<<<<
  * 
  *                         if (f_back_high == f_high and
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+                __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als2));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_als2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als2));
-                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-                __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+                __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -50392,7 +52570,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_t_2 = 0;
                 __pyx_t_14 = 0;
-                __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
@@ -50405,7 +52583,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L64:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1664
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1666
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))
  * 
  *                         if (f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -50415,7 +52593,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_high == __pyx_v_f_high);
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1665
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1667
  * 
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -50425,7 +52603,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_f_sent_len - __pyx_v_f_high) >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1666
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1668
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):             # <<<<<<<<<<<<<<
@@ -50455,7 +52633,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1667
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1669
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -50464,7 +52642,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1668
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1670
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -50473,7 +52651,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1669
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1671
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -50482,7 +52660,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1670
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1672
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -50499,7 +52677,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1671
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1673
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -50512,7 +52690,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L80:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1672
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1674
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -50528,7 +52706,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1673
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1675
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -50540,7 +52718,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L83:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1675
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1677
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -50549,17 +52727,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1676
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1678
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_back_low, f_x_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1678; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1680
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1682
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -50569,7 +52747,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_back_low, __pyx_t_15, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 0, 1, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1682
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1684
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and             # <<<<<<<<<<<<<<
@@ -50585,17 +52763,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1683
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1685
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low+gap_start+num_gaps, e_gap_high+gap_start+num_gaps,
  */
-                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1683; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1685; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_14);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1688
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1690
  *                                             f_gap_low+gap_start+num_gaps, f_gap_high+gap_start+num_gaps,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -50618,7 +52796,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1690
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1692
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -50627,7 +52805,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1691
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1693
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -50636,21 +52814,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1692
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1694
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1692; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1694; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1692; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1694; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1693
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1695
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -50660,7 +52838,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_low < __pyx_v_f_low);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1694
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1696
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50669,7 +52847,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1695
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1697
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1             # <<<<<<<<<<<<<<
@@ -50678,16 +52856,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_v_i = (__pyx_v_i + 1);
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1696
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1698
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  */
-                __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1696; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1698; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1696; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1698; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -50695,27 +52873,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L85:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1697
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1699
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1698
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1700
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -50725,7 +52903,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1699
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1701
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -50735,7 +52913,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1700
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1702
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50744,7 +52922,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1701
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1703
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -50756,7 +52934,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1703
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1705
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -50768,7 +52946,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L88:;
               }
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1704
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1706
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50777,81 +52955,81 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1705
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1707
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1705; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1705; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1706
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1708
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  */
-              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1706; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1706; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
               __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1709
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1711
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_1;
               __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1710
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1712
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1711
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1713
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L89;
               }
               /*else*/ {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1713
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1715
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -50862,7 +53040,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L89:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1714
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1716
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -50873,23 +53051,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_1 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_1); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __pyx_t_16 = Py_TYPE(__pyx_t_1)->tp_iternext;
               }
               for (;;) {
-                if (PyList_CheckExact(__pyx_t_1)) {
+                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_1)) break;
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
-                } else if (PyTuple_CheckExact(__pyx_t_1)) {
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                 } else {
                   __pyx_t_14 = __pyx_t_16(__pyx_t_1);
                   if (unlikely(!__pyx_t_14)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -50897,29 +53083,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_14))) || (PyList_CheckExact(__pyx_t_14))) {
                   PyObject* sequence = __pyx_t_14;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_15);
                   __Pyx_INCREF(__pyx_t_2);
+                  #else
+                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                } else {
+                } else
+                {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -50927,14 +53119,15 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_15);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L92_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L93_unpacking_done;
                   __pyx_L92_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L93_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -50944,7 +53137,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1715
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1717
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -50953,32 +53146,32 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_14 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_14);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_14, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_14, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als3));
                 __pyx_v_als3 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1716
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1718
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))             # <<<<<<<<<<<<<<
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als3));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_als3));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als3));
-                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+                __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -50991,7 +53184,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_15);
                 __pyx_t_2 = 0;
                 __pyx_t_15 = 0;
-                __pyx_t_15 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -51004,7 +53197,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L79:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1717
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1719
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and             # <<<<<<<<<<<<<<
@@ -51014,7 +53207,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_num_gaps < (__pyx_v_self->max_nonterminals - 1));
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1718
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1720
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and             # <<<<<<<<<<<<<<
@@ -51024,7 +53217,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_phrase_len + 1) < __pyx_v_self->max_length);
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1719
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1721
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -51034,7 +53227,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_18 = (__pyx_v_f_back_high == __pyx_v_f_high);
               if (__pyx_t_18) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1720
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1722
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -51044,7 +53237,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_8 = (__pyx_v_f_back_low == __pyx_v_f_low);
                 if (__pyx_t_8) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1721
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1723
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
@@ -51054,7 +53247,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_19 = (((__pyx_v_f_back_high - __pyx_v_f_back_low) + (2 * __pyx_v_self->train_min_gap_size)) <= __pyx_v_self->train_max_initial_size);
                   if (__pyx_t_19) {
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1722
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1724
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -51064,7 +53257,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                     __pyx_t_20 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
                     if (__pyx_t_20) {
 
-                      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1723
+                      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1725
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -51074,7 +53267,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                       __pyx_t_21 = (__pyx_v_f_high <= (__pyx_v_f_sent_len - __pyx_v_self->train_min_gap_size));
                       if (__pyx_t_21) {
 
-                        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1724
+                        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1726
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):             # <<<<<<<<<<<<<<
@@ -51124,7 +53317,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1726
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1728
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):
  * 
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -51133,7 +53326,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1727
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1729
  * 
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -51142,7 +53335,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1728
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1730
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -51151,7 +53344,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1729
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1731
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -51168,7 +53361,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1730
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1732
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -51181,7 +53374,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L95:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1731
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1733
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:             # <<<<<<<<<<<<<<
@@ -51191,7 +53384,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_18 = (__pyx_v_f_x_low < 0);
             if (__pyx_t_18) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1732
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1734
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -51203,7 +53396,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L98:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1734
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1736
  *                                 met_constraints = 0
  * 
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -51212,7 +53405,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1735
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1737
  * 
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -51221,7 +53414,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1736
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1738
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -51238,7 +53431,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_9) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1737
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1739
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -51251,7 +53444,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L99:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1738
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1740
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -51267,7 +53460,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1739
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1741
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -51279,7 +53472,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L102:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1741
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1743
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -51288,17 +53481,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1742
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1744
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_x_high,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1746
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1748
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -51308,7 +53501,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 2, 1, 1, 1, 1)) {
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1748
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1750
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and             # <<<<<<<<<<<<<<
@@ -51330,17 +53523,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_9) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1749
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1751
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and
  *                                 self.find_fixpoint(f_x_low, f_low,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  */
-                  __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1749; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_15);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1753
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1755
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -51351,17 +53544,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   if (__pyx_t_3) {
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1755
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1757
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 -1, -1, e_gap_low+1+num_gaps, e_gap_high+1+num_gaps,
  */
-                    __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1755; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1757; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     __Pyx_GOTREF(__pyx_t_15);
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1760
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1762
  *                                                 f_gap_low+1+num_gaps, f_gap_high+1+num_gaps,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -51389,7 +53582,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_8) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1762
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1764
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -51398,7 +53591,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1763
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1765
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -51407,35 +53600,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1764
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1766
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1764; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1764; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1765
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1767
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  */
-              __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1766
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1768
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51444,7 +53637,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1767
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1769
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -51453,27 +53646,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1768
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1770
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_14 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1769
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1771
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -51483,7 +53676,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1770
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1772
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -51493,7 +53686,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1771
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1773
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51502,7 +53695,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1772
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1774
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -51514,7 +53707,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1774
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1776
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -51526,7 +53719,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L106:;
               }
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1775
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1777
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51535,81 +53728,81 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1776
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1778
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  */
-              __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1776; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1776; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1777
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1779
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  */
-              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_14);
               __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1780
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1782
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_14 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 2), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 2), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1781
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1783
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_8 = (__pyx_t_13 > 0);
               if (__pyx_t_8) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1782
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1784
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L107;
               }
               /*else*/ {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1784
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1786
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -51620,7 +53813,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L107:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1785
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1787
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -51631,23 +53824,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_14 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_14); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
               }
               for (;;) {
-                if (PyList_CheckExact(__pyx_t_14)) {
+                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
-                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
-                } else if (PyTuple_CheckExact(__pyx_t_14)) {
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                 } else {
                   __pyx_t_15 = __pyx_t_16(__pyx_t_14);
                   if (unlikely(!__pyx_t_15)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -51655,29 +53856,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
                   PyObject* sequence = __pyx_t_15;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_1);
                   __Pyx_INCREF(__pyx_t_2);
+                  #else
+                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                } else {
+                } else
+                {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -51685,14 +53892,15 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_1);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L110_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L111_unpacking_done;
                   __pyx_L110_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L111_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -51702,7 +53910,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1786
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1788
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -51711,32 +53919,32 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_15 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_15);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als4));
                 __pyx_v_als4 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1787
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1789
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))             # <<<<<<<<<<<<<<
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als4));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als4));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als4));
-                __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+                __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -51749,7 +53957,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_1);
                 __pyx_t_2 = 0;
                 __pyx_t_1 = 0;
-                __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -51771,7 +53979,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1789
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1791
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"             # <<<<<<<<<<<<<<
@@ -51787,7 +53995,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L33:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1791
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1793
  *                 reason_for_failure = "Unable to extract basic phrase"
  * 
  *         free(sent_links)             # <<<<<<<<<<<<<<
@@ -51796,7 +54004,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_sent_links);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1792
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1794
  * 
  *         free(sent_links)
  *         free(f_links_low)             # <<<<<<<<<<<<<<
@@ -51805,7 +54013,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1793
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1795
  *         free(sent_links)
  *         free(f_links_low)
  *         free(f_links_high)             # <<<<<<<<<<<<<<
@@ -51814,7 +54022,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1794
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1796
  *         free(f_links_low)
  *         free(f_links_high)
  *         free(e_links_low)             # <<<<<<<<<<<<<<
@@ -51823,7 +54031,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1795
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1797
  *         free(f_links_high)
  *         free(e_links_low)
  *         free(e_links_high)             # <<<<<<<<<<<<<<
@@ -51832,7 +54040,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1796
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1798
  *         free(e_links_low)
  *         free(e_links_high)
  *         free(f_gap_low)             # <<<<<<<<<<<<<<
@@ -51841,7 +54049,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1797
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1799
  *         free(e_links_high)
  *         free(f_gap_low)
  *         free(f_gap_high)             # <<<<<<<<<<<<<<
@@ -51850,7 +54058,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1798
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1800
  *         free(f_gap_low)
  *         free(f_gap_high)
  *         free(e_gap_low)             # <<<<<<<<<<<<<<
@@ -51859,7 +54067,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1799
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1801
  *         free(f_gap_high)
  *         free(e_gap_low)
  *         free(e_gap_high)             # <<<<<<<<<<<<<<
@@ -51868,7 +54076,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1801
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1803
  *         free(e_gap_high)
  * 
  *         return extracts             # <<<<<<<<<<<<<<
@@ -51908,6 +54116,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   return __pyx_r;
 }
 
+/* Python wrapper */
+static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector___cinit__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":7
  * 
  * cdef class FeatureVector:
@@ -51916,8 +54138,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
  */
 
-static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -51926,10 +54147,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":8
  * cdef class FeatureVector:
@@ -51943,7 +54161,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__INCREMENT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -51954,9 +54172,9 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names));
-  ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->names);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->names));
+  __pyx_v_self->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":9
@@ -51971,7 +54189,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__INCREMENT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3);
@@ -51982,9 +54200,9 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values));
-  ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->values);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->values));
+  __pyx_v_self->values = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
   __pyx_r = 0;
@@ -52000,52 +54218,39 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":11
- *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
- * 
- *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
- *         self.names.append(name)
- *         self.values.append(value)
- */
-
-static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   unsigned int __pyx_v_name;
   float __pyx_v_value;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
-  __Pyx_RefNannySetupContext("set");
+  __Pyx_RefNannySetupContext("set (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__name);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__name)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("set", 1, 2, 2, 1); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "set") < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set") < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -52054,7 +54259,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
     __pyx_v_name = __Pyx_PyInt_AsUnsignedInt(values[0]); if (unlikely((__pyx_v_name == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_value = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_value == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_value = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_value == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -52064,6 +54269,28 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector_2set(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self), __pyx_v_name, __pyx_v_value);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":11
+ *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
+ * 
+ *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
+ *         self.names.append(name)
+ *         self.values.append(value)
+ */
+
+static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("set", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":12
  * 
@@ -52074,7 +54301,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
  */
   __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->names), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -52088,7 +54315,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
  */
   __pyx_t_2 = PyFloat_FromDouble(__pyx_v_value); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->values), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -52105,7 +54332,18 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector_4__iter__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
@@ -52115,36 +54353,45 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
  *         for i in range(self.names.len):
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_2__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_13FeatureVector_2__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__iter__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_9___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_9___iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_3generator5;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_6generator5, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.FeatureVector.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   unsigned int __pyx_t_2;
@@ -52153,8 +54400,8 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -52171,7 +54418,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->names->len;
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->names->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
@@ -52182,16 +54429,16 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
  * 
  *     def __str__(self):
  */
-    __pyx_t_3 = __Pyx_GetItemInt(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->names), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_self->names), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = PyBytes_FromString(((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_3_sa_FD->__pyx_vtab)->word(__pyx_v_3_sa_FD, __pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->values), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_self->values), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -52205,14 +54452,14 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
@@ -52221,11 +54468,23 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
-static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector_7__str__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
  * 
@@ -52235,45 +54494,53 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
  * cdef class Scorer:
  */
 
-static PyObject *__pyx_pf_3_sa_7__str___2genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7__str___2genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str___genexpr(PyObject *__pyx_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("genexpr");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)__pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *) __pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  __pyx_self = __pyx_self;
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7__str___3generator8;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_7__str___2generator8, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.FeatureVector.__str__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
   PyObject *(*__pyx_t_3)(PyObject *);
   PyObject *__pyx_t_4 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -52282,21 +54549,30 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) {
-    __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (PyList_CheckExact(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) || PyTuple_CheckExact(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self))) {
+    __pyx_t_1 = ((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -52324,7 +54600,7 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -52335,7 +54611,7 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -52343,7 +54619,8 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -52356,8 +54633,7 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -52367,15 +54643,15 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_10___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_10___str__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
@@ -52388,10 +54664,10 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_pf_3_sa_7__str___2genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __pyx_pf_3_sa_13FeatureVector_7__str___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -52418,6 +54694,22 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
+/* Python wrapper */
+static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_models = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
+  __Pyx_INCREF(__pyx_args);
+  __pyx_v_models = __pyx_args;
+  __pyx_r = __pyx_pf_3_sa_6Scorer___init__(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self), __pyx_v_models);
+  __Pyx_XDECREF(__pyx_v_models);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":25
  * cdef class Scorer:
  *     cdef models
@@ -52426,9 +54718,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
  *         self.models = zip(names, models)
  */
 
-static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_models = 0;
+static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_self, PyObject *__pyx_v_models) {
   PyObject *__pyx_v_names = NULL;
   PyObject *__pyx_v_model = NULL;
   int __pyx_r;
@@ -52441,10 +54731,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__init__");
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
-  __Pyx_INCREF(__pyx_args);
-  __pyx_v_models = __pyx_args;
+  __Pyx_RefNannySetupContext("__init__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":26
  *     cdef models
@@ -52454,14 +54741,15 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (unlikely(((PyObject *)__pyx_v_models) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = ((PyObject *)__pyx_v_models); __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
   for (;;) {
     if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-    __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
+    #if CYTHON_COMPILING_IN_CPYTHON
+    __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #else
+    __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #endif
     __Pyx_XDECREF(__pyx_v_model);
     __pyx_v_model = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -52471,7 +54759,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __pyx_t_4 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_3_sa_FD->__pyx_vtab)->index(__pyx_v_3_sa_FD, ((char *)__pyx_t_5))); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -52487,7 +54775,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
  *     cdef FeatureVector score(self, ctx):
  */
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_names));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_names));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_names));
@@ -52498,9 +54786,9 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models);
-  ((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models = __pyx_t_2;
+  __Pyx_GOTREF(__pyx_v_self->models);
+  __Pyx_DECREF(__pyx_v_self->models);
+  __pyx_v_self->models = __pyx_t_2;
   __pyx_t_2 = 0;
 
   __pyx_r = 0;
@@ -52512,7 +54800,6 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   __Pyx_AddTraceback("_sa.Scorer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_models);
   __Pyx_XDECREF(__pyx_v_names);
   __Pyx_XDECREF(__pyx_v_model);
   __Pyx_RefNannyFinishContext();
@@ -52544,7 +54831,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("score");
+  __Pyx_RefNannySetupContext("score", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":30
  * 
@@ -52574,12 +54861,20 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -52593,27 +54888,33 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
       PyObject* sequence = __pyx_t_4;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 2)) {
+        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
+      #else
+      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
       __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
@@ -52624,12 +54925,13 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
       index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L6_unpacking_done;
       __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      __pyx_t_8 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L6_unpacking_done:;
     }
@@ -52649,7 +54951,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_scores), __pyx_n_s__set); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_INCREF(__pyx_v_ctx);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_ctx);
     __Pyx_GIVEREF(__pyx_v_ctx);
@@ -52657,7 +54959,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_INCREF(__pyx_v_name);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_name);
     __Pyx_GIVEREF(__pyx_v_name);
@@ -52708,7 +55010,7 @@ static PyObject *__pyx_tp_new_3_sa_FloatList(PyTypeObject *t, PyObject *a, PyObj
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_FloatList *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_FloatList;
-  if (__pyx_pf_3_sa_9FloatList___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_9FloatList_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -52719,7 +55021,7 @@ static void __pyx_tp_dealloc_3_sa_FloatList(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_9FloatList_1__dealloc__(o);
+    __pyx_pw_3_sa_9FloatList_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -52736,7 +55038,7 @@ static PyObject *__pyx_sq_item_3_sa_FloatList(PyObject *o, Py_ssize_t i) {
 
 static int __pyx_mp_ass_subscript_3_sa_FloatList(PyObject *o, PyObject *i, PyObject *v) {
   if (v) {
-    return __pyx_pf_3_sa_9FloatList_3__setitem__(o, i, v);
+    return __pyx_pw_3_sa_9FloatList_7__setitem__(o, i, v);
   }
   else {
     PyErr_Format(PyExc_NotImplementedError,
@@ -52746,9 +55048,9 @@ static int __pyx_mp_ass_subscript_3_sa_FloatList(PyObject *o, PyObject *i, PyObj
 }
 
 static PyMethodDef __pyx_methods_3_sa_FloatList[] = {
-  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pf_3_sa_9FloatList_5append, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pf_3_sa_9FloatList_6write, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pf_3_sa_9FloatList_7read, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pw_3_sa_9FloatList_11append, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pw_3_sa_9FloatList_13write, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pw_3_sa_9FloatList_15read, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -52811,7 +55113,7 @@ static PyNumberMethods __pyx_tp_as_number_FloatList = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
-  __pyx_pf_3_sa_9FloatList_4__len__, /*sq_length*/
+  __pyx_pw_3_sa_9FloatList_9__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_FloatList, /*sq_item*/
@@ -52824,8 +55126,8 @@ static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_FloatList = {
-  __pyx_pf_3_sa_9FloatList_4__len__, /*mp_length*/
-  __pyx_pf_3_sa_9FloatList_2__getitem__, /*mp_subscript*/
+  __pyx_pw_3_sa_9FloatList_9__len__, /*mp_length*/
+  __pyx_pw_3_sa_9FloatList_5__getitem__, /*mp_subscript*/
   __pyx_mp_ass_subscript_3_sa_FloatList, /*mp_ass_subscript*/
 };
 
@@ -52913,7 +55215,7 @@ static PyObject *__pyx_tp_new_3_sa_IntList(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_IntList *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_IntList;
-  if (__pyx_pf_3_sa_7IntList___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_7IntList_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -52924,7 +55226,7 @@ static void __pyx_tp_dealloc_3_sa_IntList(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_7IntList_7__dealloc__(o);
+    __pyx_pw_3_sa_7IntList_15__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -52941,7 +55243,7 @@ static PyObject *__pyx_sq_item_3_sa_IntList(PyObject *o, Py_ssize_t i) {
 
 static int __pyx_mp_ass_subscript_3_sa_IntList(PyObject *o, PyObject *i, PyObject *v) {
   if (v) {
-    return __pyx_pf_3_sa_7IntList_11__setitem__(o, i, v);
+    return __pyx_pw_3_sa_7IntList_22__setitem__(o, i, v);
   }
   else {
     PyErr_Format(PyExc_NotImplementedError,
@@ -52951,16 +55253,16 @@ static int __pyx_mp_ass_subscript_3_sa_IntList(PyObject *o, PyObject *i, PyObjec
 }
 
 static PyMethodDef __pyx_methods_3_sa_IntList[] = {
-  {__Pyx_NAMESTR("index"), (PyCFunction)__pyx_pf_3_sa_7IntList_2index, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("partition"), (PyCFunction)__pyx_pf_3_sa_7IntList_3partition, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("_doquicksort"), (PyCFunction)__pyx_pf_3_sa_7IntList_4_doquicksort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("sort"), (PyCFunction)__pyx_pf_3_sa_7IntList_5sort, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pf_3_sa_7IntList_6reset, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSize"), (PyCFunction)__pyx_pf_3_sa_7IntList_13getSize, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pf_3_sa_7IntList_14append, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("extend"), (PyCFunction)__pyx_pf_3_sa_7IntList_15extend, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pf_3_sa_7IntList_16write, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pf_3_sa_7IntList_17read, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("index"), (PyCFunction)__pyx_pw_3_sa_7IntList_5index, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("partition"), (PyCFunction)__pyx_pw_3_sa_7IntList_7partition, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("_doquicksort"), (PyCFunction)__pyx_pw_3_sa_7IntList_9_doquicksort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("sort"), (PyCFunction)__pyx_pw_3_sa_7IntList_11sort, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pw_3_sa_7IntList_13reset, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSize"), (PyCFunction)__pyx_pw_3_sa_7IntList_26getSize, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pw_3_sa_7IntList_28append, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("extend"), (PyCFunction)__pyx_pw_3_sa_7IntList_30extend, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pw_3_sa_7IntList_32write, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pw_3_sa_7IntList_34read, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -53023,7 +55325,7 @@ static PyNumberMethods __pyx_tp_as_number_IntList = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_IntList = {
-  __pyx_pf_3_sa_7IntList_12__len__, /*sq_length*/
+  __pyx_pw_3_sa_7IntList_24__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_IntList, /*sq_item*/
@@ -53036,8 +55338,8 @@ static PySequenceMethods __pyx_tp_as_sequence_IntList = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_IntList = {
-  __pyx_pf_3_sa_7IntList_12__len__, /*mp_length*/
-  __pyx_pf_3_sa_7IntList_10__getitem__, /*mp_subscript*/
+  __pyx_pw_3_sa_7IntList_24__len__, /*mp_length*/
+  __pyx_pw_3_sa_7IntList_20__getitem__, /*mp_subscript*/
   __pyx_mp_ass_subscript_3_sa_IntList, /*mp_ass_subscript*/
 };
 
@@ -53082,7 +55384,7 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   &__pyx_tp_as_mapping_IntList, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_7IntList_1__str__, /*tp_str*/
+  __pyx_pw_3_sa_7IntList_3__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_IntList, /*tp_as_buffer*/
@@ -53092,7 +55394,7 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_7IntList_8__iter__, /*tp_iter*/
+  __pyx_pw_3_sa_7IntList_17__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_IntList, /*tp_methods*/
   0, /*tp_members*/
@@ -53118,14 +55420,14 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa_FeatureVector *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_FeatureVector *)o);
   p->names = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->values = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_13FeatureVector___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pw_3_sa_13FeatureVector_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -53133,8 +55435,8 @@ static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, PyObject *a, P
 
 static void __pyx_tp_dealloc_3_sa_FeatureVector(PyObject *o) {
   struct __pyx_obj_3_sa_FeatureVector *p = (struct __pyx_obj_3_sa_FeatureVector *)o;
-  Py_XDECREF(((PyObject *)p->names));
-  Py_XDECREF(((PyObject *)p->values));
+  Py_CLEAR(p->names);
+  Py_CLEAR(p->values);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -53163,7 +55465,7 @@ static int __pyx_tp_clear_3_sa_FeatureVector(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_FeatureVector[] = {
-  {__Pyx_NAMESTR("set"), (PyCFunction)__pyx_pf_3_sa_13FeatureVector_1set, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("set"), (PyCFunction)__pyx_pw_3_sa_13FeatureVector_3set, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -53285,7 +55587,7 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   &__pyx_tp_as_mapping_FeatureVector, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_13FeatureVector_4__str__, /*tp_str*/
+  __pyx_pw_3_sa_13FeatureVector_8__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_FeatureVector, /*tp_as_buffer*/
@@ -53295,7 +55597,7 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   __pyx_tp_clear_3_sa_FeatureVector, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_13FeatureVector_2__iter__, /*tp_iter*/
+  __pyx_pw_3_sa_13FeatureVector_5__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_FeatureVector, /*tp_methods*/
   0, /*tp_members*/
@@ -53328,7 +55630,7 @@ static PyObject *__pyx_tp_new_3_sa_Phrase(PyTypeObject *t, PyObject *a, PyObject
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_Phrase *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Phrase;
-  if (__pyx_pf_3_sa_6Phrase___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_6Phrase_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -53339,7 +55641,7 @@ static void __pyx_tp_dealloc_3_sa_Phrase(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_6Phrase_1__dealloc__(o);
+    __pyx_pw_3_sa_6Phrase_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -53354,19 +55656,19 @@ static PyObject *__pyx_sq_item_3_sa_Phrase(PyObject *o, Py_ssize_t i) {
   return r;
 }
 
-static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_6Phrase_5words___get__(o);
+static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_6Phrase_5words_1__get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Phrase[] = {
-  {__Pyx_NAMESTR("handle"), (PyCFunction)__pyx_pf_3_sa_6Phrase_3handle, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_3_sa_6Phrase_3handle)},
-  {__Pyx_NAMESTR("strhandle"), (PyCFunction)__pyx_pf_3_sa_6Phrase_4strhandle, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pf_3_sa_6Phrase_5arity, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getvarpos"), (PyCFunction)__pyx_pf_3_sa_6Phrase_6getvarpos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getvar"), (PyCFunction)__pyx_pf_3_sa_6Phrase_7getvar, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("clen"), (PyCFunction)__pyx_pf_3_sa_6Phrase_8clen, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getchunk"), (PyCFunction)__pyx_pf_3_sa_6Phrase_9getchunk, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("subst"), (PyCFunction)__pyx_pf_3_sa_6Phrase_16subst, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("handle"), (PyCFunction)__pyx_pw_3_sa_6Phrase_7handle, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_3_sa_6Phrase_6handle)},
+  {__Pyx_NAMESTR("strhandle"), (PyCFunction)__pyx_pw_3_sa_6Phrase_9strhandle, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pw_3_sa_6Phrase_11arity, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getvarpos"), (PyCFunction)__pyx_pw_3_sa_6Phrase_13getvarpos, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getvar"), (PyCFunction)__pyx_pw_3_sa_6Phrase_15getvar, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("clen"), (PyCFunction)__pyx_pw_3_sa_6Phrase_17clen, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getchunk"), (PyCFunction)__pyx_pw_3_sa_6Phrase_19getchunk, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("subst"), (PyCFunction)__pyx_pw_3_sa_6Phrase_32subst, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -53434,7 +55736,7 @@ static PyNumberMethods __pyx_tp_as_number_Phrase = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
-  __pyx_pf_3_sa_6Phrase_12__len__, /*sq_length*/
+  __pyx_pw_3_sa_6Phrase_25__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_Phrase, /*sq_item*/
@@ -53447,8 +55749,8 @@ static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_Phrase = {
-  __pyx_pf_3_sa_6Phrase_12__len__, /*mp_length*/
-  __pyx_pf_3_sa_6Phrase_13__getitem__, /*mp_subscript*/
+  __pyx_pw_3_sa_6Phrase_25__len__, /*mp_length*/
+  __pyx_pw_3_sa_6Phrase_27__getitem__, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
@@ -53483,7 +55785,7 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   0, /*tp_getattr*/
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_pf_3_sa_6Phrase_10__cmp__, /*tp_compare*/
+  __pyx_pw_3_sa_6Phrase_21__cmp__, /*tp_compare*/
   #else
   0, /*reserved*/
   #endif
@@ -53491,9 +55793,9 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   &__pyx_tp_as_number_Phrase, /*tp_as_number*/
   &__pyx_tp_as_sequence_Phrase, /*tp_as_sequence*/
   &__pyx_tp_as_mapping_Phrase, /*tp_as_mapping*/
-  __pyx_pf_3_sa_6Phrase_11__hash__, /*tp_hash*/
+  __pyx_pw_3_sa_6Phrase_23__hash__, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_6Phrase_2__str__, /*tp_str*/
+  __pyx_pw_3_sa_6Phrase_5__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Phrase, /*tp_as_buffer*/
@@ -53503,7 +55805,7 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_6Phrase_14__iter__, /*tp_iter*/
+  __pyx_pw_3_sa_6Phrase_29__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_Phrase, /*tp_methods*/
   0, /*tp_members*/
@@ -53538,7 +55840,7 @@ static PyObject *__pyx_tp_new_3_sa_Rule(PyTypeObject *t, PyObject *a, PyObject *
   p->e = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
   p->scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   p->word_alignments = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_4Rule___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_4Rule_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -53546,10 +55848,10 @@ static PyObject *__pyx_tp_new_3_sa_Rule(PyTypeObject *t, PyObject *a, PyObject *
 
 static void __pyx_tp_dealloc_3_sa_Rule(PyObject *o) {
   struct __pyx_obj_3_sa_Rule *p = (struct __pyx_obj_3_sa_Rule *)o;
-  Py_XDECREF(((PyObject *)p->f));
-  Py_XDECREF(((PyObject *)p->e));
-  Py_XDECREF(((PyObject *)p->scores));
-  Py_XDECREF(p->word_alignments);
+  Py_CLEAR(p->f);
+  Py_CLEAR(p->e);
+  Py_CLEAR(p->scores);
+  Py_CLEAR(p->word_alignments);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -53589,18 +55891,18 @@ static int __pyx_tp_clear_3_sa_Rule(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_4Rule_1f___get__(o);
+static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_4Rule_1f_1__get__(o);
 }
 
-static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_4Rule_1e___get__(o);
+static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_4Rule_1e_1__get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Rule[] = {
-  {__Pyx_NAMESTR("fmerge"), (PyCFunction)__pyx_pf_3_sa_4Rule_3fmerge, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pf_3_sa_4Rule_4arity, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("alignments"), (PyCFunction)__pyx_pf_3_sa_4Rule_6alignments, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("fmerge"), (PyCFunction)__pyx_pw_3_sa_4Rule_7fmerge, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pw_3_sa_4Rule_9arity, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("alignments"), (PyCFunction)__pyx_pw_3_sa_4Rule_13alignments, METH_NOARGS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -53718,7 +56020,7 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
   0, /*tp_getattr*/
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_pf_3_sa_4Rule_2__cmp__, /*tp_compare*/
+  __pyx_pw_3_sa_4Rule_5__cmp__, /*tp_compare*/
   #else
   0, /*reserved*/
   #endif
@@ -53726,9 +56028,9 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
   &__pyx_tp_as_number_Rule, /*tp_as_number*/
   &__pyx_tp_as_sequence_Rule, /*tp_as_sequence*/
   &__pyx_tp_as_mapping_Rule, /*tp_as_mapping*/
-  __pyx_pf_3_sa_4Rule_1__hash__, /*tp_hash*/
+  __pyx_pw_3_sa_4Rule_3__hash__, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_4Rule_5__str__, /*tp_str*/
+  __pyx_pw_3_sa_4Rule_11__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Rule, /*tp_as_buffer*/
@@ -53765,13 +56067,13 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
 };
 static struct __pyx_vtabstruct_3_sa_StringMap __pyx_vtable_3_sa_StringMap;
 
-static PyObject *__pyx_tp_new_3_sa_StringMap(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_StringMap(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa_StringMap *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_StringMap *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_StringMap;
-  if (__pyx_pf_3_sa_9StringMap___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pw_3_sa_9StringMap_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -53782,7 +56084,7 @@ static void __pyx_tp_dealloc_3_sa_StringMap(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_9StringMap_1__dealloc__(o);
+    __pyx_pw_3_sa_9StringMap_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -53960,7 +56262,7 @@ static PyObject *__pyx_tp_new_3_sa_DataArray(PyTypeObject *t, PyObject *a, PyObj
   p->data = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_id = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_9DataArray___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_9DataArray_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -53968,11 +56270,11 @@ static PyObject *__pyx_tp_new_3_sa_DataArray(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_DataArray(PyObject *o) {
   struct __pyx_obj_3_sa_DataArray *p = (struct __pyx_obj_3_sa_DataArray *)o;
-  Py_XDECREF(p->word2id);
-  Py_XDECREF(p->id2word);
-  Py_XDECREF(((PyObject *)p->data));
-  Py_XDECREF(((PyObject *)p->sent_id));
-  Py_XDECREF(((PyObject *)p->sent_index));
+  Py_CLEAR(p->word2id);
+  Py_CLEAR(p->id2word);
+  Py_CLEAR(p->data);
+  Py_CLEAR(p->sent_id);
+  Py_CLEAR(p->sent_index);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -54019,19 +56321,19 @@ static int __pyx_tp_clear_3_sa_DataArray(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_DataArray[] = {
-  {__Pyx_NAMESTR("getSentId"), (PyCFunction)__pyx_pf_3_sa_9DataArray_2getSentId, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSent"), (PyCFunction)__pyx_pf_3_sa_9DataArray_3getSent, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSentPos"), (PyCFunction)__pyx_pf_3_sa_9DataArray_4getSentPos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pf_3_sa_9DataArray_5get_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pf_3_sa_9DataArray_6get_word, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_9DataArray_7write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_9DataArray_8read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pf_3_sa_9DataArray_9read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pf_3_sa_9DataArray_10read_text_data, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_9DataArray_11read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_9DataArray_12write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pf_3_sa_9DataArray_13write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_9DataArray_14write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSentId"), (PyCFunction)__pyx_pw_3_sa_9DataArray_5getSentId, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSent"), (PyCFunction)__pyx_pw_3_sa_9DataArray_7getSent, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSentPos"), (PyCFunction)__pyx_pw_3_sa_9DataArray_9getSentPos, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_11get_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pw_3_sa_9DataArray_13get_word, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_17read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pw_3_sa_9DataArray_19read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pw_3_sa_9DataArray_21read_text_data, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_23read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_25write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pw_3_sa_9DataArray_27write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9DataArray_29write_enhanced, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -54094,7 +56396,7 @@ static PyNumberMethods __pyx_tp_as_number_DataArray = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
-  __pyx_pf_3_sa_9DataArray_1__len__, /*sq_length*/
+  __pyx_pw_3_sa_9DataArray_3__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
@@ -54107,7 +56409,7 @@ static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_DataArray = {
-  __pyx_pf_3_sa_9DataArray_1__len__, /*mp_length*/
+  __pyx_pw_3_sa_9DataArray_3__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -54198,7 +56500,7 @@ static PyObject *__pyx_tp_new_3_sa_Alignment(PyTypeObject *t, PyObject *a, PyObj
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Alignment;
   p->links = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_9Alignment_2__cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_9Alignment_5__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -54206,8 +56508,8 @@ static PyObject *__pyx_tp_new_3_sa_Alignment(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_Alignment(PyObject *o) {
   struct __pyx_obj_3_sa_Alignment *p = (struct __pyx_obj_3_sa_Alignment *)o;
-  Py_XDECREF(((PyObject *)p->links));
-  Py_XDECREF(((PyObject *)p->sent_index));
+  Py_CLEAR(p->links);
+  Py_CLEAR(p->sent_index);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -54236,14 +56538,14 @@ static int __pyx_tp_clear_3_sa_Alignment(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Alignment[] = {
-  {__Pyx_NAMESTR("unlink"), (PyCFunction)__pyx_pf_3_sa_9Alignment_unlink, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_unlink)},
-  {__Pyx_NAMESTR("get_sent_links"), (PyCFunction)__pyx_pf_3_sa_9Alignment_1get_sent_links, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_9Alignment_3read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_9Alignment_4read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_9Alignment_5write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_9Alignment_6write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_9Alignment_7write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("alignment"), (PyCFunction)__pyx_pf_3_sa_9Alignment_8alignment, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_8alignment)},
+  {__Pyx_NAMESTR("unlink"), (PyCFunction)__pyx_pw_3_sa_9Alignment_1unlink, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_unlink)},
+  {__Pyx_NAMESTR("get_sent_links"), (PyCFunction)__pyx_pw_3_sa_9Alignment_3get_sent_links, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9Alignment_7read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9Alignment_9read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9Alignment_11write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9Alignment_13write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9Alignment_15write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("alignment"), (PyCFunction)__pyx_pw_3_sa_9Alignment_17alignment, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_16alignment)},
   {0, 0, 0, 0}
 };
 
@@ -54416,7 +56718,7 @@ static PyObject *__pyx_tp_new_3_sa_BiLex(PyTypeObject *t, PyObject *a, PyObject
   p->id2fword = Py_None; Py_INCREF(Py_None);
   p->eword2id = Py_None; Py_INCREF(Py_None);
   p->fword2id = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_5BiLex___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_5BiLex_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -54424,14 +56726,14 @@ static PyObject *__pyx_tp_new_3_sa_BiLex(PyTypeObject *t, PyObject *a, PyObject
 
 static void __pyx_tp_dealloc_3_sa_BiLex(PyObject *o) {
   struct __pyx_obj_3_sa_BiLex *p = (struct __pyx_obj_3_sa_BiLex *)o;
-  Py_XDECREF(((PyObject *)p->col1));
-  Py_XDECREF(((PyObject *)p->col2));
-  Py_XDECREF(((PyObject *)p->f_index));
-  Py_XDECREF(((PyObject *)p->e_index));
-  Py_XDECREF(p->id2eword);
-  Py_XDECREF(p->id2fword);
-  Py_XDECREF(p->eword2id);
-  Py_XDECREF(p->fword2id);
+  Py_CLEAR(p->col1);
+  Py_CLEAR(p->col2);
+  Py_CLEAR(p->f_index);
+  Py_CLEAR(p->e_index);
+  Py_CLEAR(p->id2eword);
+  Py_CLEAR(p->id2fword);
+  Py_CLEAR(p->eword2id);
+  Py_CLEAR(p->fword2id);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -54496,14 +56798,14 @@ static int __pyx_tp_clear_3_sa_BiLex(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BiLex[] = {
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_5BiLex_1write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_5BiLex_2read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_e_id"), (PyCFunction)__pyx_pf_3_sa_5BiLex_3get_e_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_f_id"), (PyCFunction)__pyx_pf_3_sa_5BiLex_4get_f_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_5BiLex_5read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_5BiLex_6write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_score"), (PyCFunction)__pyx_pf_3_sa_5BiLex_7get_score, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_5BiLex_8write_text, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_5BiLex_8write_text)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_5BiLex_3write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_5BiLex_5read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_e_id"), (PyCFunction)__pyx_pw_3_sa_5BiLex_7get_e_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_f_id"), (PyCFunction)__pyx_pw_3_sa_5BiLex_9get_f_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_5BiLex_11read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_5BiLex_13write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_score"), (PyCFunction)__pyx_pw_3_sa_5BiLex_15get_score, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_5BiLex_17write_text, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_5BiLex_16write_text)},
   {0, 0, 0, 0}
 };
 
@@ -54661,7 +56963,7 @@ static PyTypeObject __pyx_type_3_sa_BiLex = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_BitSetIterator(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_BitSetIterator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   return o;
@@ -54672,7 +56974,7 @@ static void __pyx_tp_dealloc_3_sa_BitSetIterator(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BitSetIterator[] = {
-  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pf_3_sa_14BitSetIterator___next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pw_3_sa_14BitSetIterator_1__next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -54805,7 +57107,7 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  __pyx_pf_3_sa_14BitSetIterator___next__, /*tp_iternext*/
+  __pyx_pw_3_sa_14BitSetIterator_1__next__, /*tp_iternext*/
   __pyx_methods_3_sa_BitSetIterator, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
@@ -54830,10 +57132,10 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_BitSet(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_BitSet(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  if (__pyx_pf_3_sa_6BitSet___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pw_3_sa_6BitSet_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -54844,7 +57146,7 @@ static void __pyx_tp_dealloc_3_sa_BitSet(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_6BitSet_1__dealloc__(o);
+    __pyx_pw_3_sa_6BitSet_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -54853,10 +57155,10 @@ static void __pyx_tp_dealloc_3_sa_BitSet(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BitSet[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_6BitSet_3insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pf_3_sa_6BitSet_4findsucc, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("min"), (PyCFunction)__pyx_pf_3_sa_6BitSet_6min, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("max"), (PyCFunction)__pyx_pf_3_sa_6BitSet_7max, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_6BitSet_7insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pw_3_sa_6BitSet_9findsucc, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("min"), (PyCFunction)__pyx_pw_3_sa_6BitSet_13min, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("max"), (PyCFunction)__pyx_pw_3_sa_6BitSet_15max, METH_NOARGS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -54919,20 +57221,20 @@ static PyNumberMethods __pyx_tp_as_number_BitSet = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_BitSet = {
-  __pyx_pf_3_sa_6BitSet_8__len__, /*sq_length*/
+  __pyx_pw_3_sa_6BitSet_17__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  __pyx_pf_3_sa_6BitSet_9__contains__, /*sq_contains*/
+  __pyx_pw_3_sa_6BitSet_19__contains__, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_BitSet = {
-  __pyx_pf_3_sa_6BitSet_8__len__, /*mp_length*/
+  __pyx_pw_3_sa_6BitSet_17__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -54978,7 +57280,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   &__pyx_tp_as_mapping_BitSet, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_6BitSet_5__str__, /*tp_str*/
+  __pyx_pw_3_sa_6BitSet_11__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_BitSet, /*tp_as_buffer*/
@@ -54988,7 +57290,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_6BitSet_2__iter__, /*tp_iter*/
+  __pyx_pw_3_sa_6BitSet_5__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_BitSet, /*tp_methods*/
   0, /*tp_members*/
@@ -55014,7 +57316,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_VEBIterator(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_VEBIterator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   return o;
@@ -55025,7 +57327,7 @@ static void __pyx_tp_dealloc_3_sa_VEBIterator(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_VEBIterator[] = {
-  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pf_3_sa_11VEBIterator___next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pw_3_sa_11VEBIterator_1__next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55158,7 +57460,7 @@ static PyTypeObject __pyx_type_3_sa_VEBIterator = {
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  __pyx_pf_3_sa_11VEBIterator___next__, /*tp_iternext*/
+  __pyx_pw_3_sa_11VEBIterator_1__next__, /*tp_iternext*/
   __pyx_methods_3_sa_VEBIterator, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
@@ -55190,7 +57492,7 @@ static PyObject *__pyx_tp_new_3_sa_VEB(PyTypeObject *t, PyObject *a, PyObject *k
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_VEB *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_VEB;
-  if (__pyx_pf_3_sa_3VEB___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_3VEB_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55201,7 +57503,7 @@ static void __pyx_tp_dealloc_3_sa_VEB(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_3VEB_1__dealloc__(o);
+    __pyx_pw_3_sa_3VEB_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -55210,8 +57512,8 @@ static void __pyx_tp_dealloc_3_sa_VEB(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_VEB[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_3VEB_3insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pf_3_sa_3VEB_4findsucc, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_3VEB_7insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pw_3_sa_3VEB_9findsucc, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55274,20 +57576,20 @@ static PyNumberMethods __pyx_tp_as_number_VEB = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_VEB = {
-  __pyx_pf_3_sa_3VEB_5__len__, /*sq_length*/
+  __pyx_pw_3_sa_3VEB_11__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  __pyx_pf_3_sa_3VEB_6__contains__, /*sq_contains*/
+  __pyx_pw_3_sa_3VEB_13__contains__, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_VEB = {
-  __pyx_pf_3_sa_3VEB_5__len__, /*mp_length*/
+  __pyx_pw_3_sa_3VEB_11__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -55343,7 +57645,7 @@ static PyTypeObject __pyx_type_3_sa_VEB = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_3VEB_2__iter__, /*tp_iter*/
+  __pyx_pw_3_sa_3VEB_5__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_VEB, /*tp_methods*/
   0, /*tp_members*/
@@ -55376,7 +57678,7 @@ static PyObject *__pyx_tp_new_3_sa_LCP(PyTypeObject *t, PyObject *a, PyObject *k
   p = ((struct __pyx_obj_3_sa_LCP *)o);
   p->sa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
   p->lcp = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_3LCP___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_3LCP_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55384,8 +57686,8 @@ static PyObject *__pyx_tp_new_3_sa_LCP(PyTypeObject *t, PyObject *a, PyObject *k
 
 static void __pyx_tp_dealloc_3_sa_LCP(PyObject *o) {
   struct __pyx_obj_3_sa_LCP *p = (struct __pyx_obj_3_sa_LCP *)o;
-  Py_XDECREF(((PyObject *)p->sa));
-  Py_XDECREF(((PyObject *)p->lcp));
+  Py_CLEAR(p->sa);
+  Py_CLEAR(p->lcp);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -55414,7 +57716,7 @@ static int __pyx_tp_clear_3_sa_LCP(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_LCP[] = {
-  {__Pyx_NAMESTR("compute_stats"), (PyCFunction)__pyx_pf_3_sa_3LCP_1compute_stats, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_3LCP_1compute_stats)},
+  {__Pyx_NAMESTR("compute_stats"), (PyCFunction)__pyx_pw_3_sa_3LCP_3compute_stats, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_3LCP_2compute_stats)},
   {0, 0, 0, 0}
 };
 
@@ -55573,7 +57875,7 @@ static PyTypeObject __pyx_type_3_sa_LCP = {
 };
 static struct __pyx_vtabstruct_3_sa_Alphabet __pyx_vtable_3_sa_Alphabet;
 
-static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa_Alphabet *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -55582,7 +57884,7 @@ static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, PyObject *a, PyObje
   p->terminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
   p->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
   p->id2sym = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_8Alphabet___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pw_3_sa_8Alphabet_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55594,14 +57896,14 @@ static void __pyx_tp_dealloc_3_sa_Alphabet(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_8Alphabet_1__dealloc__(o);
+    __pyx_pw_3_sa_8Alphabet_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
   }
-  Py_XDECREF(((PyObject *)p->terminals));
-  Py_XDECREF(((PyObject *)p->nonterminals));
-  Py_XDECREF(((PyObject *)p->id2sym));
+  Py_CLEAR(p->terminals);
+  Py_CLEAR(p->nonterminals);
+  Py_CLEAR(p->id2sym);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -55635,12 +57937,12 @@ static int __pyx_tp_clear_3_sa_Alphabet(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_8Alphabet_9terminals___get__(o);
+static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_8Alphabet_9terminals_1__get__(o);
 }
 
-static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_8Alphabet_12nonterminals___get__(o);
+static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Alphabet[] = {
@@ -55814,7 +58116,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieMap(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieMap *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_TrieMap;
-  if (__pyx_pf_3_sa_7TrieMap___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_7TrieMap_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55825,7 +58127,7 @@ static void __pyx_tp_dealloc_3_sa_TrieMap(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_7TrieMap_1__dealloc__(o);
+    __pyx_pw_3_sa_7TrieMap_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -55834,9 +58136,9 @@ static void __pyx_tp_dealloc_3_sa_TrieMap(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_TrieMap[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_2insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("contains"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_3contains, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("toMap"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_4toMap, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_5insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("contains"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_7contains, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("toMap"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_9toMap, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -56003,7 +58305,7 @@ static PyObject *__pyx_tp_new_3_sa_Precomputation(PyTypeObject *t, PyObject *a,
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Precomputation;
   p->precomputed_index = Py_None; Py_INCREF(Py_None);
   p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_14Precomputation___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_14Precomputation_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56011,8 +58313,8 @@ static PyObject *__pyx_tp_new_3_sa_Precomputation(PyTypeObject *t, PyObject *a,
 
 static void __pyx_tp_dealloc_3_sa_Precomputation(PyObject *o) {
   struct __pyx_obj_3_sa_Precomputation *p = (struct __pyx_obj_3_sa_Precomputation *)o;
-  Py_XDECREF(p->precomputed_index);
-  Py_XDECREF(p->precomputed_collocations);
+  Py_CLEAR(p->precomputed_index);
+  Py_CLEAR(p->precomputed_collocations);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56041,9 +58343,9 @@ static int __pyx_tp_clear_3_sa_Precomputation(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Precomputation[] = {
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_1read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_2write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_3precompute, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_3read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_5write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_7precompute, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -56211,7 +58513,7 @@ static PyObject *__pyx_tp_new_3_sa_SuffixArray(PyTypeObject *t, PyObject *a, PyO
   p->darray = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
   p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->ha = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_11SuffixArray___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_11SuffixArray_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56219,9 +58521,9 @@ static PyObject *__pyx_tp_new_3_sa_SuffixArray(PyTypeObject *t, PyObject *a, PyO
 
 static void __pyx_tp_dealloc_3_sa_SuffixArray(PyObject *o) {
   struct __pyx_obj_3_sa_SuffixArray *p = (struct __pyx_obj_3_sa_SuffixArray *)o;
-  Py_XDECREF(((PyObject *)p->darray));
-  Py_XDECREF(((PyObject *)p->sa));
-  Py_XDECREF(((PyObject *)p->ha));
+  Py_CLEAR(p->darray);
+  Py_CLEAR(p->sa);
+  Py_CLEAR(p->ha);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56263,16 +58565,16 @@ static PyObject *__pyx_sq_item_3_sa_SuffixArray(PyObject *o, Py_ssize_t i) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_SuffixArray[] = {
-  {__Pyx_NAMESTR("getSentId"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_2getSentId, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSent"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_3getSent, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSentPos"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_4getSentPos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_5read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_5read_text)},
-  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_6q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_6q3sort)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_7write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_8read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_9write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_10write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_11lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSentId"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_5getSentId, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSent"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_7getSent, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getSentPos"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_9getSentPos, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_11read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_10read_text)},
+  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_13q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_12q3sort)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_17read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_19write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_21write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_23lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -56349,7 +58651,7 @@ static PySequenceMethods __pyx_tp_as_sequence_SuffixArray = {
 
 static PyMappingMethods __pyx_tp_as_mapping_SuffixArray = {
   0, /*mp_length*/
-  __pyx_pf_3_sa_11SuffixArray_1__getitem__, /*mp_subscript*/
+  __pyx_pw_3_sa_11SuffixArray_3__getitem__, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
@@ -56430,13 +58732,13 @@ static PyTypeObject __pyx_type_3_sa_SuffixArray = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa_TrieNode *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieNode *)o);
   p->children = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_8TrieNode___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pw_3_sa_8TrieNode_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56444,7 +58746,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, PyObject *a, PyObje
 
 static void __pyx_tp_dealloc_3_sa_TrieNode(PyObject *o) {
   struct __pyx_obj_3_sa_TrieNode *p = (struct __pyx_obj_3_sa_TrieNode *)o;
-  Py_XDECREF(p->children);
+  Py_CLEAR(p->children);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56466,16 +58768,16 @@ static int __pyx_tp_clear_3_sa_TrieNode(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_8TrieNode_8children___get__(o);
+static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_8TrieNode_8children_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_8TrieNode_children(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_8TrieNode_children(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_8TrieNode_8children_1__set__(o, v);
+    return __pyx_pw_3_sa_8TrieNode_8children_3__set__(o, v);
   }
   else {
-    return __pyx_pf_3_sa_8TrieNode_8children_2__del__(o);
+    return __pyx_pw_3_sa_8TrieNode_8children_5__del__(o);
   }
 }
 
@@ -56650,7 +58952,7 @@ static PyObject *__pyx_tp_new_3_sa_ExtendedTrieNode(PyTypeObject *t, PyObject *a
   p->phrase = Py_None; Py_INCREF(Py_None);
   p->phrase_location = Py_None; Py_INCREF(Py_None);
   p->suffix_link = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_16ExtendedTrieNode___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56658,9 +58960,9 @@ static PyObject *__pyx_tp_new_3_sa_ExtendedTrieNode(PyTypeObject *t, PyObject *a
 
 static void __pyx_tp_dealloc_3_sa_ExtendedTrieNode(PyObject *o) {
   struct __pyx_obj_3_sa_ExtendedTrieNode *p = (struct __pyx_obj_3_sa_ExtendedTrieNode *)o;
-  Py_XDECREF(p->phrase);
-  Py_XDECREF(p->phrase_location);
-  Py_XDECREF(p->suffix_link);
+  Py_CLEAR(p->phrase);
+  Py_CLEAR(p->phrase_location);
+  Py_CLEAR(p->suffix_link);
   __pyx_tp_dealloc_3_sa_TrieNode(o);
 }
 
@@ -56696,42 +58998,42 @@ static int __pyx_tp_clear_3_sa_ExtendedTrieNode(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(o, v);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(o, v);
   }
   else {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(o);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(o, v);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(o, v);
   }
   else {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(o);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(o, v);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(o, v);
   }
   else {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(o);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(o);
   }
 }
 
@@ -56906,7 +59208,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieTable(PyTypeObject *t, PyObject *a, PyObj
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieTable *)o);
   p->root = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_9TrieTable___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_9TrieTable_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56914,7 +59216,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieTable(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_TrieTable(PyObject *o) {
   struct __pyx_obj_3_sa_TrieTable *p = (struct __pyx_obj_3_sa_TrieTable *)o;
-  Py_XDECREF(p->root);
+  Py_CLEAR(p->root);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56936,13 +59238,13 @@ static int __pyx_tp_clear_3_sa_TrieTable(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_9TrieTable_8extended___get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9TrieTable_8extended_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_9TrieTable_8extended_1__set__(o, v);
+    return __pyx_pw_3_sa_9TrieTable_8extended_3__set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -56950,13 +59252,13 @@ static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, void
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_9TrieTable_5count___get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9TrieTable_5count_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_9TrieTable_5count_1__set__(o, v);
+    return __pyx_pw_3_sa_9TrieTable_5count_3__set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -56964,16 +59266,16 @@ static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, void *x
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_9TrieTable_4root___get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9TrieTable_4root_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_root(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_root(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_9TrieTable_4root_1__set__(o, v);
+    return __pyx_pw_3_sa_9TrieTable_4root_3__set__(o, v);
   }
   else {
-    return __pyx_pf_3_sa_9TrieTable_4root_2__del__(o);
+    return __pyx_pw_3_sa_9TrieTable_4root_5__del__(o);
   }
 }
 
@@ -57150,7 +59452,7 @@ static PyObject *__pyx_tp_new_3_sa_PhraseLocation(PyTypeObject *t, PyObject *a,
   p = ((struct __pyx_obj_3_sa_PhraseLocation *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_PhraseLocation;
   p->arr = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_14PhraseLocation___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_14PhraseLocation_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57158,7 +59460,7 @@ static PyObject *__pyx_tp_new_3_sa_PhraseLocation(PyTypeObject *t, PyObject *a,
 
 static void __pyx_tp_dealloc_3_sa_PhraseLocation(PyObject *o) {
   struct __pyx_obj_3_sa_PhraseLocation *p = (struct __pyx_obj_3_sa_PhraseLocation *)o;
-  Py_XDECREF(((PyObject *)p->arr));
+  Py_CLEAR(p->arr);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -57344,7 +59646,7 @@ static PyObject *__pyx_tp_new_3_sa_Sampler(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_Sampler *)o);
   p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_7Sampler___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_7Sampler_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57352,7 +59654,7 @@ static PyObject *__pyx_tp_new_3_sa_Sampler(PyTypeObject *t, PyObject *a, PyObjec
 
 static void __pyx_tp_dealloc_3_sa_Sampler(PyObject *o) {
   struct __pyx_obj_3_sa_Sampler *p = (struct __pyx_obj_3_sa_Sampler *)o;
-  Py_XDECREF(((PyObject *)p->sa));
+  Py_CLEAR(p->sa);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -57375,7 +59677,7 @@ static int __pyx_tp_clear_3_sa_Sampler(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Sampler[] = {
-  {__Pyx_NAMESTR("sample"), (PyCFunction)__pyx_pf_3_sa_7Sampler_1sample, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_7Sampler_1sample)},
+  {__Pyx_NAMESTR("sample"), (PyCFunction)__pyx_pw_3_sa_7Sampler_3sample, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_7Sampler_2sample)},
   {0, 0, 0, 0}
 };
 
@@ -57556,7 +59858,7 @@ static PyObject *__pyx_tp_new_3_sa_HieroCachingRuleFactory(PyTypeObject *t, PyOb
   p->fid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->findexes = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->findexes1 = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57564,22 +59866,22 @@ static PyObject *__pyx_tp_new_3_sa_HieroCachingRuleFactory(PyTypeObject *t, PyOb
 
 static void __pyx_tp_dealloc_3_sa_HieroCachingRuleFactory(PyObject *o) {
   struct __pyx_obj_3_sa_HieroCachingRuleFactory *p = (struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o;
-  Py_XDECREF(((PyObject *)p->rules));
-  Py_XDECREF(((PyObject *)p->sampler));
-  Py_XDECREF(((PyObject *)p->scorer));
-  Py_XDECREF(p->precomputed_index);
-  Py_XDECREF(p->precomputed_collocations);
-  Py_XDECREF(p->precompute_file);
-  Py_XDECREF(p->max_rank);
-  Py_XDECREF(p->prev_norm_prefix);
-  Py_XDECREF(((PyObject *)p->fsa));
-  Py_XDECREF(((PyObject *)p->fda));
-  Py_XDECREF(((PyObject *)p->eda));
-  Py_XDECREF(((PyObject *)p->alignment));
-  Py_XDECREF(((PyObject *)p->eid2symid));
-  Py_XDECREF(((PyObject *)p->fid2symid));
-  Py_XDECREF(((PyObject *)p->findexes));
-  Py_XDECREF(((PyObject *)p->findexes1));
+  Py_CLEAR(p->rules);
+  Py_CLEAR(p->sampler);
+  Py_CLEAR(p->scorer);
+  Py_CLEAR(p->precomputed_index);
+  Py_CLEAR(p->precomputed_collocations);
+  Py_CLEAR(p->precompute_file);
+  Py_CLEAR(p->max_rank);
+  Py_CLEAR(p->prev_norm_prefix);
+  Py_CLEAR(p->fsa);
+  Py_CLEAR(p->fda);
+  Py_CLEAR(p->eda);
+  Py_CLEAR(p->alignment);
+  Py_CLEAR(p->eid2symid);
+  Py_CLEAR(p->fid2symid);
+  Py_CLEAR(p->findexes);
+  Py_CLEAR(p->findexes1);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -57692,17 +59994,17 @@ static int __pyx_tp_clear_3_sa_HieroCachingRuleFactory(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_HieroCachingRuleFactory[] = {
-  {__Pyx_NAMESTR("configure"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_1configure)},
-  {__Pyx_NAMESTR("pattern2phrase"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("pattern2phrase_plus"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_precomputed_collocation"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("advance"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_all_nodes_isteps_away"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_11input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_11input)},
+  {__Pyx_NAMESTR("configure"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_2configure)},
+  {__Pyx_NAMESTR("pattern2phrase"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("pattern2phrase_plus"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_precomputed_collocation"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("advance"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_all_nodes_isteps_away"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_23input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_22input)},
   {0, 0, 0, 0}
 };
 
@@ -57861,7 +60163,7 @@ static PyTypeObject __pyx_type_3_sa_HieroCachingRuleFactory = {
 };
 static struct __pyx_vtabstruct_3_sa_Scorer __pyx_vtable_3_sa_Scorer;
 
-static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa_Scorer *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -57873,7 +60175,7 @@ static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, PyObject *a, PyObject
 
 static void __pyx_tp_dealloc_3_sa_Scorer(PyObject *o) {
   struct __pyx_obj_3_sa_Scorer *p = (struct __pyx_obj_3_sa_Scorer *)o;
-  Py_XDECREF(p->models);
+  Py_CLEAR(p->models);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -58037,7 +60339,7 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  __pyx_pf_3_sa_6Scorer___init__, /*tp_init*/
+  __pyx_pw_3_sa_6Scorer_1__init__, /*tp_init*/
   0, /*tp_alloc*/
   __pyx_tp_new_3_sa_Scorer, /*tp_new*/
   0, /*tp_free*/
@@ -58053,219 +60355,9 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_Generator(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_Generator_object *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
-  if (!o) return 0;
-  p = ((struct __pyx_Generator_object *)o);
-  p->exc_type = 0;
-  p->exc_value = 0;
-  p->exc_traceback = 0;
-  return o;
-}
-
-static void __pyx_tp_dealloc_3_sa___pyx_Generator(PyObject *o) {
-  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
-  Py_XDECREF(p->exc_type);
-  Py_XDECREF(p->exc_value);
-  Py_XDECREF(p->exc_traceback);
-  (*Py_TYPE(o)->tp_free)(o);
-}
-
-static int __pyx_tp_traverse_3_sa___pyx_Generator(PyObject *o, visitproc v, void *a) {
-  int e;
-  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
-  if (p->exc_type) {
-    e = (*v)(p->exc_type, a); if (e) return e;
-  }
-  if (p->exc_value) {
-    e = (*v)(p->exc_value, a); if (e) return e;
-  }
-  if (p->exc_traceback) {
-    e = (*v)(p->exc_traceback, a); if (e) return e;
-  }
-  return 0;
-}
-
-static int __pyx_tp_clear_3_sa___pyx_Generator(PyObject *o) {
-  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
-  PyObject* tmp;
-  tmp = ((PyObject*)p->exc_type);
-  p->exc_type = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->exc_value);
-  p->exc_value = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->exc_traceback);
-  p->exc_traceback = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  return 0;
-}
-
-static PyMethodDef __pyx_methods_3_sa___pyx_Generator[] = {
-  {__Pyx_NAMESTR("send"), (PyCFunction)__Pyx_Generator_Send, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("close"), (PyCFunction)__Pyx_Generator_Close, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("throw"), (PyCFunction)__Pyx_Generator_Throw, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number___pyx_Generator = {
-  0, /*nb_add*/
-  0, /*nb_subtract*/
-  0, /*nb_multiply*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_divide*/
-  #endif
-  0, /*nb_remainder*/
-  0, /*nb_divmod*/
-  0, /*nb_power*/
-  0, /*nb_negative*/
-  0, /*nb_positive*/
-  0, /*nb_absolute*/
-  0, /*nb_nonzero*/
-  0, /*nb_invert*/
-  0, /*nb_lshift*/
-  0, /*nb_rshift*/
-  0, /*nb_and*/
-  0, /*nb_xor*/
-  0, /*nb_or*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_coerce*/
-  #endif
-  0, /*nb_int*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_long*/
-  #else
-  0, /*reserved*/
-  #endif
-  0, /*nb_float*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_oct*/
-  #endif
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_hex*/
-  #endif
-  0, /*nb_inplace_add*/
-  0, /*nb_inplace_subtract*/
-  0, /*nb_inplace_multiply*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_inplace_divide*/
-  #endif
-  0, /*nb_inplace_remainder*/
-  0, /*nb_inplace_power*/
-  0, /*nb_inplace_lshift*/
-  0, /*nb_inplace_rshift*/
-  0, /*nb_inplace_and*/
-  0, /*nb_inplace_xor*/
-  0, /*nb_inplace_or*/
-  0, /*nb_floor_divide*/
-  0, /*nb_true_divide*/
-  0, /*nb_inplace_floor_divide*/
-  0, /*nb_inplace_true_divide*/
-  #if PY_VERSION_HEX >= 0x02050000
-  0, /*nb_index*/
-  #endif
-};
-
-static PySequenceMethods __pyx_tp_as_sequence___pyx_Generator = {
-  0, /*sq_length*/
-  0, /*sq_concat*/
-  0, /*sq_repeat*/
-  0, /*sq_item*/
-  0, /*sq_slice*/
-  0, /*sq_ass_item*/
-  0, /*sq_ass_slice*/
-  0, /*sq_contains*/
-  0, /*sq_inplace_concat*/
-  0, /*sq_inplace_repeat*/
-};
-
-static PyMappingMethods __pyx_tp_as_mapping___pyx_Generator = {
-  0, /*mp_length*/
-  0, /*mp_subscript*/
-  0, /*mp_ass_subscript*/
-};
-
-static PyBufferProcs __pyx_tp_as_buffer___pyx_Generator = {
-  #if PY_MAJOR_VERSION < 3
-  0, /*bf_getreadbuffer*/
-  #endif
-  #if PY_MAJOR_VERSION < 3
-  0, /*bf_getwritebuffer*/
-  #endif
-  #if PY_MAJOR_VERSION < 3
-  0, /*bf_getsegcount*/
-  #endif
-  #if PY_MAJOR_VERSION < 3
-  0, /*bf_getcharbuffer*/
-  #endif
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*bf_getbuffer*/
-  #endif
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*bf_releasebuffer*/
-  #endif
-};
-
-static PyTypeObject __pyx_Generator_type = {
-  PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_Generator"), /*tp_name*/
-  sizeof(struct __pyx_Generator_object), /*tp_basicsize*/
-  0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_Generator, /*tp_dealloc*/
-  0, /*tp_print*/
-  0, /*tp_getattr*/
-  0, /*tp_setattr*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*tp_compare*/
-  #else
-  0, /*reserved*/
-  #endif
-  0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_Generator, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_Generator, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_Generator, /*tp_as_mapping*/
-  0, /*tp_hash*/
-  0, /*tp_call*/
-  0, /*tp_str*/
-  0, /*tp_getattro*/
-  0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_Generator, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_Generator, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_Generator, /*tp_clear*/
-  0, /*tp_richcompare*/
-  0, /*tp_weaklistoffset*/
-  PyObject_SelfIter, /*tp_iter*/
-  __Pyx_Generator_Next, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_Generator, /*tp_methods*/
-  0, /*tp_members*/
-  0, /*tp_getset*/
-  0, /*tp_base*/
-  0, /*tp_dict*/
-  0, /*tp_descr_get*/
-  0, /*tp_descr_set*/
-  0, /*tp_dictoffset*/
-  0, /*tp_init*/
-  0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_Generator, /*tp_new*/
-  0, /*tp_free*/
-  0, /*tp_is_gc*/
-  0, /*tp_bases*/
-  0, /*tp_mro*/
-  0, /*tp_cache*/
-  0, /*tp_subclasses*/
-  0, /*tp_weaklist*/
-  0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*tp_version_tag*/
-  #endif
-};
-
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o);
   p->__pyx_v_self = 0;
@@ -58274,14 +60366,13 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct____iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_self);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -58291,9 +60382,8 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct____iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -58456,7 +60546,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct____iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -58467,7 +60557,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_1_read_bitext(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o;
-  Py_XDECREF(p->__pyx_v_fp);
+  Py_CLEAR(p->__pyx_v_fp);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -58647,9 +60737,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_1_read_bitext = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -58660,16 +60750,15 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
-  Py_XDECREF(p->__pyx_v_line);
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_line);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -58685,7 +60774,6 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -58856,9 +60944,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_2_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o);
   p->__pyx_v_ngram = 0;
@@ -58872,19 +60960,18 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObje
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_ngram));
-  Py_XDECREF(((PyObject *)p->__pyx_v_ngram_start));
-  Py_XDECREF(((PyObject *)p->__pyx_v_ngram_starts));
-  Py_XDECREF(((PyObject *)p->__pyx_v_run_start));
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  Py_XDECREF(((PyObject *)p->__pyx_v_veb));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_ngram);
+  Py_CLEAR(p->__pyx_v_ngram_start);
+  Py_CLEAR(p->__pyx_v_ngram_starts);
+  Py_CLEAR(p->__pyx_v_run_start);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_veb);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_ngram) {
     e = (*v)(p->__pyx_v_ngram, a); if (e) return e;
   }
@@ -58909,7 +60996,6 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_ngram);
   p->__pyx_v_ngram = ((PyObject*)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -58923,7 +61009,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   p->__pyx_v_run_start = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_LCP *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_veb);
   p->__pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)Py_None); Py_INCREF(Py_None);
@@ -59089,9 +61175,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_3_compute_stats = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o);
   p->__pyx_v_self = 0;
@@ -59100,14 +61186,13 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_4___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_self);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_4___iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -59117,9 +61202,8 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_4___iter__(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_4___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -59282,7 +61366,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_4___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -59293,7 +61377,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_5___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_CLEAR(p->__pyx_v_self);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -59310,7 +61394,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_5___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
   PyObject* tmp;
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Rule *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -59473,9 +61557,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_5___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -59486,16 +61570,15 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
-  Py_XDECREF(p->__pyx_v_a);
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_a);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -59511,7 +61594,6 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -59682,9 +61764,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_6_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o);
   p->__pyx_v_point = 0;
@@ -59695,16 +61777,15 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
-  Py_XDECREF(p->__pyx_v_point);
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_point);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_point) {
     e = (*v)(p->__pyx_v_point, a); if (e) return e;
   }
@@ -59720,12 +61801,11 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments(PyObject *o, v
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_point);
   p->__pyx_v_point = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Rule *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_t_0);
   p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
@@ -59891,9 +61971,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_7_alignments = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o);
   p->__pyx_v_alignment = 0;
@@ -59940,68 +62020,67 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, P
   p->__pyx_v_xcat_index = 0;
   p->__pyx_v_xnode = 0;
   p->__pyx_v_xroot = 0;
-  p->__pyx_t_2 = 0;
-  p->__pyx_t_3 = 0;
+  p->__pyx_t_1 = 0;
   p->__pyx_t_4 = 0;
+  p->__pyx_t_5 = 0;
   return o;
 }
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
-  Py_XDECREF(p->__pyx_v_alignment);
-  Py_XDECREF(p->__pyx_v_als);
-  Py_XDECREF(p->__pyx_v_alslist);
-  Py_XDECREF(((PyObject *)p->__pyx_v_chunklen));
-  Py_XDECREF(p->__pyx_v_count);
-  Py_XDECREF(p->__pyx_v_e);
-  Py_XDECREF(p->__pyx_v_elist);
-  Py_XDECREF(p->__pyx_v_extract);
-  Py_XDECREF(p->__pyx_v_extract_start);
-  Py_XDECREF(p->__pyx_v_extract_stop);
-  Py_XDECREF(((PyObject *)p->__pyx_v_extracts));
-  Py_XDECREF(p->__pyx_v_f);
-  Py_XDECREF(p->__pyx_v_fcount);
-  Py_XDECREF(p->__pyx_v_fphrases);
-  Py_XDECREF(((PyObject *)p->__pyx_v_frontier));
-  Py_XDECREF(p->__pyx_v_frontier_nodes);
-  Py_XDECREF(p->__pyx_v_fwords);
-  Py_XDECREF(((PyObject *)p->__pyx_v_hiero_phrase));
-  Py_XDECREF(p->__pyx_v_is_shadow_path);
-  Py_XDECREF(((PyObject *)p->__pyx_v_key));
-  Py_XDECREF(p->__pyx_v_loc);
-  Py_XDECREF(((PyObject *)p->__pyx_v_locs));
-  Py_XDECREF(((PyObject *)p->__pyx_v_new_frontier));
-  Py_XDECREF(p->__pyx_v_new_node);
-  Py_XDECREF(((PyObject *)p->__pyx_v_next_states));
-  Py_XDECREF(p->__pyx_v_node);
-  Py_XDECREF(((PyObject *)p->__pyx_v_nodes_isteps_away_buffer));
-  Py_XDECREF(p->__pyx_v_pathlen);
-  Py_XDECREF(p->__pyx_v_phrase);
-  Py_XDECREF(((PyObject *)p->__pyx_v_phrase_location));
-  Py_XDECREF(p->__pyx_v_prefix);
-  Py_XDECREF(((PyObject *)p->__pyx_v_reachable_buffer));
-  Py_XDECREF(p->__pyx_v_sa_range);
-  Py_XDECREF(((PyObject *)p->__pyx_v_sample));
-  Py_XDECREF(((PyObject *)p->__pyx_v_scores));
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  Py_XDECREF(p->__pyx_v_spanlen);
-  Py_XDECREF(p->__pyx_v_stop_time);
-  Py_XDECREF(p->__pyx_v_suffix_link);
-  Py_XDECREF(p->__pyx_v_suffix_link_xcat_index);
-  Py_XDECREF(p->__pyx_v_word_id);
-  Py_XDECREF(p->__pyx_v_xcat_index);
-  Py_XDECREF(p->__pyx_v_xnode);
-  Py_XDECREF(p->__pyx_v_xroot);
-  Py_XDECREF(p->__pyx_t_2);
-  Py_XDECREF(p->__pyx_t_3);
-  Py_XDECREF(p->__pyx_t_4);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_alignment);
+  Py_CLEAR(p->__pyx_v_als);
+  Py_CLEAR(p->__pyx_v_alslist);
+  Py_CLEAR(p->__pyx_v_chunklen);
+  Py_CLEAR(p->__pyx_v_count);
+  Py_CLEAR(p->__pyx_v_e);
+  Py_CLEAR(p->__pyx_v_elist);
+  Py_CLEAR(p->__pyx_v_extract);
+  Py_CLEAR(p->__pyx_v_extract_start);
+  Py_CLEAR(p->__pyx_v_extract_stop);
+  Py_CLEAR(p->__pyx_v_extracts);
+  Py_CLEAR(p->__pyx_v_f);
+  Py_CLEAR(p->__pyx_v_fcount);
+  Py_CLEAR(p->__pyx_v_fphrases);
+  Py_CLEAR(p->__pyx_v_frontier);
+  Py_CLEAR(p->__pyx_v_frontier_nodes);
+  Py_CLEAR(p->__pyx_v_fwords);
+  Py_CLEAR(p->__pyx_v_hiero_phrase);
+  Py_CLEAR(p->__pyx_v_is_shadow_path);
+  Py_CLEAR(p->__pyx_v_key);
+  Py_CLEAR(p->__pyx_v_loc);
+  Py_CLEAR(p->__pyx_v_locs);
+  Py_CLEAR(p->__pyx_v_new_frontier);
+  Py_CLEAR(p->__pyx_v_new_node);
+  Py_CLEAR(p->__pyx_v_next_states);
+  Py_CLEAR(p->__pyx_v_node);
+  Py_CLEAR(p->__pyx_v_nodes_isteps_away_buffer);
+  Py_CLEAR(p->__pyx_v_pathlen);
+  Py_CLEAR(p->__pyx_v_phrase);
+  Py_CLEAR(p->__pyx_v_phrase_location);
+  Py_CLEAR(p->__pyx_v_prefix);
+  Py_CLEAR(p->__pyx_v_reachable_buffer);
+  Py_CLEAR(p->__pyx_v_sa_range);
+  Py_CLEAR(p->__pyx_v_sample);
+  Py_CLEAR(p->__pyx_v_scores);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_spanlen);
+  Py_CLEAR(p->__pyx_v_stop_time);
+  Py_CLEAR(p->__pyx_v_suffix_link);
+  Py_CLEAR(p->__pyx_v_suffix_link_xcat_index);
+  Py_CLEAR(p->__pyx_v_word_id);
+  Py_CLEAR(p->__pyx_v_xcat_index);
+  Py_CLEAR(p->__pyx_v_xnode);
+  Py_CLEAR(p->__pyx_v_xroot);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_4);
+  Py_CLEAR(p->__pyx_t_5);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_alignment) {
     e = (*v)(p->__pyx_v_alignment, a); if (e) return e;
   }
@@ -60134,22 +62213,21 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitp
   if (p->__pyx_v_xroot) {
     e = (*v)(p->__pyx_v_xroot, a); if (e) return e;
   }
-  if (p->__pyx_t_2) {
-    e = (*v)(p->__pyx_t_2, a); if (e) return e;
-  }
-  if (p->__pyx_t_3) {
-    e = (*v)(p->__pyx_t_3, a); if (e) return e;
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
   }
   if (p->__pyx_t_4) {
     e = (*v)(p->__pyx_t_4, a); if (e) return e;
   }
+  if (p->__pyx_t_5) {
+    e = (*v)(p->__pyx_t_5, a); if (e) return e;
+  }
   return 0;
 }
 
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_alignment);
   p->__pyx_v_alignment = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -60256,7 +62334,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   p->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_spanlen);
   p->__pyx_v_spanlen = Py_None; Py_INCREF(Py_None);
@@ -60282,15 +62360,15 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   tmp = ((PyObject*)p->__pyx_v_xroot);
   p->__pyx_v_xroot = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_2);
-  p->__pyx_t_2 = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_3);
-  p->__pyx_t_3 = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_t_1);
+  p->__pyx_t_1 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_t_4);
   p->__pyx_t_4 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_5);
+  p->__pyx_t_5 = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
   return 0;
 }
 
@@ -60452,9 +62530,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_8_input = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o);
   p->__pyx_v_self = 0;
@@ -60463,14 +62541,13 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_9___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_self);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_9___iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -60480,9 +62557,8 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_9___iter__(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_9___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -60645,7 +62721,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_9___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -60656,7 +62732,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_10___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_CLEAR(p->__pyx_v_self);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -60673,7 +62749,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_10___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
   PyObject* tmp;
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -60836,9 +62912,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_10___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -60849,16 +62925,15 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
-  Py_XDECREF(p->__pyx_v_feat);
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_feat);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -60874,7 +62949,6 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -61097,9 +63171,11 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_132, __pyx_k_132, sizeof(__pyx_k_132), 0, 0, 1, 0},
   {&__pyx_kp_s_133, __pyx_k_133, sizeof(__pyx_k_133), 0, 0, 1, 0},
   {&__pyx_kp_s_134, __pyx_k_134, sizeof(__pyx_k_134), 0, 0, 1, 0},
-  {&__pyx_kp_s_135, __pyx_k_135, sizeof(__pyx_k_135), 0, 0, 1, 0},
   {&__pyx_kp_s_137, __pyx_k_137, sizeof(__pyx_k_137), 0, 0, 1, 0},
+  {&__pyx_kp_s_138, __pyx_k_138, sizeof(__pyx_k_138), 0, 0, 1, 0},
   {&__pyx_kp_s_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 0, 1, 0},
+  {&__pyx_kp_s_142, __pyx_k_142, sizeof(__pyx_k_142), 0, 0, 1, 0},
+  {&__pyx_kp_s_143, __pyx_k_143, sizeof(__pyx_k_143), 0, 0, 1, 0},
   {&__pyx_kp_s_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 1, 0},
   {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
   {&__pyx_kp_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 0},
@@ -61193,6 +63269,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__defaultdict, __pyx_k__defaultdict, sizeof(__pyx_k__defaultdict), 0, 0, 1, 1},
   {&__pyx_n_s__dist, __pyx_k__dist, sizeof(__pyx_k__dist), 0, 0, 1, 1},
   {&__pyx_n_s__e, __pyx_k__e, sizeof(__pyx_k__e), 0, 0, 1, 1},
+  {&__pyx_n_s__e_text, __pyx_k__e_text, sizeof(__pyx_k__e_text), 0, 0, 1, 1},
   {&__pyx_n_s__earray, __pyx_k__earray, sizeof(__pyx_k__earray), 0, 0, 1, 1},
   {&__pyx_n_s__edarray, __pyx_k__edarray, sizeof(__pyx_k__edarray), 0, 0, 1, 1},
   {&__pyx_n_s__end, __pyx_k__end, sizeof(__pyx_k__end), 0, 0, 1, 1},
@@ -61202,6 +63279,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__extend, __pyx_k__extend, sizeof(__pyx_k__extend), 0, 0, 1, 1},
   {&__pyx_n_s__extended, __pyx_k__extended, sizeof(__pyx_k__extended), 0, 0, 1, 1},
   {&__pyx_n_s__f, __pyx_k__f, sizeof(__pyx_k__f), 0, 0, 1, 1},
+  {&__pyx_n_s__f_text, __pyx_k__f_text, sizeof(__pyx_k__f_text), 0, 0, 1, 1},
   {&__pyx_n_s__fcount, __pyx_k__fcount, sizeof(__pyx_k__fcount), 0, 0, 1, 1},
   {&__pyx_n_s__filename, __pyx_k__filename, sizeof(__pyx_k__filename), 0, 0, 1, 1},
   {&__pyx_n_s__fphrase, __pyx_k__fphrase, sizeof(__pyx_k__fphrase), 0, 0, 1, 1},
@@ -61351,8 +63429,8 @@ static int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_zip = __Pyx_GetName(__pyx_b, __pyx_n_s__zip); if (!__pyx_builtin_zip) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_StopIteration = __Pyx_GetName(__pyx_b, __pyx_n_s__StopIteration); if (!__pyx_builtin_StopIteration) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_cmp = __Pyx_GetName(__pyx_b, __pyx_n_s__cmp); if (!__pyx_builtin_cmp) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_sorted = __Pyx_GetName(__pyx_b, __pyx_n_s__sorted); if (!__pyx_builtin_sorted) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_max = __Pyx_GetName(__pyx_b, __pyx_n_s__max); if (!__pyx_builtin_max) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_sorted = __Pyx_GetName(__pyx_b, __pyx_n_s__sorted); if (!__pyx_builtin_sorted) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_max = __Pyx_GetName(__pyx_b, __pyx_n_s__max); if (!__pyx_builtin_max) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -61360,7 +63438,7 @@ static int __Pyx_InitCachedBuiltins(void) {
 
 static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants");
+  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
@@ -61370,7 +63448,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.sent_index = IntList(1000,1000)
  */
   __pyx_k_tuple_10 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_10));
+  __Pyx_GOTREF(__pyx_k_tuple_10);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61387,7 +63465,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.use_sent_id = use_sent_id
  */
   __pyx_k_tuple_11 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_11));
+  __Pyx_GOTREF(__pyx_k_tuple_11);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_11, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61404,7 +63482,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if from_binary:
  */
   __pyx_k_tuple_12 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_12));
+  __Pyx_GOTREF(__pyx_k_tuple_12);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_12, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61421,7 +63499,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     def read_text(self, char* filename):
  */
   __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_15));
+  __Pyx_GOTREF(__pyx_k_tuple_15);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61435,7 +63513,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 if w_id > 1:
  */
   __pyx_k_tuple_16 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_16));
+  __Pyx_GOTREF(__pyx_k_tuple_16);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61455,7 +63533,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_17 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_17));
+  __Pyx_GOTREF(__pyx_k_tuple_17);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61475,7 +63553,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_19 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_19));
+  __Pyx_GOTREF(__pyx_k_tuple_19);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_18));
   PyTuple_SET_ITEM(__pyx_k_tuple_19, 0, ((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_18));
@@ -61489,7 +63567,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.read_text_data(data)
  */
   __pyx_k_tuple_20 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_20));
+  __Pyx_GOTREF(__pyx_k_tuple_20);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_20, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61509,7 +63587,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%d " %i)
  */
   __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_22));
+  __Pyx_GOTREF(__pyx_k_tuple_22);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_22, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61523,7 +63601,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%d " %i)
  */
   __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_23));
+  __Pyx_GOTREF(__pyx_k_tuple_23);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_23, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61537,7 +63615,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%s %d " % (word, self.word2id[word]))
  */
   __pyx_k_tuple_24 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_24));
+  __Pyx_GOTREF(__pyx_k_tuple_24);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_24, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61551,7 +63629,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     def write_enhanced(self, char* filename):
  */
   __pyx_k_tuple_26 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_26)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_26));
+  __Pyx_GOTREF(__pyx_k_tuple_26);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_26, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61564,7 +63642,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.write_enhanced_handle(self, f)
  */
   __pyx_k_tuple_28 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_28));
+  __Pyx_GOTREF(__pyx_k_tuple_28);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_28, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61584,7 +63662,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if from_binary:
  */
   __pyx_k_tuple_29 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_29)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_29));
+  __Pyx_GOTREF(__pyx_k_tuple_29);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_29, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61601,7 +63679,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.read_binary(from_binary)
  */
   __pyx_k_tuple_30 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_30)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_30));
+  __Pyx_GOTREF(__pyx_k_tuple_30);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_30, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61618,7 +63696,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.sent_index.append(len(self.links))
  */
   __pyx_k_tuple_32 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_32)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_32));
+  __Pyx_GOTREF(__pyx_k_tuple_32);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_31));
   PyTuple_SET_ITEM(__pyx_k_tuple_32, 0, ((PyObject *)__pyx_kp_s_31));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_31));
@@ -61632,7 +63710,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 self.sent_index.append(len(self.links))
  */
   __pyx_k_tuple_33 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_33)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_33));
+  __Pyx_GOTREF(__pyx_k_tuple_33);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_33, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61652,7 +63730,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d-%d " % self.unlink(link))
  */
   __pyx_k_tuple_34 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_34)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_34));
+  __Pyx_GOTREF(__pyx_k_tuple_34);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_34, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61666,7 +63744,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     def write_binary(self, char* filename):
  */
   __pyx_k_tuple_36 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_36)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_36));
+  __Pyx_GOTREF(__pyx_k_tuple_36);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_36, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61680,7 +63758,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for i, link in enumerate(self.links):
  */
   __pyx_k_tuple_37 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_37)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_37));
+  __Pyx_GOTREF(__pyx_k_tuple_37);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_37, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61700,7 +63778,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % i)
  */
   __pyx_k_tuple_38 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_38)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_38));
+  __Pyx_GOTREF(__pyx_k_tuple_38);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_38, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61714,7 +63792,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     def alignment(self, i):
  */
   __pyx_k_tuple_39 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_39)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_39));
+  __Pyx_GOTREF(__pyx_k_tuple_39);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_39, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61728,7 +63806,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for link in self.links:
  */
   __pyx_k_tuple_40 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_40)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_40));
+  __Pyx_GOTREF(__pyx_k_tuple_40);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_40, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61748,7 +63826,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 (fword, eword, score1, score2) = line.split()
  */
   __pyx_k_tuple_43 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_43)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_43));
+  __Pyx_GOTREF(__pyx_k_tuple_43);
   __Pyx_INCREF(__pyx_int_0);
   PyTuple_SET_ITEM(__pyx_k_tuple_43, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
@@ -61762,7 +63840,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for line in f:
  */
   __pyx_k_tuple_44 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_44)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_44));
+  __Pyx_GOTREF(__pyx_k_tuple_44);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_44, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61782,7 +63860,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             return
  */
   __pyx_k_tuple_47 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_47)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_47));
+  __Pyx_GOTREF(__pyx_k_tuple_47);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_46));
   PyTuple_SET_ITEM(__pyx_k_tuple_47, 0, ((PyObject *)__pyx_kp_s_46));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_46));
@@ -61796,7 +63874,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %f %f " % (i, s1, s2))
  */
   __pyx_k_tuple_49 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_49)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_49));
+  __Pyx_GOTREF(__pyx_k_tuple_49);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_49, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61810,7 +63888,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %s " % (i, w))
  */
   __pyx_k_tuple_51 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_51)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_51));
+  __Pyx_GOTREF(__pyx_k_tuple_51);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_51, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61824,7 +63902,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %s " % (i, w))
  */
   __pyx_k_tuple_53 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_53)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_53));
+  __Pyx_GOTREF(__pyx_k_tuple_53);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_53, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61838,7 +63916,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_54 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_54)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_54));
+  __Pyx_GOTREF(__pyx_k_tuple_54);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_54, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -61852,7 +63930,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % i)
  */
   __pyx_k_tuple_55 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_55)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_55));
+  __Pyx_GOTREF(__pyx_k_tuple_55);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_55, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61872,7 +63950,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             f_id = 0
  */
   __pyx_k_tuple_57 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_57)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_57));
+  __Pyx_GOTREF(__pyx_k_tuple_57);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_57, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61892,7 +63970,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         n = self.sa.sa.len
  */
   __pyx_k_tuple_61 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_61)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_61));
+  __Pyx_GOTREF(__pyx_k_tuple_61);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_60));
   PyTuple_SET_ITEM(__pyx_k_tuple_61, 0, ((PyObject *)__pyx_kp_s_60));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_60));
@@ -61906,7 +63984,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     def compute_stats(self, int max_n):
  */
   __pyx_k_tuple_63 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_63)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_63));
+  __Pyx_GOTREF(__pyx_k_tuple_63);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_62));
   PyTuple_SET_ITEM(__pyx_k_tuple_63, 0, ((PyObject *)__pyx_kp_s_62));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_62));
@@ -61920,7 +63998,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_73 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_73)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_73));
+  __Pyx_GOTREF(__pyx_k_tuple_73);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_72));
   PyTuple_SET_ITEM(__pyx_k_tuple_73, 0, ((PyObject *)__pyx_kp_s_72));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_72));
@@ -61934,7 +64012,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         for i from 0 <= i < N:
  */
   __pyx_k_tuple_75 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_75)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_75));
+  __Pyx_GOTREF(__pyx_k_tuple_75);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_74));
   PyTuple_SET_ITEM(__pyx_k_tuple_75, 0, ((PyObject *)__pyx_kp_s_74));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_74));
@@ -61948,7 +64026,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         ptr1 = 0
  */
   __pyx_k_tuple_77 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_77)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_77));
+  __Pyx_GOTREF(__pyx_k_tuple_77);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_76));
   PyTuple_SET_ITEM(__pyx_k_tuple_77, 0, ((PyObject *)__pyx_kp_s_76));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_76));
@@ -61962,7 +64040,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_79 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_79)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_79));
+  __Pyx_GOTREF(__pyx_k_tuple_79);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_79, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
@@ -61976,7 +64054,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_80 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_80)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_80));
+  __Pyx_GOTREF(__pyx_k_tuple_80);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_80, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
@@ -61990,7 +64068,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  */
   __pyx_k_tuple_81 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_81)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_81));
+  __Pyx_GOTREF(__pyx_k_tuple_81);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_81, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
@@ -62004,7 +64082,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_82 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_82)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_82));
+  __Pyx_GOTREF(__pyx_k_tuple_82);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_82, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
@@ -62018,7 +64096,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             j = isa.arr[i]
  */
   __pyx_k_tuple_93 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_93)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_93));
+  __Pyx_GOTREF(__pyx_k_tuple_93);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_92));
   PyTuple_SET_ITEM(__pyx_k_tuple_93, 0, ((PyObject *)__pyx_kp_s_92));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_92));
@@ -62032,7 +64110,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % w_i)
  */
   __pyx_k_tuple_96 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_96)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_96));
+  __Pyx_GOTREF(__pyx_k_tuple_96);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_96, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -62046,7 +64124,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
   __pyx_k_tuple_97 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_97)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_97));
+  __Pyx_GOTREF(__pyx_k_tuple_97);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_97, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -62060,7 +64138,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for a_i in self.sa:
  */
   __pyx_k_tuple_98 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_98)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_98));
+  __Pyx_GOTREF(__pyx_k_tuple_98);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_98, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -62072,48 +64150,66 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_98));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":107
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
  * 
  *     def sample(self, PhraseLocation phrase_location):
  */
-  __pyx_k_tuple_102 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_102)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_102));
+  __pyx_k_tuple_102 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_102)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_102);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_101));
   PyTuple_SET_ITEM(__pyx_k_tuple_102, 0, ((PyObject *)__pyx_kp_s_101));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_101));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_102));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":314
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":316
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
  *         self.alignment = alignment
  * 
  */
-  __pyx_k_tuple_107 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_107)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_107));
+  __pyx_k_tuple_107 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_107)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_107);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_106));
   PyTuple_SET_ITEM(__pyx_k_tuple_107, 0, ((PyObject *)__pyx_kp_s_106));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_106));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_107));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1020
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1022
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-  __pyx_k_tuple_122 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_122)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_122));
+  __pyx_k_tuple_122 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_122)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_122);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_121));
   PyTuple_SET_ITEM(__pyx_k_tuple_122, 0, ((PyObject *)__pyx_kp_s_121));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_121));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_122));
 
+  /* "_sa.pyx":9
+ *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
+ * 
+ * def gzip_or_text(char* filename):             # <<<<<<<<<<<<<<
+ *     if filename.endswith('.gz'):
+ *         return gzip.GzipFile(filename)
+ */
+  __pyx_k_tuple_135 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_135)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_135);
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 0, ((PyObject *)__pyx_n_s__filename));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 1, ((PyObject *)__pyx_n_s__filename));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_135));
+  __pyx_k_codeobj_136 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_135, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_137, __pyx_n_s__gzip_or_text, 9, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_136)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
   /* "_sa.pyx":15
  *         return open(filename)
  * 
@@ -62121,12 +64217,29 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  * include "float_list.pxi"
  */
-  __pyx_k_tuple_136 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_136)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_136));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_135));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 0, ((PyObject *)__pyx_kp_s_135));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_135));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_136));
+  __pyx_k_tuple_139 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_139)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_139);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_138));
+  PyTuple_SET_ITEM(__pyx_k_tuple_139, 0, ((PyObject *)__pyx_kp_s_138));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_138));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_139));
+
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
+ *     return ALPHABET.setindex(sym, id)
+ * 
+ * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
+ *     return ALPHABET.fromstring(string, terminal)
+ */
+  __pyx_k_tuple_140 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_140)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_140);
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__string));
+  PyTuple_SET_ITEM(__pyx_k_tuple_140, 0, ((PyObject *)__pyx_n_s__string));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__string));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__terminal));
+  PyTuple_SET_ITEM(__pyx_k_tuple_140, 1, ((PyObject *)__pyx_n_s__terminal));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__terminal));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_140));
+  __pyx_k_codeobj_141 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_140, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_142, __pyx_n_s__sym_fromstring, 104, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_141)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -62135,9 +64248,6 @@ static int __Pyx_InitCachedConstants(void) {
 }
 
 static int __Pyx_InitGlobals(void) {
-  #if PY_VERSION_HEX < 0x02040000
-  if (unlikely(__Pyx_Py23SetsImport() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #endif
   if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
@@ -62176,12 +64286,18 @@ PyMODINIT_FUNC PyInit__sa(void)
           Py_FatalError("failed to import 'refnanny' module");
   }
   #endif
-  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__sa(void)");
+  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__sa(void)", 0);
   if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #ifdef __pyx_binding_PyCFunctionType_USED
-  if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #ifdef __Pyx_CyFunction_USED
+  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
+  #ifdef __Pyx_FusedFunction_USED
+  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
+  #ifdef __Pyx_Generator_USED
+  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   /*--- Library function declarations ---*/
   /*--- Threads initialization code ---*/
@@ -62192,16 +64308,15 @@ PyMODINIT_FUNC PyInit__sa(void)
   #endif
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_sa"), __pyx_methods, 0, 0, PYTHON_API_VERSION);
+  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_sa"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
   #else
   __pyx_m = PyModule_Create(&__pyx_moduledef);
   #endif
-  if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
-  #if PY_MAJOR_VERSION < 3
-  Py_INCREF(__pyx_m);
+  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #if CYTHON_COMPILING_IN_PYPY
+  Py_INCREF(__pyx_b);
   #endif
-  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
-  if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   /*--- Initialize various global constants etc. ---*/
   if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -62338,32 +64453,32 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetAttrString(__pyx_m, "Precomputation", (PyObject *)&__pyx_type_3_sa_Precomputation) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Precomputation = &__pyx_type_3_sa_Precomputation;
   __pyx_vtabptr_3_sa_SuffixArray = &__pyx_vtable_3_sa_SuffixArray;
-  __pyx_vtable_3_sa_SuffixArray.__search_high = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_high;
-  __pyx_vtable_3_sa_SuffixArray.__search_low = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_low;
-  __pyx_vtable_3_sa_SuffixArray.__get_range = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int))__pyx_f_3_sa_11SuffixArray___get_range;
-  __pyx_vtable_3_sa_SuffixArray.__lookup_helper = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___lookup_helper;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___search_high = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_high;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___search_low = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_low;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___get_range = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int))__pyx_f_3_sa_11SuffixArray___get_range;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___lookup_helper = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___lookup_helper;
   if (PyType_Ready(&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetVtable(__pyx_type_3_sa_SuffixArray.tp_dict, __pyx_vtabptr_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "SuffixArray", (PyObject *)&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_SuffixArray = &__pyx_type_3_sa_SuffixArray;
-  if (PyType_Ready(&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "TrieNode", (PyObject *)&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "TrieNode", (PyObject *)&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_TrieNode = &__pyx_type_3_sa_TrieNode;
   __pyx_type_3_sa_ExtendedTrieNode.tp_base = __pyx_ptype_3_sa_TrieNode;
-  if (PyType_Ready(&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "ExtendedTrieNode", (PyObject *)&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "ExtendedTrieNode", (PyObject *)&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_ExtendedTrieNode = &__pyx_type_3_sa_ExtendedTrieNode;
-  if (PyType_Ready(&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "TrieTable", (PyObject *)&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "TrieTable", (PyObject *)&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_TrieTable = &__pyx_type_3_sa_TrieTable;
   __pyx_vtabptr_3_sa_PhraseLocation = &__pyx_vtable_3_sa_PhraseLocation;
   __pyx_vtable_3_sa_PhraseLocation.contains = (int (*)(struct __pyx_obj_3_sa_PhraseLocation *, int))__pyx_f_3_sa_14PhraseLocation_contains;
-  if (PyType_Ready(&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_3_sa_PhraseLocation.tp_dict, __pyx_vtabptr_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "PhraseLocation", (PyObject *)&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_3_sa_PhraseLocation.tp_dict, __pyx_vtabptr_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "PhraseLocation", (PyObject *)&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_PhraseLocation = &__pyx_type_3_sa_PhraseLocation;
-  if (PyType_Ready(&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Sampler", (PyObject *)&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Sampler", (PyObject *)&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Sampler = &__pyx_type_3_sa_Sampler;
   __pyx_vtabptr_3_sa_HieroCachingRuleFactory = &__pyx_vtable_3_sa_HieroCachingRuleFactory;
   __pyx_vtable_3_sa_HieroCachingRuleFactory.set_idmap = (PyObject *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, struct __pyx_obj_3_sa_DataArray *))__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap;
@@ -62381,9 +64496,9 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_vtable_3_sa_HieroCachingRuleFactory.extract_phrases = (PyObject *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, int, int, int *, int *, int *, int, int, int, int *, int *, int *, int, int, int))__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases;
   __pyx_vtable_3_sa_HieroCachingRuleFactory.create_alignments = (struct __pyx_obj_3_sa_IntList *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, int *, int, PyObject *, PyObject *))__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments;
   __pyx_vtable_3_sa_HieroCachingRuleFactory.extract = (PyObject *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, struct __pyx_obj_3_sa_Phrase *, struct __pyx_t_3_sa_Matching *, int *, int))__pyx_f_3_sa_23HieroCachingRuleFactory_extract;
-  if (PyType_Ready(&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_3_sa_HieroCachingRuleFactory.tp_dict, __pyx_vtabptr_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "HieroCachingRuleFactory", (PyObject *)&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_3_sa_HieroCachingRuleFactory.tp_dict, __pyx_vtabptr_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "HieroCachingRuleFactory", (PyObject *)&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_HieroCachingRuleFactory = &__pyx_type_3_sa_HieroCachingRuleFactory;
   __pyx_vtabptr_3_sa_Scorer = &__pyx_vtable_3_sa_Scorer;
   __pyx_vtable_3_sa_Scorer.score = (struct __pyx_obj_3_sa_FeatureVector *(*)(struct __pyx_obj_3_sa_Scorer *, PyObject *))__pyx_f_3_sa_6Scorer_score;
@@ -62391,39 +64506,28 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetVtable(__pyx_type_3_sa_Scorer.tp_dict, __pyx_vtabptr_3_sa_Scorer) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "Scorer", (PyObject *)&__pyx_type_3_sa_Scorer) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Scorer = &__pyx_type_3_sa_Scorer;
-  if (PyType_Ready(&__pyx_Generator_type) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_3_sa___pyx_Generator = &__pyx_Generator_type;
-  __pyx_type_3_sa___pyx_scope_struct____iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct____iter__) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct____iter__ = &__pyx_type_3_sa___pyx_scope_struct____iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_1_read_bitext) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = &__pyx_type_3_sa___pyx_scope_struct_1_read_bitext;
-  __pyx_type_3_sa___pyx_scope_struct_2_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = &__pyx_type_3_sa___pyx_scope_struct_2_genexpr;
-  __pyx_type_3_sa___pyx_scope_struct_3_compute_stats.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_3_compute_stats) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats = &__pyx_type_3_sa___pyx_scope_struct_3_compute_stats;
-  __pyx_type_3_sa___pyx_scope_struct_4___iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_4___iter__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_4___iter__ = &__pyx_type_3_sa___pyx_scope_struct_4___iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_5___str__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_5___str__ = &__pyx_type_3_sa___pyx_scope_struct_5___str__;
-  __pyx_type_3_sa___pyx_scope_struct_6_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_6_genexpr) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_6_genexpr = &__pyx_type_3_sa___pyx_scope_struct_6_genexpr;
-  __pyx_type_3_sa___pyx_scope_struct_7_alignments.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_7_alignments) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_7_alignments = &__pyx_type_3_sa___pyx_scope_struct_7_alignments;
-  __pyx_type_3_sa___pyx_scope_struct_8_input.tp_base = __pyx_ptype_3_sa___pyx_Generator;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_8_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_8_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_8_input = &__pyx_type_3_sa___pyx_scope_struct_8_input;
-  __pyx_type_3_sa___pyx_scope_struct_9___iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_9___iter__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_9___iter__ = &__pyx_type_3_sa___pyx_scope_struct_9___iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_10___str__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_10___str__ = &__pyx_type_3_sa___pyx_scope_struct_10___str__;
-  __pyx_type_3_sa___pyx_scope_struct_11_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_11_genexpr) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_11_genexpr = &__pyx_type_3_sa___pyx_scope_struct_11_genexpr;
   /*--- Type import code ---*/
@@ -62471,7 +64575,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  *     if filename.endswith('.gz'):
  *         return gzip.GzipFile(filename)
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_gzip_or_text, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_1gzip_or_text, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gzip_or_text, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -62488,7 +64592,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__getLogger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_136), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_139), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__logger, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -62573,7 +64677,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
  *     return ALPHABET.fromstring(string, terminal)
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_1sym_fromstring, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_3sym_fromstring, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sym_fromstring, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -62610,7 +64714,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  * FeatureContext = namedtuple('FeatureContext',
  */
   __pyx_t_1 = PyList_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__defaultdict));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__defaultdict));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__defaultdict));
@@ -62623,15 +64727,27 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__collections), ((PyObject *)__pyx_t_1), -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__defaultdict);
+  if (__pyx_t_1 == NULL) {
+    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__defaultdict);
+    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__defaultdict, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Counter); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Counter);
+  if (__pyx_t_1 == NULL) {
+    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__Counter);
+    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__Counter, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__namedtuple);
+  if (__pyx_t_1 == NULL) {
+    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__namedtuple);
+    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__namedtuple, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -62654,8 +64770,8 @@ PyMODINIT_FUNC PyInit__sa(void)
  *      'ephrase',
  *      'paircount',
  */
-  __pyx_t_1 = PyList_New(8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__fphrase));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__fphrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fphrase));
@@ -62680,8 +64796,14 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_INCREF(((PyObject *)__pyx_n_s__test_sentence));
   PyList_SET_ITEM(__pyx_t_1, 7, ((PyObject *)__pyx_n_s__test_sentence));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__test_sentence));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__f_text));
+  PyList_SET_ITEM(__pyx_t_1, 8, ((PyObject *)__pyx_n_s__f_text));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__f_text));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__e_text));
+  PyList_SET_ITEM(__pyx_t_1, 9, ((PyObject *)__pyx_n_s__e_text));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__e_text));
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__FeatureContext));
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_n_s__FeatureContext));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__FeatureContext));
@@ -62695,7 +64817,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FeatureContext, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":25
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":27
  *     ])
  * 
  * cdef int PRECOMPUTE = 0             # <<<<<<<<<<<<<<
@@ -62704,7 +64826,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_PRECOMPUTE = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":28
  * 
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1             # <<<<<<<<<<<<<<
@@ -62713,7 +64835,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MERGE = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":29
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1
  * cdef int BAEZA_YATES = 2             # <<<<<<<<<<<<<<
@@ -62722,41 +64844,41 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_BAEZA_YATES = 2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":32
  * 
  * # NOTE: was encoded as a non-terminal in the previous version
  * cdef int EPSILON = sym_fromstring('*EPS*', True)             # <<<<<<<<<<<<<<
  * 
  * cdef class TrieNode:
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_137));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_137));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_137));
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_143));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_143));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_143));
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_v_3_sa_EPSILON = __pyx_t_4;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":53
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":55
  *     cdef public int count
  *     cdef public root
  *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
  *         self.count = 0
  *         self.extended = extended
  */
-  __pyx_t_3 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_k_99 = __pyx_t_3;
   __Pyx_GIVEREF(__pyx_t_3);
@@ -62826,7 +64948,6 @@ PyMODINIT_FUNC PyInit__sa(void)
 }
 
 /* Runtime support code */
-
 #if CYTHON_REFNANNY
 static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
     PyObject *m = NULL, *p = NULL;
@@ -62858,92 +64979,6 @@ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
     return result;
 }
 
-static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
-                                         Py_ssize_t end, int direction)
-{
-    const char* self_ptr = PyBytes_AS_STRING(self);
-    Py_ssize_t self_len = PyBytes_GET_SIZE(self);
-    const char* sub_ptr;
-    Py_ssize_t sub_len;
-    int retval;
-
-#if PY_VERSION_HEX >= 0x02060000
-    Py_buffer view;
-    view.obj = NULL;
-#endif
-
-    if ( PyBytes_Check(arg) ) {
-        sub_ptr = PyBytes_AS_STRING(arg);
-        sub_len = PyBytes_GET_SIZE(arg);
-    }
-#if PY_MAJOR_VERSION < 3
-    // Python 2.x allows mixing unicode and str
-    else if ( PyUnicode_Check(arg) ) {
-        return PyUnicode_Tailmatch(self, arg, start, end, direction);
-    }
-#endif
-    else {
-#if PY_VERSION_HEX < 0x02060000
-        if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
-            return -1;
-#else
-        if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
-            return -1;
-        sub_ptr = (const char*) view.buf;
-        sub_len = view.len;
-#endif
-    }
-
-    if (end > self_len)
-        end = self_len;
-    else if (end < 0)
-        end += self_len;
-    if (end < 0)
-        end = 0;
-    if (start < 0)
-        start += self_len;
-    if (start < 0)
-        start = 0;
-
-    if (direction > 0) {
-        /* endswith */
-        if (end-sub_len > start)
-            start = end - sub_len;
-    }
-
-    if (start + sub_len <= end)
-        retval = !memcmp(self_ptr+start, sub_ptr, sub_len);
-    else
-        retval = 0;
-
-#if PY_VERSION_HEX >= 0x02060000
-    if (view.obj)
-        PyBuffer_Release(&view);
-#endif
-
-    return retval;
-}
-
-static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
-                                   Py_ssize_t end, int direction)
-{
-    if (unlikely(PyTuple_Check(substr))) {
-        int result;
-        Py_ssize_t i;
-        for (i = 0; i < PyTuple_GET_SIZE(substr); i++) {
-            result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
-                                                   start, end, direction);
-            if (result) {
-                return result;
-            }
-        }
-        return 0;
-    }
-
-    return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
-}
-
-
 static void __Pyx_RaiseDoubleKeywordsError(
     const char* func_name,
     PyObject* kw_name)
@@ -62953,7 +64988,7 @@ static void __Pyx_RaiseDoubleKeywordsError(
         "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
         #else
         "%s() got multiple values for keyword argument '%s'", func_name,
-        PyString_AS_STRING(kw_name));
+        PyString_AsString(kw_name));
         #endif
 }
 
@@ -62969,55 +65004,77 @@ static int __Pyx_ParseOptionalKeywords(
     Py_ssize_t pos = 0;
     PyObject*** name;
     PyObject*** first_kw_arg = argnames + num_pos_args;
-
     while (PyDict_Next(kwds, &pos, &key, &value)) {
         name = first_kw_arg;
         while (*name && (**name != key)) name++;
         if (*name) {
             values[name-argnames] = value;
-        } else {
-            #if PY_MAJOR_VERSION < 3
-            if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) {
-            #else
-            if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) {
-            #endif
-                goto invalid_keyword_type;
-            } else {
-                for (name = first_kw_arg; *name; name++) {
-                    #if PY_MAJOR_VERSION >= 3
-                    if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
-                        PyUnicode_Compare(**name, key) == 0) break;
-                    #else
-                    if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
-                        _PyString_Eq(**name, key)) break;
-                    #endif
-                }
-                if (*name) {
+            continue;
+        }
+        name = first_kw_arg;
+        #if PY_MAJOR_VERSION < 3
+        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
+            while (*name) {
+                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
+                        && _PyString_Eq(**name, key)) {
                     values[name-argnames] = value;
-                } else {
-                    /* unexpected keyword found */
-                    for (name=argnames; name != first_kw_arg; name++) {
-                        if (**name == key) goto arg_passed_twice;
-                        #if PY_MAJOR_VERSION >= 3
-                        if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
-                            PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice;
-                        #else
-                        if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
-                            _PyString_Eq(**name, key)) goto arg_passed_twice;
-                        #endif
-                    }
-                    if (kwds2) {
-                        if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
-                    } else {
-                        goto invalid_keyword;
+                    break;
+                }
+                name++;
+            }
+            if (*name) continue;
+            else {
+                PyObject*** argname = argnames;
+                while (argname != first_kw_arg) {
+                    if ((**argname == key) || (
+                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
+                             && _PyString_Eq(**argname, key))) {
+                        goto arg_passed_twice;
                     }
+                    argname++;
                 }
             }
+        } else
+        #endif
+        if (likely(PyUnicode_Check(key))) {
+            while (*name) {
+                int cmp = (**name == key) ? 0 :
+                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
+                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
+                #endif
+                    PyUnicode_Compare(**name, key);
+                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
+                if (cmp == 0) {
+                    values[name-argnames] = value;
+                    break;
+                }
+                name++;
+            }
+            if (*name) continue;
+            else {
+                PyObject*** argname = argnames;
+                while (argname != first_kw_arg) {
+                    int cmp = (**argname == key) ? 0 :
+                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
+                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
+                    #endif
+                        PyUnicode_Compare(**argname, key);
+                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
+                    if (cmp == 0) goto arg_passed_twice;
+                    argname++;
+                }
+            }
+        } else
+            goto invalid_keyword_type;
+        if (kwds2) {
+            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
+        } else {
+            goto invalid_keyword;
         }
     }
     return 0;
 arg_passed_twice:
-    __Pyx_RaiseDoubleKeywordsError(function_name, **name);
+    __Pyx_RaiseDoubleKeywordsError(function_name, key);
     goto bad;
 invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
@@ -63045,7 +65102,6 @@ static void __Pyx_RaiseArgtupleInvalid(
 {
     Py_ssize_t num_expected;
     const char *more_or_less;
-
     if (num_found < num_min) {
         num_expected = num_min;
         more_or_less = "at least";
@@ -63057,15 +65113,15 @@ static void __Pyx_RaiseArgtupleInvalid(
         more_or_less = "exactly";
     }
     PyErr_Format(PyExc_TypeError,
-                 "%s() takes %s %"PY_FORMAT_SIZE_T"d positional argument%s (%"PY_FORMAT_SIZE_T"d given)",
+                 "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)",
                  func_name, more_or_less, num_expected,
                  (num_expected == 1) ? "" : "s", num_found);
 }
 
 static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
-
     tmp_type = tstate->curexc_type;
     tmp_value = tstate->curexc_value;
     tmp_tb = tstate->curexc_traceback;
@@ -63075,55 +65131,60 @@ static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyOb
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
+#else
+    PyErr_Restore(type, value, tb);
+#endif
 }
-
 static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->curexc_type;
     *value = tstate->curexc_value;
     *tb = tstate->curexc_traceback;
-
     tstate->curexc_type = 0;
     tstate->curexc_value = 0;
     tstate->curexc_traceback = 0;
+#else
+    PyErr_Fetch(type, value, tb);
+#endif
 }
 
-
 #if PY_MAJOR_VERSION < 3
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
-    /* cause is unused */
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
+                        CYTHON_UNUSED PyObject *cause) {
     Py_XINCREF(type);
-    Py_XINCREF(value);
-    Py_XINCREF(tb);
-    /* First, check the traceback argument, replacing None with NULL. */
-    if (tb == Py_None) {
-        Py_DECREF(tb);
-        tb = 0;
-    }
-    else if (tb != NULL && !PyTraceBack_Check(tb)) {
-        PyErr_SetString(PyExc_TypeError,
-            "raise: arg 3 must be a traceback or None");
-        goto raise_error;
-    }
-    /* Next, replace a missing value with None */
-    if (value == NULL) {
-        value = Py_None;
+    if (!value || value == Py_None)
+        value = NULL;
+    else
         Py_INCREF(value);
+    if (!tb || tb == Py_None)
+        tb = NULL;
+    else {
+        Py_INCREF(tb);
+        if (!PyTraceBack_Check(tb)) {
+            PyErr_SetString(PyExc_TypeError,
+                "raise: arg 3 must be a traceback or None");
+            goto raise_error;
+        }
     }
     #if PY_VERSION_HEX < 0x02050000
-    if (!PyClass_Check(type))
+    if (PyClass_Check(type)) {
     #else
-    if (!PyType_Check(type))
+    if (PyType_Check(type)) {
     #endif
-    {
-        /* Raising an instance.  The value should be a dummy. */
-        if (value != Py_None) {
+#if CYTHON_COMPILING_IN_PYPY
+        if (!value) {
+            Py_INCREF(Py_None);
+            value = Py_None;
+        }
+#endif
+        PyErr_NormalizeException(&type, &value, &tb);
+    } else {
+        if (value) {
             PyErr_SetString(PyExc_TypeError,
                 "instance exception may not have a separate value");
             goto raise_error;
         }
-        /* Normalize to raise <class>, <instance> */
-        Py_DECREF(value);
         value = type;
         #if PY_VERSION_HEX < 0x02050000
             if (PyInstance_Check(type)) {
@@ -63146,7 +65207,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             }
         #endif
     }
-
     __Pyx_ErrRestore(type, value, tb);
     return;
 raise_error:
@@ -63155,10 +65215,9 @@ raise_error:
     Py_XDECREF(tb);
     return;
 }
-
 #else /* Python 3+ */
-
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
+    PyObject* owned_instance = NULL;
     if (tb == Py_None) {
         tb = 0;
     } else if (tb && !PyTraceBack_Check(tb)) {
@@ -63168,7 +65227,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
     }
     if (value == Py_None)
         value = 0;
-
     if (PyExceptionInstance_Check(type)) {
         if (value) {
             PyErr_SetString(PyExc_TypeError,
@@ -63177,13 +65235,36 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
         }
         value = type;
         type = (PyObject*) Py_TYPE(value);
-    } else if (!PyExceptionClass_Check(type)) {
+    } else if (PyExceptionClass_Check(type)) {
+        PyObject *args;
+        if (!value)
+            args = PyTuple_New(0);
+        else if (PyTuple_Check(value)) {
+            Py_INCREF(value);
+            args = value;
+        }
+        else
+            args = PyTuple_Pack(1, value);
+        if (!args)
+            goto bad;
+        owned_instance = PyEval_CallObject(type, args);
+        Py_DECREF(args);
+        if (!owned_instance)
+            goto bad;
+        value = owned_instance;
+        if (!PyExceptionInstance_Check(value)) {
+            PyErr_Format(PyExc_TypeError,
+                         "calling %R should have returned an instance of "
+                         "BaseException, not %R",
+                         type, Py_TYPE(value));
+            goto bad;
+        }
+    } else {
         PyErr_SetString(PyExc_TypeError,
             "raise: exception class must be a subclass of BaseException");
         goto bad;
     }
-
-    if (cause) {
+    if (cause && cause != Py_None) {
         PyObject *fixed_cause;
         if (PyExceptionClass_Check(cause)) {
             fixed_cause = PyObject_CallObject(cause, NULL);
@@ -63200,14 +65281,9 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
                             "BaseException");
             goto bad;
         }
-        if (!value) {
-            value = PyObject_CallObject(type, NULL);
-        }
         PyException_SetCause(value, fixed_cause);
     }
-
     PyErr_SetObject(type, value);
-
     if (tb) {
         PyThreadState *tstate = PyThreadState_GET();
         PyObject* tmp_tb = tstate->curexc_traceback;
@@ -63217,8 +65293,8 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             Py_XDECREF(tmp_tb);
         }
     }
-
 bad:
+    Py_XDECREF(owned_instance);
     return;
 }
 #endif
@@ -63242,13 +65318,17 @@ static CYTHON_INLINE int __Pyx_CheckKeywordStrings(
 {
     PyObject* key = 0;
     Py_ssize_t pos = 0;
+#if CPYTHON_COMPILING_IN_PYPY
+    if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0))
+        goto invalid_keyword;
+    return 1;
+#else
     while (PyDict_Next(kwdict, &pos, &key, 0)) {
         #if PY_MAJOR_VERSION < 3
         if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key)))
-        #else
-        if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key)))
         #endif
-            goto invalid_keyword_type;
+            if (unlikely(!PyUnicode_Check(key)))
+                goto invalid_keyword_type;
     }
     if ((!kw_allowed) && unlikely(key))
         goto invalid_keyword;
@@ -63257,6 +65337,7 @@ invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
         "%s() keywords must be strings", function_name);
     return 0;
+#endif
 invalid_keyword:
     PyErr_Format(PyExc_TypeError,
     #if PY_MAJOR_VERSION < 3
@@ -63269,9 +65350,9 @@ invalid_keyword:
     return 0;
 }
 
-
 static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *local_type, *local_value, *local_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
     local_type = tstate->curexc_type;
@@ -63280,19 +65361,27 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->curexc_type = 0;
     tstate->curexc_value = 0;
     tstate->curexc_traceback = 0;
+#else
+    PyErr_Fetch(&local_type, &local_value, &local_tb);
+#endif
     PyErr_NormalizeException(&local_type, &local_value, &local_tb);
+#if CYTHON_COMPILING_IN_CPYTHON
     if (unlikely(tstate->curexc_type))
+#else
+    if (unlikely(PyErr_Occurred()))
+#endif
         goto bad;
     #if PY_MAJOR_VERSION >= 3
     if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
         goto bad;
     #endif
-    *type = local_type;
-    *value = local_value;
-    *tb = local_tb;
     Py_INCREF(local_type);
     Py_INCREF(local_value);
     Py_INCREF(local_tb);
+    *type = local_type;
+    *value = local_value;
+    *tb = local_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
     tmp_type = tstate->exc_type;
     tmp_value = tstate->exc_value;
     tmp_tb = tstate->exc_traceback;
@@ -63300,10 +65389,13 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->exc_value = local_value;
     tstate->exc_traceback = local_tb;
     /* Make sure tstate is in a consistent state when we XDECREF
-       these objects (XDECREF may run arbitrary code). */
+       these objects (DECREF may run arbitrary code). */
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
+#else
+    PyErr_SetExcInfo(local_type, local_value, local_tb);
+#endif
     return 0;
 bad:
     *type = 0;
@@ -63315,7 +65407,6 @@ bad:
     return -1;
 }
 
-
 static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
     PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
 }
@@ -63333,23 +65424,40 @@ static CYTHON_INLINE long __Pyx_mod_long(long a, long b) {
     return r;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
     PyErr_Format(PyExc_ValueError,
-                 "need more than %"PY_FORMAT_SIZE_T"d value%s to unpack",
-                 index, (index == 1) ? "" : "s");
+                 "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected);
 }
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
+static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
     PyErr_Format(PyExc_ValueError,
-                 "too many values to unpack (expected %"PY_FORMAT_SIZE_T"d)", expected);
+                 "need more than %" CYTHON_FORMAT_SSIZE_T "d value%s to unpack",
+                 index, (index == 1) ? "" : "s");
 }
 
-static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
-    if (unlikely(retval)) {
-        Py_DECREF(retval);
-        __Pyx_RaiseTooManyValuesError(expected);
-        return -1;
-    } else if (PyErr_Occurred()) {
+static CYTHON_INLINE int __Pyx_IterFinish(void) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyThreadState *tstate = PyThreadState_GET();
+    PyObject* exc_type = tstate->curexc_type;
+    if (unlikely(exc_type)) {
+        if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) {
+            PyObject *exc_value, *exc_tb;
+            exc_value = tstate->curexc_value;
+            exc_tb = tstate->curexc_traceback;
+            tstate->curexc_type = 0;
+            tstate->curexc_value = 0;
+            tstate->curexc_traceback = 0;
+            Py_DECREF(exc_type);
+            Py_XDECREF(exc_value);
+            Py_XDECREF(exc_tb);
+            return 0;
+        } else {
+            return -1;
+        }
+    }
+    return 0;
+#else
+    if (unlikely(PyErr_Occurred())) {
         if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) {
             PyErr_Clear();
             return 0;
@@ -63358,11 +65466,25 @@ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
         }
     }
     return 0;
+#endif
 }
 
+static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
+    if (unlikely(retval)) {
+        Py_DECREF(retval);
+        __Pyx_RaiseTooManyValuesError(expected);
+        return -1;
+    } else {
+        return __Pyx_IterFinish();
+    }
+    return 0;
+}
 
 static double __Pyx__PyObject_AsDouble(PyObject* obj) {
     PyObject* float_value;
+#if CYTHON_COMPILING_IN_PYPY
+    float_value = PyNumber_Float(obj);
+#else
     if (Py_TYPE(obj)->tp_as_number && Py_TYPE(obj)->tp_as_number->nb_float) {
         return PyFloat_AsDouble(obj);
     } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) {
@@ -63379,6 +65501,7 @@ static double __Pyx__PyObject_AsDouble(PyObject* obj) {
         PyTuple_SET_ITEM(args, 0, 0);
         Py_DECREF(args);
     }
+#endif
     if (likely(float_value)) {
         double value = PyFloat_AS_DOUBLE(float_value);
         Py_DECREF(float_value);
@@ -63412,8 +65535,158 @@ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed
     return 0;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is unsubscriptable");
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+}
+
+static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
+    if (t == Py_None) {
+      __Pyx_RaiseNoneNotIterableError();
+    } else if (PyTuple_GET_SIZE(t) < index) {
+      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
+    } else {
+      __Pyx_RaiseTooManyValuesError(index);
+    }
+}
+
+static CYTHON_INLINE int __Pyx_unpack_tuple2(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2,
+                                             int is_tuple, int has_known_size, int decref_tuple) {
+    Py_ssize_t index;
+    PyObject *value1 = NULL, *value2 = NULL, *iter = NULL;
+    if (!is_tuple && unlikely(!PyTuple_Check(tuple))) {
+        iternextfunc iternext;
+        iter = PyObject_GetIter(tuple);
+        if (unlikely(!iter)) goto bad;
+        if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; }
+        iternext = Py_TYPE(iter)->tp_iternext;
+        value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; }
+        value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; }
+        if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad;
+        Py_DECREF(iter);
+    } else {
+        if (!has_known_size && unlikely(PyTuple_GET_SIZE(tuple) != 2)) {
+            __Pyx_UnpackTupleError(tuple, 2);
+            goto bad;
+        }
+#if CYTHON_COMPILING_IN_PYPY
+        value1 = PySequence_ITEM(tuple, 0);
+        if (unlikely(!value1)) goto bad;
+        value2 = PySequence_ITEM(tuple, 1);
+        if (unlikely(!value2)) goto bad;
+#else
+        value1 = PyTuple_GET_ITEM(tuple, 0);
+        value2 = PyTuple_GET_ITEM(tuple, 1);
+        Py_INCREF(value1);
+        Py_INCREF(value2);
+#endif
+        if (decref_tuple) { Py_DECREF(tuple); }
+    }
+    *pvalue1 = value1;
+    *pvalue2 = value2;
+    return 0;
+unpacking_failed:
+    if (!has_known_size && __Pyx_IterFinish() == 0)
+        __Pyx_RaiseNeedMoreValuesError(index);
+bad:
+    Py_XDECREF(iter);
+    Py_XDECREF(value1);
+    Py_XDECREF(value2);
+    if (decref_tuple) { Py_XDECREF(tuple); }
+    return -1;
+}
+
+static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name,
+                                                   Py_ssize_t* p_orig_length, int* p_source_is_dict) {
+    is_dict = is_dict || likely(PyDict_CheckExact(iterable));
+    *p_source_is_dict = is_dict;
+#if !CYTHON_COMPILING_IN_PYPY
+    if (is_dict) {
+        *p_orig_length = PyDict_Size(iterable);
+        Py_INCREF(iterable);
+        return iterable;
+    }
+#endif
+    *p_orig_length = 0;
+    if (method_name) {
+        PyObject* iter;
+        iterable = PyObject_CallMethodObjArgs(iterable, method_name, NULL);
+        if (!iterable)
+            return NULL;
+#if !CYTHON_COMPILING_IN_PYPY
+        if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable))
+            return iterable;
+#endif
+        iter = PyObject_GetIter(iterable);
+        Py_DECREF(iterable);
+        return iter;
+    }
+    return PyObject_GetIter(iterable);
+}
+static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* iter_obj, Py_ssize_t orig_length, Py_ssize_t* ppos,
+                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) {
+    PyObject* next_item;
+#if !CYTHON_COMPILING_IN_PYPY
+    if (source_is_dict) {
+        PyObject *key, *value;
+        if (unlikely(orig_length != PyDict_Size(iter_obj))) {
+            PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration");
+            return -1;
+        }
+        if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) {
+            return 0;
+        }
+        if (pitem) {
+            PyObject* tuple = PyTuple_New(2);
+            if (unlikely(!tuple)) {
+                return -1;
+            }
+            Py_INCREF(key);
+            Py_INCREF(value);
+            PyTuple_SET_ITEM(tuple, 0, key);
+            PyTuple_SET_ITEM(tuple, 1, value);
+            *pitem = tuple;
+        } else {
+            if (pkey) {
+                Py_INCREF(key);
+                *pkey = key;
+            }
+            if (pvalue) {
+                Py_INCREF(value);
+                *pvalue = value;
+            }
+        }
+        return 1;
+    } else if (PyTuple_CheckExact(iter_obj)) {
+        Py_ssize_t pos = *ppos;
+        if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0;
+        *ppos = pos + 1;
+        next_item = PyTuple_GET_ITEM(iter_obj, pos);
+        Py_INCREF(next_item);
+    } else if (PyList_CheckExact(iter_obj)) {
+        Py_ssize_t pos = *ppos;
+        if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0;
+        *ppos = pos + 1;
+        next_item = PyList_GET_ITEM(iter_obj, pos);
+        Py_INCREF(next_item);
+    } else
+#endif
+    {
+        next_item = PyIter_Next(iter_obj);
+        if (unlikely(!next_item)) {
+            return __Pyx_IterFinish();
+        }
+    }
+    if (pitem) {
+        *pitem = next_item;
+    } else if (pkey && pvalue) {
+        if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1))
+            return -1;
+    } else if (pkey) {
+        *pkey = next_item;
+    } else {
+        *pvalue = next_item;
+    }
+    return 1;
 }
 
 static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
@@ -63424,6 +65697,7 @@ static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
 }
 
 static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->exc_type;
     *value = tstate->exc_value;
@@ -63431,9 +65705,12 @@ static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value,
     Py_XINCREF(*type);
     Py_XINCREF(*value);
     Py_XINCREF(*tb);
+#else
+    PyErr_GetExcInfo(type, value, tb);
+#endif
 }
-
 static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
     tmp_type = tstate->exc_type;
@@ -63445,6 +65722,9 @@ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb)
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
+#else
+    PyErr_SetExcInfo(type, value, tb);
+#endif
 }
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {
@@ -63473,12 +65753,33 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {
         goto bad;
     #if PY_VERSION_HEX >= 0x02050000
     {
-        PyObject *py_level = PyInt_FromLong(level);
-        if (!py_level)
-            goto bad;
-        module = PyObject_CallFunctionObjArgs(py_import,
-            name, global_dict, empty_dict, list, py_level, NULL);
-        Py_DECREF(py_level);
+        #if PY_MAJOR_VERSION >= 3
+        if (level == -1) {
+            if (strchr(__Pyx_MODULE_NAME, '.')) {
+                /* try package relative import first */
+                PyObject *py_level = PyInt_FromLong(1);
+                if (!py_level)
+                    goto bad;
+                module = PyObject_CallFunctionObjArgs(py_import,
+                    name, global_dict, empty_dict, list, py_level, NULL);
+                Py_DECREF(py_level);
+                if (!module) {
+                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
+                        goto bad;
+                    PyErr_Clear();
+                }
+            }
+            level = 0; /* try absolute import on failure */
+        }
+        #endif
+        if (!module) {
+            PyObject *py_level = PyInt_FromLong(level);
+            if (!py_level)
+                goto bad;
+            module = PyObject_CallFunctionObjArgs(py_import,
+                name, global_dict, empty_dict, list, py_level, NULL);
+            Py_DECREF(py_level);
+        }
     }
     #else
     if (level>0) {
@@ -63495,106 +65796,422 @@ bad:
     return module;
 }
 
-static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
-    if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
-        return (equals == Py_EQ);
-    } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
-        if (PyBytes_GET_SIZE(s1) != PyBytes_GET_SIZE(s2)) {
-            return (equals == Py_NE);
-        } else if (PyBytes_GET_SIZE(s1) == 1) {
-            if (equals == Py_EQ)
-                return (PyBytes_AS_STRING(s1)[0] == PyBytes_AS_STRING(s2)[0]);
-            else
-                return (PyBytes_AS_STRING(s1)[0] != PyBytes_AS_STRING(s2)[0]);
-        } else {
-            int result = memcmp(PyBytes_AS_STRING(s1), PyBytes_AS_STRING(s2), (size_t)PyBytes_GET_SIZE(s1));
-            return (equals == Py_EQ) ? (result == 0) : (result != 0);
-        }
-    } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
-        return (equals == Py_NE);
-    } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
-        return (equals == Py_NE);
-    } else {
-        int result;
-        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
-        if (!py_result)
-            return -1;
-        result = __Pyx_PyObject_IsTrue(py_result);
-        Py_DECREF(py_result);
-        return result;
-    }
+static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) {
+#if PY_MAJOR_VERSION < 3
+    PyErr_Format(PyExc_ImportError, "cannot import name %.230s",
+                 PyString_AsString(name));
+#else
+    PyErr_Format(PyExc_ImportError, "cannot import name %S", name);
+#endif
 }
 
-static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
-    if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
-        return (equals == Py_EQ);
-    } else if (PyUnicode_CheckExact(s1) & PyUnicode_CheckExact(s2)) {
-        if (PyUnicode_GET_SIZE(s1) != PyUnicode_GET_SIZE(s2)) {
-            return (equals == Py_NE);
-        } else if (PyUnicode_GET_SIZE(s1) == 1) {
-            if (equals == Py_EQ)
-                return (PyUnicode_AS_UNICODE(s1)[0] == PyUnicode_AS_UNICODE(s2)[0]);
-            else
-                return (PyUnicode_AS_UNICODE(s1)[0] != PyUnicode_AS_UNICODE(s2)[0]);
-        } else {
-            int result = PyUnicode_Compare(s1, s2);
-            if ((result == -1) && unlikely(PyErr_Occurred()))
-                return -1;
-            return (equals == Py_EQ) ? (result == 0) : (result != 0);
+static PyObject *
+__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure)
+{
+    if (op->func_doc == NULL && op->func.m_ml->ml_doc) {
+#if PY_MAJOR_VERSION >= 3
+        op->func_doc = PyUnicode_FromString(op->func.m_ml->ml_doc);
+#else
+        op->func_doc = PyString_FromString(op->func.m_ml->ml_doc);
+#endif
+    }
+    if (op->func_doc == 0) {
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+    Py_INCREF(op->func_doc);
+    return op->func_doc;
+}
+static int
+__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value)
+{
+    PyObject *tmp = op->func_doc;
+    if (value == NULL)
+        op->func_doc = Py_None; /* Mark as deleted */
+    else
+        op->func_doc = value;
+    Py_INCREF(op->func_doc);
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op)
+{
+    if (op->func_name == NULL) {
+#if PY_MAJOR_VERSION >= 3
+        op->func_name = PyUnicode_InternFromString(op->func.m_ml->ml_name);
+#else
+        op->func_name = PyString_InternFromString(op->func.m_ml->ml_name);
+#endif
+    }
+    Py_INCREF(op->func_name);
+    return op->func_name;
+}
+static int
+__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value)
+{
+    PyObject *tmp;
+#if PY_MAJOR_VERSION >= 3
+    if (value == NULL || !PyUnicode_Check(value)) {
+#else
+    if (value == NULL || !PyString_Check(value)) {
+#endif
+        PyErr_SetString(PyExc_TypeError,
+                        "__name__ must be set to a string object");
+        return -1;
+    }
+    tmp = op->func_name;
+    Py_INCREF(value);
+    op->func_name = value;
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure)
+{
+    PyObject *self;
+    self = m->func_closure;
+    if (self == NULL)
+        self = Py_None;
+    Py_INCREF(self);
+    return self;
+}
+static PyObject *
+__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op)
+{
+    if (op->func_dict == NULL) {
+        op->func_dict = PyDict_New();
+        if (op->func_dict == NULL)
+            return NULL;
+    }
+    Py_INCREF(op->func_dict);
+    return op->func_dict;
+}
+static int
+__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value)
+{
+    PyObject *tmp;
+    if (value == NULL) {
+        PyErr_SetString(PyExc_TypeError,
+               "function's dictionary may not be deleted");
+        return -1;
+    }
+    if (!PyDict_Check(value)) {
+        PyErr_SetString(PyExc_TypeError,
+               "setting function's dictionary to a non-dict");
+        return -1;
+    }
+    tmp = op->func_dict;
+    Py_INCREF(value);
+    op->func_dict = value;
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_globals(CYTHON_UNUSED __pyx_CyFunctionObject *op)
+{
+    PyObject* dict = PyModule_GetDict(__pyx_m);
+    Py_XINCREF(dict);
+    return dict;
+}
+static PyObject *
+__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op)
+{
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+static PyObject *
+__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op)
+{
+    PyObject* result = (op->func_code) ? op->func_code : Py_None;
+    Py_INCREF(result);
+    return result;
+}
+static PyObject *
+__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op)
+{
+    if (op->defaults_tuple) {
+        Py_INCREF(op->defaults_tuple);
+        return op->defaults_tuple;
+    }
+    if (op->defaults_getter) {
+        PyObject *res = op->defaults_getter((PyObject *) op);
+        if (res) {
+            Py_INCREF(res);
+            op->defaults_tuple = res;
         }
-    } else if ((s1 == Py_None) & PyUnicode_CheckExact(s2)) {
-        return (equals == Py_NE);
-    } else if ((s2 == Py_None) & PyUnicode_CheckExact(s1)) {
-        return (equals == Py_NE);
-    } else {
-        int result;
-        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
-        if (!py_result)
-            return -1;
-        result = __Pyx_PyObject_IsTrue(py_result);
-        Py_DECREF(py_result);
-        return result;
+        return res;
     }
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+static PyGetSetDef __pyx_CyFunction_getsets[] = {
+    {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
+    {(char *) "__doc__",  (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
+    {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
+    {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
+    {(char *) "__self__", (getter)__Pyx_CyFunction_get_self, 0, 0, 0},
+    {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
+    {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
+    {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
+    {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
+    {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
+    {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
+    {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
+    {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
+    {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, 0, 0, 0},
+    {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, 0, 0, 0},
+    {0, 0, 0, 0, 0}
+};
+#ifndef PY_WRITE_RESTRICTED /* < Py2.5 */
+#define PY_WRITE_RESTRICTED WRITE_RESTRICTED
+#endif
+static PyMemberDef __pyx_CyFunction_members[] = {
+    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CyFunctionObject, func.m_module), PY_WRITE_RESTRICTED, 0},
+    {0, 0, 0,  0, 0}
+};
+static PyObject *
+__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args)
+{
+#if PY_MAJOR_VERSION >= 3
+    return PyUnicode_FromString(m->func.m_ml->ml_name);
+#else
+    return PyString_FromString(m->func.m_ml->ml_name);
+#endif
 }
-
-
-static PyObject *__pyx_binding_PyCFunctionType_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) {
-    __pyx_binding_PyCFunctionType_object *op = PyObject_GC_New(__pyx_binding_PyCFunctionType_object, __pyx_binding_PyCFunctionType);
+static PyMethodDef __pyx_CyFunction_methods[] = {
+    {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0},
+    {0, 0, 0, 0}
+};
+static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags,
+                                      PyObject *closure, PyObject *module, PyObject* code) {
+    __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type);
     if (op == NULL)
         return NULL;
+    op->flags = flags;
+    op->func_weakreflist = NULL;
     op->func.m_ml = ml;
-    Py_XINCREF(self);
-    op->func.m_self = self;
+    op->func.m_self = (PyObject *) op;
+    Py_XINCREF(closure);
+    op->func_closure = closure;
     Py_XINCREF(module);
     op->func.m_module = module;
+    op->func_dict = NULL;
+    op->func_name = NULL;
+    op->func_doc = NULL;
+    op->func_classobj = NULL;
+    Py_XINCREF(code);
+    op->func_code = code;
+    op->defaults_pyobjects = 0;
+    op->defaults = NULL;
+    op->defaults_tuple = NULL;
+    op->defaults_getter = NULL;
     PyObject_GC_Track(op);
-    return (PyObject *)op;
+    return (PyObject *) op;
 }
-
-static void __pyx_binding_PyCFunctionType_dealloc(__pyx_binding_PyCFunctionType_object *m) {
+static int
+__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
+{
+    Py_CLEAR(m->func_closure);
+    Py_CLEAR(m->func.m_module);
+    Py_CLEAR(m->func_dict);
+    Py_CLEAR(m->func_name);
+    Py_CLEAR(m->func_doc);
+    Py_CLEAR(m->func_code);
+    Py_CLEAR(m->func_classobj);
+    Py_CLEAR(m->defaults_tuple);
+    if (m->defaults) {
+        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
+        int i;
+        for (i = 0; i < m->defaults_pyobjects; i++)
+            Py_XDECREF(pydefaults[i]);
+        PyMem_Free(m->defaults);
+        m->defaults = NULL;
+    }
+    return 0;
+}
+static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
+{
     PyObject_GC_UnTrack(m);
-    Py_XDECREF(m->func.m_self);
-    Py_XDECREF(m->func.m_module);
+    if (m->func_weakreflist != NULL)
+        PyObject_ClearWeakRefs((PyObject *) m);
+    __Pyx_CyFunction_clear(m);
     PyObject_GC_Del(m);
 }
-
-static PyObject *__pyx_binding_PyCFunctionType_descr_get(PyObject *func, PyObject *obj, PyObject *type) {
+static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg)
+{
+    Py_VISIT(m->func_closure);
+    Py_VISIT(m->func.m_module);
+    Py_VISIT(m->func_dict);
+    Py_VISIT(m->func_name);
+    Py_VISIT(m->func_doc);
+    Py_VISIT(m->func_code);
+    Py_VISIT(m->func_classobj);
+    Py_VISIT(m->defaults_tuple);
+    if (m->defaults) {
+        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
+        int i;
+        for (i = 0; i < m->defaults_pyobjects; i++)
+            Py_VISIT(pydefaults[i]);
+    }
+    return 0;
+}
+static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
+{
+    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
+    if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
+        Py_INCREF(func);
+        return func;
+    }
+    if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
+        if (type == NULL)
+            type = (PyObject *)(Py_TYPE(obj));
+        return PyMethod_New(func,
+                            type, (PyObject *)(Py_TYPE(type)));
+    }
     if (obj == Py_None)
-            obj = NULL;
+        obj = NULL;
     return PyMethod_New(func, obj, type);
 }
-
-static int __pyx_binding_PyCFunctionType_init(void) {
-    __pyx_binding_PyCFunctionType_type = PyCFunction_Type;
-    __pyx_binding_PyCFunctionType_type.tp_name = __Pyx_NAMESTR("cython_binding_builtin_function_or_method");
-    __pyx_binding_PyCFunctionType_type.tp_dealloc = (destructor)__pyx_binding_PyCFunctionType_dealloc;
-    __pyx_binding_PyCFunctionType_type.tp_descr_get = __pyx_binding_PyCFunctionType_descr_get;
-    if (PyType_Ready(&__pyx_binding_PyCFunctionType_type) < 0) {
-        return -1;
+static PyObject*
+__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op)
+{
+    PyObject *func_name = __Pyx_CyFunction_get_name(op);
+#if PY_MAJOR_VERSION >= 3
+    return PyUnicode_FromFormat("<cyfunction %U at %p>",
+                                func_name, (void *)op);
+#else
+    return PyString_FromFormat("<cyfunction %s at %p>",
+                               PyString_AsString(func_name), (void *)op);
+#endif
+}
+#if CYTHON_COMPILING_IN_PYPY
+static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+    PyCFunctionObject* f = (PyCFunctionObject*)func;
+    PyCFunction meth = PyCFunction_GET_FUNCTION(func);
+    PyObject *self = PyCFunction_GET_SELF(func);
+    Py_ssize_t size;
+    switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
+    case METH_VARARGS:
+        if (likely(kw == NULL) || PyDict_Size(kw) == 0)
+            return (*meth)(self, arg);
+        break;
+    case METH_VARARGS | METH_KEYWORDS:
+        return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
+    case METH_NOARGS:
+        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
+            size = PyTuple_GET_SIZE(arg);
+            if (size == 0)
+                return (*meth)(self, NULL);
+            PyErr_Format(PyExc_TypeError,
+                "%.200s() takes no arguments (%zd given)",
+                f->m_ml->ml_name, size);
+            return NULL;
+        }
+        break;
+    case METH_O:
+        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
+            size = PyTuple_GET_SIZE(arg);
+            if (size == 1)
+                return (*meth)(self, PyTuple_GET_ITEM(arg, 0));
+            PyErr_Format(PyExc_TypeError,
+                "%.200s() takes exactly one argument (%zd given)",
+                f->m_ml->ml_name, size);
+            return NULL;
+        }
+        break;
+    default:
+        PyErr_SetString(PyExc_SystemError, "Bad call flags in "
+                        "__Pyx_CyFunction_Call. METH_OLDARGS is no "
+                        "longer supported!");
+        return NULL;
     }
-    __pyx_binding_PyCFunctionType = &__pyx_binding_PyCFunctionType_type;
+    PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
+                 f->m_ml->ml_name);
+    return NULL;
+}
+#else
+static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+	return PyCFunction_Call(func, arg, kw);
+}
+#endif
+static PyTypeObject __pyx_CyFunctionType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    __Pyx_NAMESTR("cython_function_or_method"), /*tp_name*/
+    sizeof(__pyx_CyFunctionObject),   /*tp_basicsize*/
+    0,                                  /*tp_itemsize*/
+    (destructor) __Pyx_CyFunction_dealloc, /*tp_dealloc*/
+    0,                                  /*tp_print*/
+    0,                                  /*tp_getattr*/
+    0,                                  /*tp_setattr*/
+#if PY_MAJOR_VERSION < 3
+    0,                                  /*tp_compare*/
+#else
+    0,                                  /*reserved*/
+#endif
+    (reprfunc) __Pyx_CyFunction_repr,   /*tp_repr*/
+    0,                                  /*tp_as_number*/
+    0,                                  /*tp_as_sequence*/
+    0,                                  /*tp_as_mapping*/
+    0,                                  /*tp_hash*/
+    __Pyx_CyFunction_Call,              /*tp_call*/
+    0,                                  /*tp_str*/
+    0,                                  /*tp_getattro*/
+    0,                                  /*tp_setattro*/
+    0,                                  /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
+    0,                                  /*tp_doc*/
+    (traverseproc) __Pyx_CyFunction_traverse,   /*tp_traverse*/
+    (inquiry) __Pyx_CyFunction_clear,   /*tp_clear*/
+    0,                                  /*tp_richcompare*/
+    offsetof(__pyx_CyFunctionObject, func_weakreflist), /* tp_weaklistoffse */
+    0,                                  /*tp_iter*/
+    0,                                  /*tp_iternext*/
+    __pyx_CyFunction_methods,           /*tp_methods*/
+    __pyx_CyFunction_members,           /*tp_members*/
+    __pyx_CyFunction_getsets,           /*tp_getset*/
+    0,                                  /*tp_base*/
+    0,                                  /*tp_dict*/
+    __Pyx_CyFunction_descr_get,         /*tp_descr_get*/
+    0,                                  /*tp_descr_set*/
+    offsetof(__pyx_CyFunctionObject, func_dict),/*tp_dictoffset*/
+    0,                                  /*tp_init*/
+    0,                                  /*tp_alloc*/
+    0,                                  /*tp_new*/
+    0,                                  /*tp_free*/
+    0,                                  /*tp_is_gc*/
+    0,                                  /*tp_bases*/
+    0,                                  /*tp_mro*/
+    0,                                  /*tp_cache*/
+    0,                                  /*tp_subclasses*/
+    0,                                  /*tp_weaklist*/
+    0,                                  /*tp_del*/
+#if PY_VERSION_HEX >= 0x02060000
+    0,                                  /*tp_version_tag*/
+#endif
+};
+static int __Pyx_CyFunction_init(void) {
+#if !CYTHON_COMPILING_IN_PYPY
+    __pyx_CyFunctionType_type.tp_call = PyCFunction_Call;
+#endif
+    if (PyType_Ready(&__pyx_CyFunctionType_type) < 0)
+        return -1;
+    __pyx_CyFunctionType = &__pyx_CyFunctionType_type;
     return 0;
-
+}
+static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) {
+    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
+    m->defaults = PyMem_Malloc(size);
+    if (!m->defaults)
+        return PyErr_NoMemory();
+    memset(m->defaults, 0, sizeof(size));
+    m->defaults_pyobjects = pyobjects;
+    return m->defaults;
+}
+static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) {
+    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
+    m->defaults_tuple = tuple;
+    Py_INCREF(tuple);
 }
 
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
@@ -63997,8 +66614,8 @@ static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject*
     }
 }
 
-static void __Pyx_WriteUnraisable(const char *name, int clineno,
-                                  int lineno, const char *filename) {
+static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
+                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename) {
     PyObject *old_exc, *old_val, *old_tb;
     PyObject *ctx;
     __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
@@ -64018,125 +66635,522 @@ static void __Pyx_WriteUnraisable(const char *name, int clineno,
 
 static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *tmp_type, *tmp_value, *tmp_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
-
     tmp_type = tstate->exc_type;
     tmp_value = tstate->exc_value;
     tmp_tb = tstate->exc_traceback;
-
     tstate->exc_type = *type;
     tstate->exc_value = *value;
     tstate->exc_traceback = *tb;
-
+#else
+    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
+    PyErr_SetExcInfo(*type, *value, *tb);
+#endif
     *type = tmp_type;
     *value = tmp_value;
     *tb = tmp_tb;
 }
 
-static CYTHON_INLINE void __Pyx_Generator_ExceptionClear(struct __pyx_Generator_object *self)
-{
-    Py_XDECREF(self->exc_type);
-    Py_XDECREF(self->exc_value);
-    Py_XDECREF(self->exc_traceback);
-
+static PyObject *__Pyx_Generator_Next(PyObject *self);
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
+static PyObject *__Pyx_Generator_Close(PyObject *self);
+static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args);
+static PyTypeObject *__pyx_GeneratorType = 0;
+#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
+#define __Pyx_Generator_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
+#if 1 || PY_VERSION_HEX < 0x030300B0
+static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
+    PyObject *et, *ev, *tb;
+    PyObject *value = NULL;
+    __Pyx_ErrFetch(&et, &ev, &tb);
+    if (!et) {
+        Py_XDECREF(tb);
+        Py_XDECREF(ev);
+        Py_INCREF(Py_None);
+        *pvalue = Py_None;
+        return 0;
+    }
+    if (unlikely(et != PyExc_StopIteration) &&
+            unlikely(!PyErr_GivenExceptionMatches(et, PyExc_StopIteration))) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    if (likely(et == PyExc_StopIteration)) {
+        if (likely(!ev) || !PyObject_IsInstance(ev, PyExc_StopIteration)) {
+            if (!ev) {
+                Py_INCREF(Py_None);
+                ev = Py_None;
+            }
+            Py_XDECREF(tb);
+            Py_DECREF(et);
+            *pvalue = ev;
+            return 0;
+        }
+    }
+    PyErr_NormalizeException(&et, &ev, &tb);
+    if (unlikely(!PyObject_IsInstance(ev, PyExc_StopIteration))) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    Py_XDECREF(tb);
+    Py_DECREF(et);
+#if PY_VERSION_HEX >= 0x030300A0
+    value = ((PyStopIterationObject *)ev)->value;
+    Py_INCREF(value);
+    Py_DECREF(ev);
+#else
+    {
+        PyObject* args = PyObject_GetAttrString(ev, "args");
+        Py_DECREF(ev);
+        if (likely(args)) {
+            value = PyObject_GetItem(args, 0);
+            Py_DECREF(args);
+        }
+        if (unlikely(!value)) {
+            __Pyx_ErrRestore(NULL, NULL, NULL);
+            Py_INCREF(Py_None);
+            value = Py_None;
+        }
+    }
+#endif
+    *pvalue = value;
+    return 0;
+}
+#endif
+static CYTHON_INLINE
+void __Pyx_Generator_ExceptionClear(__pyx_GeneratorObject *self) {
+    PyObject *exc_type = self->exc_type;
+    PyObject *exc_value = self->exc_value;
+    PyObject *exc_traceback = self->exc_traceback;
     self->exc_type = NULL;
     self->exc_value = NULL;
     self->exc_traceback = NULL;
+    Py_XDECREF(exc_type);
+    Py_XDECREF(exc_value);
+    Py_XDECREF(exc_traceback);
 }
-
-static CYTHON_INLINE PyObject *__Pyx_Generator_SendEx(struct __pyx_Generator_object *self, PyObject *value)
-{
-    PyObject *retval;
-
-    if (self->is_running) {
+static CYTHON_INLINE
+int __Pyx_Generator_CheckRunning(__pyx_GeneratorObject *gen) {
+    if (unlikely(gen->is_running)) {
         PyErr_SetString(PyExc_ValueError,
                         "generator already executing");
-        return NULL;
+        return 1;
     }
-
-    if (self->resume_label == 0) {
-        if (value && value != Py_None) {
+    return 0;
+}
+static CYTHON_INLINE
+PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value) {
+    PyObject *retval;
+    assert(!self->is_running);
+    if (unlikely(self->resume_label == 0)) {
+        if (unlikely(value && value != Py_None)) {
             PyErr_SetString(PyExc_TypeError,
                             "can't send non-None value to a "
                             "just-started generator");
             return NULL;
         }
     }
-
-    if (self->resume_label == -1) {
+    if (unlikely(self->resume_label == -1)) {
         PyErr_SetNone(PyExc_StopIteration);
         return NULL;
     }
-
-
-    if (value)
-        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback);
-    else
+    if (value) {
+#if CYTHON_COMPILING_IN_PYPY
+#else
+        /* Generators always return to their most recent caller, not
+         * necessarily their creator. */
+        if (self->exc_traceback) {
+            PyThreadState *tstate = PyThreadState_GET();
+            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
+            PyFrameObject *f = tb->tb_frame;
+            Py_XINCREF(tstate->frame);
+            assert(f->f_back == NULL);
+            f->f_back = tstate->frame;
+        }
+#endif
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
+                            &self->exc_traceback);
+    } else {
         __Pyx_Generator_ExceptionClear(self);
-
+    }
     self->is_running = 1;
     retval = self->body((PyObject *) self, value);
     self->is_running = 0;
-
-    if (retval)
-        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback);
-    else
+    if (retval) {
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
+                            &self->exc_traceback);
+#if CYTHON_COMPILING_IN_PYPY
+#else
+        /* Don't keep the reference to f_back any longer than necessary.  It
+         * may keep a chain of frames alive or it could create a reference
+         * cycle. */
+        if (self->exc_traceback) {
+            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
+            PyFrameObject *f = tb->tb_frame;
+            Py_CLEAR(f->f_back);
+        }
+#endif
+    } else {
         __Pyx_Generator_ExceptionClear(self);
-
+    }
     return retval;
 }
-
-static PyObject *__Pyx_Generator_Next(PyObject *self)
-{
-    return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, Py_None);
-}
-
-static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value)
-{
-    return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, value);
+static CYTHON_INLINE
+PyObject *__Pyx_Generator_FinishDelegation(__pyx_GeneratorObject *gen) {
+    PyObject *ret;
+    PyObject *val = NULL;
+    __Pyx_Generator_Undelegate(gen);
+    __Pyx_PyGen_FetchStopIterationValue(&val);
+    ret = __Pyx_Generator_SendEx(gen, val);
+    Py_XDECREF(val);
+    return ret;
+}
+static PyObject *__Pyx_Generator_Next(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        ret = Py_TYPE(yf)->tp_iternext(yf);
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Generator_FinishDelegation(gen);
+    }
+    return __Pyx_Generator_SendEx(gen, Py_None);
 }
-
-static PyObject *__Pyx_Generator_Close(PyObject *self)
-{
-    struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
-    PyObject *retval;
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Send(yf, value);
+        } else {
+            if (value == Py_None)
+                ret = PyIter_Next(yf);
+            else
+                ret = PyObject_CallMethod(yf, (char*)"send", (char*)"O", value);
+        }
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Generator_FinishDelegation(gen);
+    }
+    return __Pyx_Generator_SendEx(gen, value);
+}
+static int __Pyx_Generator_CloseIter(__pyx_GeneratorObject *gen, PyObject *yf) {
+    PyObject *retval = NULL;
+    int err = 0;
+    if (__Pyx_Generator_CheckExact(yf)) {
+        retval = __Pyx_Generator_Close(yf);
+        if (!retval)
+            return -1;
+    } else {
+        PyObject *meth;
+        gen->is_running = 1;
+        meth = PyObject_GetAttrString(yf, "close");
+        if (unlikely(!meth)) {
+            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                PyErr_WriteUnraisable(yf);
+            }
+            PyErr_Clear();
+        } else {
+            retval = PyObject_CallFunction(meth, NULL);
+            Py_DECREF(meth);
+            if (!retval)
+                err = -1;
+        }
+        gen->is_running = 0;
+    }
+    Py_XDECREF(retval);
+    return err;
+}
+static PyObject *__Pyx_Generator_Close(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject *retval, *raised_exception;
+    PyObject *yf = gen->yieldfrom;
+    int err = 0;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        Py_INCREF(yf);
+        err = __Pyx_Generator_CloseIter(gen, yf);
+        __Pyx_Generator_Undelegate(gen);
+        Py_DECREF(yf);
+    }
+    if (err == 0)
 #if PY_VERSION_HEX < 0x02050000
-    PyErr_SetNone(PyExc_StopIteration);
+        PyErr_SetNone(PyExc_StopIteration);
 #else
-    PyErr_SetNone(PyExc_GeneratorExit);
+        PyErr_SetNone(PyExc_GeneratorExit);
 #endif
-    retval = __Pyx_Generator_SendEx(generator, NULL);
+    retval = __Pyx_Generator_SendEx(gen, NULL);
     if (retval) {
         Py_DECREF(retval);
         PyErr_SetString(PyExc_RuntimeError,
                         "generator ignored GeneratorExit");
         return NULL;
     }
-#if PY_VERSION_HEX < 0x02050000
-    if (PyErr_ExceptionMatches(PyExc_StopIteration))
-#else
-    if (PyErr_ExceptionMatches(PyExc_StopIteration)
-        || PyErr_ExceptionMatches(PyExc_GeneratorExit))
+    raised_exception = PyErr_Occurred();
+    if (!raised_exception
+        || raised_exception == PyExc_StopIteration
+#if PY_VERSION_HEX >= 0x02050000
+        || raised_exception == PyExc_GeneratorExit
+        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
 #endif
+        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
     {
-        PyErr_Clear();          /* ignore these errors */
+        if (raised_exception) PyErr_Clear();      /* ignore these errors */
         Py_INCREF(Py_None);
         return Py_None;
     }
     return NULL;
 }
-
-static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args, CYTHON_UNUSED PyObject *kwds)
-{
-    struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
+static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
     PyObject *typ;
     PyObject *tb = NULL;
     PyObject *val = NULL;
-
+    PyObject *yf = gen->yieldfrom;
     if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
         return NULL;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        Py_INCREF(yf);
+#if PY_VERSION_HEX >= 0x02050000
+        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
+            int err = __Pyx_Generator_CloseIter(gen, yf);
+            Py_DECREF(yf);
+            __Pyx_Generator_Undelegate(gen);
+            if (err < 0)
+                return __Pyx_Generator_SendEx(gen, NULL);
+            goto throw_here;
+        }
+#endif
+        gen->is_running = 1;
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Throw(yf, args);
+        } else {
+            PyObject *meth = PyObject_GetAttrString(yf, "throw");
+            if (unlikely(!meth)) {
+                Py_DECREF(yf);
+                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                    gen->is_running = 0;
+                    return NULL;
+                }
+                PyErr_Clear();
+                __Pyx_Generator_Undelegate(gen);
+                gen->is_running = 0;
+                goto throw_here;
+            }
+            ret = PyObject_CallObject(meth, args);
+            Py_DECREF(meth);
+        }
+        gen->is_running = 0;
+        Py_DECREF(yf);
+        if (!ret) {
+            ret = __Pyx_Generator_FinishDelegation(gen);
+        }
+        return ret;
+    }
+throw_here:
     __Pyx_Raise(typ, val, tb, NULL);
-    return __Pyx_Generator_SendEx(generator, NULL);
+    return __Pyx_Generator_SendEx(gen, NULL);
+}
+static int __Pyx_Generator_traverse(PyObject *self, visitproc visit, void *arg) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    Py_VISIT(gen->closure);
+    Py_VISIT(gen->classobj);
+    Py_VISIT(gen->yieldfrom);
+    Py_VISIT(gen->exc_type);
+    Py_VISIT(gen->exc_value);
+    Py_VISIT(gen->exc_traceback);
+    return 0;
+}
+static int __Pyx_Generator_clear(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    Py_CLEAR(gen->closure);
+    Py_CLEAR(gen->classobj);
+    Py_CLEAR(gen->yieldfrom);
+    Py_CLEAR(gen->exc_type);
+    Py_CLEAR(gen->exc_value);
+    Py_CLEAR(gen->exc_traceback);
+    return 0;
+}
+static void __Pyx_Generator_dealloc(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject_GC_UnTrack(gen);
+    if (gen->gi_weakreflist != NULL)
+        PyObject_ClearWeakRefs(self);
+    PyObject_GC_Track(self);
+    if (gen->resume_label > 0) {
+        Py_TYPE(gen)->tp_del(self);
+        if (self->ob_refcnt > 0)
+            return;                     /* resurrected.  :( */
+    }
+    PyObject_GC_UnTrack(self);
+    __Pyx_Generator_clear(self);
+    PyObject_GC_Del(gen);
+}
+static void __Pyx_Generator_del(PyObject *self) {
+    PyObject *res;
+    PyObject *error_type, *error_value, *error_traceback;
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    if (gen->resume_label <= 0)
+        return ;
+    assert(self->ob_refcnt == 0);
+    self->ob_refcnt = 1;
+    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
+    res = __Pyx_Generator_Close(self);
+    if (res == NULL)
+        PyErr_WriteUnraisable(self);
+    else
+        Py_DECREF(res);
+    __Pyx_ErrRestore(error_type, error_value, error_traceback);
+    /* Undo the temporary resurrection; can't use DECREF here, it would
+     * cause a recursive call.
+     */
+    assert(self->ob_refcnt > 0);
+    if (--self->ob_refcnt == 0)
+        return; /* this is the normal path out */
+    /* close() resurrected it!  Make it look like the original Py_DECREF
+     * never happened.
+     */
+    {
+        Py_ssize_t refcnt = self->ob_refcnt;
+        _Py_NewReference(self);
+        self->ob_refcnt = refcnt;
+    }
+#if CYTHON_COMPILING_FOR_CPYTHON
+    assert(PyType_IS_GC(self->ob_type) &&
+           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
+    /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
+     * we need to undo that. */
+    _Py_DEC_REFTOTAL;
+#endif
+    /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
+     * chain, so no more to do there.
+     * If COUNT_ALLOCS, the original decref bumped tp_frees, and
+     * _Py_NewReference bumped tp_allocs:  both of those need to be
+     * undone.
+     */
+#ifdef COUNT_ALLOCS
+    --Py_TYPE(self)->tp_frees;
+    --Py_TYPE(self)->tp_allocs;
+#endif
+}
+static PyMemberDef __pyx_Generator_memberlist[] = {
+    {(char *) "gi_running",
+#if PY_VERSION_HEX >= 0x02060000
+     T_BOOL,
+#else
+     T_BYTE,
+#endif
+     offsetof(__pyx_GeneratorObject, is_running),
+     READONLY,
+     NULL},
+    {0, 0, 0, 0, 0}
+};
+static PyMethodDef __pyx_Generator_methods[] = {
+    {__Pyx_NAMESTR("send"), (PyCFunction) __Pyx_Generator_Send, METH_O, 0},
+    {__Pyx_NAMESTR("throw"), (PyCFunction) __Pyx_Generator_Throw, METH_VARARGS, 0},
+    {__Pyx_NAMESTR("close"), (PyCFunction) __Pyx_Generator_Close, METH_NOARGS, 0},
+    {0, 0, 0, 0}
+};
+static PyTypeObject __pyx_GeneratorType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    __Pyx_NAMESTR("generator"),         /*tp_name*/
+    sizeof(__pyx_GeneratorObject),      /*tp_basicsize*/
+    0,                                  /*tp_itemsize*/
+    (destructor) __Pyx_Generator_dealloc,/*tp_dealloc*/
+    0,                                  /*tp_print*/
+    0,                                  /*tp_getattr*/
+    0,                                  /*tp_setattr*/
+#if PY_MAJOR_VERSION < 3
+    0,                                  /*tp_compare*/
+#else
+    0,                                  /*reserved*/
+#endif
+    0,                                   /*tp_repr*/
+    0,                                  /*tp_as_number*/
+    0,                                  /*tp_as_sequence*/
+    0,                                  /*tp_as_mapping*/
+    0,                                  /*tp_hash*/
+    0,                                  /*tp_call*/
+    0,                                  /*tp_str*/
+    0,                                  /*tp_getattro*/
+    0,                                  /*tp_setattro*/
+    0,                                  /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
+    0,                                  /*tp_doc*/
+    (traverseproc) __Pyx_Generator_traverse,   /*tp_traverse*/
+    0,                                  /*tp_clear*/
+    0,                                  /*tp_richcompare*/
+    offsetof(__pyx_GeneratorObject, gi_weakreflist), /* tp_weaklistoffse */
+    0,                                  /*tp_iter*/
+    (iternextfunc) __Pyx_Generator_Next, /*tp_iternext*/
+    __pyx_Generator_methods,            /*tp_methods*/
+    __pyx_Generator_memberlist,         /*tp_members*/
+    0,                                  /*tp_getset*/
+    0,                                  /*tp_base*/
+    0,                                  /*tp_dict*/
+    0,                                  /*tp_descr_get*/
+    0,                                  /*tp_descr_set*/
+    0,                                  /*tp_dictoffset*/
+    0,                                  /*tp_init*/
+    0,                                  /*tp_alloc*/
+    0,                                  /*tp_new*/
+    0,                                  /*tp_free*/
+    0,                                  /*tp_is_gc*/
+    0,                                  /*tp_bases*/
+    0,                                  /*tp_mro*/
+    0,                                  /*tp_cache*/
+    0,                                  /*tp_subclasses*/
+    0,                                  /*tp_weaklist*/
+    __Pyx_Generator_del,                /*tp_del*/
+#if PY_VERSION_HEX >= 0x02060000
+    0,                                  /*tp_version_tag*/
+#endif
+};
+static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                                  PyObject *closure) {
+    __pyx_GeneratorObject *gen =
+        PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType_type);
+    if (gen == NULL)
+        return NULL;
+    gen->body = body;
+    gen->closure = closure;
+    Py_XINCREF(closure);
+    gen->is_running = 0;
+    gen->resume_label = 0;
+    gen->classobj = NULL;
+    gen->yieldfrom = NULL;
+    gen->exc_type = NULL;
+    gen->exc_value = NULL;
+    gen->exc_traceback = NULL;
+    gen->gi_weakreflist = NULL;
+    PyObject_GC_Track(gen);
+    return gen;
+}
+static int __pyx_Generator_init(void) {
+    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
+    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
+    if (PyType_Ready(&__pyx_GeneratorType_type)) {
+        return -1;
+    }
+    __pyx_GeneratorType = &__pyx_GeneratorType_type;
+    return 0;
 }
 
 static int __Pyx_check_binary_version(void) {
@@ -64165,7 +67179,6 @@ static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *s
         void (*fp)(void);
         void *p;
     } tmp;
-
     d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__");
     if (!d) {
         PyErr_Clear();
@@ -64212,29 +67225,105 @@ bad:
     return -1;
 }
 
+static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
+    int start = 0, mid = 0, end = count - 1;
+    if (end >= 0 && code_line > entries[end].code_line) {
+        return count;
+    }
+    while (start < end) {
+        mid = (start + end) / 2;
+        if (code_line < entries[mid].code_line) {
+            end = mid;
+        } else if (code_line > entries[mid].code_line) {
+             start = mid + 1;
+        } else {
+            return mid;
+        }
+    }
+    if (code_line <= entries[mid].code_line) {
+        return mid;
+    } else {
+        return mid + 1;
+    }
+}
+static PyCodeObject *__pyx_find_code_object(int code_line) {
+    PyCodeObject* code_object;
+    int pos;
+    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
+        return NULL;
+    }
+    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
+        return NULL;
+    }
+    code_object = __pyx_code_cache.entries[pos].code_object;
+    Py_INCREF(code_object);
+    return code_object;
+}
+static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
+    int pos, i;
+    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
+    if (unlikely(!code_line)) {
+        return;
+    }
+    if (unlikely(!entries)) {
+        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
+        if (likely(entries)) {
+            __pyx_code_cache.entries = entries;
+            __pyx_code_cache.max_count = 64;
+            __pyx_code_cache.count = 1;
+            entries[0].code_line = code_line;
+            entries[0].code_object = code_object;
+            Py_INCREF(code_object);
+        }
+        return;
+    }
+    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
+        PyCodeObject* tmp = entries[pos].code_object;
+        entries[pos].code_object = code_object;
+        Py_DECREF(tmp);
+        return;
+    }
+    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
+        int new_max = __pyx_code_cache.max_count + 64;
+        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
+            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));
+        if (unlikely(!entries)) {
+            return;
+        }
+        __pyx_code_cache.entries = entries;
+        __pyx_code_cache.max_count = new_max;
+    }
+    for (i=__pyx_code_cache.count; i>pos; i--) {
+        entries[i] = entries[i-1];
+    }
+    entries[pos].code_line = code_line;
+    entries[pos].code_object = code_object;
+    __pyx_code_cache.count++;
+    Py_INCREF(code_object);
+}
+
 #include "compile.h"
 #include "frameobject.h"
 #include "traceback.h"
-
-static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
-                               int __pyx_lineno, const char *__pyx_filename) {
+static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
+            const char *funcname, int c_line,
+            int py_line, const char *filename) {
+    PyCodeObject *py_code = 0;
     PyObject *py_srcfile = 0;
     PyObject *py_funcname = 0;
-    PyObject *py_globals = 0;
-    PyCodeObject *py_code = 0;
-    PyFrameObject *py_frame = 0;
-
     #if PY_MAJOR_VERSION < 3
-    py_srcfile = PyString_FromString(__pyx_filename);
+    py_srcfile = PyString_FromString(filename);
     #else
-    py_srcfile = PyUnicode_FromString(__pyx_filename);
+    py_srcfile = PyUnicode_FromString(filename);
     #endif
     if (!py_srcfile) goto bad;
-    if (__pyx_clineno) {
+    if (c_line) {
         #if PY_MAJOR_VERSION < 3
-        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
+        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
         #else
-        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
+        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
         #endif
     }
     else {
@@ -64245,28 +67334,45 @@ static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
         #endif
     }
     if (!py_funcname) goto bad;
-    py_globals = PyModule_GetDict(__pyx_m);
-    if (!py_globals) goto bad;
-    py_code = PyCode_New(
+    py_code = __Pyx_PyCode_New(
         0,            /*int argcount,*/
-        #if PY_MAJOR_VERSION >= 3
         0,            /*int kwonlyargcount,*/
-        #endif
         0,            /*int nlocals,*/
         0,            /*int stacksize,*/
         0,            /*int flags,*/
         __pyx_empty_bytes, /*PyObject *code,*/
-        __pyx_empty_tuple,  /*PyObject *consts,*/
-        __pyx_empty_tuple,  /*PyObject *names,*/
-        __pyx_empty_tuple,  /*PyObject *varnames,*/
-        __pyx_empty_tuple,  /*PyObject *freevars,*/
-        __pyx_empty_tuple,  /*PyObject *cellvars,*/
+        __pyx_empty_tuple, /*PyObject *consts,*/
+        __pyx_empty_tuple, /*PyObject *names,*/
+        __pyx_empty_tuple, /*PyObject *varnames,*/
+        __pyx_empty_tuple, /*PyObject *freevars,*/
+        __pyx_empty_tuple, /*PyObject *cellvars,*/
         py_srcfile,   /*PyObject *filename,*/
         py_funcname,  /*PyObject *name,*/
-        __pyx_lineno,   /*int firstlineno,*/
+        py_line,      /*int firstlineno,*/
         __pyx_empty_bytes  /*PyObject *lnotab*/
     );
-    if (!py_code) goto bad;
+    Py_DECREF(py_srcfile);
+    Py_DECREF(py_funcname);
+    return py_code;
+bad:
+    Py_XDECREF(py_srcfile);
+    Py_XDECREF(py_funcname);
+    return NULL;
+}
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+                               int py_line, const char *filename) {
+    PyCodeObject *py_code = 0;
+    PyObject *py_globals = 0;
+    PyFrameObject *py_frame = 0;
+    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
+    if (!py_code) {
+        py_code = __Pyx_CreateCodeObjectForTraceback(
+            funcname, c_line, py_line, filename);
+        if (!py_code) goto bad;
+        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
+    }
+    py_globals = PyModule_GetDict(__pyx_m);
+    if (!py_globals) goto bad;
     py_frame = PyFrame_New(
         PyThreadState_GET(), /*PyThreadState *tstate,*/
         py_code,             /*PyCodeObject *code,*/
@@ -64274,11 +67380,9 @@ static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
         0                    /*PyObject *locals*/
     );
     if (!py_frame) goto bad;
-    py_frame->f_lineno = __pyx_lineno;
+    py_frame->f_lineno = py_line;
     PyTraceBack_Here(py_frame);
 bad:
-    Py_XDECREF(py_srcfile);
-    Py_XDECREF(py_funcname);
     Py_XDECREF(py_code);
     Py_XDECREF(py_frame);
 }
@@ -64313,6 +67417,7 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     return 0;
 }
 
+
 /* Type Conversion Functions */
 
 static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
diff --git a/python/src/sa/rulefactory.pxi b/python/src/sa/rulefactory.pxi
index a123e85f..ea0805bf 100644
--- a/python/src/sa/rulefactory.pxi
+++ b/python/src/sa/rulefactory.pxi
@@ -19,7 +19,9 @@ FeatureContext = namedtuple('FeatureContext',
      'fsample_count',
      'input_span',
      'matches',
-     'test_sentence'
+     'test_sentence',
+     'f_text',
+     'e_text'
     ])
 
 cdef int PRECOMPUTE = 0
@@ -1103,7 +1105,7 @@ cdef class HieroCachingRuleFactory:
                                     count = len(locs)
                                     scores = self.scorer.score(FeatureContext(
                                                f, e, count, fcount[f], num_samples,
-                                               (k,i+spanlen), locs, fwords
+                                               (k,i+spanlen), locs, fwords, self.fda, self.eda
                                                ))
                                     yield Rule(self.category, f, e, scores, alignment)
 
-- 
cgit v1.2.3


From b939bff222736e87fa234c2835511cc29fce644f Mon Sep 17 00:00:00 2001
From: Victor Chahuneau <vchahune@cs.cmu.edu>
Date: Wed, 5 Sep 2012 19:17:29 +0100
Subject: Revert to the "old style" pair count...

+ API naming fixes
+ Multiple feature definition files can be passed to the extractor
---
 python/pkg/cdec/sa/extract.py   |    23 +-
 python/pkg/cdec/sa/extractor.py |     2 +
 python/src/sa/_sa.c             | 25797 +++++++++++++++++++++-----------------
 python/src/sa/data_array.pxi    |     6 +-
 python/src/sa/int_list.pxi      |     2 +-
 python/src/sa/rulefactory.pxi   |     7 +-
 python/src/sa/suffix_array.pxi  |    12 +-
 7 files changed, 14505 insertions(+), 11344 deletions(-)

(limited to 'python/src/sa')

diff --git a/python/pkg/cdec/sa/extract.py b/python/pkg/cdec/sa/extract.py
index 472f128b..3136c5a7 100644
--- a/python/pkg/cdec/sa/extract.py
+++ b/python/pkg/cdec/sa/extract.py
@@ -11,16 +11,17 @@ extractor, prefix = None, None
 def make_extractor(config, grammars, features):
     global extractor, prefix
     signal.signal(signal.SIGINT, signal.SIG_IGN) # Let parent process catch Ctrl+C
-    if features: load_features(features)
+    load_features(features)
     extractor = cdec.sa.GrammarExtractor(config)
     prefix = grammars
 
 def load_features(features):
-    logging.info('Loading additional feature definitions from %s', features)
-    prefix = os.path.dirname(features)
-    sys.path.append(prefix)
-    __import__(os.path.basename(features).replace('.py', ''))
-    sys.path.remove(prefix)
+    for featdef in features:
+        logging.info('Loading additional feature definitions from %s', featdef)
+        prefix = os.path.dirname(featdef)
+        sys.path.append(prefix)
+        __import__(os.path.basename(featdef).replace('.py', ''))
+        sys.path.remove(prefix)
 
 def extract(inp):
     global extractor, prefix
@@ -44,15 +45,17 @@ def main():
                         help='number of parallel extractors')
     parser.add_argument('-s', '--chunksize', type=int, default=10,
                         help='number of sentences / chunk')
-    parser.add_argument('-f', '--features', type=str, default=None,
+    parser.add_argument('-f', '--features', action='append',
                         help='additional feature definitions')
     args = parser.parse_args()
 
     if not os.path.exists(args.grammars):
         os.mkdir(args.grammars)
-    if not (args.features is None or args.features.endswith('.py')):
-        sys.stderr.write('Error: feature definition file should be a python module\n')
-        sys.exit(1)
+    for featdef in args.features:
+        if not featdef.endswith('.py'):
+            sys.stderr.write('Error: feature definition file <{0}>'
+                    ' should be a python module\n'.format(featdef))
+            sys.exit(1)
     
     if args.jobs > 1:
         logging.info('Starting %d workers; chunk size: %d', args.jobs, args.chunksize)
diff --git a/python/pkg/cdec/sa/extractor.py b/python/pkg/cdec/sa/extractor.py
index 89e35bf8..940544fb 100644
--- a/python/pkg/cdec/sa/extractor.py
+++ b/python/pkg/cdec/sa/extractor.py
@@ -57,6 +57,8 @@ class GrammarExtractor:
         # lexical weighting tables
         tt = cdec.sa.BiLex(from_binary=config['lex_file'])
 
+        # TODO: use @cdec.sa.features decorator for standard features too
+        # + add a mask to disable features
         scorer = cdec.sa.Scorer(EgivenFCoherent, SampleCountF, CountEF, 
             MaxLexFgivenE(tt), MaxLexEgivenF(tt), IsSingletonF, IsSingletonFE,
             *cdec.sa._SA_FEATURES)
diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index 7753341b..8bd65ed1 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,16 +1,16 @@
-/* Generated by Cython 0.15.1 on Wed Sep  5 11:46:33 2012 */
+/* Generated by Cython 0.17 on Wed Sep  5 19:07:09 2012 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
+#elif PY_VERSION_HEX < 0x02040000
+    #error Cython requires Python 2.4+.
 #else
-
 #include <stddef.h> /* For offsetof */
 #ifndef offsetof
 #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
 #endif
-
 #if !defined(WIN32) && !defined(MS_WINDOWS)
   #ifndef __stdcall
     #define __stdcall
@@ -22,36 +22,44 @@
     #define __fastcall
   #endif
 #endif
-
 #ifndef DL_IMPORT
   #define DL_IMPORT(t) t
 #endif
 #ifndef DL_EXPORT
   #define DL_EXPORT(t) t
 #endif
-
 #ifndef PY_LONG_LONG
   #define PY_LONG_LONG LONG_LONG
 #endif
-
-#if PY_VERSION_HEX < 0x02040000
-  #define METH_COEXIST 0
-  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
-  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)
+#ifndef Py_HUGE_VAL
+  #define Py_HUGE_VAL HUGE_VAL
+#endif
+#ifdef PYPY_VERSION
+#define CYTHON_COMPILING_IN_PYPY 1
+#define CYTHON_COMPILING_IN_CPYTHON 0
+#else
+#define CYTHON_COMPILING_IN_PYPY 0
+#define CYTHON_COMPILING_IN_CPYTHON 1
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   typedef int Py_ssize_t;
   #define PY_SSIZE_T_MAX INT_MAX
   #define PY_SSIZE_T_MIN INT_MIN
   #define PY_FORMAT_SIZE_T ""
+  #define CYTHON_FORMAT_SSIZE_T ""
   #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
   #define PyInt_AsSsize_t(o)   __Pyx_PyInt_AsInt(o)
-  #define PyNumber_Index(o)    PyNumber_Int(o)
-  #define PyIndex_Check(o)     PyNumber_Check(o)
+  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \
+                                (PyErr_Format(PyExc_TypeError, \
+                                              "expected index value, got %.200s", Py_TYPE(o)->tp_name), \
+                                 (PyObject*)0))
+  #define PyIndex_Check(o)     (PyNumber_Check(o) && !PyFloat_Check(o) && !PyComplex_Check(o))
   #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
+  #define __PYX_BUILD_PY_SSIZE_T "i"
+#else
+  #define __PYX_BUILD_PY_SSIZE_T "n"
+  #define CYTHON_FORMAT_SSIZE_T "z"
 #endif
-
 #if PY_VERSION_HEX < 0x02060000
   #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
   #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
@@ -59,7 +67,6 @@
   #define PyVarObject_HEAD_INIT(type, size) \
           PyObject_HEAD_INIT(type) size,
   #define PyType_Modified(t)
-
   typedef struct {
      void *buf;
      PyObject *obj;
@@ -73,7 +80,6 @@
      Py_ssize_t *suboffsets;
      void *internal;
   } Py_buffer;
-
   #define PyBUF_SIMPLE 0
   #define PyBUF_WRITABLE 0x0001
   #define PyBUF_FORMAT 0x0004
@@ -83,24 +89,44 @@
   #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
   #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
   #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
-
+  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)
+  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)
+  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
+  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
 #endif
-
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
+  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
+          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
+  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
+          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+#endif
+#if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6
+  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict")
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define Py_TPFLAGS_CHECKTYPES 0
   #define Py_TPFLAGS_HAVE_INDEX 0
 #endif
-
 #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
-
+#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
+  #define CYTHON_PEP393_ENABLED 1
+  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \
+                                              0 : _PyUnicode_Ready((PyObject *)(op)))
+  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
+  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
+  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
+#else
+  #define CYTHON_PEP393_ENABLED 0
+  #define __Pyx_PyUnicode_READY(op)       (0)
+  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
+  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
+  #define __Pyx_PyUnicode_READ(k, d, i)   ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
+#endif
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
   #define PyStringObject               PyUnicodeObject
@@ -108,7 +134,6 @@
   #define PyString_Check               PyUnicode_Check
   #define PyString_CheckExact          PyUnicode_CheckExact
 #endif
-
 #if PY_VERSION_HEX < 0x02060000
   #define PyBytesObject                PyStringObject
   #define PyBytes_Type                 PyString_Type
@@ -127,7 +152,6 @@
   #define PyBytes_Concat               PyString_Concat
   #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
 #endif
-
 #if PY_VERSION_HEX < 0x02060000
   #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
   #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
@@ -135,9 +159,7 @@
 #ifndef PySet_CheckExact
   #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
 #endif
-
 #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
-
 #if PY_MAJOR_VERSION >= 3
   #define PyIntObject                  PyLongObject
   #define PyInt_Type                   PyLong_Type
@@ -154,11 +176,9 @@
   #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
   #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define PyBoolObject                 PyLongObject
 #endif
-
 #if PY_VERSION_HEX < 0x03020000
   typedef long Py_hash_t;
   #define __Pyx_PyInt_FromHash_t PyInt_FromLong
@@ -167,16 +187,6 @@
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
   #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
 #endif
-
-
-#if PY_MAJOR_VERSION >= 3
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
-#else
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
-#endif
-
 #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)
   #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)
   #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)
@@ -195,11 +205,9 @@
         (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \
             (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1)))
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
@@ -209,7 +217,6 @@
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
   #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_NAMESTR(n) ((char *)(n))
   #define __Pyx_DOCSTR(n)  ((char *)(n))
@@ -218,6 +225,15 @@
   #define __Pyx_DOCSTR(n)  (n)
 #endif
 
+
+#if PY_MAJOR_VERSION >= 3
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
+#else
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
+#endif
+
 #ifndef __PYX_EXTERN_C
   #ifdef __cplusplus
     #define __PYX_EXTERN_C extern "C"
@@ -267,7 +283,7 @@
 #   else
 #     define CYTHON_UNUSED
 #   endif
-# elif defined(__ICC) || defined(__INTEL_COMPILER)
+# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
 #   define CYTHON_UNUSED __attribute__ ((__unused__))
 # else
 #   define CYTHON_UNUSED
@@ -291,8 +307,12 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
 static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 
+#if CYTHON_COMPILING_IN_CPYTHON
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
-
+#else
+#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
+#endif
+#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
 
 #ifdef __GNUC__
   /* Test for GCC > 2.95 */
@@ -336,16 +356,8 @@ static const char *__pyx_f[] = {
   "str_map.pxi",
 };
 
-static PyObject *__Pyx_Generator_Next(PyObject *self);
-static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
-static PyObject *__Pyx_Generator_Close(PyObject *self);
-static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args, CYTHON_UNUSED PyObject *kwds);
-
-typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
-
 /*--- Type declarations ---*/
 struct __pyx_obj_3_sa_HieroCachingRuleFactory;
-struct __pyx_Generator_object;
 struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__;
 struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats;
 struct __pyx_obj_3_sa_IntList;
@@ -390,7 +402,7 @@ struct __pyx_t_3_sa__Trie_Node;
 struct __pyx_t_3_sa_match_node;
 struct __pyx_t_3_sa_Matching;
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":9
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef struct _node:             # <<<<<<<<<<<<<<
@@ -404,7 +416,7 @@ struct __pyx_t_3_sa__node {
   int val;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":30
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":30
  * _init_lower_mask()
  * 
  * cdef struct _BitSet:             # <<<<<<<<<<<<<<
@@ -418,7 +430,7 @@ struct __pyx_t_3_sa__BitSet {
   int size;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":168
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":168
  *     return result
  * 
  * cdef struct _VEB:             # <<<<<<<<<<<<<<
@@ -435,7 +447,7 @@ struct __pyx_t_3_sa__VEB {
   void **bottom;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":10
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":10
  * cdef struct _Trie_Node    # forward decl
  * 
  * cdef struct _Trie_Edge:             # <<<<<<<<<<<<<<
@@ -449,7 +461,7 @@ struct __pyx_t_3_sa__Trie_Edge {
   struct __pyx_t_3_sa__Trie_Edge *smaller;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":8
  * from libc.string cimport memset, memcpy
  * 
  * cdef struct _Trie_Node    # forward decl             # <<<<<<<<<<<<<<
@@ -462,7 +474,7 @@ struct __pyx_t_3_sa__Trie_Node {
   int arr_len;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":62
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":62
  * 
  * # linked list structure for storing matches in BaselineRuleFactory
  * cdef struct match_node:             # <<<<<<<<<<<<<<
@@ -474,7 +486,7 @@ struct __pyx_t_3_sa_match_node {
   struct __pyx_t_3_sa_match_node *next;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":158
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":158
  * 
  * # struct used to encapsulate a single matching
  * cdef struct Matching:             # <<<<<<<<<<<<<<
@@ -489,7 +501,7 @@ struct __pyx_t_3_sa_Matching {
   int size;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":214
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":214
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -538,25 +550,7 @@ struct __pyx_obj_3_sa_HieroCachingRuleFactory {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
- *         free(self.arr)
- * 
- *     def __iter__(self):             # <<<<<<<<<<<<<<
- *         cdef int i
- *         for i in range(self.len):
- */
-struct __pyx_Generator_object {
-  PyObject_HEAD
-  __pyx_generator_body_t body;
-  int is_running;
-  int resume_label;
-  PyObject *exc_type;
-  PyObject *exc_value;
-  PyObject *exc_traceback;
-};
-
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -564,14 +558,14 @@ struct __pyx_Generator_object {
  *         for i from 0 <= i < self.n:
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   int __pyx_v_i;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_Phrase *__pyx_v_self;
   int __pyx_t_0;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":36
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
  * 
  *     def compute_stats(self, int max_n):             # <<<<<<<<<<<<<<
@@ -579,7 +573,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ {
  *         particular, the frequency associated with each word is
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   int __pyx_v_N;
   int __pyx_v_freq;
   int __pyx_v_h;
@@ -595,7 +589,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
   PyObject *__pyx_v_ngram_starts;
   int __pyx_v_rs;
   struct __pyx_obj_3_sa_IntList *__pyx_v_run_start;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_LCP *__pyx_v_self;
   int __pyx_v_valid;
   struct __pyx_obj_3_sa_VEB *__pyx_v_veb;
   int __pyx_t_0;
@@ -619,7 +613,7 @@ struct __pyx_obj_3_sa_IntList {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":340
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":340
  * 
  * 
  * cdef class VEBIterator:             # <<<<<<<<<<<<<<
@@ -633,7 +627,7 @@ struct __pyx_obj_3_sa_VEBIterator {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":47
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":47
  * 
  * 
  * cdef class BiLex:             # <<<<<<<<<<<<<<
@@ -654,7 +648,7 @@ struct __pyx_obj_3_sa_BiLex {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":354
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":354
  * 
  * 
  * cdef class VEB:             # <<<<<<<<<<<<<<
@@ -668,7 +662,7 @@ struct __pyx_obj_3_sa_VEB {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":5
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":5
  * as k most frequent n-grams"""
  * 
  * cdef class LCP:             # <<<<<<<<<<<<<<
@@ -682,7 +676,7 @@ struct __pyx_obj_3_sa_LCP {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":9
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
@@ -701,7 +695,7 @@ struct __pyx_obj_3_sa_DataArray {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":100
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":100
  * 
  * 
  * cdef class BitSetIterator:             # <<<<<<<<<<<<<<
@@ -715,7 +709,7 @@ struct __pyx_obj_3_sa_BitSetIterator {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":188
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":188
  * 
  * 
  * cdef class Precomputation:             # <<<<<<<<<<<<<<
@@ -736,7 +730,7 @@ struct __pyx_obj_3_sa_Precomputation {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":935
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":935
  *         return sorted(result);
  * 
  *     def input(self, fwords):             # <<<<<<<<<<<<<<
@@ -744,7 +738,7 @@ struct __pyx_obj_3_sa_Precomputation {
  *         it looks up all of the rules that can be used to translate
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   PyObject *__pyx_v_alignment;
   PyObject *__pyx_v_als;
   PyObject *__pyx_v_alslist;
@@ -777,6 +771,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
   PyObject *__pyx_v_locs;
   int __pyx_v_lookup_required;
   struct __pyx_t_3_sa_Matching __pyx_v_matching;
+  PyObject *__pyx_v_max_locs;
   PyObject *__pyx_v_new_frontier;
   PyObject *__pyx_v_new_node;
   PyObject *__pyx_v_next_states;
@@ -793,7 +788,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
   PyObject *__pyx_v_sa_range;
   struct __pyx_obj_3_sa_IntList *__pyx_v_sample;
   struct __pyx_obj_3_sa_FeatureVector *__pyx_v_scores;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self;
   PyObject *__pyx_v_spanlen;
   float __pyx_v_start_time;
   PyObject *__pyx_v_stop_time;
@@ -807,17 +802,19 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
   PyObject *__pyx_v_xnode;
   PyObject *__pyx_v_xroot;
   Py_ssize_t __pyx_t_0;
-  Py_ssize_t __pyx_t_1;
-  PyObject *__pyx_t_2;
-  PyObject *__pyx_t_3;
+  PyObject *__pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  int __pyx_t_3;
   PyObject *__pyx_t_4;
-  PyObject *(*__pyx_t_5)(PyObject *);
-  Py_ssize_t __pyx_t_6;
-  PyObject *(*__pyx_t_7)(PyObject *);
+  PyObject *__pyx_t_5;
+  int __pyx_t_6;
+  Py_ssize_t __pyx_t_7;
+  Py_ssize_t __pyx_t_8;
+  Py_ssize_t __pyx_t_9;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":6
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":6
  * from libc.stdio cimport FILE, fclose, fopen
  * 
  * cdef class SuffixArray:             # <<<<<<<<<<<<<<
@@ -833,7 +830,7 @@ struct __pyx_obj_3_sa_SuffixArray {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":7
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":7
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1
  * 
  * cdef class Alphabet:             # <<<<<<<<<<<<<<
@@ -869,7 +866,7 @@ struct __pyx_obj_3_sa_Rule {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
@@ -877,7 +874,7 @@ struct __pyx_obj_3_sa_Rule {
  * 
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *__pyx_outer_scope;
   PyObject *__pyx_v_a;
   PyObject *__pyx_t_0;
@@ -886,7 +883,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -894,7 +891,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
  * 
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_outer_scope;
   PyObject *__pyx_v_line;
   PyObject *__pyx_t_0;
@@ -903,7 +900,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":70
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":70
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -922,7 +919,7 @@ struct __pyx_obj_3_sa_PhraseLocation {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -930,7 +927,7 @@ struct __pyx_obj_3_sa_PhraseLocation {
  * cdef class Scorer:
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *__pyx_outer_scope;
   PyObject *__pyx_v_feat;
   PyObject *__pyx_t_0;
@@ -939,7 +936,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":20
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":20
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -948,11 +945,11 @@ struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ {
   PyObject_HEAD
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -980,7 +977,7 @@ struct __pyx_obj_3_sa_FeatureVector {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":190
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
  * 
  *     def alignments(self):             # <<<<<<<<<<<<<<
@@ -988,16 +985,16 @@ struct __pyx_obj_3_sa_FeatureVector {
  *             yield point/65536, point%65536
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   PyObject *__pyx_v_point;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_Rule *__pyx_v_self;
   PyObject *__pyx_t_0;
   Py_ssize_t __pyx_t_1;
   PyObject *(*__pyx_t_2)(PyObject *);
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":23
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":23
  *         return ' '.join('%s=%s' % feat for feat in self)
  * 
  * cdef class Scorer:             # <<<<<<<<<<<<<<
@@ -1011,7 +1008,7 @@ struct __pyx_obj_3_sa_Scorer {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":8
  * # May need to revisit if things get really tight, though.
  * 
  * cdef class Alignment:             # <<<<<<<<<<<<<<
@@ -1026,7 +1023,7 @@ struct __pyx_obj_3_sa_Alignment {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":15
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -1034,15 +1031,15 @@ struct __pyx_obj_3_sa_Alignment {
  *         for i in range(self.names.len):
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   unsigned int __pyx_v_i;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self;
   int __pyx_t_0;
   unsigned int __pyx_t_1;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":118
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":118
  * # (entirely C-implemented) _BitSet struct.
  * # Very slow; use only for debugging
  * cdef class BitSet:             # <<<<<<<<<<<<<<
@@ -1055,7 +1052,7 @@ struct __pyx_obj_3_sa_BitSet {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":92
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":92
  * 
  * 
  * cdef class Sampler:             # <<<<<<<<<<<<<<
@@ -1069,7 +1066,7 @@ struct __pyx_obj_3_sa_Sampler {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":8
  *     char* stringmap_word(StrMap *vocab, int i)
  * 
  * cdef class StringMap:             # <<<<<<<<<<<<<<
@@ -1083,7 +1080,7 @@ struct __pyx_obj_3_sa_StringMap {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":32
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":32
  * cdef int EPSILON = sym_fromstring('*EPS*', True)
  * 
  * cdef class TrieNode:             # <<<<<<<<<<<<<<
@@ -1096,7 +1093,7 @@ struct __pyx_obj_3_sa_TrieNode {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":38
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":38
  *         self.children = {}
  * 
  * cdef class ExtendedTrieNode(TrieNode):             # <<<<<<<<<<<<<<
@@ -1111,7 +1108,7 @@ struct __pyx_obj_3_sa_ExtendedTrieNode {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":109
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":109
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)
  * 
  * cdef class TrieMap:             # <<<<<<<<<<<<<<
@@ -1143,7 +1140,7 @@ struct __pyx_obj_3_sa_Phrase {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -1151,15 +1148,15 @@ struct __pyx_obj_3_sa_Phrase {
  *         for i in range(self.len):
  */
 struct __pyx_obj_3_sa___pyx_scope_struct____iter__ {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   int __pyx_v_i;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_self;
   int __pyx_t_0;
   int __pyx_t_1;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":49
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":49
  * 
  * 
  * cdef class TrieTable:             # <<<<<<<<<<<<<<
@@ -1174,7 +1171,7 @@ struct __pyx_obj_3_sa_TrieTable {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":183
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":183
  *         return self.f.arity()
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -1183,7 +1180,7 @@ struct __pyx_obj_3_sa_TrieTable {
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ {
   PyObject_HEAD
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_Rule *__pyx_v_self;
 };
 
 
@@ -1205,7 +1202,7 @@ struct __pyx_obj_3_sa_FloatList {
 
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":8
  *     char* stringmap_word(StrMap *vocab, int i)
  * 
  * cdef class StringMap:             # <<<<<<<<<<<<<<
@@ -1220,7 +1217,7 @@ struct __pyx_vtabstruct_3_sa_StringMap {
 static struct __pyx_vtabstruct_3_sa_StringMap *__pyx_vtabptr_3_sa_StringMap;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":9
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
@@ -1235,7 +1232,7 @@ struct __pyx_vtabstruct_3_sa_DataArray {
 static struct __pyx_vtabstruct_3_sa_DataArray *__pyx_vtabptr_3_sa_DataArray;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":109
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":109
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)
  * 
  * cdef class TrieMap:             # <<<<<<<<<<<<<<
@@ -1250,7 +1247,7 @@ struct __pyx_vtabstruct_3_sa_TrieMap {
 static struct __pyx_vtabstruct_3_sa_TrieMap *__pyx_vtabptr_3_sa_TrieMap;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":8
  * # May need to revisit if things get really tight, though.
  * 
  * cdef class Alignment:             # <<<<<<<<<<<<<<
@@ -1266,7 +1263,7 @@ struct __pyx_vtabstruct_3_sa_Alignment {
 static struct __pyx_vtabstruct_3_sa_Alignment *__pyx_vtabptr_3_sa_Alignment;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":47
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":47
  * 
  * 
  * cdef class BiLex:             # <<<<<<<<<<<<<<
@@ -1285,7 +1282,7 @@ struct __pyx_vtabstruct_3_sa_BiLex {
 static struct __pyx_vtabstruct_3_sa_BiLex *__pyx_vtabptr_3_sa_BiLex;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":9
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":9
  * from libc.string cimport memset, memcpy
  * 
  * cdef class IntList:             # <<<<<<<<<<<<<<
@@ -1305,7 +1302,7 @@ struct __pyx_vtabstruct_3_sa_IntList {
 static struct __pyx_vtabstruct_3_sa_IntList *__pyx_vtabptr_3_sa_IntList;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":4
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":4
  * from libc.string cimport strsep, strcpy, strlen
  * 
  * cdef class Phrase:             # <<<<<<<<<<<<<<
@@ -1320,7 +1317,7 @@ struct __pyx_vtabstruct_3_sa_Phrase {
 static struct __pyx_vtabstruct_3_sa_Phrase *__pyx_vtabptr_3_sa_Phrase;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":70
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":70
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -1334,7 +1331,7 @@ struct __pyx_vtabstruct_3_sa_PhraseLocation {
 static struct __pyx_vtabstruct_3_sa_PhraseLocation *__pyx_vtabptr_3_sa_PhraseLocation;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":188
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":188
  * 
  * 
  * cdef class Precomputation:             # <<<<<<<<<<<<<<
@@ -1349,7 +1346,7 @@ struct __pyx_vtabstruct_3_sa_Precomputation {
 static struct __pyx_vtabstruct_3_sa_Precomputation *__pyx_vtabptr_3_sa_Precomputation;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":23
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":23
  *         return ' '.join('%s=%s' % feat for feat in self)
  * 
  * cdef class Scorer:             # <<<<<<<<<<<<<<
@@ -1363,7 +1360,7 @@ struct __pyx_vtabstruct_3_sa_Scorer {
 static struct __pyx_vtabstruct_3_sa_Scorer *__pyx_vtabptr_3_sa_Scorer;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":9
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":9
  * from libc.string cimport memset, strcpy, strlen
  * 
  * cdef class FloatList:             # <<<<<<<<<<<<<<
@@ -1379,7 +1376,7 @@ struct __pyx_vtabstruct_3_sa_FloatList {
 static struct __pyx_vtabstruct_3_sa_FloatList *__pyx_vtabptr_3_sa_FloatList;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":354
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":354
  * 
  * 
  * cdef class VEB:             # <<<<<<<<<<<<<<
@@ -1395,7 +1392,7 @@ struct __pyx_vtabstruct_3_sa_VEB {
 static struct __pyx_vtabstruct_3_sa_VEB *__pyx_vtabptr_3_sa_VEB;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":7
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":7
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1
  * 
  * cdef class Alphabet:             # <<<<<<<<<<<<<<
@@ -1418,7 +1415,7 @@ struct __pyx_vtabstruct_3_sa_Alphabet {
 static struct __pyx_vtabstruct_3_sa_Alphabet *__pyx_vtabptr_3_sa_Alphabet;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":214
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":214
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -1446,7 +1443,7 @@ struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory {
 static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *__pyx_vtabptr_3_sa_HieroCachingRuleFactory;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":6
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":6
  * from libc.stdio cimport FILE, fclose, fopen
  * 
  * cdef class SuffixArray:             # <<<<<<<<<<<<<<
@@ -1455,17 +1452,15 @@ static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *__pyx_vtabptr_3_sa_
  */
 
 struct __pyx_vtabstruct_3_sa_SuffixArray {
-  int (*__search_high)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
-  int (*__search_low)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
-  PyObject *(*__get_range)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int);
-  PyObject *(*__lookup_helper)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  int (*__pyx___search_high)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  int (*__pyx___search_low)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  PyObject *(*__pyx___get_range)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int);
+  PyObject *(*__pyx___lookup_helper)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
 };
 static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
-
 #ifndef CYTHON_REFNANNY
   #define CYTHON_REFNANNY 0
 #endif
-
 #if CYTHON_REFNANNY
   typedef struct {
     void (*INCREF)(void*, PyObject*, int);
@@ -1478,8 +1473,21 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/
   #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
-  #define __Pyx_RefNannySetupContext(name)           __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
-  #define __Pyx_RefNannyFinishContext()           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
+#ifdef WITH_THREAD
+  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
+          if (acquire_gil) { \
+              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \
+              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
+              PyGILState_Release(__pyx_gilstate_save); \
+          } else { \
+              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
+          }
+#else
+  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
+          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
+#endif
+  #define __Pyx_RefNannyFinishContext() \
+          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
   #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
@@ -1490,7 +1498,7 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
 #else
   #define __Pyx_RefNannyDeclarations
-  #define __Pyx_RefNannySetupContext(name)
+  #define __Pyx_RefNannySetupContext(name, acquire_gil)
   #define __Pyx_RefNannyFinishContext()
   #define __Pyx_INCREF(r) Py_INCREF(r)
   #define __Pyx_DECREF(r) Py_DECREF(r)
@@ -1501,16 +1509,97 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   #define __Pyx_XGOTREF(r)
   #define __Pyx_XGIVEREF(r)
 #endif /* CYTHON_REFNANNY */
+#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
+#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
 
 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
 
-static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
-                                   Py_ssize_t end, int direction);
+static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
+                                         Py_ssize_t end, int direction)
+{
+    const char* self_ptr = PyBytes_AS_STRING(self);
+    Py_ssize_t self_len = PyBytes_GET_SIZE(self);
+    const char* sub_ptr;
+    Py_ssize_t sub_len;
+    int retval;
+#if PY_VERSION_HEX >= 0x02060000
+    Py_buffer view;
+    view.obj = NULL;
+#endif
+    if ( PyBytes_Check(arg) ) {
+        sub_ptr = PyBytes_AS_STRING(arg);
+        sub_len = PyBytes_GET_SIZE(arg);
+    }
+#if PY_MAJOR_VERSION < 3
+    else if ( PyUnicode_Check(arg) ) {
+        return PyUnicode_Tailmatch(self, arg, start, end, direction);
+    }
+#endif
+    else {
+#if PY_VERSION_HEX < 0x02060000
+        if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
+            return -1;
+#else
+        if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
+            return -1;
+        sub_ptr = (const char*) view.buf;
+        sub_len = view.len;
+#endif
+    }
+    if (end > self_len)
+        end = self_len;
+    else if (end < 0)
+        end += self_len;
+    if (end < 0)
+        end = 0;
+    if (start < 0)
+        start += self_len;
+    if (start < 0)
+        start = 0;
+    if (direction > 0) {
+        if (end-sub_len > start)
+            start = end - sub_len;
+    }
+    if (start + sub_len <= end)
+        retval = !memcmp(self_ptr+start, sub_ptr, sub_len);
+    else
+        retval = 0;
+#if PY_VERSION_HEX >= 0x02060000
+    if (view.obj)
+        PyBuffer_Release(&view);
+#endif
+    return retval;
+}
+static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
+                                   Py_ssize_t end, int direction)
+{
+    if (unlikely(PyTuple_Check(substr))) {
+        Py_ssize_t i, count = PyTuple_GET_SIZE(substr);
+        for (i = 0; i < count; i++) {
+            int result;
+#if CYTHON_COMPILING_IN_CPYTHON
+            result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
+                                                   start, end, direction);
+#else
+            PyObject* sub = PySequence_GetItem(substr, i);
+            if (unlikely(!sub)) return -1;
+            result = __Pyx_PyBytes_SingleTailmatch(self, sub, start, end, direction);
+            Py_DECREF(sub);
+#endif
+            if (result) {
+                return result;
+            }
+        }
+        return 0;
+    }
+    return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
+}
 
-static void __Pyx_RaiseDoubleKeywordsError(
-    const char* func_name, PyObject* kw_name); /*proto*/
+static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/
 
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
+    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
+    const char* function_name); /*proto*/
 
 static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
     Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
@@ -1522,9 +1611,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
 
 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
 
-static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict,
-    const char* function_name, int kw_allowed); /*proto*/
-
+static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /*proto*/
 
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
     PyObject *r;
@@ -1533,86 +1620,96 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j
     Py_DECREF(j);
     return r;
 }
-
-
 #define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_List_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) {
-    if (likely(o != Py_None)) {
-        if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-            PyObject *r = PyList_GET_ITEM(o, i);
-            Py_INCREF(r);
-            return r;
-        }
-        else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
-            PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
-            Py_INCREF(r);
-            return r;
-        }
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        PyObject *r = PyList_GET_ITEM(o, i);
+        Py_INCREF(r);
+        return r;
+    }
+    else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
+        PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
+        Py_INCREF(r);
+        return r;
     }
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    return PySequence_GetItem(o, i);
+#endif
 }
-
 #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_Tuple_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) {
-    if (likely(o != Py_None)) {
-        if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, i);
-            Py_INCREF(r);
-            return r;
-        }
-        else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
-            PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
-            Py_INCREF(r);
-            return r;
-        }
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        PyObject *r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
+        return r;
+    }
+    else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
+        PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
+        Py_INCREF(r);
+        return r;
     }
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    return PySequence_GetItem(o, i);
+#endif
 }
-
-
 #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
-    PyObject *r;
-    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-        r = PyList_GET_ITEM(o, i);
-        Py_INCREF(r);
-    }
-    else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-        r = PyTuple_GET_ITEM(o, i);
-        Py_INCREF(r);
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (PyList_CheckExact(o)) {
+        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
+        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
+            PyObject *r = PyList_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
     }
-    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
-        r = PySequence_GetItem(o, i);
+    else if (PyTuple_CheckExact(o)) {
+        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
+        if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
+            PyObject *r = PyTuple_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
+    } else {  /* inlined PySequence_GetItem() */
+        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
+        if (likely(m && m->sq_item)) {
+            if (unlikely(i < 0) && likely(m->sq_length)) {
+                Py_ssize_t l = m->sq_length(o);
+                if (unlikely(l < 0)) return NULL;
+                i += l;
+            }
+            return m->sq_item(o, i);
+        }
     }
-    else {
-        r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    if (PySequence_Check(o)) {
+        return PySequence_GetItem(o, i);
     }
-    return r;
+#endif
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
 }
 
-static CYTHON_INLINE int __Pyx_NegateNonNeg(int b) { 
-    return unlikely(b < 0) ? b : !b; 
-}
-static CYTHON_INLINE PyObject* __Pyx_PyBoolOrNull_FromLong(long b) {
-    return unlikely(b < 0) ? NULL : __Pyx_PyBool_FromLong(b);
+static CYTHON_INLINE int __Pyx_PySequence_Contains(PyObject* item, PyObject* seq, int eq) {
+    int result = PySequence_Contains(seq, item);
+    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
 }
 
 static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
     if (likely(PyList_CheckExact(L))) {
-        if (PyList_Append(L, x) < 0) return NULL;
+        if (unlikely(PyList_Append(L, x) < 0)) return NULL;
         Py_INCREF(Py_None);
         return Py_None; /* this is just to have an accurate signature */
-    }
-    else {
+    } else {
         PyObject *r, *m;
         m = __Pyx_GetAttrString(L, "append");
         if (!m) return NULL;
@@ -1630,16 +1727,17 @@ static CYTHON_INLINE long __Pyx_div_long(long, long); /* proto */
 
 static CYTHON_INLINE long __Pyx_mod_long(long, long); /* proto */
 
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
+
 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
+static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/
 
 static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/
 
 #define __Pyx_SetItemInt(o, i, v, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_SetItemInt_Fast(o, i, v) : \
                                                     __Pyx_SetItemInt_Generic(o, to_py_func(i), v))
-
 static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
     int r;
     if (!j) return -1;
@@ -1647,130 +1745,126 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyOb
     Py_DECREF(j);
     return r;
 }
-
 static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v) {
-    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-        Py_INCREF(v);
-        Py_DECREF(PyList_GET_ITEM(o, i));
-        PyList_SET_ITEM(o, i, v);
-        return 1;
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (PyList_CheckExact(o)) {
+        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
+        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
+            PyObject* old = PyList_GET_ITEM(o, n);
+            Py_INCREF(v);
+            PyList_SET_ITEM(o, n, v);
+            Py_DECREF(old);
+            return 1;
+        }
+    } else {  /* inlined PySequence_SetItem() */
+        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
+        if (likely(m && m->sq_ass_item)) {
+            if (unlikely(i < 0) && likely(m->sq_length)) {
+                Py_ssize_t l = m->sq_length(o);
+                if (unlikely(l < 0)) return -1;
+                i += l;
+            }
+            return m->sq_ass_item(o, i, v);
+        }
     }
-    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0)))
+#else
+#if CYTHON_COMPILING_IN_PYPY
+    if (PySequence_Check(o) && !PyDict_Check(o)) {
+#else
+    if (PySequence_Check(o)) {
+#endif
         return PySequence_SetItem(o, i, v);
-    else {
-        PyObject *j = PyInt_FromSsize_t(i);
-        return __Pyx_SetItemInt_Generic(o, j, v);
     }
+#endif
+    return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v);
 }
 
 static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */
-
+#if CYTHON_COMPILING_IN_PYPY
 #define __Pyx_PyObject_AsDouble(obj) \
-    ((likely(PyFloat_CheckExact(obj))) ? \
-     PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
+(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \
+ likely(PyInt_CheckExact(obj)) ? \
+ PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
+#else
+#define __Pyx_PyObject_AsDouble(obj) \
+((likely(PyFloat_CheckExact(obj))) ? \
+ PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
+#endif
 
 static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);
 
 static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact); /*proto*/
 
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
+    PyListObject* L = (PyListObject*) list;
+    Py_ssize_t len = Py_SIZE(list);
+    if (likely(L->allocated > len)) {
+        Py_INCREF(x);
+        PyList_SET_ITEM(list, len, x);
+        Py_SIZE(list) = len+1;
+        return 0;
+    }
+    return PyList_Append(list, x);
+}
+#else
+#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
+#endif
+
+static CYTHON_INLINE int __Pyx_PyDict_Contains(PyObject* item, PyObject* dict, int eq) {
+    int result = PyDict_Contains(dict, item);
+    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
+}
+
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
+
+static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
+
+static CYTHON_INLINE int __Pyx_unpack_tuple2(PyObject* tuple, PyObject** value1, PyObject** value2,
+                                             int is_tuple, int has_known_size, int decref_tuple);
+
+static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name,
+                                                   Py_ssize_t* p_orig_length, int* p_is_dict);
+static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos,
+                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict);
+
 #if PY_VERSION_HEX < 0x02050000
 #ifndef PyAnySet_CheckExact
-
 #define PyAnySet_CheckExact(ob) \
     ((ob)->ob_type == &PySet_Type || \
      (ob)->ob_type == &PyFrozenSet_Type)
-
 #define PySet_New(iterable) \
     PyObject_CallFunctionObjArgs((PyObject *)&PySet_Type, (iterable), NULL)
-
 #define Pyx_PyFrozenSet_New(iterable) \
     PyObject_CallFunctionObjArgs((PyObject *)&PyFrozenSet_Type, (iterable), NULL)
-
 #define PySet_Size(anyset) \
     PyObject_Size((anyset))
-
 #define PySet_Contains(anyset, key) \
     PySequence_Contains((anyset), (key))
-
 #define PySet_Pop(set) \
     PyObject_CallMethod(set, (char *)"pop", NULL)
-
 static CYTHON_INLINE int PySet_Clear(PyObject *set) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"clear", NULL);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
-
 static CYTHON_INLINE int PySet_Discard(PyObject *set, PyObject *key) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"discard", (char *)"O", key);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
-
 static CYTHON_INLINE int PySet_Add(PyObject *set, PyObject *key) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"add", (char *)"O", key);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
-
 #endif /* PyAnySet_CheckExact (<= Py2.4) */
-
-#if PY_VERSION_HEX < 0x02040000
-#ifndef Py_SETOBJECT_H
-#define Py_SETOBJECT_H
-
-static PyTypeObject *__Pyx_PySet_Type = NULL;
-static PyTypeObject *__Pyx_PyFrozenSet_Type = NULL;
-
-#define PySet_Type (*__Pyx_PySet_Type)
-#define PyFrozenSet_Type (*__Pyx_PyFrozenSet_Type)
-
-#define PyAnySet_Check(ob) \
-    (PyAnySet_CheckExact(ob) || \
-     PyType_IsSubtype((ob)->ob_type, &PySet_Type) || \
-     PyType_IsSubtype((ob)->ob_type, &PyFrozenSet_Type))
-
-#define PyFrozenSet_CheckExact(ob) ((ob)->ob_type == &PyFrozenSet_Type)
-
-static int __Pyx_Py23SetsImport(void) {
-    PyObject *sets=0, *Set=0, *ImmutableSet=0;
-
-    sets = PyImport_ImportModule((char *)"sets");
-    if (!sets) goto bad;
-    Set = PyObject_GetAttrString(sets, (char *)"Set");
-    if (!Set) goto bad;
-    ImmutableSet = PyObject_GetAttrString(sets, (char *)"ImmutableSet");
-    if (!ImmutableSet) goto bad;
-    Py_DECREF(sets);
-
-    __Pyx_PySet_Type       = (PyTypeObject*) Set;
-    __Pyx_PyFrozenSet_Type = (PyTypeObject*) ImmutableSet;
-
-    return 0;
-
- bad:
-    Py_XDECREF(sets);
-    Py_XDECREF(Set);
-    Py_XDECREF(ImmutableSet);
-    return -1;
-}
-
-#else
-static int __Pyx_Py23SetsImport(void) { return 0; }
-#endif /* !Py_SETOBJECT_H */
-#endif /* < Py2.4  */
 #endif /* < Py2.5  */
 
-static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void);
-
 #if PY_MAJOR_VERSION >= 3
 static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
     PyObject *value;
-    if (unlikely(d == Py_None)) {
-        __Pyx_RaiseNoneIndexingError();
-        return NULL;
-    }
     value = PyDict_GetItemWithError(d, key);
     if (unlikely(!value)) {
         if (!PyErr_Occurred())
@@ -1789,10 +1883,9 @@ static CYTHON_INLINE int __Pyx_div_int(int, int); /* proto */
 #define UNARY_NEG_WOULD_OVERFLOW(x)            (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
 
 static CYTHON_INLINE PyObject* __Pyx_PyObject_Pop(PyObject* L) {
-#if PY_VERSION_HEX >= 0x02040000
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02040000
     if (likely(PyList_CheckExact(L))
-            /* Check that both the size is positive and no reallocation shrinking needs to be done. */
-            && likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
+        && likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
         Py_SIZE(L) -= 1;
         return PyList_GET_ITEM(L, PyList_GET_SIZE(L));
     }
@@ -1810,31 +1903,49 @@ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb);
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/
 
-#include <string.h>
-
-static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
-
-static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
-
-#if PY_MAJOR_VERSION >= 3
-#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
-#else
-#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
-#endif
-
-#define __pyx_binding_PyCFunctionType_USED 1
-
+static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name);
+
+#define __Pyx_CyFunction_USED 1
+#include <structmember.h>
+#define __Pyx_CYFUNCTION_STATICMETHOD  0x01
+#define __Pyx_CYFUNCTION_CLASSMETHOD   0x02
+#define __Pyx_CYFUNCTION_CCLASS        0x04
+#define __Pyx_CyFunction_GetClosure(f) \
+    (((__pyx_CyFunctionObject *) (f))->func_closure)
+#define __Pyx_CyFunction_GetClassObj(f) \
+    (((__pyx_CyFunctionObject *) (f))->func_classobj)
+#define __Pyx_CyFunction_Defaults(type, f) \
+    ((type *)(((__pyx_CyFunctionObject *) (f))->defaults))
+#define __Pyx_CyFunction_SetDefaultsGetter(f, g) \
+    ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g)
 typedef struct {
     PyCFunctionObject func;
-} __pyx_binding_PyCFunctionType_object;
-
-static PyTypeObject __pyx_binding_PyCFunctionType_type;
-static PyTypeObject *__pyx_binding_PyCFunctionType = NULL;
-
-static PyObject *__pyx_binding_PyCFunctionType_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module); /* proto */
-#define __pyx_binding_PyCFunctionType_New(ml, self) __pyx_binding_PyCFunctionType_NewEx(ml, self, NULL)
-
-static int __pyx_binding_PyCFunctionType_init(void); /* proto */
+    int flags;
+    PyObject *func_dict;
+    PyObject *func_weakreflist;
+    PyObject *func_name;
+    PyObject *func_doc;
+    PyObject *func_code;
+    PyObject *func_closure;
+    PyObject *func_classobj; /* No-args super() class cell */
+    void *defaults;
+    int defaults_pyobjects;
+    PyObject *defaults_tuple; /* Const defaults tuple */
+    PyObject *(*defaults_getter)(PyObject *);
+} __pyx_CyFunctionObject;
+static PyTypeObject *__pyx_CyFunctionType = 0;
+#define __Pyx_CyFunction_NewEx(ml, flags, self, module, code) \
+    __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, self, module, code)
+static PyObject *__Pyx_CyFunction_New(PyTypeObject *,
+                                      PyMethodDef *ml, int flags,
+                                      PyObject *self, PyObject *module,
+                                      PyObject* code);
+static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m,
+                                                         size_t size,
+                                                         int pyobjects);
+static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m,
+                                                            PyObject *tuple);
+static int __Pyx_CyFunction_init(void);
 
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
 
@@ -1873,17 +1984,59 @@ static void __Pyx_WriteUnraisable(const char *name, int clineno,
 
 static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
 
+#define __Pyx_Generator_USED
+#include <structmember.h>
+#include <frameobject.h>
+typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
+typedef struct {
+    PyObject_HEAD
+    __pyx_generator_body_t body;
+    PyObject *closure;
+    PyObject *exc_type;
+    PyObject *exc_value;
+    PyObject *exc_traceback;
+    PyObject *gi_weakreflist;
+    PyObject *classobj;
+    PyObject *yieldfrom;
+    int resume_label;
+    char is_running;  // using T_BOOL for property below requires char value
+} __pyx_GeneratorObject;
+static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                                  PyObject *closure);
+static int __pyx_Generator_init(void);
+static int __Pyx_Generator_clear(PyObject* self);
+#if 1 || PY_VERSION_HEX < 0x030300B0
+static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
+#else
+#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
+#endif
+
 static int __Pyx_check_binary_version(void);
 
 static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/
 
 static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
 
-static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
-                               int __pyx_lineno, const char *__pyx_filename); /*proto*/
+typedef struct {
+    int code_line;
+    PyCodeObject* code_object;
+} __Pyx_CodeObjectCacheEntry;
+struct __Pyx_CodeObjectCache {
+    int count;
+    int max_count;
+    __Pyx_CodeObjectCacheEntry* entries;
+};
+static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
+static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
+static PyCodeObject *__pyx_find_code_object(int code_line);
+static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
+
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+                               int py_line, const char *filename); /*proto*/
 
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
 
+
 /* Module declarations from 'libc.stdio' */
 
 /* Module declarations from 'libc.stdlib' */
@@ -1918,7 +2071,6 @@ static PyTypeObject *__pyx_ptype_3_sa_PhraseLocation = 0;
 static PyTypeObject *__pyx_ptype_3_sa_Sampler = 0;
 static PyTypeObject *__pyx_ptype_3_sa_HieroCachingRuleFactory = 0;
 static PyTypeObject *__pyx_ptype_3_sa_Scorer = 0;
-static PyTypeObject *__pyx_ptype_3_sa___pyx_Generator = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct____iter__ = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = 0;
@@ -1943,7 +2095,6 @@ static int __pyx_v_3_sa_BAEZA_YATES;
 static int __pyx_v_3_sa_EPSILON;
 static struct __pyx_obj_3_sa_StringMap *__pyx_v_3_sa_FD = 0;
 static char *__pyx_f_3_sa_sym_tostring(int); /*proto*/
-static char *__pyx_f_3_sa_sym_tocat(int); /*proto*/
 static int __pyx_f_3_sa_sym_isvar(int); /*proto*/
 static int __pyx_f_3_sa_sym_getindex(int); /*proto*/
 static float __pyx_f_3_sa_monitor_cpu(void); /*proto*/
@@ -1968,7 +2119,6 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *);
 static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
-static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_Node *, int *, int); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *, PyObject *, PyObject *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *, PyObject *, PyObject *, int); /*proto*/
@@ -1993,6 +2143,192 @@ static PyObject *__pyx_builtin_StopIteration;
 static PyObject *__pyx_builtin_cmp;
 static PyObject *__pyx_builtin_sorted;
 static PyObject *__pyx_builtin_max;
+static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_filename); /* proto */
+static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len); /* proto */
+static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, float __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_16__iter__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_index); /* proto */
+static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_25get_size(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id); /* proto */
+static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_from_text, PyObject *__pyx_v_from_data, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_earray, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_alignment); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_eword); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword, PyObject *__pyx_v_eword, PyObject *__pyx_v_col); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBIterator *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_size); /* proto */
+static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa); /* proto */
+static PyObject *__pyx_pf_3_sa_3LCP_2compute_stats(struct __pyx_obj_3_sa_LCP *__pyx_v_self, int __pyx_v_max_n); /* proto */
+static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_2sym_fromstring(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_string, int __pyx_v_terminal); /* proto */
+static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_words); /* proto */
+static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_k); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_ci); /* proto */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
+#endif
+static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_28__iter__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_children); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, int __pyx_v_lhs, struct __pyx_obj_3_sa_Phrase *__pyx_v_f, struct __pyx_obj_3_sa_Phrase *__pyx_v_e, PyObject *__pyx_v_scores, PyObject *__pyx_v_word_alignments); /* proto */
+static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Rule *__pyx_v_other); /* proto */
+#endif
+static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Phrase *__pyx_v_f); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_7__str___genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_12alignments(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, int __pyx_v_alphabet_size); /* proto */
+static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_flag); /* proto */
+static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_from_stats, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_precompute_rank, PyObject *__pyx_v_precompute_secondary_rank, PyObject *__pyx_v_max_length, PyObject *__pyx_v_max_nonterminals, PyObject *__pyx_v_train_max_initial_size, PyObject *__pyx_v_train_min_gap_size); /* proto */
+static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray); /* proto */
+static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high); /* proto */
+static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_8TrieNode_8children_4__del__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_phrase, PyObject *__pyx_v_phrase_location, PyObject *__pyx_v_suffix_link); /* proto */
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_extended); /* proto */
+static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_4root_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sa_low, int __pyx_v_sa_high, int __pyx_v_arr_low, int __pyx_v_arr_high, PyObject *__pyx_v_arr, int __pyx_v_num_subpatterns); /* proto */
+static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, int __pyx_v_sample_size, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray); /* proto */
+static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location); /* proto */
+static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment, float __pyx_v_by_slack_factor, char *__pyx_v_category, PyObject *__pyx_v_max_chunks, unsigned int __pyx_v_max_initial_size, unsigned int __pyx_v_max_length, unsigned int __pyx_v_max_nonterminals, PyObject *__pyx_v_max_target_chunks, PyObject *__pyx_v_max_target_length, unsigned int __pyx_v_min_gap_size, PyObject *__pyx_v_precompute_file, unsigned int __pyx_v_precompute_secondary_rank, unsigned int __pyx_v_precompute_rank, int __pyx_v_require_aligned_terminal, int __pyx_v_require_aligned_chunks, unsigned int __pyx_v_train_max_initial_size, unsigned int __pyx_v_train_min_gap_size, int __pyx_v_tight_phrases, int __pyx_v_use_baeza_yates, int __pyx_v_use_collocations, int __pyx_v_use_index); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray, struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray, struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler, struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_phrase); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_frontier, PyObject *__pyx_v_res, PyObject *__pyx_v_fwords); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_skip, PyObject *__pyx_v_i, PyObject *__pyx_v_spanlen, PyObject *__pyx_v_pathlen, PyObject *__pyx_v_fwords, PyObject *__pyx_v_next_states, PyObject *__pyx_v_reachable_buffer); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_dist); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_ito); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v__columns, PyObject *__pyx_v_curr_idx, PyObject *__pyx_v_min_dist); /* proto */
+static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords); /* proto */
+static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str___genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_self, PyObject *__pyx_v_models); /* proto */
 static char __pyx_k_1[] = ".gz";
 static char __pyx_k_2[] = "Requested index %d of %d-length FloatList";
 static char __pyx_k_3[] = "IntList[";
@@ -2039,12 +2375,13 @@ static char __pyx_k_85[] = "RANK %d\tCOUNT, COST: %d    %d\tCUMUL: %d, %d";
 static char __pyx_k_86[] = "Precomputed collocations for %d patterns out of %d possible (upper bound %d)";
 static char __pyx_k_87[] = "Precomputed inverted index for %d patterns ";
 static char __pyx_k_88[] = "Precomputation took %f seconds";
-static char __pyx_k_89[] = "    Bucket sort took %f seconds";
-static char __pyx_k_90[] = "    Refining, sort depth = %d";
-static char __pyx_k_91[] = "    Refinement took %f seconds";
-static char __pyx_k_92[] = "    Finalizing sort...";
-static char __pyx_k_94[] = "Suffix array construction took %f seconds";
-static char __pyx_k_95[] = "Unexpected condition found in q3sort: sort from %d to %d";
+static char __pyx_k_89[] = "get_sentence_position";
+static char __pyx_k_90[] = "    Bucket sort took %f seconds";
+static char __pyx_k_91[] = "    Refining, sort depth = %d";
+static char __pyx_k_92[] = "    Refinement took %f seconds";
+static char __pyx_k_93[] = "    Finalizing sort...";
+static char __pyx_k_95[] = "Suffix array construction took %f seconds";
+static char __pyx_k_96[] = "Unexpected condition found in q3sort: sort from %d to %d";
 static char __pyx_k__0[] = "0";
 static char __pyx_k__1[] = "1";
 static char __pyx_k__e[] = "e";
@@ -2054,40 +2391,42 @@ static char __pyx_k__i[] = "i";
 static char __pyx_k__j[] = "j";
 static char __pyx_k__r[] = "r";
 static char __pyx_k__w[] = "w";
-static char __pyx_k_100[] = "Sampling strategy: uniform, max sample size = %d";
-static char __pyx_k_101[] = "Sampling strategy: no sampling";
-static char __pyx_k_103[] = "require_aligned_terminal";
-static char __pyx_k_104[] = "require_aligned_chunks";
-static char __pyx_k_105[] = "[X]";
-static char __pyx_k_106[] = "Must specify an alignment object";
-static char __pyx_k_108[] = "Reading precomputed data from file %s... ";
-static char __pyx_k_109[] = "Precomputation done with max nonterminals %d, decoder uses %d";
-static char __pyx_k_110[] = "Precomputation done with max terminals %d, decoder uses %d";
-static char __pyx_k_111[] = "Precomputation done with max initial size %d, decoder uses %d";
-static char __pyx_k_112[] = "Precomputation done with min gap size %d, decoder uses %d";
-static char __pyx_k_113[] = "Converting %d hash keys on precomputed inverted index... ";
-static char __pyx_k_114[] = "Converting %d hash keys on precomputed collocations... ";
-static char __pyx_k_115[] = "Processing precomputations took %f seconds";
-static char __pyx_k_116[] = "{";
-  static char __pyx_k_117[] = "(";
-static char __pyx_k_118[] = "}";
-static char __pyx_k_119[] = "get_precomputed_collocation";
-static char __pyx_k_120[] = "double binary";
-static char __pyx_k_121[] = "Keyword trie error";
-static char __pyx_k_123[] = "get_all_nodes_isteps_away";
-static char __pyx_k_124[] = "Total time for rule lookup, extraction, and scoring = %f seconds";
-static char __pyx_k_125[] = "    Extract time = %f seconds";
-static char __pyx_k_126[] = "No aligned terminals";
-static char __pyx_k_127[] = "Unaligned chunk";
-static char __pyx_k_128[] = "Gaps are not tight phrases";
-static char __pyx_k_129[] = "Inside edges of preceding subphrase are not tight";
-static char __pyx_k_130[] = "Inside edges of following subphrase are not tight";
-static char __pyx_k_131[] = "Subphrase [%d, %d] failed integrity check";
-static char __pyx_k_132[] = "Didn't extract anything from [%d, %d] -> [%d, %d]";
-static char __pyx_k_133[] = "Unable to extract basic phrase";
-static char __pyx_k_134[] = "%s=%s";
-static char __pyx_k_135[] = "cdec.sa";
-static char __pyx_k_137[] = "*EPS*";
+static char __pyx_k_101[] = "Sampling strategy: uniform, max sample size = %d";
+static char __pyx_k_102[] = "Sampling strategy: no sampling";
+static char __pyx_k_104[] = "require_aligned_terminal";
+static char __pyx_k_105[] = "require_aligned_chunks";
+static char __pyx_k_106[] = "[X]";
+static char __pyx_k_107[] = "Must specify an alignment object";
+static char __pyx_k_109[] = "Reading precomputed data from file %s... ";
+static char __pyx_k_110[] = "Precomputation done with max nonterminals %d, decoder uses %d";
+static char __pyx_k_111[] = "Precomputation done with max terminals %d, decoder uses %d";
+static char __pyx_k_112[] = "Precomputation done with max initial size %d, decoder uses %d";
+static char __pyx_k_113[] = "Precomputation done with min gap size %d, decoder uses %d";
+static char __pyx_k_114[] = "Converting %d hash keys on precomputed inverted index... ";
+static char __pyx_k_115[] = "Converting %d hash keys on precomputed collocations... ";
+static char __pyx_k_116[] = "Processing precomputations took %f seconds";
+static char __pyx_k_117[] = "{";
+  static char __pyx_k_118[] = "(";
+static char __pyx_k_119[] = "}";
+static char __pyx_k_120[] = "get_precomputed_collocation";
+static char __pyx_k_121[] = "double binary";
+static char __pyx_k_122[] = "Keyword trie error";
+static char __pyx_k_124[] = "get_all_nodes_isteps_away";
+static char __pyx_k_125[] = "Total time for rule lookup, extraction, and scoring = %f seconds";
+static char __pyx_k_126[] = "    Extract time = %f seconds";
+static char __pyx_k_127[] = "No aligned terminals";
+static char __pyx_k_128[] = "Unaligned chunk";
+static char __pyx_k_129[] = "Gaps are not tight phrases";
+static char __pyx_k_130[] = "Inside edges of preceding subphrase are not tight";
+static char __pyx_k_131[] = "Inside edges of following subphrase are not tight";
+static char __pyx_k_132[] = "Subphrase [%d, %d] failed integrity check";
+static char __pyx_k_133[] = "Didn't extract anything from [%d, %d] -> [%d, %d]";
+static char __pyx_k_134[] = "Unable to extract basic phrase";
+static char __pyx_k_135[] = "%s=%s";
+static char __pyx_k_138[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/_sa.pyx";
+static char __pyx_k_139[] = "cdec.sa";
+static char __pyx_k_143[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi";
+static char __pyx_k_144[] = "*EPS*";
 static char __pyx_k__gc[] = "gc";
 static char __pyx_k__sa[] = "sa";
 static char __pyx_k___sa[] = "_sa";
@@ -2167,7 +2506,6 @@ static char __pyx_k__edarray[] = "edarray";
 static char __pyx_k__ephrase[] = "ephrase";
 static char __pyx_k__fphrase[] = "fphrase";
 static char __pyx_k__fsarray[] = "fsarray";
-static char __pyx_k__getSent[] = "getSent";
 static char __pyx_k__logging[] = "logging";
 static char __pyx_k__matches[] = "matches";
 static char __pyx_k__pathlen[] = "pathlen";
@@ -2206,7 +2544,6 @@ static char __pyx_k__enumerate[] = "enumerate";
 static char __pyx_k__from_data[] = "from_data";
 static char __pyx_k__from_text[] = "from_text";
 static char __pyx_k__getLogger[] = "getLogger";
-static char __pyx_k__getSentId[] = "getSentId";
 static char __pyx_k__getrusage[] = "getrusage";
 static char __pyx_k__increment[] = "increment";
 static char __pyx_k__iteritems[] = "iteritems";
@@ -2219,7 +2556,6 @@ static char __pyx_k__use_index[] = "use_index";
 static char __pyx_k__IndexError[] = "IndexError";
 static char __pyx_k__alignments[] = "alignments";
 static char __pyx_k__from_stats[] = "from_stats";
-static char __pyx_k__getSentPos[] = "getSentPos";
 static char __pyx_k__input_span[] = "input_span";
 static char __pyx_k__itervalues[] = "itervalues";
 static char __pyx_k__max_chunks[] = "max_chunks";
@@ -2242,6 +2578,7 @@ static char __pyx_k__sample_size[] = "sample_size";
 static char __pyx_k__suffix_link[] = "suffix_link";
 static char __pyx_k__use_sent_id[] = "use_sent_id";
 static char __pyx_k___doquicksort[] = "_doquicksort";
+static char __pyx_k__get_sentence[] = "get_sentence";
 static char __pyx_k__gzip_or_text[] = "gzip_or_text";
 static char __pyx_k__min_gap_size[] = "min_gap_size";
 static char __pyx_k__StopIteration[] = "StopIteration";
@@ -2255,6 +2592,7 @@ static char __pyx_k__read_text_data[] = "read_text_data";
 static char __pyx_k__sym_fromstring[] = "sym_fromstring";
 static char __pyx_k__by_slack_factor[] = "by_slack_factor";
 static char __pyx_k__get_next_states[] = "get_next_states";
+static char __pyx_k__get_sentence_id[] = "get_sentence_id";
 static char __pyx_k__num_subpatterns[] = "num_subpatterns";
 static char __pyx_k__phrase_location[] = "phrase_location";
 static char __pyx_k__precompute_file[] = "precompute_file";
@@ -2271,12 +2609,11 @@ static char __pyx_k__max_target_length[] = "max_target_length";
 static char __pyx_k__train_min_gap_size[] = "train_min_gap_size";
 static char __pyx_k__pattern2phrase_plus[] = "pattern2phrase_plus";
 static PyObject *__pyx_kp_s_1;
-static PyObject *__pyx_kp_s_100;
 static PyObject *__pyx_kp_s_101;
-static PyObject *__pyx_n_s_103;
+static PyObject *__pyx_kp_s_102;
 static PyObject *__pyx_n_s_104;
-static PyObject *__pyx_kp_s_106;
-static PyObject *__pyx_kp_s_108;
+static PyObject *__pyx_n_s_105;
+static PyObject *__pyx_kp_s_107;
 static PyObject *__pyx_kp_s_109;
 static PyObject *__pyx_kp_s_110;
 static PyObject *__pyx_kp_s_111;
@@ -2287,11 +2624,11 @@ static PyObject *__pyx_kp_s_115;
 static PyObject *__pyx_kp_s_116;
 static PyObject *__pyx_kp_s_117;
 static PyObject *__pyx_kp_s_118;
-static PyObject *__pyx_n_s_119;
-static PyObject *__pyx_kp_s_120;
+static PyObject *__pyx_kp_s_119;
+static PyObject *__pyx_n_s_120;
 static PyObject *__pyx_kp_s_121;
-static PyObject *__pyx_n_s_123;
-static PyObject *__pyx_kp_s_124;
+static PyObject *__pyx_kp_s_122;
+static PyObject *__pyx_n_s_124;
 static PyObject *__pyx_kp_s_125;
 static PyObject *__pyx_kp_s_126;
 static PyObject *__pyx_kp_s_127;
@@ -2304,8 +2641,11 @@ static PyObject *__pyx_kp_s_132;
 static PyObject *__pyx_kp_s_133;
 static PyObject *__pyx_kp_s_134;
 static PyObject *__pyx_kp_s_135;
-static PyObject *__pyx_kp_s_137;
+static PyObject *__pyx_kp_s_138;
+static PyObject *__pyx_kp_s_139;
 static PyObject *__pyx_kp_s_14;
+static PyObject *__pyx_kp_s_143;
+static PyObject *__pyx_kp_s_144;
 static PyObject *__pyx_kp_s_18;
 static PyObject *__pyx_kp_s_2;
 static PyObject *__pyx_kp_s_21;
@@ -2348,13 +2688,14 @@ static PyObject *__pyx_kp_s_85;
 static PyObject *__pyx_kp_s_86;
 static PyObject *__pyx_kp_s_87;
 static PyObject *__pyx_kp_s_88;
-static PyObject *__pyx_kp_s_89;
+static PyObject *__pyx_n_s_89;
 static PyObject *__pyx_kp_s_9;
 static PyObject *__pyx_kp_s_90;
 static PyObject *__pyx_kp_s_91;
 static PyObject *__pyx_kp_s_92;
-static PyObject *__pyx_kp_s_94;
+static PyObject *__pyx_kp_s_93;
 static PyObject *__pyx_kp_s_95;
+static PyObject *__pyx_kp_s_96;
 static PyObject *__pyx_kp_s__0;
 static PyObject *__pyx_kp_s__1;
 static PyObject *__pyx_n_s__Counter;
@@ -2422,13 +2763,12 @@ static PyObject *__pyx_n_s__fword;
 static PyObject *__pyx_n_s__fwords;
 static PyObject *__pyx_n_s__gc;
 static PyObject *__pyx_n_s__getLogger;
-static PyObject *__pyx_n_s__getSent;
-static PyObject *__pyx_n_s__getSentId;
-static PyObject *__pyx_n_s__getSentPos;
 static PyObject *__pyx_n_s__get_e_id;
 static PyObject *__pyx_n_s__get_f_id;
 static PyObject *__pyx_n_s__get_id;
 static PyObject *__pyx_n_s__get_next_states;
+static PyObject *__pyx_n_s__get_sentence;
+static PyObject *__pyx_n_s__get_sentence_id;
 static PyObject *__pyx_n_s__get_word;
 static PyObject *__pyx_n_s__getchunk;
 static PyObject *__pyx_n_s__getrusage;
@@ -2555,7 +2895,7 @@ static PyObject *__pyx_int_20;
 static PyObject *__pyx_int_1000;
 static PyObject *__pyx_int_65536;
 static PyObject *__pyx_k_41;
-static PyObject *__pyx_k_99;
+static PyObject *__pyx_k_100;
 static PyObject *__pyx_k_tuple_10;
 static PyObject *__pyx_k_tuple_11;
 static PyObject *__pyx_k_tuple_12;
@@ -2597,14 +2937,18 @@ static PyObject *__pyx_k_tuple_79;
 static PyObject *__pyx_k_tuple_80;
 static PyObject *__pyx_k_tuple_81;
 static PyObject *__pyx_k_tuple_82;
-static PyObject *__pyx_k_tuple_93;
-static PyObject *__pyx_k_tuple_96;
+static PyObject *__pyx_k_tuple_94;
 static PyObject *__pyx_k_tuple_97;
 static PyObject *__pyx_k_tuple_98;
-static PyObject *__pyx_k_tuple_102;
-static PyObject *__pyx_k_tuple_107;
-static PyObject *__pyx_k_tuple_122;
+static PyObject *__pyx_k_tuple_99;
+static PyObject *__pyx_k_tuple_103;
+static PyObject *__pyx_k_tuple_108;
+static PyObject *__pyx_k_tuple_123;
 static PyObject *__pyx_k_tuple_136;
+static PyObject *__pyx_k_tuple_140;
+static PyObject *__pyx_k_tuple_141;
+static PyObject *__pyx_k_codeobj_137;
+static PyObject *__pyx_k_codeobj_142;
 
 /* "_sa.pyx":5
  * import gzip
@@ -2625,7 +2969,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("monitor_cpu");
+  __Pyx_RefNannySetupContext("monitor_cpu", 0);
 
   /* "_sa.pyx":6
  * 
@@ -2645,7 +2989,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -2675,7 +3019,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   __pyx_t_4 = 0;
@@ -2690,7 +3034,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_r = __pyx_t_5;
   goto __pyx_L0;
@@ -2709,6 +3053,28 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_1gzip_or_text = {__Pyx_NAMESTR("gzip_or_text"), (PyCFunction)__pyx_pw_3_sa_1gzip_or_text, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("gzip_or_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.gzip_or_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_gzip_or_text(__pyx_self, ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "_sa.pyx":9
  *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
  * 
@@ -2717,10 +3083,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
  *         return gzip.GzipFile(filename)
  */
 
-static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_gzip_or_text = {__Pyx_NAMESTR("gzip_or_text"), (PyCFunction)__pyx_pf_3_sa_gzip_or_text, METH_O, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_filename) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2730,17 +3093,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("gzip_or_text");
-  __pyx_self = __pyx_self;
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.gzip_or_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("gzip_or_text", 0);
 
   /* "_sa.pyx":10
  * 
@@ -2771,7 +3124,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -2782,7 +3135,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
@@ -2797,7 +3150,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -2808,7 +3161,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_t_1 = 0;
     goto __pyx_L0;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -2824,32 +3177,22 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":11
- * cdef class FloatList:
- * 
- *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
- *         if initial_len > size:
- *             size = initial_len
- */
-
-static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -2857,7 +3200,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
@@ -2875,7 +3218,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -2910,8 +3253,26 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList___cinit__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_size, __pyx_v_increment, __pyx_v_initial_len);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":12
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":11
+ * cdef class FloatList:
+ * 
+ *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
+ *         if initial_len > size:
+ *             size = initial_len
+ */
+
+static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":12
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:             # <<<<<<<<<<<<<<
@@ -2921,7 +3282,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = (__pyx_v_initial_len > __pyx_v_size);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":13
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":13
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:
  *             size = initial_len             # <<<<<<<<<<<<<<
@@ -2929,61 +3290,70 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.increment = increment
  */
     __pyx_v_size = __pyx_v_initial_len;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":14
  *         if initial_len > size:
  *             size = initial_len
  *         self.size = size             # <<<<<<<<<<<<<<
  *         self.increment = increment
  *         self.len = initial_len
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size = __pyx_v_size;
+  __pyx_v_self->size = __pyx_v_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":15
  *             size = initial_len
  *         self.size = size
  *         self.increment = increment             # <<<<<<<<<<<<<<
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->increment = __pyx_v_increment;
+  __pyx_v_self->increment = __pyx_v_increment;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":16
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":16
  *         self.size = size
  *         self.increment = increment
  *         self.len = initial_len             # <<<<<<<<<<<<<<
  *         self.arr = <float*> malloc(size*sizeof(float))
  *         memset(self.arr, 0, initial_len*sizeof(float))
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len = __pyx_v_initial_len;
+  __pyx_v_self->len = __pyx_v_initial_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":17
  *         self.increment = increment
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))             # <<<<<<<<<<<<<<
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
+  __pyx_v_self->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":18
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))
  *         memset(self.arr, 0, initial_len*sizeof(float))             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  memset(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr, 0, (__pyx_v_initial_len * (sizeof(float))));
+  memset(__pyx_v_self->arr, 0, (__pyx_v_initial_len * (sizeof(float))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":20
+/* Python wrapper */
+static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_9FloatList_2__dealloc__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -2991,24 +3361,34 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":21
  * 
  *     def __dealloc__(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, i):
  */
-  free(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr);
+  free(__pyx_v_self->arr);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":23
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9FloatList_4__getitem__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":23
  *         free(self.arr)
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -3016,8 +3396,7 @@ static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self) {
  *         if i<0:
  */
 
-static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_v_j = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -3030,9 +3409,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":24
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":24
  * 
  *     def __getitem__(self, i):
  *         j = i             # <<<<<<<<<<<<<<
@@ -3042,27 +3421,26 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
   __Pyx_INCREF(__pyx_v_i);
   __pyx_v_j = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":25
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":25
  *     def __getitem__(self, i):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":26
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":26
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  */
-    __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
@@ -3070,26 +3448,24 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
     __Pyx_DECREF(__pyx_v_j);
     __pyx_v_j = __pyx_t_3;
     __pyx_t_3 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":27
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         return self.arr[j]
  */
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (!__pyx_t_2) {
-    __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_j, __pyx_t_3, Py_GE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_j, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3099,17 +3475,17 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
   }
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":28
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":28
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))             # <<<<<<<<<<<<<<
  *         return self.arr[j]
  * 
  */
-    __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_i);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_i);
     __Pyx_GIVEREF(__pyx_v_i);
@@ -3120,7 +3496,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -3130,11 +3506,11 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
     __Pyx_Raise(__pyx_t_1, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L4;
   }
-  __pyx_L6:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":29
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":29
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         return self.arr[j]             # <<<<<<<<<<<<<<
@@ -3143,7 +3519,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_j); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr[__pyx_t_6])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->arr[__pyx_t_6])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3163,7 +3539,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":31
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":31
  *         return self.arr[j]
  * 
  *     cdef void set(self, int i, float v):             # <<<<<<<<<<<<<<
@@ -3183,9 +3559,9 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set");
+  __Pyx_RefNannySetupContext("set", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":32
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":32
  * 
  *     cdef void set(self, int i, float v):
  *         j = i             # <<<<<<<<<<<<<<
@@ -3194,7 +3570,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
  */
   __pyx_v_j = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":33
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":33
  *     cdef void set(self, int i, float v):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -3204,7 +3580,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   __pyx_t_1 = (__pyx_v_i < 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":34
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":34
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -3216,7 +3592,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":35
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":35
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -3232,7 +3608,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":36
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":36
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))             # <<<<<<<<<<<<<<
@@ -3244,7 +3620,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
     __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -3255,7 +3631,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -3269,7 +3645,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":37
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":37
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         self.arr[j] = v             # <<<<<<<<<<<<<<
@@ -3288,7 +3664,18 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":39
+/* Python wrapper */
+static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9FloatList_6__setitem__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((PyObject *)__pyx_v_i), ((PyObject *)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":39
  *         self.arr[j] = v
  * 
  *     def __setitem__(self, i, val):             # <<<<<<<<<<<<<<
@@ -3296,8 +3683,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
  * 
  */
 
-static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
-static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -3305,9 +3691,9 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setitem__");
+  __Pyx_RefNannySetupContext("__setitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":40
  * 
  *     def __setitem__(self, i, val):
  *         self.set(i, val)             # <<<<<<<<<<<<<<
@@ -3315,8 +3701,8 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
  *     def __len__(self):
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = __pyx_PyFloat_AsDouble(__pyx_v_val); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->set(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_t_1, __pyx_t_2);
+  __pyx_t_2 = __pyx_PyFloat_AsFloat(__pyx_v_val); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->set(__pyx_v_self, __pyx_t_1, __pyx_t_2);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -3328,7 +3714,18 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":42
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9FloatList_8__len__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":42
  *         self.set(i, val)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -3336,20 +3733,19 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":43
  * 
  *     def __len__(self):
  *         return self.len             # <<<<<<<<<<<<<<
  * 
  *     def append(self, float val):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len;
+  __pyx_r = __pyx_v_self->len;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -3358,26 +3754,15 @@ static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":45
- *         return self.len
- * 
- *     def append(self, float val):             # <<<<<<<<<<<<<<
- *         if self.len == self.size:
- *             self.size = self.size + self.increment
- */
-
-static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
   float __pyx_v_val;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("append");
+  __Pyx_RefNannySetupContext("append (wrapper)", 0);
   assert(__pyx_arg_val); {
-    __pyx_v_val = __pyx_PyFloat_AsDouble(__pyx_arg_val); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = __pyx_PyFloat_AsFloat(__pyx_arg_val); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -3385,55 +3770,73 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList_10append(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((float)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":46
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":45
+ *         return self.len
+ * 
+ *     def append(self, float val):             # <<<<<<<<<<<<<<
+ *         if self.len == self.size:
+ *             self.size = self.size + self.increment
+ */
+
+static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, float __pyx_v_val) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("append", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":46
  * 
  *     def append(self, float val):
  *         if self.len == self.size:             # <<<<<<<<<<<<<<
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len == ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size);
+  __pyx_t_1 = (__pyx_v_self->len == __pyx_v_self->size);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":47
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":47
  *     def append(self, float val):
  *         if self.len == self.size:
  *             self.size = self.size + self.increment             # <<<<<<<<<<<<<<
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val
  */
-    ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size + ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->increment);
+    __pyx_v_self->size = (__pyx_v_self->size + __pyx_v_self->increment);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":48
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":48
  *         if self.len == self.size:
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))             # <<<<<<<<<<<<<<
  *         self.arr[self.len] = val
  *         self.len = self.len + 1
  */
-    ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr = ((float *)realloc(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr, (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size * (sizeof(float)))));
-    goto __pyx_L5;
+    __pyx_v_self->arr = ((float *)realloc(__pyx_v_self->arr, (__pyx_v_self->size * (sizeof(float)))));
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":49
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":49
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val             # <<<<<<<<<<<<<<
  *         self.len = self.len + 1
  * 
  */
-  (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr[((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len]) = __pyx_v_val;
+  (__pyx_v_self->arr[__pyx_v_self->len]) = __pyx_v_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":50
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":50
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val
  *         self.len = self.len + 1             # <<<<<<<<<<<<<<
  * 
  *     cdef void write_handle(self, FILE* f):
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len + 1);
+  __pyx_v_self->len = (__pyx_v_self->len + 1);
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -3441,7 +3844,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":52
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":52
  *         self.len = self.len + 1
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -3451,9 +3854,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
 
 static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_handle");
+  __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":53
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":53
  * 
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(float), 1, f)             # <<<<<<<<<<<<<<
@@ -3462,7 +3865,7 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
  */
   fwrite((&__pyx_v_self->len), (sizeof(float)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":54
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(float), 1, f)
  *         fwrite(self.arr, sizeof(float), self.len, f)             # <<<<<<<<<<<<<<
@@ -3474,24 +3877,13 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":56
- *         fwrite(self.arr, sizeof(float), self.len, f)
- * 
- *     def write(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write");
+  __Pyx_RefNannySetupContext("write (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -3501,8 +3893,26 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList_12write(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":56
+ *         fwrite(self.arr, sizeof(float), self.len, f)
+ * 
+ *     def write(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":58
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":58
  *     def write(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -3511,16 +3921,16 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":59
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":59
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":60
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -3535,7 +3945,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":62
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":62
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -3545,9 +3955,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
 
 static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_handle");
+  __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":63
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":63
  * 
  *     cdef void read_handle(self, FILE* f):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -3556,7 +3966,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   free(__pyx_v_self->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":64
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":64
  *     cdef void read_handle(self, FILE* f):
  *         free(self.arr)
  *         fread(&(self.len), sizeof(float), 1, f)             # <<<<<<<<<<<<<<
@@ -3565,7 +3975,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   fread((&__pyx_v_self->len), (sizeof(float)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":65
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":65
  *         free(self.arr)
  *         fread(&(self.len), sizeof(float), 1, f)
  *         self.arr = <float*> malloc(self.len * sizeof(float))             # <<<<<<<<<<<<<<
@@ -3574,7 +3984,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   __pyx_v_self->arr = ((float *)malloc((__pyx_v_self->len * (sizeof(float)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":66
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":66
  *         fread(&(self.len), sizeof(float), 1, f)
  *         self.arr = <float*> malloc(self.len * sizeof(float))
  *         self.size = self.len             # <<<<<<<<<<<<<<
@@ -3583,7 +3993,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   __pyx_v_self->size = __pyx_v_self->len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":67
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":67
  *         self.arr = <float*> malloc(self.len * sizeof(float))
  *         self.size = self.len
  *         fread(self.arr, sizeof(float), self.len, f)             # <<<<<<<<<<<<<<
@@ -3595,24 +4005,13 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":69
- *         fread(self.arr, sizeof(float), self.len, f)
- * 
- *     def read(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read");
+  __Pyx_RefNannySetupContext("read (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -3622,8 +4021,26 @@ static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList_14read(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":71
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":69
+ *         fread(self.arr, sizeof(float), self.len, f)
+ * 
+ *     def read(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":71
  *     def read(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -3632,15 +4049,15 @@ static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":72
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":73
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":73
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -3653,32 +4070,22 @@ static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":11
- * cdef class IntList:
- * 
- *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
- *         if initial_len > size:
- *             size = initial_len
- */
-
-static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -3686,7 +4093,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
@@ -3704,7 +4111,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3739,8 +4146,26 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList___cinit__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_size, __pyx_v_increment, __pyx_v_initial_len);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":11
+ * cdef class IntList:
+ * 
+ *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
+ *         if initial_len > size:
+ *             size = initial_len
+ */
+
+static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":12
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":12
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:             # <<<<<<<<<<<<<<
@@ -3750,7 +4175,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
   __pyx_t_1 = (__pyx_v_initial_len > __pyx_v_size);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":13
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":13
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:
  *             size = initial_len             # <<<<<<<<<<<<<<
@@ -3758,61 +4183,72 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         self.increment = increment
  */
     __pyx_v_size = __pyx_v_initial_len;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":14
  *         if initial_len > size:
  *             size = initial_len
  *         self.size = size             # <<<<<<<<<<<<<<
  *         self.increment = increment
  *         self.len = initial_len
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size = __pyx_v_size;
+  __pyx_v_self->size = __pyx_v_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":15
  *             size = initial_len
  *         self.size = size
  *         self.increment = increment             # <<<<<<<<<<<<<<
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->increment = __pyx_v_increment;
+  __pyx_v_self->increment = __pyx_v_increment;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":16
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":16
  *         self.size = size
  *         self.increment = increment
  *         self.len = initial_len             # <<<<<<<<<<<<<<
  *         self.arr = <int*> malloc(size*sizeof(int))
  *         memset(self.arr, 0, initial_len*sizeof(int))
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len = __pyx_v_initial_len;
+  __pyx_v_self->len = __pyx_v_initial_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":17
  *         self.increment = increment
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))             # <<<<<<<<<<<<<<
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
+  __pyx_v_self->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":18
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))
  *         memset(self.arr, 0, initial_len*sizeof(int))             # <<<<<<<<<<<<<<
  * 
  *     def __str__(self):
  */
-  memset(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr, 0, (__pyx_v_initial_len * (sizeof(int))));
+  memset(__pyx_v_self->arr, 0, (__pyx_v_initial_len * (sizeof(int))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":20
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_2__str__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -3820,8 +4256,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         ret = "IntList["
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_v_ret = NULL;
   int __pyx_v_idx;
   PyObject *__pyx_r = NULL;
@@ -3834,9 +4269,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":22
  *     def __str__(self):
  *         cdef unsigned i
  *         ret = "IntList["             # <<<<<<<<<<<<<<
@@ -3846,18 +4281,18 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_3));
   __pyx_v_ret = ((PyObject *)__pyx_kp_s_3);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":23
  *         cdef unsigned i
  *         ret = "IntList["
  *         for idx in range(self.size):             # <<<<<<<<<<<<<<
  *             if idx>0:
  *                 ret += ","
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size;
+  __pyx_t_1 = __pyx_v_self->size;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_idx = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":24
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":24
  *         ret = "IntList["
  *         for idx in range(self.size):
  *             if idx>0:             # <<<<<<<<<<<<<<
@@ -3867,7 +4302,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
     __pyx_t_3 = (__pyx_v_idx > 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":25
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":25
  *         for idx in range(self.size):
  *             if idx>0:
  *                 ret += ","             # <<<<<<<<<<<<<<
@@ -3879,21 +4314,21 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
       __Pyx_DECREF(__pyx_v_ret);
       __pyx_v_ret = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":26
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":26
  *             if idx>0:
  *                 ret += ","
  *             ret += str(self.arr[idx])             # <<<<<<<<<<<<<<
  *         ret += "]"
  *         ret += "len="
  */
-    __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_idx])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_idx])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
@@ -3908,7 +4343,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
     __pyx_t_5 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":27
  *                 ret += ","
  *             ret += str(self.arr[idx])
  *         ret += "]"             # <<<<<<<<<<<<<<
@@ -3921,7 +4356,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   __pyx_v_ret = __pyx_t_5;
   __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":28
  *             ret += str(self.arr[idx])
  *         ret += "]"
  *         ret += "len="             # <<<<<<<<<<<<<<
@@ -3934,14 +4369,14 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   __pyx_v_ret = __pyx_t_5;
   __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":29
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":29
  *         ret += "]"
  *         ret += "len="
  *         ret += self.len             # <<<<<<<<<<<<<<
  *         return ret
  * 
  */
-  __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_ret, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
@@ -3950,7 +4385,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   __pyx_v_ret = __pyx_t_4;
   __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":30
  *         ret += "len="
  *         ret += self.len
  *         return ret             # <<<<<<<<<<<<<<
@@ -3976,7 +4411,18 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":32
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("index (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_4index(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":32
  *         return ret
  * 
  *     def index(self, val):             # <<<<<<<<<<<<<<
@@ -3984,8 +4430,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
  *         for i in range(self.len):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
+static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_val) {
   unsigned int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -3997,36 +4442,35 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("index");
+  __Pyx_RefNannySetupContext("index", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":34
  *     def index(self, val):
  *         cdef unsigned i
  *         for i in range(self.len):             # <<<<<<<<<<<<<<
  *             if self.arr[i] == val:
  *                 return i
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len;
+  __pyx_t_1 = __pyx_v_self->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":35
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":35
  *         cdef unsigned i
  *         for i in range(self.len):
  *             if self.arr[i] == val:             # <<<<<<<<<<<<<<
  *                 return i
  *         return IndexError
  */
-    __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_val, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_val, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":36
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":36
  *         for i in range(self.len):
  *             if self.arr[i] == val:
  *                 return i             # <<<<<<<<<<<<<<
@@ -4039,12 +4483,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
       __pyx_r = __pyx_t_4;
       __pyx_t_4 = 0;
       goto __pyx_L0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":37
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":37
  *             if self.arr[i] == val:
  *                 return i
  *         return IndexError             # <<<<<<<<<<<<<<
@@ -4069,60 +4513,39 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":39
- *         return IndexError
- * 
- *     def partition(self,start,end):             # <<<<<<<<<<<<<<
- *         pivot = self.arr[end]
- *         bottom = start-1
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_end = 0;
-  PyObject *__pyx_v_pivot = NULL;
-  PyObject *__pyx_v_bottom = NULL;
-  PyObject *__pyx_v_top = NULL;
-  long __pyx_v_done;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  Py_ssize_t __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
-  __Pyx_RefNannySetupContext("partition");
+  __Pyx_RefNannySetupContext("partition (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("partition", 1, 2, 2, 1); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "partition") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "partition") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -4141,8 +4564,38 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_6partition(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_start, __pyx_v_end);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":39
+ *         return IndexError
+ * 
+ *     def partition(self,start,end):             # <<<<<<<<<<<<<<
+ *         pivot = self.arr[end]
+ *         bottom = start-1
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end) {
+  PyObject *__pyx_v_pivot = NULL;
+  PyObject *__pyx_v_bottom = NULL;
+  PyObject *__pyx_v_top = NULL;
+  long __pyx_v_done;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  Py_ssize_t __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  Py_ssize_t __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("partition", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":40
  * 
  *     def partition(self,start,end):
  *         pivot = self.arr[end]             # <<<<<<<<<<<<<<
@@ -4150,12 +4603,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *         top = end
  */
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_end); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_pivot = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":41
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":41
  *     def partition(self,start,end):
  *         pivot = self.arr[end]
  *         bottom = start-1             # <<<<<<<<<<<<<<
@@ -4167,7 +4620,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
   __pyx_v_bottom = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":42
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":42
  *         pivot = self.arr[end]
  *         bottom = start-1
  *         top = end             # <<<<<<<<<<<<<<
@@ -4177,7 +4630,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
   __Pyx_INCREF(__pyx_v_end);
   __pyx_v_top = __pyx_v_end;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":43
  *         bottom = start-1
  *         top = end
  *         done = 0             # <<<<<<<<<<<<<<
@@ -4186,7 +4639,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
   __pyx_v_done = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":44
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":44
  *         top = end
  *         done = 0
  *         while not done:             # <<<<<<<<<<<<<<
@@ -4197,7 +4650,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
     __pyx_t_3 = (!__pyx_v_done);
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":45
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":45
  *         done = 0
  *         while not done:
  *             while not done:             # <<<<<<<<<<<<<<
@@ -4208,7 +4661,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
       __pyx_t_3 = (!__pyx_v_done);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":46
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":46
  *         while not done:
  *             while not done:
  *                 bottom += 1             # <<<<<<<<<<<<<<
@@ -4221,20 +4674,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
       __pyx_v_bottom = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":47
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":47
  *             while not done:
  *                 bottom += 1
  *                 if bottom == top:             # <<<<<<<<<<<<<<
  *                     done = 1
  *                     break
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_bottom, __pyx_v_top, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_bottom, __pyx_v_top, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":48
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":48
  *                 bottom += 1
  *                 if bottom == top:
  *                     done = 1             # <<<<<<<<<<<<<<
@@ -4243,19 +4695,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
         __pyx_v_done = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":49
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":49
  *                 if bottom == top:
  *                     done = 1
  *                     break             # <<<<<<<<<<<<<<
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]
  */
-        goto __pyx_L9_break;
-        goto __pyx_L10;
+        goto __pyx_L6_break;
+        goto __pyx_L7;
       }
-      __pyx_L10:;
+      __pyx_L7:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":50
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":50
  *                     done = 1
  *                     break
  *                 if self.arr[bottom] > pivot:             # <<<<<<<<<<<<<<
@@ -4263,16 +4715,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *                     break
  */
       __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_pivot, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_pivot, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":51
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":51
  *                     break
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]             # <<<<<<<<<<<<<<
@@ -4281,23 +4732,23 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
         __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_5]) = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]);
+        (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":52
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":52
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]
  *                     break             # <<<<<<<<<<<<<<
  *             while not done:
  *                 top -= 1
  */
-        goto __pyx_L9_break;
-        goto __pyx_L11;
+        goto __pyx_L6_break;
+        goto __pyx_L8;
       }
-      __pyx_L11:;
+      __pyx_L8:;
     }
-    __pyx_L9_break:;
+    __pyx_L6_break:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":53
  *                     self.arr[top] = self.arr[bottom]
  *                     break
  *             while not done:             # <<<<<<<<<<<<<<
@@ -4308,7 +4759,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
       __pyx_t_3 = (!__pyx_v_done);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":54
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":54
  *                     break
  *             while not done:
  *                 top -= 1             # <<<<<<<<<<<<<<
@@ -4321,20 +4772,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
       __pyx_v_top = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":55
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":55
  *             while not done:
  *                 top -= 1
  *                 if top == bottom:             # <<<<<<<<<<<<<<
  *                     done = 1
  *                     break
  */
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_top, __pyx_v_bottom, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_top, __pyx_v_bottom, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":56
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":56
  *                 top -= 1
  *                 if top == bottom:
  *                     done = 1             # <<<<<<<<<<<<<<
@@ -4343,19 +4793,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
         __pyx_v_done = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":57
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":57
  *                 if top == bottom:
  *                     done = 1
  *                     break             # <<<<<<<<<<<<<<
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]
  */
-        goto __pyx_L13_break;
-        goto __pyx_L14;
+        goto __pyx_L10_break;
+        goto __pyx_L11;
       }
-      __pyx_L14:;
+      __pyx_L11:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":58
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":58
  *                     done = 1
  *                     break
  *                 if self.arr[top] < pivot:             # <<<<<<<<<<<<<<
@@ -4363,16 +4813,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *                     break
  */
       __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pivot, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pivot, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":59
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":59
  *                     break
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]             # <<<<<<<<<<<<<<
@@ -4381,24 +4830,24 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
         __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_5]) = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]);
+        (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":60
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":60
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]
  *                     break             # <<<<<<<<<<<<<<
  *         self.arr[top] = pivot
  *         return top
  */
-        goto __pyx_L13_break;
-        goto __pyx_L15;
+        goto __pyx_L10_break;
+        goto __pyx_L12;
       }
-      __pyx_L15:;
+      __pyx_L12:;
     }
-    __pyx_L13_break:;
+    __pyx_L10_break:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":61
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":61
  *                     self.arr[bottom] = self.arr[top]
  *                     break
  *         self.arr[top] = pivot             # <<<<<<<<<<<<<<
@@ -4407,9 +4856,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
   __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_pivot); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]) = __pyx_t_6;
+  (__pyx_v_self->arr[__pyx_t_1]) = __pyx_t_6;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":62
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":62
  *                     break
  *         self.arr[top] = pivot
  *         return top             # <<<<<<<<<<<<<<
@@ -4437,55 +4886,39 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":64
- *         return top
- * 
- *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
- *         if start < end:
- *             split = self.partition(start,end)
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_end = 0;
-  PyObject *__pyx_v_split = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
-  __Pyx_RefNannySetupContext("_doquicksort");
+  __Pyx_RefNannySetupContext("_doquicksort (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("_doquicksort", 1, 2, 2, 1); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_doquicksort") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_doquicksort") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -4504,31 +4937,55 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_8_doquicksort(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_start, __pyx_v_end);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":64
+ *         return top
+ * 
+ *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
+ *         if start < end:
+ *             split = self.partition(start,end)
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end) {
+  PyObject *__pyx_v_split = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_doquicksort", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":65
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":65
  * 
  *     def _doquicksort(self,start,end):
  *         if start < end:             # <<<<<<<<<<<<<<
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_start, __pyx_v_end, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_start, __pyx_v_end, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":66
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":66
  *     def _doquicksort(self,start,end):
  *         if start < end:
  *             split = self.partition(start,end)             # <<<<<<<<<<<<<<
  *             self._doquicksort(start,split-1)
  *             self._doquicksort(split+1,end)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__partition); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__partition); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_start);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_start);
     __Pyx_GIVEREF(__pyx_v_start);
@@ -4542,19 +4999,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
     __pyx_v_split = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":67
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":67
  *         if start < end:
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)             # <<<<<<<<<<<<<<
  *             self._doquicksort(split+1,end)
  *         else:
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyNumber_Subtract(__pyx_v_split, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_start);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_start);
     __Pyx_GIVEREF(__pyx_v_start);
@@ -4567,19 +5024,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":68
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":68
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)
  *             self._doquicksort(split+1,end)             # <<<<<<<<<<<<<<
  *         else:
  *             return
  */
-    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_1 = PyNumber_Add(__pyx_v_split, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_end);
@@ -4591,11 +5048,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":70
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":70
  *             self._doquicksort(split+1,end)
  *         else:
  *             return             # <<<<<<<<<<<<<<
@@ -4606,7 +5063,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -4623,7 +5080,18 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":72
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("sort (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_10sort(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":72
  *             return
  * 
  *     def sort(self):             # <<<<<<<<<<<<<<
@@ -4631,8 +5099,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -4641,21 +5108,21 @@ static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNU
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sort");
+  __Pyx_RefNannySetupContext("sort", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":73
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":73
  * 
  *     def sort(self):
  *         self._doquicksort(0,self.len-1)             # <<<<<<<<<<<<<<
  * 
  *     def reset(self):
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->len - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(__pyx_int_0);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
@@ -4682,7 +5149,18 @@ static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNU
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":75
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("reset (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_12reset(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":75
  *         self._doquicksort(0,self.len-1)
  * 
  *     def reset(self):             # <<<<<<<<<<<<<<
@@ -4690,20 +5168,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNU
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("reset");
+  __Pyx_RefNannySetupContext("reset", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":76
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":76
  * 
  *     def reset(self):
  *         self.len = 0             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len = 0;
+  __pyx_v_self->len = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -4711,7 +5188,16 @@ static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":78
+/* Python wrapper */
+static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_7IntList_14__dealloc__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":78
  *         self.len = 0
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -4719,25 +5205,35 @@ static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UN
  * 
  */
 
-static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":79
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":79
  * 
  *     def __dealloc__(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
  * 
  *     def __iter__(self):
  */
-  free(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr);
+  free(__pyx_v_self->arr);
+
+  __Pyx_RefNannyFinishContext();
+}
+static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_16__iter__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
   __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -4745,43 +5241,52 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
  *         for i in range(self.len):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_8__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_8__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_16__iter__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__iter__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)__pyx_ptype_3_sa___pyx_scope_struct____iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct____iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7IntList_9generator;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_7IntList_18generator, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.IntList.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -4791,25 +5296,25 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":83
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":83
  *     def __iter__(self):
  *         cdef int i
  *         for i in range(self.len):             # <<<<<<<<<<<<<<
  *             yield self.arr[i]
  * 
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_cur_scope->__pyx_v_self)->len;
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":84
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":84
  *         cdef int i
  *         for i in range(self.len):
  *             yield self.arr[i]             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, index):
  */
-    __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_cur_scope->__pyx_v_self)->arr[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->arr[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
@@ -4818,26 +5323,38 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":86
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_19__getitem__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_index));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":86
  *             yield self.arr[i]
  * 
  *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
@@ -4845,8 +5362,7 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
  *         if isinstance(index, int):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
+static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_index) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -4866,9 +5382,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":88
  *     def __getitem__(self, index):
  *         cdef int i, j, k
  *         if isinstance(index, int):             # <<<<<<<<<<<<<<
@@ -4881,7 +5397,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":89
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":89
  *         cdef int i, j, k
  *         if isinstance(index, int):
  *             j = index             # <<<<<<<<<<<<<<
@@ -4891,7 +5407,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_index); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_j = __pyx_t_3;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":90
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":90
  *         if isinstance(index, int):
  *             j = index
  *             if j < 0:             # <<<<<<<<<<<<<<
@@ -4901,19 +5417,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_2 = (__pyx_v_j < 0);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":91
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":91
  *             j = index
  *             if j < 0:
  *                 j = self.len + j             # <<<<<<<<<<<<<<
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  */
-      __pyx_v_j = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_j);
-      goto __pyx_L6;
+      __pyx_v_j = (__pyx_v_self->len + __pyx_v_j);
+      goto __pyx_L4;
     }
-    __pyx_L6:;
+    __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":92
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":92
  *             if j < 0:
  *                 j = self.len + j
  *             if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -4922,24 +5438,24 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  */
     __pyx_t_2 = (__pyx_v_j < 0);
     if (!__pyx_t_2) {
-      __pyx_t_4 = (__pyx_v_j >= ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
+      __pyx_t_4 = (__pyx_v_j >= __pyx_v_self->len);
       __pyx_t_5 = __pyx_t_4;
     } else {
       __pyx_t_5 = __pyx_t_2;
     }
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":93
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":93
  *                 j = self.len + j
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))             # <<<<<<<<<<<<<<
  *             return self.arr[j]
  *         elif isinstance(index, slice):
  */
-      __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+      __Pyx_GOTREF(__pyx_t_6);
       __Pyx_INCREF(__pyx_v_index);
       PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_index);
       __Pyx_GIVEREF(__pyx_v_index);
@@ -4950,7 +5466,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
       __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+      __Pyx_GOTREF(__pyx_t_6);
       PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_1));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
       __pyx_t_1 = 0;
@@ -4960,11 +5476,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_Raise(__pyx_t_1, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":94
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":94
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  *             return self.arr[j]             # <<<<<<<<<<<<<<
@@ -4972,15 +5488,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  *             i = index.start
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_j])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_j])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":95
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":95
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  *             return self.arr[j]
  *         elif isinstance(index, slice):             # <<<<<<<<<<<<<<
@@ -4993,7 +5509,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":96
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":96
  *             return self.arr[j]
  *         elif isinstance(index, slice):
  *             i = index.start             # <<<<<<<<<<<<<<
@@ -5006,7 +5522,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_v_i = __pyx_t_3;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":97
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":97
  *         elif isinstance(index, slice):
  *             i = index.start
  *             j = index.stop             # <<<<<<<<<<<<<<
@@ -5019,7 +5535,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_v_j = __pyx_t_3;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":98
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":98
  *             i = index.start
  *             j = index.stop
  *             if i < 0:             # <<<<<<<<<<<<<<
@@ -5029,19 +5545,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_5 = (__pyx_v_i < 0);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":99
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":99
  *             j = index.stop
  *             if i < 0:
  *                 i = self.len + i             # <<<<<<<<<<<<<<
  *             if j < 0:
  *                 j = self.len + j
  */
-      __pyx_v_i = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_i);
-      goto __pyx_L8;
+      __pyx_v_i = (__pyx_v_self->len + __pyx_v_i);
+      goto __pyx_L6;
     }
-    __pyx_L8:;
+    __pyx_L6:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":100
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":100
  *             if i < 0:
  *                 i = self.len + i
  *             if j < 0:             # <<<<<<<<<<<<<<
@@ -5051,19 +5567,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_5 = (__pyx_v_j < 0);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":101
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":101
  *                 i = self.len + i
  *             if j < 0:
  *                 j = self.len + j             # <<<<<<<<<<<<<<
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  */
-      __pyx_v_j = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_j);
-      goto __pyx_L9;
+      __pyx_v_j = (__pyx_v_self->len + __pyx_v_j);
+      goto __pyx_L7;
     }
-    __pyx_L9:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":102
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":102
  *             if j < 0:
  *                 j = self.len + j
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:             # <<<<<<<<<<<<<<
@@ -5072,11 +5588,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  */
     __pyx_t_5 = (__pyx_v_i < 0);
     if (!__pyx_t_5) {
-      __pyx_t_2 = (__pyx_v_i >= ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
+      __pyx_t_2 = (__pyx_v_i >= __pyx_v_self->len);
       if (!__pyx_t_2) {
         __pyx_t_4 = (__pyx_v_j < 0);
         if (!__pyx_t_4) {
-          __pyx_t_7 = (__pyx_v_j > ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
+          __pyx_t_7 = (__pyx_v_j > __pyx_v_self->len);
           __pyx_t_8 = __pyx_t_7;
         } else {
           __pyx_t_8 = __pyx_t_4;
@@ -5091,7 +5607,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     }
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":103
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":103
  *                 j = self.len + j
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))             # <<<<<<<<<<<<<<
@@ -5102,10 +5618,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_6 = PyObject_GetAttr(__pyx_v_index, __pyx_n_s__stop); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_9 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+      __Pyx_GOTREF(__pyx_t_10);
       PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_6);
@@ -5119,7 +5635,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
       __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+      __Pyx_GOTREF(__pyx_t_10);
       PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
       __pyx_t_9 = 0;
@@ -5129,11 +5645,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_Raise(__pyx_t_9, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L10;
+      goto __pyx_L8;
     }
-    __pyx_L10:;
+    __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":104
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":104
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  *             result = ()             # <<<<<<<<<<<<<<
@@ -5143,7 +5659,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
     __pyx_v_result = __pyx_empty_tuple;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":105
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  *             result = ()
  *             for k from i <= k < j:             # <<<<<<<<<<<<<<
@@ -5153,17 +5669,17 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_3 = __pyx_v_j;
     for (__pyx_v_k = __pyx_v_i; __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":106
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":106
  *             result = ()
  *             for k from i <= k < j:
  *                 result = result + (self.arr[k],)             # <<<<<<<<<<<<<<
  *             return result
  *         else:
  */
-      __pyx_t_9 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_k])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_k])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+      __Pyx_GOTREF(__pyx_t_10);
       PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_9);
       __Pyx_GIVEREF(__pyx_t_9);
       __pyx_t_9 = 0;
@@ -5175,7 +5691,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __pyx_t_9 = 0;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":107
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":107
  *             for k from i <= k < j:
  *                 result = result + (self.arr[k],)
  *             return result             # <<<<<<<<<<<<<<
@@ -5186,11 +5702,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_INCREF(((PyObject *)__pyx_v_result));
     __pyx_r = ((PyObject *)__pyx_v_result);
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":109
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":109
  *             return result
  *         else:
  *             raise TypeError("Illegal key type %s for IntList" % type(index))             # <<<<<<<<<<<<<<
@@ -5200,7 +5716,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_9), ((PyObject *)Py_TYPE(__pyx_v_index))); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_9));
     __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+    __Pyx_GOTREF(__pyx_t_10);
     PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
     __pyx_t_9 = 0;
@@ -5211,7 +5727,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -5229,7 +5745,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":111
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":111
  *             raise TypeError("Illegal key type %s for IntList" % type(index))
  * 
  *     cdef void set(self, int i, int val):             # <<<<<<<<<<<<<<
@@ -5249,9 +5765,9 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set");
+  __Pyx_RefNannySetupContext("set", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":112
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":112
  * 
  *     cdef void set(self, int i, int val):
  *         j = i             # <<<<<<<<<<<<<<
@@ -5260,7 +5776,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
  */
   __pyx_v_j = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":113
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":113
  *     cdef void set(self, int i, int val):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -5270,7 +5786,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   __pyx_t_1 = (__pyx_v_i < 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":114
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":114
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -5282,7 +5798,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":115
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":115
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -5298,7 +5814,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":116
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":116
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length IntList" % (i, self.len))             # <<<<<<<<<<<<<<
@@ -5310,7 +5826,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
     __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -5321,7 +5837,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -5335,7 +5851,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":117
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":117
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length IntList" % (i, self.len))
  *         self.arr[j] = val             # <<<<<<<<<<<<<<
@@ -5354,7 +5870,18 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":119
+/* Python wrapper */
+static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_21__setitem__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_i), ((PyObject *)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":119
  *         self.arr[j] = val
  * 
  *     def __setitem__(self, i, val):             # <<<<<<<<<<<<<<
@@ -5362,8 +5889,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
  * 
  */
 
-static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
-static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -5371,9 +5897,9 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setitem__");
+  __Pyx_RefNannySetupContext("__setitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":120
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":120
  * 
  *     def __setitem__(self, i, val):
  *         self.set(i, val)             # <<<<<<<<<<<<<<
@@ -5382,7 +5908,7 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_v_val); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->set(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_t_1, __pyx_t_2);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->set(__pyx_v_self, __pyx_t_1, __pyx_t_2);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -5394,7 +5920,18 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":122
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_23__len__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":122
  *         self.set(i, val)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -5402,20 +5939,19 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":123
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":123
  * 
  *     def __len__(self):
  *         return self.len             # <<<<<<<<<<<<<<
  * 
- *     def getSize(self):
+ *     def get_size(self):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len;
+  __pyx_r = __pyx_v_self->len;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -5424,33 +5960,43 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":125
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_26get_size(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_26get_size(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_size (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_25get_size(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":125
  *         return self.len
  * 
- *     def getSize(self):             # <<<<<<<<<<<<<<
+ *     def get_size(self):             # <<<<<<<<<<<<<<
  *         return self.size
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_13getSize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_13getSize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_7IntList_25get_size(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSize");
+  __Pyx_RefNannySetupContext("get_size", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":126
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":126
  * 
- *     def getSize(self):
+ *     def get_size(self):
  *         return self.size             # <<<<<<<<<<<<<<
  * 
  *     def append(self, int val):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -5460,7 +6006,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_13getSize(PyObject *__pyx_v_self, CYTHON
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_sa.IntList.getSize", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.IntList.get_size", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -5468,23 +6014,13 @@ static PyObject *__pyx_pf_3_sa_7IntList_13getSize(PyObject *__pyx_v_self, CYTHON
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":128
- *         return self.size
- * 
- *     def append(self, int val):             # <<<<<<<<<<<<<<
- *         self._append(val)
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
   int __pyx_v_val;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("append");
+  __Pyx_RefNannySetupContext("append (wrapper)", 0);
   assert(__pyx_arg_val); {
     __pyx_v_val = __Pyx_PyInt_AsInt(__pyx_arg_val); if (unlikely((__pyx_v_val == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -5494,15 +6030,32 @@ static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_27append(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((int)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":128
+ *         return self.size
+ * 
+ *     def append(self, int val):             # <<<<<<<<<<<<<<
+ *         self._append(val)
+ * 
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":129
+static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("append", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":129
  * 
  *     def append(self, int val):
  *         self._append(val)             # <<<<<<<<<<<<<<
  * 
  *     cdef void _append(self, int val):
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->_append(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_val);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->_append(__pyx_v_self, __pyx_v_val);
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -5510,7 +6063,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":131
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":131
  *         self._append(val)
  * 
  *     cdef void _append(self, int val):             # <<<<<<<<<<<<<<
@@ -5521,9 +6074,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObjec
 static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("_append");
+  __Pyx_RefNannySetupContext("_append", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":132
  * 
  *     cdef void _append(self, int val):
  *         if self.len == self.size:             # <<<<<<<<<<<<<<
@@ -5533,7 +6086,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   __pyx_t_1 = (__pyx_v_self->len == __pyx_v_self->size);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":133
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":133
  *     cdef void _append(self, int val):
  *         if self.len == self.size:
  *             self.size = self.size + self.increment             # <<<<<<<<<<<<<<
@@ -5542,7 +6095,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  */
     __pyx_v_self->size = (__pyx_v_self->size + __pyx_v_self->increment);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":134
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":134
  *         if self.len == self.size:
  *             self.size = self.size + self.increment
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))             # <<<<<<<<<<<<<<
@@ -5554,7 +6107,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":135
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":135
  *             self.size = self.size + self.increment
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         self.arr[self.len] = val             # <<<<<<<<<<<<<<
@@ -5563,7 +6116,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  */
   (__pyx_v_self->arr[__pyx_v_self->len]) = __pyx_v_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":136
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         self.arr[self.len] = val
  *         self.len = self.len + 1             # <<<<<<<<<<<<<<
@@ -5575,7 +6128,18 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":138
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("extend (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_29extend(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_other));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":138
  *         self.len = self.len + 1
  * 
  *     def extend(self, other):             # <<<<<<<<<<<<<<
@@ -5583,17 +6147,16 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_other) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extend");
+  __Pyx_RefNannySetupContext("extend", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":139
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":139
  * 
  *     def extend(self, other):
  *         self._extend(other)             # <<<<<<<<<<<<<<
@@ -5603,7 +6166,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObjec
   if (!(likely(((__pyx_v_other) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_other, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __pyx_v_other;
   __Pyx_INCREF(__pyx_t_1);
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->_extend(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1));
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->_extend(__pyx_v_self, ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1));
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -5618,7 +6181,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":141
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":141
  *         self._extend(other)
  * 
  *     cdef void _extend(self, IntList other):             # <<<<<<<<<<<<<<
@@ -5628,9 +6191,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObjec
 
 static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, struct __pyx_obj_3_sa_IntList *__pyx_v_other) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_extend");
+  __Pyx_RefNannySetupContext("_extend", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":142
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":142
  * 
  *     cdef void _extend(self, IntList other):
  *         self._extend_arr(other.arr, other.len)             # <<<<<<<<<<<<<<
@@ -5642,7 +6205,7 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":144
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":144
  *         self._extend_arr(other.arr, other.len)
  * 
  *     cdef void _extend_arr(self, int* other, int other_len):             # <<<<<<<<<<<<<<
@@ -5653,9 +6216,9 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
 static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int *__pyx_v_other, int __pyx_v_other_len) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("_extend_arr");
+  __Pyx_RefNannySetupContext("_extend_arr", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":145
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":145
  * 
  *     cdef void _extend_arr(self, int* other, int other_len):
  *         if self.size < self.len + other_len:             # <<<<<<<<<<<<<<
@@ -5665,7 +6228,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   __pyx_t_1 = (__pyx_v_self->size < (__pyx_v_self->len + __pyx_v_other_len));
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":146
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":146
  *     cdef void _extend_arr(self, int* other, int other_len):
  *         if self.size < self.len + other_len:
  *             self.size = self.len + other_len             # <<<<<<<<<<<<<<
@@ -5674,7 +6237,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
  */
     __pyx_v_self->size = (__pyx_v_self->len + __pyx_v_other_len);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":147
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":147
  *         if self.size < self.len + other_len:
  *             self.size = self.len + other_len
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))             # <<<<<<<<<<<<<<
@@ -5686,7 +6249,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":148
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":148
  *             self.size = self.len + other_len
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         memcpy(self.arr+self.len, other, other_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -5695,7 +6258,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
  */
   memcpy((__pyx_v_self->arr + __pyx_v_self->len), __pyx_v_other, (__pyx_v_other_len * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":149
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":149
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         memcpy(self.arr+self.len, other, other_len*sizeof(int))
  *         self.len = self.len + other_len             # <<<<<<<<<<<<<<
@@ -5707,7 +6270,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":151
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":151
  *         self.len = self.len + other_len
  * 
  *     cdef void _clear(self):             # <<<<<<<<<<<<<<
@@ -5717,9 +6280,9 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
 
 static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_clear");
+  __Pyx_RefNannySetupContext("_clear", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":152
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":152
  * 
  *     cdef void _clear(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -5728,7 +6291,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   free(__pyx_v_self->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":153
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":153
  *     cdef void _clear(self):
  *         free(self.arr)
  *         self.len = 0             # <<<<<<<<<<<<<<
@@ -5737,7 +6300,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   __pyx_v_self->len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":154
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":154
  *         free(self.arr)
  *         self.len = 0
  *         self.size = 0             # <<<<<<<<<<<<<<
@@ -5746,7 +6309,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   __pyx_v_self->size = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":155
  *         self.len = 0
  *         self.size = 0
  *         self.arr = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -5758,7 +6321,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":157
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":157
  *         self.arr = <int*> malloc(0)
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -5768,9 +6331,9 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
 
 static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_handle");
+  __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":158
  * 
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -5779,7 +6342,7 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
  */
   fwrite((&__pyx_v_self->len), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":159
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":159
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(int), 1, f)
  *         fwrite(self.arr, sizeof(int), self.len, f)             # <<<<<<<<<<<<<<
@@ -5791,24 +6354,13 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":161
- *         fwrite(self.arr, sizeof(int), self.len, f)
- * 
- *     def write(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write");
+  __Pyx_RefNannySetupContext("write (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -5818,8 +6370,26 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_31write(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":161
+ *         fwrite(self.arr, sizeof(int), self.len, f)
+ * 
+ *     def write(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":163
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":163
  *     def write(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -5828,16 +6398,16 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":164
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":164
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":165
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":165
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -5852,7 +6422,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":167
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":167
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -5862,9 +6432,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
 
 static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_handle");
+  __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":168
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":168
  * 
  *     cdef void read_handle(self, FILE* f):
  *         (self.arr)             # <<<<<<<<<<<<<<
@@ -5873,7 +6443,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":169
  *     cdef void read_handle(self, FILE* f):
  *         (self.arr)
  *         fread(&(self.len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -5882,7 +6452,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   fread((&__pyx_v_self->len), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":170
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":170
  *         (self.arr)
  *         fread(&(self.len), sizeof(int), 1, f)
  *         self.arr = <int*> malloc(self.len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -5891,7 +6461,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->arr = ((int *)malloc((__pyx_v_self->len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":171
  *         fread(&(self.len), sizeof(int), 1, f)
  *         self.arr = <int*> malloc(self.len * sizeof(int))
  *         self.size = self.len             # <<<<<<<<<<<<<<
@@ -5900,7 +6470,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->size = __pyx_v_self->len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":172
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":172
  *         self.arr = <int*> malloc(self.len * sizeof(int))
  *         self.size = self.len
  *         fread(self.arr, sizeof(int), self.len, f)             # <<<<<<<<<<<<<<
@@ -5912,24 +6482,13 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":174
- *         fread(self.arr, sizeof(int), self.len, f)
- * 
- *     def read(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read");
+  __Pyx_RefNannySetupContext("read (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -5939,8 +6498,26 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_33read(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":176
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":174
+ *         fread(self.arr, sizeof(int), self.len, f)
+ * 
+ *     def read(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":176
  *     def read(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -5949,15 +6526,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":177
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":177
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":178
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":178
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -5970,7 +6547,21 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":13
+/* Python wrapper */
+static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_9StringMap___cinit__(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":13
  *     cdef int index(self, char *s)
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -5978,30 +6569,35 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":14
  * 
  *     def __cinit__(self):
  *         self.vocab = stringmap_new()             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self)->vocab = stringmap_new();
+  __pyx_v_self->vocab = stringmap_new();
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":16
+/* Python wrapper */
+static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_9StringMap_2__dealloc__(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":16
  *         self.vocab = stringmap_new()
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -6009,24 +6605,23 @@ static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":17
  * 
  *     def __dealloc__(self):
  *         stringmap_delete(self.vocab)             # <<<<<<<<<<<<<<
  * 
  *     cdef char *word(self, int i):
  */
-  stringmap_delete(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self)->vocab);
+  stringmap_delete(__pyx_v_self->vocab);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":19
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":19
  *         stringmap_delete(self.vocab)
  * 
  *     cdef char *word(self, int i):             # <<<<<<<<<<<<<<
@@ -6037,9 +6632,9 @@ static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self) {
 static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx_v_self, int __pyx_v_i) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("word");
+  __Pyx_RefNannySetupContext("word", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":20
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":20
  * 
  *     cdef char *word(self, int i):
  *         return stringmap_word(self.vocab, i)             # <<<<<<<<<<<<<<
@@ -6055,7 +6650,7 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":22
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":22
  *         return stringmap_word(self.vocab, i)
  * 
  *     cdef int index(self, char *s):             # <<<<<<<<<<<<<<
@@ -6065,9 +6660,9 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
 static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_v_self, char *__pyx_v_s) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("index");
+  __Pyx_RefNannySetupContext("index", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":23
  * 
  *     cdef int index(self, char *s):
  *         return stringmap_index(self.vocab, s)             # <<<<<<<<<<<<<<
@@ -6081,40 +6676,34 @@ static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":17
- *     cdef bint use_sent_id
- * 
- *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
- *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
- *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
- */
-
-static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_v_use_sent_id;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  long __pyx_t_5;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
     PyObject* values[4] = {0,0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":17
+ *     cdef bint use_sent_id
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
+ *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
+ *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -6123,7 +6712,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -6146,7 +6735,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -6175,8 +6764,25 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray___cinit__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text, __pyx_v_side, __pyx_v_use_sent_id);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  long __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":18
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}             # <<<<<<<<<<<<<<
@@ -6188,12 +6794,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__END_OF_FILE), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__END_OF_LINE), __pyx_int_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id);
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->word2id);
+  __Pyx_DECREF(__pyx_v_self->word2id);
+  __pyx_v_self->word2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":19
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":19
  *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]             # <<<<<<<<<<<<<<
@@ -6201,7 +6807,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.sent_id = IntList(1000,1000)
  */
   __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__END_OF_FILE));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__END_OF_FILE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__END_OF_FILE));
@@ -6209,12 +6815,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   PyList_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_n_s__END_OF_LINE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__END_OF_LINE));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word);
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->id2word);
+  __Pyx_DECREF(__pyx_v_self->id2word);
+  __pyx_v_self->id2word = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":20
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -6224,12 +6830,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data));
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->data);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->data));
+  __pyx_v_self->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":21
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -6239,12 +6845,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_11), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id));
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sent_id);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_id));
+  __pyx_v_self->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":22
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -6254,21 +6860,21 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_12), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index));
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sent_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
+  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":23
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  *         self.use_sent_id = use_sent_id             # <<<<<<<<<<<<<<
  *         if from_binary:
  *             self.read_binary(from_binary)
  */
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id = __pyx_v_use_sent_id;
+  __pyx_v_self->use_sent_id = __pyx_v_use_sent_id;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":24
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":24
  *         self.sent_index = IntList(1000,1000)
  *         self.use_sent_id = use_sent_id
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -6278,17 +6884,17 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":25
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":25
  *         self.use_sent_id = use_sent_id
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_text:
  *             if side:
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -6297,10 +6903,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":26
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -6310,7 +6916,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":27
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":27
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             if side:             # <<<<<<<<<<<<<<
@@ -6320,16 +6926,18 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_side); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":28
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":28
  *         elif from_text:
  *             if side:
  *                 self.read_bitext(from_text, (0 if side == 'source' else 1))             # <<<<<<<<<<<<<<
  *             else:
  *                 self.read_text(from_text)
  */
-      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_bitext); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_bitext); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = __Pyx_PyString_Equals(__pyx_v_side, ((PyObject *)__pyx_n_s__source), Py_EQ); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_side, ((PyObject *)__pyx_n_s__source), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_2) {
         __pyx_t_5 = 0;
       } else {
@@ -6338,7 +6946,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
       __pyx_t_3 = PyInt_FromLong(__pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(__pyx_v_from_text);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
       __Pyx_GIVEREF(__pyx_v_from_text);
@@ -6350,21 +6958,21 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L7;
+      goto __pyx_L4;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":30
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":30
  *                 self.read_bitext(from_text, (0 if side == 'source' else 1))
  *             else:
  *                 self.read_text(from_text)             # <<<<<<<<<<<<<<
  * 
  *     def __len__(self):
  */
-      __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(__pyx_v_from_text);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
       __Pyx_GIVEREF(__pyx_v_from_text);
@@ -6374,10 +6982,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     }
-    __pyx_L7:;
-    goto __pyx_L6;
+    __pyx_L4:;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -6392,7 +7000,18 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":32
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_2__len__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":32
  *                 self.read_text(from_text)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -6400,8 +7019,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -6409,16 +7027,16 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":33
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":33
  * 
  *     def __len__(self):
  *         return len(self.data)             # <<<<<<<<<<<<<<
  * 
- *     def getSentId(self, i):
+ *     def get_sentence_id(self, i):
  */
-  __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->data);
   __Pyx_INCREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -6436,16 +7054,26 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":35
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_4get_sentence_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":35
  *         return len(self.data)
  * 
- *     def getSentId(self, i):             # <<<<<<<<<<<<<<
+ *     def get_sentence_id(self, i):             # <<<<<<<<<<<<<<
  *         return self.sent_id.arr[i]
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -6453,18 +7081,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentId");
+  __Pyx_RefNannySetupContext("get_sentence_id", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":36
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":36
  * 
- *     def getSentId(self, i):
+ *     def get_sentence_id(self, i):
  *         return self.sent_id.arr[i]             # <<<<<<<<<<<<<<
  * 
- *     def getSent(self, i):
+ *     def get_sentence(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -6474,7 +7102,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyO
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_AddTraceback("_sa.DataArray.getSentId", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.DataArray.get_sentence_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -6482,16 +7110,26 @@ static PyObject *__pyx_pf_3_sa_9DataArray_2getSentId(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":38
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_6get_sentence(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":38
  *         return self.sent_id.arr[i]
  * 
- *     def getSent(self, i):             # <<<<<<<<<<<<<<
+ *     def get_sentence(self, i):             # <<<<<<<<<<<<<<
  *         cdef int j, start, stop
  *         sent = []
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_sent = NULL;
@@ -6505,22 +7143,22 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSent");
+  __Pyx_RefNannySetupContext("get_sentence", 0);
   __Pyx_INCREF(__pyx_v_i);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":40
- *     def getSent(self, i):
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":40
+ *     def get_sentence(self, i):
  *         cdef int j, start, stop
  *         sent = []             # <<<<<<<<<<<<<<
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_sent = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":41
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":41
  *         cdef int j, start, stop
  *         sent = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
@@ -6528,9 +7166,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
  *         for i from start <= i < stop:
  */
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":42
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":42
  *         sent = []
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
@@ -6541,9 +7179,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_stop = (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_stop = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":43
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -6558,25 +7196,22 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":44
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":44
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])             # <<<<<<<<<<<<<<
  *         return sent
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_sent) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = __Pyx_GetItemInt(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_self->id2word, (__pyx_v_self->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyList_Append(__pyx_v_sent, __pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":43
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -6589,12 +7224,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
   __pyx_v_i = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":45
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])
  *         return sent             # <<<<<<<<<<<<<<
  * 
- *     def getSentPos(self, loc):
+ *     def get_sentence_position(self, loc):
  */
   __Pyx_XDECREF(__pyx_r);
   __Pyx_INCREF(((PyObject *)__pyx_v_sent));
@@ -6605,7 +7240,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_sa.DataArray.getSent", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.DataArray.get_sentence", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_v_sent);
@@ -6615,16 +7250,26 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3getSent(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":47
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence_position (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_8get_sentence_position(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":47
  *         return sent
  * 
- *     def getSentPos(self, loc):             # <<<<<<<<<<<<<<
+ *     def get_sentence_position(self, loc):             # <<<<<<<<<<<<<<
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -6633,18 +7278,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentPos");
+  __Pyx_RefNannySetupContext("get_sentence_position", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":48
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":48
  * 
- *     def getSentPos(self, loc):
+ *     def get_sentence_position(self, loc):
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]             # <<<<<<<<<<<<<<
  * 
  *     def get_id(self, word):
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_index->arr[(__pyx_v_self->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyNumber_Subtract(__pyx_v_loc, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
@@ -6658,7 +7303,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.DataArray.getSentPos", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.DataArray.get_sentence_position", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -6666,7 +7311,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":50
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_10get_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_word));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":50
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]
  * 
  *     def get_id(self, word):             # <<<<<<<<<<<<<<
@@ -6674,8 +7330,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4getSentPos(PyObject *__pyx_v_self, Py
  *             self.word2id[word] = len(self.id2word)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
+static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -6685,50 +7340,50 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_id");
+  __Pyx_RefNannySetupContext("get_id", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":51
  * 
  *     def get_id(self, word):
  *         if not word in self.word2id:             # <<<<<<<<<<<<<<
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  */
-  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (!__pyx_t_1);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":52
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":52
  *     def get_id(self, word):
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
  *             self.id2word.append(word)
  *         return self.word2id[word]
  */
-    __pyx_t_3 = ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word;
+    __pyx_t_3 = __pyx_v_self->id2word;
     __Pyx_INCREF(__pyx_t_3);
     __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (PyObject_SetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_self->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":53
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
  *         return self.word2id[word]
  * 
  */
-    __pyx_t_3 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Append(__pyx_v_self->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":54
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *         return self.word2id[word]             # <<<<<<<<<<<<<<
@@ -6736,7 +7391,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
  *     def get_word(self, id):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_3 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -6754,7 +7409,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":56
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_word (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_12get_word(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_id));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":56
  *         return self.word2id[word]
  * 
  *     def get_word(self, id):             # <<<<<<<<<<<<<<
@@ -6762,17 +7428,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_id(PyObject *__pyx_v_self, PyObje
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
+static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_word");
+  __Pyx_RefNannySetupContext("get_word", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":57
  * 
  *     def get_word(self, id):
  *         return self.id2word[id]             # <<<<<<<<<<<<<<
@@ -6780,7 +7445,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyOb
  *     def write_text(self, char* filename):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetItem(__pyx_v_self->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -6798,7 +7463,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":59
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_14write_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":59
  *         return self.id2word[id]
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -6806,9 +7492,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_word(PyObject *__pyx_v_self, PyOb
  *             for w_id in self.data:
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_w_id = NULL;
   PyObject *__pyx_r = NULL;
@@ -6819,10 +7503,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  int __pyx_t_9;
-  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
+  int __pyx_t_10;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
   PyObject *__pyx_t_13 = NULL;
@@ -6830,18 +7514,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -6852,7 +7527,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -6864,153 +7539,160 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":61
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":61
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             for w_id in self.data:             # <<<<<<<<<<<<<<
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->data)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->data))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_w_id);
-            __pyx_v_w_id = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_w_id = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":62
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":62
  *         with open(filename, "w") as f:
  *             for w_id in self.data:
  *                 if w_id > 1:             # <<<<<<<<<<<<<<
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  */
-            __pyx_t_2 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            if (__pyx_t_9) {
+            __pyx_t_1 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            if (__pyx_t_10) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
  *             for w_id in self.data:
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))             # <<<<<<<<<<<<<<
  *                 if w_id == 1:
  *                     f.write("\n")
  */
-              __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_word); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_word); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_v_w_id);
               PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_w_id);
               __Pyx_GIVEREF(__pyx_v_w_id);
-              __pyx_t_12 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(((PyObject *)__pyx_t_11));
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_12);
               PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
               __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
               __pyx_t_11 = 0;
-              __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-              goto __pyx_L19;
+              goto __pyx_L18;
             }
-            __pyx_L19:;
+            __pyx_L18:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":64
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":64
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:             # <<<<<<<<<<<<<<
  *                     f.write("\n")
  * 
  */
-            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            if (__pyx_t_9) {
+            if (__pyx_t_10) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":65
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              goto __pyx_L20;
+              goto __pyx_L19;
             }
-            __pyx_L20:;
+            __pyx_L19:;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
-        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7019,75 +7701,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_12);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
-          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
+          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __pyx_t_14 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_14 = (!__pyx_t_10);
           if (__pyx_t_14) {
-            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_12);
             __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_12, __pyx_t_11);
-            __pyx_t_1 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_ErrRestore(__pyx_t_4, __pyx_t_12, __pyx_t_11);
+            __pyx_t_4 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7095,7 +7777,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
@@ -7108,7 +7790,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":67
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_16read_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":67
  *                     f.write("\n")
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -7116,9 +7819,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7write_text(PyObject *__pyx_v_self, Py
  *             self.read_text_data(fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_fp = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -7136,18 +7837,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7160,7 +7852,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -7170,12 +7862,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -7183,39 +7875,40 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_fp = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_v_fp = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":69
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":69
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:
  *             self.read_text_data(fp)             # <<<<<<<<<<<<<<
  * 
  *     def read_bitext(self, char* filename, int side):
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_INCREF(__pyx_v_fp);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fp);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fp);
           __Pyx_GIVEREF(__pyx_v_fp);
-          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7224,57 +7917,57 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_3, __pyx_t_2);
-            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L19;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L18;
           }
-          __pyx_L19:;
+          __pyx_L18:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L16_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -7288,11 +7981,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L20;
-    __pyx_L5_error:;
+    goto __pyx_L19;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L20:;
+    __pyx_L19:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7310,9 +8003,65 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8read_text(PyObject *__pyx_v_self, PyO
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_filename;
+  int __pyx_v_side;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_bitext (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_18read_bitext(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -7320,37 +8069,45 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11read_bitext_genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_11read_bitext_genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("genexpr");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)__pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *) __pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  __pyx_self = __pyx_self;
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_11read_bitext_1generator6;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_9DataArray_11read_bitext_2generator6, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_bitext.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
@@ -7358,8 +8115,8 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -7368,7 +8125,8 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
     __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
@@ -7377,12 +8135,20 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -7416,7 +8182,7 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -7427,7 +8193,7 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -7436,12 +8202,13 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -7449,10 +8216,8 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
  *             data = (line.split(' ||| ')[side] for line in fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_cur_scope;
-  char *__pyx_v_filename;
   PyObject *__pyx_v_data = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -7470,60 +8235,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
-  __Pyx_RefNannySetupContext("read_bitext");
+  __Pyx_RefNannySetupContext("read_bitext", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  {
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-    }
-    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_cur_scope->__pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_cur_scope->__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __pyx_cur_scope->__pyx_v_side = __pyx_v_side;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7536,7 +8257,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -7546,12 +8267,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -7559,52 +8280,53 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_cur_scope->__pyx_v_fp = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_cur_scope->__pyx_v_fp = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
  *             self.read_text_data(data)
  * 
  */
-          __pyx_t_2 = __pyx_pf_3_sa_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_v_data = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_t_1 = __pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_v_data = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)
  *             self.read_text_data(data)             # <<<<<<<<<<<<<<
  * 
  *     def read_text_data(self, data):
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_INCREF(__pyx_v_data);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_data);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_data);
           __Pyx_GIVEREF(__pyx_v_data);
-          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L17_try_end;
-        __pyx_L10_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7612,58 +8334,58 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
  *             self.read_text_data(data)
  */
         /*except:*/ {
-          __Pyx_AddTraceback("_sa.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_3, __pyx_t_2);
-            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
-            goto __pyx_L20;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L18;
           }
-          __pyx_L20:;
+          __pyx_L18:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L11_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L12_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L11_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L17_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -7677,11 +8399,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L21;
-    __pyx_L6_error:;
+    goto __pyx_L19;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L21:;
+    __pyx_L19:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7701,7 +8423,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text_data (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_20read_text_data(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_data));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
  *             self.read_text_data(data)
  * 
  *     def read_text_data(self, data):             # <<<<<<<<<<<<<<
@@ -7709,8 +8442,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_bitext(PyObject *__pyx_v_self, P
  *         for line_num, line in enumerate(data):
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
+static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data) {
   int __pyx_v_word_count;
   PyObject *__pyx_v_line_num = NULL;
   PyObject *__pyx_v_line = NULL;
@@ -7730,9 +8462,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text_data");
+  __Pyx_RefNannySetupContext("read_text_data", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":77
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":77
  * 
  *     def read_text_data(self, data):
  *         cdef int word_count = 0             # <<<<<<<<<<<<<<
@@ -7741,7 +8473,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  */
   __pyx_v_word_count = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":78
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":78
  *     def read_text_data(self, data):
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):             # <<<<<<<<<<<<<<
@@ -7759,12 +8491,20 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
@@ -7788,7 +8528,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":79
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":79
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
@@ -7797,12 +8537,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  */
     __pyx_t_5 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":80
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":80
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)
  *             for word in line.split():             # <<<<<<<<<<<<<<
@@ -7824,12 +8564,20 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
     }
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_6)) {
+      if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
-        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
-      } else if (PyTuple_CheckExact(__pyx_t_6)) {
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
         __pyx_t_5 = __pyx_t_8(__pyx_t_6);
         if (unlikely(!__pyx_t_5)) {
@@ -7845,17 +8593,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
       __pyx_v_word = __pyx_t_5;
       __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":81
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":81
  *             self.sent_index.append(word_count)
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))             # <<<<<<<<<<<<<<
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  */
-      __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+      __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_word);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_word);
       __Pyx_GIVEREF(__pyx_v_word);
@@ -7863,35 +8611,35 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":82
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":82
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:             # <<<<<<<<<<<<<<
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  */
-      if (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id) {
+      if (__pyx_v_self->use_sent_id) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":83
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":83
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *                 word_count = word_count + 1
  *             self.data.append(1)
  */
-        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        goto __pyx_L9;
+        goto __pyx_L7;
       }
-      __pyx_L9:;
+      __pyx_L7:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":84
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":84
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -7902,41 +8650,41 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
     }
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":85
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  *             self.data.append(1)             # <<<<<<<<<<<<<<
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  */
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":86
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":86
  *                 word_count = word_count + 1
  *             self.data.append(1)
  *             if self.use_sent_id:             # <<<<<<<<<<<<<<
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  */
-    if (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id) {
+    if (__pyx_v_self->use_sent_id) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":87
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":87
  *             self.data.append(1)
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *             word_count = word_count + 1
  *         self.data.append(0)
  */
-      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L10;
+      goto __pyx_L8;
     }
-    __pyx_L10:;
+    __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":88
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":88
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -7948,18 +8696,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":89
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":89
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  *         self.data.append(0)             # <<<<<<<<<<<<<<
  *         self.sent_index.append(word_count)
  * 
  */
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":90
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":90
  *             word_count = word_count + 1
  *         self.data.append(0)
  *         self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
@@ -7968,7 +8716,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
  */
   __pyx_t_1 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -7993,24 +8741,13 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_text_data(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":93
- * 
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -8020,8 +8757,26 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_22read_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":93
+ * 
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":95
+static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":95
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -8030,16 +8785,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self,
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":96
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":96
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":97
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":97
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -8054,7 +8809,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":99
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":99
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -8065,7 +8820,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_binary(PyObject *__pyx_v_self,
 static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, FILE *__pyx_v_f) {
   int __pyx_v_num_words;
   int __pyx_v_word_len;
-  unsigned int __pyx_v_i;
+  CYTHON_UNUSED unsigned int __pyx_v_i;
   char *__pyx_v_word;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -8077,9 +8832,9 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_handle");
+  __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":104
  *         cdef char* word
  * 
  *         self.data.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8088,7 +8843,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->read_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":105
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":105
  * 
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8097,7 +8852,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":106
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":106
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8106,7 +8861,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->read_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":107
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8115,7 +8870,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":108
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":108
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):             # <<<<<<<<<<<<<<
@@ -8126,7 +8881,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":109
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":109
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8135,7 +8890,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":110
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":110
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -8144,7 +8899,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":111
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":111
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -8153,7 +8908,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":112
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":112
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
@@ -8172,7 +8927,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":113
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":113
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
@@ -8186,7 +8941,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":114
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":114
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -8196,7 +8951,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     free(__pyx_v_word);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":115
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":115
  *             self.id2word.append(word)
  *             free(word)
  *         if len(self.sent_id) == 0:             # <<<<<<<<<<<<<<
@@ -8210,7 +8965,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __pyx_t_6 = (__pyx_t_4 == 0);
   if (__pyx_t_6) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":116
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":116
  *             free(word)
  *         if len(self.sent_id) == 0:
  *             self.use_sent_id = False             # <<<<<<<<<<<<<<
@@ -8222,7 +8977,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":118
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":118
  *             self.use_sent_id = False
  *         else:
  *             self.use_sent_id = True             # <<<<<<<<<<<<<<
@@ -8242,7 +8997,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":120
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":120
  *             self.use_sent_id = True
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -8264,9 +9019,9 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_handle");
+  __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":124
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":124
  *         cdef int num_words
  * 
  *         self.data.write_handle(f)             # <<<<<<<<<<<<<<
@@ -8275,7 +9030,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->write_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":125
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":125
  * 
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -8284,7 +9039,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":126
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":126
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)             # <<<<<<<<<<<<<<
@@ -8293,7 +9048,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->write_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":127
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":127
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2             # <<<<<<<<<<<<<<
@@ -8306,7 +9061,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_num_words = (__pyx_t_2 - 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":128
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":128
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8315,7 +9070,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":129
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":129
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:             # <<<<<<<<<<<<<<
@@ -8334,12 +9089,20 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_3)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_3)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_1 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_1)) {
@@ -8355,7 +9118,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_v_word = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":130
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":130
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
@@ -8365,7 +9128,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":131
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":131
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8374,7 +9137,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":132
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":132
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -8396,24 +9159,13 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":134
- *             fwrite(<char *>word, sizeof(char), word_len, f)
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -8423,8 +9175,26 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_24write_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":134
+ *             fwrite(<char *>word, sizeof(char), word_len, f)
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":136
+static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":136
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -8433,16 +9203,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self,
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":137
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":137
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":138
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":138
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -8457,7 +9227,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":140
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced_handle (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_26write_enhanced_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_f));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":140
  *         fclose(f)
  * 
  *     def write_enhanced_handle(self, f):             # <<<<<<<<<<<<<<
@@ -8465,8 +9246,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12write_binary(PyObject *__pyx_v_self,
  *             f.write("%d " %i)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f) {
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_word = NULL;
   PyObject *__pyx_r = NULL;
@@ -8480,30 +9260,38 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced_handle");
+  __Pyx_RefNannySetupContext("write_enhanced_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":141
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":141
  * 
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data))) {
-    __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self->data)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->data))) {
+    __pyx_t_1 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -8519,7 +9307,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __pyx_v_i = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":142
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":142
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -8531,7 +9319,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -8543,7 +9331,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":143
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -8557,28 +9345,36 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":144
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":144
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_index:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index))) {
-    __pyx_t_5 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_index))) {
+    __pyx_t_5 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_3 = Py_TYPE(__pyx_t_5)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_5)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_5)) break;
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_5)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_1 = __pyx_t_3(__pyx_t_5);
       if (unlikely(!__pyx_t_1)) {
@@ -8594,7 +9390,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":145
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":145
  *         f.write("\n")
  *         for i in self.sent_index:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -8606,7 +9402,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_6));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
     __pyx_t_6 = 0;
@@ -8618,7 +9414,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   }
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -8632,28 +9428,36 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":147
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":147
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_id:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id))) {
-    __pyx_t_6 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_id)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_id))) {
+    __pyx_t_6 = ((PyObject *)__pyx_v_self->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_3 = Py_TYPE(__pyx_t_6)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_6)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_6)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_6)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_6);
       if (unlikely(!__pyx_t_5)) {
@@ -8669,7 +9473,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __pyx_v_i = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":148
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":148
  *         f.write("\n")
  *         for i in self.sent_id:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -8681,7 +9485,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
     __pyx_t_4 = 0;
@@ -8693,7 +9497,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   }
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -8707,28 +9511,36 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":150
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":150
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for word in self.id2word:             # <<<<<<<<<<<<<<
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word)) {
-    __pyx_t_4 = ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
+  if (PyList_CheckExact(__pyx_v_self->id2word) || PyTuple_CheckExact(__pyx_v_self->id2word)) {
+    __pyx_t_4 = __pyx_v_self->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_self->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_4)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_4)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_6 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_6)) {
@@ -8744,7 +9556,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __pyx_v_word = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":151
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":151
  *         f.write("\n")
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))             # <<<<<<<<<<<<<<
@@ -8753,10 +9565,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
  */
     __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_word);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_word);
     __Pyx_GIVEREF(__pyx_v_word);
@@ -8767,7 +9579,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -8779,7 +9591,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -8810,7 +9622,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":154
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_28write_enhanced(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":154
  *         f.write("\n")
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -8818,9 +9651,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_enhanced_handle(PyObject *__py
  *             self.write_enhanced_handle(self, f)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -8838,18 +9669,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -8859,7 +9681,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -8871,53 +9693,54 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":156
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":156
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.write_enhanced_handle(self, f)             # <<<<<<<<<<<<<<
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s_27); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          __Pyx_INCREF(__pyx_v_self);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self);
-          __Pyx_GIVEREF(__pyx_v_self);
+          __Pyx_INCREF(((PyObject *)__pyx_v_self));
+          PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
           __Pyx_INCREF(__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -8925,75 +9748,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_7);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_INCREF(__pyx_t_7);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7);
-          __Pyx_GIVEREF(__pyx_t_7);
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __pyx_t_10 = PyObject_Call(__pyx_t_3, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
-            __Pyx_GIVEREF(__pyx_t_7);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_7, __pyx_t_2, __pyx_t_1);
-            __pyx_t_7 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L19;
+            __Pyx_GIVEREF(__pyx_t_4);
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_4);
+            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_4 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L18;
           }
-          __pyx_L19:;
+          __pyx_L18:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L20;
-    __pyx_L5_error:;
+    goto __pyx_L19;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L20:;
+    __pyx_L19:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -9001,7 +9824,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -9012,7 +9835,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":12
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":12
  *     cdef IntList sent_index
  * 
  *     cdef int link(self, int i, int j):             # <<<<<<<<<<<<<<
@@ -9020,12 +9843,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced(PyObject *__pyx_v_sel
  *         return i*65536 + j
  */
 
-static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
+static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("link");
+  __Pyx_RefNannySetupContext("link", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":14
  *     cdef int link(self, int i, int j):
  *         """Integerizes an alignment link pair"""
  *         return i*65536 + j             # <<<<<<<<<<<<<<
@@ -9041,7 +9864,19 @@ static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":16
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link); /*proto*/
+static char __pyx_doc_3_sa_9Alignment_unlink[] = "De-integerizes an alignment link pair";
+static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("unlink (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9Alignment_unlink(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((PyObject *)__pyx_v_link));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":16
  *         return i*65536 + j
  * 
  *     def unlink(self, link):             # <<<<<<<<<<<<<<
@@ -9049,9 +9884,7 @@ static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v
  *         return (link/65536, link%65536)
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link); /*proto*/
-static char __pyx_doc_3_sa_9Alignment_unlink[] = "De-integerizes an alignment link pair";
-static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link) {
+static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -9060,9 +9893,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("unlink");
+  __Pyx_RefNannySetupContext("unlink", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":18
  *     def unlink(self, link):
  *         """De-integerizes an alignment link pair"""
  *         return (link/65536, link%65536)             # <<<<<<<<<<<<<<
@@ -9075,7 +9908,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
   __pyx_t_2 = PyNumber_Remainder(__pyx_v_link, __pyx_int_65536); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -9100,7 +9933,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":20
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":20
  *         return (link/65536, link%65536)
  * 
  *     cdef _unlink(self, int link, int* f, int* e):             # <<<<<<<<<<<<<<
@@ -9108,12 +9941,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
  *         e[0] = link%65536
  */
 
-static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_link, int *__pyx_v_f, int *__pyx_v_e) {
+static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_link, int *__pyx_v_f, int *__pyx_v_e) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_unlink");
+  __Pyx_RefNannySetupContext("_unlink", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":21
  * 
  *     cdef _unlink(self, int link, int* f, int* e):
  *         f[0] = link/65536             # <<<<<<<<<<<<<<
@@ -9122,7 +9955,7 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment
  */
   (__pyx_v_f[0]) = __Pyx_div_long(__pyx_v_link, 65536);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":22
  *     cdef _unlink(self, int link, int* f, int* e):
  *         f[0] = link/65536
  *         e[0] = link%65536             # <<<<<<<<<<<<<<
@@ -9137,7 +9970,28 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":24
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id) {
+  int __pyx_v_sent_id;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sent_links (wrapper)", 0);
+  assert(__pyx_arg_sent_id); {
+    __pyx_v_sent_id = __Pyx_PyInt_AsInt(__pyx_arg_sent_id); if (unlikely((__pyx_v_sent_id == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.get_sent_links", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_2get_sent_links(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((int)__pyx_v_sent_id));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":24
  *         e[0] = link%65536
  * 
  *     def get_sent_links(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -9145,9 +9999,7 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment
  *         cdef int* arr
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id) {
-  int __pyx_v_sent_id;
+static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id) {
   struct __pyx_obj_3_sa_IntList *__pyx_v_sent_links = 0;
   int *__pyx_v_arr;
   int __pyx_v_arr_len;
@@ -9157,18 +10009,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sent_links");
-  assert(__pyx_arg_sent_id); {
-    __pyx_v_sent_id = __Pyx_PyInt_AsInt(__pyx_arg_sent_id); if (unlikely((__pyx_v_sent_id == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.get_sent_links", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("get_sent_links", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":28
  *         cdef int* arr
  *         cdef int arr_len
  *         sent_links = IntList()             # <<<<<<<<<<<<<<
@@ -9180,16 +10023,16 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
   __pyx_v_sent_links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":29
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":29
  *         cdef int arr_len
  *         sent_links = IntList()
  *         arr = self._get_sent_links(sent_id, &arr_len)             # <<<<<<<<<<<<<<
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)
  */
-  __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->__pyx_vtab)->_get_sent_links(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_v_sent_id, (&__pyx_v_arr_len));
+  __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->_get_sent_links(__pyx_v_self, __pyx_v_sent_id, (&__pyx_v_arr_len));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":30
  *         sent_links = IntList()
  *         arr = self._get_sent_links(sent_id, &arr_len)
  *         sent_links._extend_arr(arr, arr_len*2)             # <<<<<<<<<<<<<<
@@ -9198,7 +10041,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sent_links->__pyx_vtab)->_extend_arr(__pyx_v_sent_links, __pyx_v_arr, (__pyx_v_arr_len * 2));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":31
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":31
  *         arr = self._get_sent_links(sent_id, &arr_len)
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)             # <<<<<<<<<<<<<<
@@ -9207,7 +10050,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
  */
   free(__pyx_v_arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":32
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":32
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)
  *         return sent_links             # <<<<<<<<<<<<<<
@@ -9232,7 +10075,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":34
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":34
  *         return sent_links
  * 
  *     cdef int* _get_sent_links(self, int sent_id, int* num_links):             # <<<<<<<<<<<<<<
@@ -9252,9 +10095,9 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_get_sent_links");
+  __Pyx_RefNannySetupContext("_get_sent_links", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":37
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":37
  *         cdef int* sent_links
  *         cdef int i, start, end
  *         start = self.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -9263,7 +10106,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_v_sent_id]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":38
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":38
  *         cdef int i, start, end
  *         start = self.sent_index.arr[sent_id]
  *         end = self.sent_index.arr[sent_id+1]             # <<<<<<<<<<<<<<
@@ -9272,7 +10115,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_end = (__pyx_v_self->sent_index->arr[(__pyx_v_sent_id + 1)]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":39
  *         start = self.sent_index.arr[sent_id]
  *         end = self.sent_index.arr[sent_id+1]
  *         num_links[0] = end - start             # <<<<<<<<<<<<<<
@@ -9281,7 +10124,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   (__pyx_v_num_links[0]) = (__pyx_v_end - __pyx_v_start);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":40
  *         end = self.sent_index.arr[sent_id+1]
  *         num_links[0] = end - start
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))             # <<<<<<<<<<<<<<
@@ -9290,7 +10133,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_sent_links = ((int *)malloc(((2 * (__pyx_v_num_links[0])) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":41
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":41
  *         num_links[0] = end - start
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))
  *         for i from 0 <= i < num_links[0]:             # <<<<<<<<<<<<<<
@@ -9300,7 +10143,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   __pyx_t_1 = (__pyx_v_num_links[0]);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":42
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":42
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))
  *         for i from 0 <= i < num_links[0]:
  *             self._unlink(self.links.arr[start + i], sent_links + (2*i), sent_links + (2*i) + 1)             # <<<<<<<<<<<<<<
@@ -9312,7 +10155,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":43
  *         for i from 0 <= i < num_links[0]:
  *             self._unlink(self.links.arr[start + i], sent_links + (2*i), sent_links + (2*i) + 1)
  *         return sent_links             # <<<<<<<<<<<<<<
@@ -9333,43 +10176,38 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":45
- *         return sent_links
- * 
- *     def __cinit__(self, from_binary=None, from_text=None):             # <<<<<<<<<<<<<<
- *         self.links = IntList(1000,1000)
- *         self.sent_index = IntList(1000,1000)
- */
-
-static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
     PyObject* values[2] = {0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":45
+ *         return sent_links
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None):             # <<<<<<<<<<<<<<
+ *         self.links = IntList(1000,1000)
+ *         self.sent_index = IntList(1000,1000)
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -9382,7 +10220,7 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -9403,8 +10241,24 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_4__cinit__(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":46
+static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":46
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -9414,12 +10268,12 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_29), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links));
-  ((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->links);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->links));
+  __pyx_v_self->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":47
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":47
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -9429,12 +10283,12 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_30), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index));
-  ((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sent_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
+  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":48
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":48
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -9444,17 +10298,17 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":49
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":49
  *         self.sent_index = IntList(1000,1000)
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_text:
  *             self.read_text(from_text)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -9463,10 +10317,10 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":50
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":50
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -9476,17 +10330,17 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":51
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":51
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             self.read_text(from_text)             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -9495,9 +10349,9 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -9512,7 +10366,28 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":53
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_6read_text(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":53
  *             self.read_text(from_text)
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9520,9 +10395,7 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
  *             for line in f:
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_line = NULL;
   PyObject *__pyx_v_pairs = NULL;
@@ -9554,18 +10427,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -9578,7 +10442,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -9588,12 +10452,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -9601,10 +10465,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_v_f = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":55
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":55
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -9612,70 +10477,78 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  *                 pairs = line.split()
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_3 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_3)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_line);
-            __pyx_v_line = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_line = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":56
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":56
  *         with gzip_or_text(filename) as f:
  *             for line in f:
  *                 self.sent_index.append(len(self.links))             # <<<<<<<<<<<<<<
  *                 pairs = line.split()
  *                 for pair in pairs:
  */
-            __pyx_t_3 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
-            __Pyx_INCREF(__pyx_t_3);
-            __pyx_t_10 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = ((PyObject *)__pyx_v_self->links);
+            __Pyx_INCREF(__pyx_t_2);
+            __pyx_t_10 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":57
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":57
  *             for line in f:
  *                 self.sent_index.append(len(self.links))
  *                 pairs = line.split()             # <<<<<<<<<<<<<<
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_XDECREF(__pyx_v_pairs);
-            __pyx_v_pairs = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_pairs = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":58
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":58
  *                 self.sent_index.append(len(self.links))
  *                 pairs = line.split()
  *                 for pair in pairs:             # <<<<<<<<<<<<<<
@@ -9683,158 +10556,173 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  *                     self.links.append(self.link(i, j))
  */
             if (PyList_CheckExact(__pyx_v_pairs) || PyTuple_CheckExact(__pyx_v_pairs)) {
-              __pyx_t_3 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
+              __pyx_t_2 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_2); __pyx_t_10 = 0;
               __pyx_t_11 = NULL;
             } else {
-              __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_3);
-              __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
+              __pyx_t_10 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_11 = Py_TYPE(__pyx_t_2)->tp_iternext;
             }
             for (;;) {
-              if (PyList_CheckExact(__pyx_t_3)) {
-                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
-                __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++;
-              } else if (PyTuple_CheckExact(__pyx_t_3)) {
-                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-                __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++;
+              if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_2)) {
+                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_2)) break;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #else
+                __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #endif
+              } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_2)) {
+                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #else
+                __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #endif
               } else {
-                __pyx_t_1 = __pyx_t_11(__pyx_t_3);
-                if (unlikely(!__pyx_t_1)) {
+                __pyx_t_3 = __pyx_t_11(__pyx_t_2);
+                if (unlikely(!__pyx_t_3)) {
                   if (PyErr_Occurred()) {
                     if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                    else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                   }
                   break;
                 }
-                __Pyx_GOTREF(__pyx_t_1);
+                __Pyx_GOTREF(__pyx_t_3);
               }
               __Pyx_XDECREF(__pyx_v_pair);
-              __pyx_v_pair = __pyx_t_1;
-              __pyx_t_1 = 0;
+              __pyx_v_pair = __pyx_t_3;
+              __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":59
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))             # <<<<<<<<<<<<<<
  *                     self.links.append(self.link(i, j))
  *             self.sent_index.append(len(self.links))
  */
-              __pyx_t_1 = PyObject_GetAttr(__pyx_v_pair, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_12 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_32), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_3 = PyObject_GetAttr(__pyx_v_pair, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_12 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_k_tuple_32), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_3);
               __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-              PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
+              PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
               __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-              PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
+              PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_12);
               __Pyx_GIVEREF(__pyx_t_12);
               __pyx_t_12 = 0;
-              __pyx_t_12 = PyObject_Call(__pyx_builtin_map, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_builtin_map, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+              __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
               if ((likely(PyTuple_CheckExact(__pyx_t_12))) || (PyList_CheckExact(__pyx_t_12))) {
                 PyObject* sequence = __pyx_t_12;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                Py_ssize_t size = Py_SIZE(sequence);
+                #else
+                Py_ssize_t size = PySequence_Size(sequence);
+                #endif
+                if (unlikely(size != 2)) {
+                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                }
+                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                  }
-                  __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
+                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                  }
-                  __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
+                  __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
                 }
-                __Pyx_INCREF(__pyx_t_1);
+                __Pyx_INCREF(__pyx_t_3);
                 __Pyx_INCREF(__pyx_t_13);
+                #else
+                __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_t_13 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #endif
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              } else {
+              } else
+              {
                 Py_ssize_t index = -1;
-                __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
                 __pyx_t_15 = Py_TYPE(__pyx_t_14)->tp_iternext;
-                index = 0; __pyx_t_1 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_1)) goto __pyx_L21_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_1);
-                index = 1; __pyx_t_13 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L21_unpacking_failed;
+                index = 0; __pyx_t_3 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_3)) goto __pyx_L20_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_3);
+                index = 1; __pyx_t_13 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L20_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_13);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_14), 2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_14), 2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_t_15 = NULL;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                goto __pyx_L22_unpacking_done;
-                __pyx_L21_unpacking_failed:;
+                goto __pyx_L21_unpacking_done;
+                __pyx_L20_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                __pyx_L22_unpacking_done:;
+                __pyx_t_15 = NULL;
+                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_L21_unpacking_done:;
               }
               __Pyx_XDECREF(__pyx_v_i);
-              __pyx_v_i = __pyx_t_1;
-              __pyx_t_1 = 0;
+              __pyx_v_i = __pyx_t_3;
+              __pyx_t_3 = 0;
               __Pyx_XDECREF(__pyx_v_j);
               __pyx_v_j = __pyx_t_13;
               __pyx_t_13 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":60
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":60
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))
  *                     self.links.append(self.link(i, j))             # <<<<<<<<<<<<<<
  *             self.sent_index.append(len(self.links))
  * 
  */
-              __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_t_12 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->__pyx_vtab)->link(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_t_16, __pyx_t_17)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->link(__pyx_v_self, __pyx_t_16, __pyx_t_17)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __pyx_t_13 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links), __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_13 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->links), __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_13);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
             }
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":61
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":61
  *                     (i, j) = map(int, pair.split('-'))
  *                     self.links.append(self.link(i, j))
  *             self.sent_index.append(len(self.links))             # <<<<<<<<<<<<<<
  * 
  *     def read_binary(self, char* filename):
  */
-          __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
-          __Pyx_INCREF(__pyx_t_2);
-          __pyx_t_8 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = ((PyObject *)__pyx_v_self->links);
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_t_8 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_3 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -9843,57 +10731,57 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_13) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_13) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-          __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_3);
-          __Pyx_GIVEREF(__pyx_t_3);
+          __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_12);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_13);
           PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_t_13);
           __Pyx_GIVEREF(__pyx_t_13);
           __pyx_t_19 = PyObject_Call(__pyx_t_4, __pyx_t_12, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_19);
           __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_19);
           __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-          if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_20 = (!__pyx_t_18);
           if (__pyx_t_20) {
-            __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_13);
-            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_13);
-            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_13 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L25;
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_13);
+            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_13 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L24;
           }
-          __pyx_L25:;
+          __pyx_L24:;
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L16_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -9907,11 +10795,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
         if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L26;
-    __pyx_L5_error:;
+    goto __pyx_L25;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L26:;
+    __pyx_L25:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -9937,24 +10825,13 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":63
- *             self.sent_index.append(len(self.links))
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -9964,8 +10841,26 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_8read_binary(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":63
+ *             self.sent_index.append(len(self.links))
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":65
+static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":65
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -9974,25 +10869,25 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":66
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":66
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.links.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.sent_index.read_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->read_handle(__pyx_v_self->links, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":67
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":67
  *         f = fopen(filename, "r")
  *         self.links.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":68
  *         self.links.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -10007,7 +10902,28 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":70
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_10write_text(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":70
  *         fclose(f)
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -10015,9 +10931,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
  *             sent_num = 0
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_sent_num = NULL;
   PyObject *__pyx_v_i = NULL;
@@ -10030,9 +10944,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   PyObject *__pyx_t_10 = NULL;
   int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
@@ -10042,18 +10956,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10064,7 +10969,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -10076,23 +10981,24 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":72
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":72
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             sent_num = 0             # <<<<<<<<<<<<<<
@@ -10102,7 +11008,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_sent_num = __pyx_int_0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":73
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":73
  *         with open(filename, "w") as f:
  *             sent_num = 0
  *             for i, link in enumerate(self.links):             # <<<<<<<<<<<<<<
@@ -10110,46 +11016,54 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  *                     f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_1 = __pyx_int_0;
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links))) {
-            __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links); __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_4 = __pyx_int_0;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->links)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->links))) {
+            __pyx_t_1 = ((PyObject *)__pyx_v_self->links); __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->links)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_9 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_9 = __pyx_t_8(__pyx_t_2);
-              if (unlikely(!__pyx_t_9)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_9);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_link);
-            __pyx_v_link = __pyx_t_9;
-            __pyx_t_9 = 0;
-            __Pyx_INCREF(__pyx_t_1);
+            __pyx_v_link = __pyx_t_2;
+            __pyx_t_2 = 0;
+            __Pyx_INCREF(__pyx_t_4);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_9 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_1);
-            __pyx_t_1 = __pyx_t_9;
-            __pyx_t_9 = 0;
+            __pyx_v_i = __pyx_t_4;
+            __pyx_t_2 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_4);
+            __pyx_t_4 = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":74
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":74
  *             sent_num = 0
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:             # <<<<<<<<<<<<<<
@@ -10157,107 +11071,106 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  *                     sent_num = sent_num + 1
  */
             while (1) {
-              __pyx_t_9 = PyObject_GetItem(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_v_sent_num); if (!__pyx_t_9) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_9);
-              __pyx_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_9, Py_GE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_2 = PyObject_GetItem(((PyObject *)__pyx_v_self->sent_index), __pyx_v_sent_num); if (!__pyx_t_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               if (!__pyx_t_11) break;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":75
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":75
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  */
-              __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_k_tuple_34), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_2 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_k_tuple_34), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":76
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":76
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")
  *                     sent_num = sent_num + 1             # <<<<<<<<<<<<<<
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")
  */
-              __pyx_t_9 = PyNumber_Add(__pyx_v_sent_num, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_2 = PyNumber_Add(__pyx_v_sent_num, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
               __Pyx_DECREF(__pyx_v_sent_num);
-              __pyx_v_sent_num = __pyx_t_9;
-              __pyx_t_9 = 0;
+              __pyx_v_sent_num = __pyx_t_2;
+              __pyx_t_2 = 0;
             }
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":77
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":77
  *                     f.write("\n")
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__unlink); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__unlink); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
             __Pyx_INCREF(__pyx_v_link);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_link);
             __Pyx_GIVEREF(__pyx_v_link);
-            __pyx_t_13 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_13 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_13);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __pyx_t_12 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_35), __pyx_t_13); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_35), __pyx_t_13); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_13);
             PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_t_12));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
             __pyx_t_12 = 0;
-            __pyx_t_12 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":78
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def write_binary(self, char* filename):
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_36), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_36), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10266,75 +11179,75 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_12) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_4, &__pyx_t_12) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-          __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_13);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_12);
           PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __pyx_t_14 = PyObject_Call(__pyx_t_3, __pyx_t_13, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_14);
           __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_15 = (!__pyx_t_11);
           if (__pyx_t_15) {
-            __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_12);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_12);
-            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_12 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_4, __pyx_t_12);
+            __pyx_t_1 = 0; __pyx_t_4 = 0; __pyx_t_12 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
+          __pyx_L22:;
           __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_37, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_37, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -10342,7 +11255,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_XDECREF(__pyx_t_13);
@@ -10358,24 +11271,13 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":80
- *             f.write("\n")
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -10385,8 +11287,26 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_12write_binary(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":80
+ *             f.write("\n")
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":82
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":82
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -10395,25 +11315,25 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":83
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":83
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.links.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.sent_index.write_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->write_handle(__pyx_v_self->links, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":84
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":84
  *         f = fopen(filename, "w")
  *         self.links.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":85
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":85
  *         self.links.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -10428,7 +11348,28 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":87
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_14write_enhanced(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":87
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -10436,11 +11377,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
  *             sent_num = 1
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
-  long __pyx_v_sent_num;
+  CYTHON_UNUSED long __pyx_v_sent_num;
   PyObject *__pyx_v_link = NULL;
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_r = NULL;
@@ -10451,9 +11390,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   PyObject *__pyx_t_10 = NULL;
   int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
@@ -10461,18 +11400,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10483,7 +11413,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -10495,23 +11425,24 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":89
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":89
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             sent_num = 1             # <<<<<<<<<<<<<<
@@ -10520,167 +11451,183 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  */
           __pyx_v_sent_num = 1;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":90
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":90
  *         with open(filename, "w") as f:
  *             sent_num = 1
  *             for link in self.links:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % link)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->links)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->links))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->links); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->links)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_link);
-            __pyx_v_link = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_link = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":91
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":91
  *             sent_num = 1
  *             for link in self.links:
  *                 f.write("%d " % link)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i in self.sent_index:
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
-            __pyx_t_9 = 0;
-            __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":92
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
  *                 f.write("%d " % link)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_38), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_38), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":93
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":93
  *                 f.write("%d " % link)
  *             f.write("\n")
  *             for i in self.sent_index:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index))) {
-            __pyx_t_9 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index); __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_index))) {
+            __pyx_t_2 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_1 = __pyx_t_8(__pyx_t_9);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_4 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_4)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_4);
             }
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_i = __pyx_t_4;
+            __pyx_t_4 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":94
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":94
  *             f.write("\n")
  *             for i in self.sent_index:
  *                 f.write("%d " % i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_10));
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":95
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def alignment(self, i):
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_39), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_39), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10689,75 +11636,75 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_9, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
-          __Pyx_INCREF(__pyx_t_9);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
-          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_9, __pyx_t_2);
-            __pyx_t_10 = 0; __pyx_t_9 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_2, __pyx_t_1);
+            __pyx_t_10 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_40, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_40, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -10765,7 +11712,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -10778,7 +11725,19 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":97
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static char __pyx_doc_3_sa_9Alignment_16alignment[] = "Return all (e,f) pairs for sentence i";
+static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("alignment (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9Alignment_16alignment(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":97
  *             f.write("\n")
  * 
  *     def alignment(self, i):             # <<<<<<<<<<<<<<
@@ -10786,9 +11745,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  *         cdef int j, start, end
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static char __pyx_doc_3_sa_9Alignment_8alignment[] = "Return all (e,f) pairs for sentence i";
-static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_j;
   int __pyx_v_start;
   int __pyx_v_end;
@@ -10804,9 +11761,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("alignment");
+  __Pyx_RefNannySetupContext("alignment", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":100
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":100
  *         """Return all (e,f) pairs for sentence i"""
  *         cdef int j, start, end
  *         result = []             # <<<<<<<<<<<<<<
@@ -10814,11 +11771,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
  *         end = self.sent_index.arr[i+1]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":101
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":101
  *         cdef int j, start, end
  *         result = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
@@ -10826,9 +11783,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
  *         for j from start <= j < end:
  */
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = (((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":102
  *         result = []
  *         start = self.sent_index.arr[i]
  *         end = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
@@ -10839,9 +11796,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_end = (((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_end = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":103
  *         start = self.sent_index.arr[i]
  *         end = self.sent_index.arr[i+1]
  *         for j from start <= j < end:             # <<<<<<<<<<<<<<
@@ -10851,21 +11808,18 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
   __pyx_t_3 = __pyx_v_end;
   for (__pyx_v_j = __pyx_v_start; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":104
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":104
  *         end = self.sent_index.arr[i+1]
  *         for j from start <= j < end:
  *             result.append(self.unlink(self.links.arr[j]))             # <<<<<<<<<<<<<<
  *         return result
  */
-    if (unlikely(((PyObject *)__pyx_v_result) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__unlink); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__unlink); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->arr[__pyx_v_j])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((__pyx_v_self->links->arr[__pyx_v_j])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
@@ -10877,7 +11831,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":105
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":105
  *         for j from start <= j < end:
  *             result.append(self.unlink(self.links.arr[j]))
  *         return result             # <<<<<<<<<<<<<<
@@ -10902,7 +11856,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":15
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":15
  *     int val
  * 
  * cdef _node* new_node(int key):             # <<<<<<<<<<<<<<
@@ -10914,9 +11868,9 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   struct __pyx_t_3_sa__node *__pyx_v_n;
   struct __pyx_t_3_sa__node *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_node");
+  __Pyx_RefNannySetupContext("new_node", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":17
  * cdef _node* new_node(int key):
  *     cdef _node* n
  *     n = <_node*> malloc(sizeof(_node))             # <<<<<<<<<<<<<<
@@ -10925,7 +11879,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n = ((struct __pyx_t_3_sa__node *)malloc((sizeof(struct __pyx_t_3_sa__node))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":18
  *     cdef _node* n
  *     n = <_node*> malloc(sizeof(_node))
  *     n.smaller = NULL             # <<<<<<<<<<<<<<
@@ -10934,7 +11888,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->smaller = NULL;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":19
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":19
  *     n = <_node*> malloc(sizeof(_node))
  *     n.smaller = NULL
  *     n.bigger = NULL             # <<<<<<<<<<<<<<
@@ -10943,7 +11897,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->bigger = NULL;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":20
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":20
  *     n.smaller = NULL
  *     n.bigger = NULL
  *     n.key = key             # <<<<<<<<<<<<<<
@@ -10952,7 +11906,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->key = __pyx_v_key;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":21
  *     n.bigger = NULL
  *     n.key = key
  *     n.val = 0             # <<<<<<<<<<<<<<
@@ -10961,7 +11915,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->val = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":22
  *     n.key = key
  *     n.val = 0
  *     return n             # <<<<<<<<<<<<<<
@@ -10977,7 +11931,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":25
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":25
  * 
  * 
  * cdef del_node(_node* n):             # <<<<<<<<<<<<<<
@@ -10993,9 +11947,9 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("del_node");
+  __Pyx_RefNannySetupContext("del_node", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":26
  * 
  * cdef del_node(_node* n):
  *     if n.smaller != NULL:             # <<<<<<<<<<<<<<
@@ -11005,7 +11959,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   __pyx_t_1 = (__pyx_v_n->smaller != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":27
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":27
  * cdef del_node(_node* n):
  *     if n.smaller != NULL:
  *         del_node(n.smaller)             # <<<<<<<<<<<<<<
@@ -11019,7 +11973,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":28
  *     if n.smaller != NULL:
  *         del_node(n.smaller)
  *     if n.bigger != NULL:             # <<<<<<<<<<<<<<
@@ -11029,7 +11983,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   __pyx_t_1 = (__pyx_v_n->bigger != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":29
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":29
  *         del_node(n.smaller)
  *     if n.bigger != NULL:
  *         del_node(n.bigger)             # <<<<<<<<<<<<<<
@@ -11043,7 +11997,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":30
  *     if n.bigger != NULL:
  *         del_node(n.bigger)
  *     free(n)             # <<<<<<<<<<<<<<
@@ -11064,7 +12018,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":32
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":32
  *     free(n)
  * 
  * cdef int* get_val(_node* n, int key):             # <<<<<<<<<<<<<<
@@ -11076,9 +12030,9 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("get_val");
+  __Pyx_RefNannySetupContext("get_val", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":33
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":33
  * 
  * cdef int* get_val(_node* n, int key):
  *     if key == n.key:             # <<<<<<<<<<<<<<
@@ -11088,7 +12042,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   __pyx_t_1 = (__pyx_v_key == __pyx_v_n->key);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":34
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":34
  * cdef int* get_val(_node* n, int key):
  *     if key == n.key:
  *         return &n.val             # <<<<<<<<<<<<<<
@@ -11100,7 +12054,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":35
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":35
  *     if key == n.key:
  *         return &n.val
  *     elif key < n.key:             # <<<<<<<<<<<<<<
@@ -11110,7 +12064,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   __pyx_t_1 = (__pyx_v_key < __pyx_v_n->key);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":36
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":36
  *         return &n.val
  *     elif key < n.key:
  *         if n.smaller == NULL:             # <<<<<<<<<<<<<<
@@ -11120,7 +12074,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     __pyx_t_1 = (__pyx_v_n->smaller == NULL);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":37
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":37
  *     elif key < n.key:
  *         if n.smaller == NULL:
  *             n.smaller = new_node(key)             # <<<<<<<<<<<<<<
@@ -11129,7 +12083,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
  */
       __pyx_v_n->smaller = __pyx_f_3_sa_new_node(__pyx_v_key);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":38
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":38
  *         if n.smaller == NULL:
  *             n.smaller = new_node(key)
  *             return &(n.smaller.val)             # <<<<<<<<<<<<<<
@@ -11142,7 +12096,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     }
     __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":39
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":39
  *             n.smaller = new_node(key)
  *             return &(n.smaller.val)
  *         return get_val(n.smaller, key)             # <<<<<<<<<<<<<<
@@ -11155,7 +12109,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":41
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":41
  *         return get_val(n.smaller, key)
  *     else:
  *         if n.bigger == NULL:             # <<<<<<<<<<<<<<
@@ -11165,7 +12119,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     __pyx_t_1 = (__pyx_v_n->bigger == NULL);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":42
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":42
  *     else:
  *         if n.bigger == NULL:
  *             n.bigger = new_node(key)             # <<<<<<<<<<<<<<
@@ -11174,7 +12128,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
  */
       __pyx_v_n->bigger = __pyx_f_3_sa_new_node(__pyx_v_key);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":43
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":43
  *         if n.bigger == NULL:
  *             n.bigger = new_node(key)
  *             return &(n.bigger.val)             # <<<<<<<<<<<<<<
@@ -11187,7 +12141,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":44
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":44
  *             n.bigger = new_node(key)
  *             return &(n.bigger.val)
  *         return get_val(n.bigger, key)             # <<<<<<<<<<<<<<
@@ -11205,16 +12159,9 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
- *     cdef id2eword, id2fword, eword2id, fword2id
- * 
- *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
- *             earray=None, fsarray=None, alignment=None):
- *         self.id2eword = []
- */
-
-static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_from_data = 0;
   PyObject *__pyx_v_from_binary = 0;
@@ -11223,23 +12170,23 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   PyObject *__pyx_v_alignment = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
     PyObject* values[6] = {0,0,0,0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
+ *     cdef id2eword, id2fword, eword2id, fword2id
+ * 
+ *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
+ *             earray=None, fsarray=None, alignment=None):
+ *         self.id2eword = []
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = __pyx_k_41;
     values[2] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":55
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":55
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,
  *             earray=None, fsarray=None, alignment=None):             # <<<<<<<<<<<<<<
@@ -11251,7 +12198,8 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     values[5] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -11262,7 +12210,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_text);
@@ -11295,7 +12243,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -11324,8 +12272,33 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex___cinit__(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_v_from_text, __pyx_v_from_data, __pyx_v_from_binary, __pyx_v_earray, __pyx_v_fsarray, __pyx_v_alignment);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":56
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
+ *     cdef id2eword, id2fword, eword2id, fword2id
+ * 
+ *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
+ *             earray=None, fsarray=None, alignment=None):
+ *         self.id2eword = []
+ */
+
+static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_from_text, PyObject *__pyx_v_from_data, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_earray, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_alignment) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":56
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,
  *             earray=None, fsarray=None, alignment=None):
  *         self.id2eword = []             # <<<<<<<<<<<<<<
@@ -11333,14 +12306,14 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
  *         self.eword2id = {}
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->id2eword);
+  __Pyx_DECREF(__pyx_v_self->id2eword);
+  __pyx_v_self->id2eword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":57
  *             earray=None, fsarray=None, alignment=None):
  *         self.id2eword = []
  *         self.id2fword = []             # <<<<<<<<<<<<<<
@@ -11348,14 +12321,14 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
  *         self.fword2id = {}
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->id2fword);
+  __Pyx_DECREF(__pyx_v_self->id2fword);
+  __pyx_v_self->id2fword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":58
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":58
  *         self.id2eword = []
  *         self.id2fword = []
  *         self.eword2id = {}             # <<<<<<<<<<<<<<
@@ -11365,12 +12338,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->eword2id);
+  __Pyx_DECREF(__pyx_v_self->eword2id);
+  __pyx_v_self->eword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":59
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":59
  *         self.id2fword = []
  *         self.eword2id = {}
  *         self.fword2id = {}             # <<<<<<<<<<<<<<
@@ -11380,12 +12353,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->fword2id);
+  __Pyx_DECREF(__pyx_v_self->fword2id);
+  __pyx_v_self->fword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":60
  *         self.eword2id = {}
  *         self.fword2id = {}
  *         self.e_index = IntList()             # <<<<<<<<<<<<<<
@@ -11395,12 +12368,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->e_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->e_index));
+  __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":61
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":61
  *         self.fword2id = {}
  *         self.e_index = IntList()
  *         self.f_index = IntList()             # <<<<<<<<<<<<<<
@@ -11410,12 +12383,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->f_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->f_index));
+  __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":62
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":62
  *         self.e_index = IntList()
  *         self.f_index = IntList()
  *         self.col1 = FloatList()             # <<<<<<<<<<<<<<
@@ -11425,12 +12398,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->col1);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->col1));
+  __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":63
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":63
  *         self.f_index = IntList()
  *         self.col1 = FloatList()
  *         self.col2 = FloatList()             # <<<<<<<<<<<<<<
@@ -11440,12 +12413,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->col2);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->col2));
+  __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":64
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":64
  *         self.col1 = FloatList()
  *         self.col2 = FloatList()
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -11455,17 +12428,17 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":65
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":65
  *         self.col2 = FloatList()
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_data:
  *             self.compute_from_data(fsarray, earray, alignment)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -11474,10 +12447,10 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":66
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":66
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_data:             # <<<<<<<<<<<<<<
@@ -11487,7 +12460,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_data); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":67
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":67
  *             self.read_binary(from_binary)
  *         elif from_data:
  *             self.compute_from_data(fsarray, earray, alignment)             # <<<<<<<<<<<<<<
@@ -11503,27 +12476,27 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     if (!(likely(((__pyx_v_alignment) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_alignment, __pyx_ptype_3_sa_Alignment))))) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __pyx_v_alignment;
     __Pyx_INCREF(__pyx_t_1);
-    __pyx_t_5 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->compute_from_data(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_t_4), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_3), ((struct __pyx_obj_3_sa_Alignment *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->compute_from_data(__pyx_v_self, ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_t_4), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_3), ((struct __pyx_obj_3_sa_Alignment *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":69
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":69
  *             self.compute_from_data(fsarray, earray, alignment)
  *         else:
  *             self.read_text(from_text)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -11533,7 +12506,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -11549,7 +12522,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":72
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":72
  * 
  * 
  *     cdef compute_from_data(self, SuffixArray fsa, DataArray eda, Alignment aa):             # <<<<<<<<<<<<<<
@@ -11601,9 +12574,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("compute_from_data");
+  __Pyx_RefNannySetupContext("compute_from_data", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":79
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":79
  *         cdef int null_word
  * 
  *         null_word = 0             # <<<<<<<<<<<<<<
@@ -11612,7 +12585,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_null_word = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":80
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":80
  * 
  *         null_word = 0
  *         for word in fsa.darray.id2word: # I miss list comprehensions             # <<<<<<<<<<<<<<
@@ -11628,12 +12601,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -11649,7 +12630,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":81
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":81
  *         null_word = 0
  *         for word in fsa.darray.id2word: # I miss list comprehensions
  *             self.id2fword.append(word)             # <<<<<<<<<<<<<<
@@ -11662,7 +12643,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":82
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":82
  *         for word in fsa.darray.id2word: # I miss list comprehensions
  *             self.id2fword.append(word)
  *         self.id2fword[null_word] = "NULL"             # <<<<<<<<<<<<<<
@@ -11671,7 +12652,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   if (__Pyx_SetItemInt(__pyx_v_self->id2fword, __pyx_v_null_word, ((PyObject *)__pyx_n_s__NULL), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":83
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":83
  *             self.id2fword.append(word)
  *         self.id2fword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2fword):             # <<<<<<<<<<<<<<
@@ -11689,12 +12670,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_4)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_4)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_5)) {
@@ -11718,7 +12707,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":84
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":84
  *         self.id2fword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2fword):
  *             self.fword2id[word] = id             # <<<<<<<<<<<<<<
@@ -11730,7 +12719,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":86
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":86
  *             self.fword2id[word] = id
  * 
  *         for word in eda.id2word:             # <<<<<<<<<<<<<<
@@ -11746,12 +12735,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -11767,7 +12764,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":87
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":87
  * 
  *         for word in eda.id2word:
  *             self.id2eword.append(word)             # <<<<<<<<<<<<<<
@@ -11780,7 +12777,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":88
  *         for word in eda.id2word:
  *             self.id2eword.append(word)
  *         self.id2eword[null_word] = "NULL"             # <<<<<<<<<<<<<<
@@ -11789,7 +12786,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   if (__Pyx_SetItemInt(__pyx_v_self->id2eword, __pyx_v_null_word, ((PyObject *)__pyx_n_s__NULL), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":89
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":89
  *             self.id2eword.append(word)
  *         self.id2eword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2eword):             # <<<<<<<<<<<<<<
@@ -11807,12 +12804,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_4)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_4)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_5)) {
@@ -11836,7 +12841,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":90
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":90
  *         self.id2eword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2eword):
  *             self.eword2id[word] = id             # <<<<<<<<<<<<<<
@@ -11848,7 +12853,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":92
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":92
  *             self.eword2id[word] = id
  * 
  *         num_pairs = 0             # <<<<<<<<<<<<<<
@@ -11857,7 +12862,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_num_pairs = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":94
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":94
  *         num_pairs = 0
  * 
  *         V_E = len(eda.id2word)             # <<<<<<<<<<<<<<
@@ -11870,7 +12875,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_V_E = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":95
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":95
  * 
  *         V_E = len(eda.id2word)
  *         V_F = len(fsa.darray.id2word)             # <<<<<<<<<<<<<<
@@ -11883,7 +12888,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_V_F = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":96
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":96
  *         V_E = len(eda.id2word)
  *         V_F = len(fsa.darray.id2word)
  *         fmargin = <int*> malloc(V_F*sizeof(int))             # <<<<<<<<<<<<<<
@@ -11892,7 +12897,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_fmargin = ((int *)malloc((__pyx_v_V_F * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":97
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":97
  *         V_F = len(fsa.darray.id2word)
  *         fmargin = <int*> malloc(V_F*sizeof(int))
  *         emargin = <int*> malloc(V_E*sizeof(int))             # <<<<<<<<<<<<<<
@@ -11901,7 +12906,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_emargin = ((int *)malloc((__pyx_v_V_E * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":98
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":98
  *         fmargin = <int*> malloc(V_F*sizeof(int))
  *         emargin = <int*> malloc(V_E*sizeof(int))
  *         memset(fmargin, 0, V_F*sizeof(int))             # <<<<<<<<<<<<<<
@@ -11910,7 +12915,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_fmargin, 0, (__pyx_v_V_F * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":99
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":99
  *         emargin = <int*> malloc(V_E*sizeof(int))
  *         memset(fmargin, 0, V_F*sizeof(int))
  *         memset(emargin, 0, V_E*sizeof(int))             # <<<<<<<<<<<<<<
@@ -11919,7 +12924,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_emargin, 0, (__pyx_v_V_E * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":101
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":101
  *         memset(emargin, 0, V_E*sizeof(int))
  * 
  *         dict = <_node**> malloc(V_F*sizeof(_node*))             # <<<<<<<<<<<<<<
@@ -11928,7 +12933,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_dict = ((struct __pyx_t_3_sa__node **)malloc((__pyx_v_V_F * (sizeof(struct __pyx_t_3_sa__node *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":102
  * 
  *         dict = <_node**> malloc(V_F*sizeof(_node*))
  *         memset(dict, 0, V_F*sizeof(_node*))             # <<<<<<<<<<<<<<
@@ -11937,7 +12942,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_dict, 0, (__pyx_v_V_F * (sizeof(struct __pyx_t_3_sa__node *))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":104
  *         memset(dict, 0, V_F*sizeof(_node*))
  * 
  *         num_sents = len(fsa.darray.sent_index)             # <<<<<<<<<<<<<<
@@ -11953,7 +12958,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_num_sents = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":105
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":105
  * 
  *         num_sents = len(fsa.darray.sent_index)
  *         for sent_id from 0 <= sent_id < num_sents-1:             # <<<<<<<<<<<<<<
@@ -11966,7 +12971,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (__pyx_v_sent_id = 0; __pyx_v_sent_id < __pyx_t_6; __pyx_v_sent_id++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":107
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":107
  *         for sent_id from 0 <= sent_id < num_sents-1:
  * 
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -11975,7 +12980,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_fsent = (__pyx_v_fsa->darray->data->arr + (__pyx_v_fsa->darray->sent_index->arr[__pyx_v_sent_id]));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":108
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":108
  * 
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1             # <<<<<<<<<<<<<<
@@ -11984,7 +12989,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_I = (((__pyx_v_fsa->darray->sent_index->arr[(__pyx_v_sent_id + 1)]) - (__pyx_v_fsa->darray->sent_index->arr[__pyx_v_sent_id])) - 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":109
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":109
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1
  *             faligned = <int*> malloc(I*sizeof(int))             # <<<<<<<<<<<<<<
@@ -11993,7 +12998,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_faligned = ((int *)malloc((__pyx_v_I * (sizeof(int)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":110
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":110
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1
  *             faligned = <int*> malloc(I*sizeof(int))
  *             memset(faligned, 0, I*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12002,7 +13007,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     memset(__pyx_v_faligned, 0, (__pyx_v_I * (sizeof(int))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":112
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":112
  *             memset(faligned, 0, I*sizeof(int))
  * 
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -12011,7 +13016,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_esent = (__pyx_v_eda->data->arr + (__pyx_v_eda->sent_index->arr[__pyx_v_sent_id]));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":113
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":113
  * 
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1             # <<<<<<<<<<<<<<
@@ -12020,7 +13025,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_J = (((__pyx_v_eda->sent_index->arr[(__pyx_v_sent_id + 1)]) - (__pyx_v_eda->sent_index->arr[__pyx_v_sent_id])) - 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":114
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":114
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1
  *             ealigned = <int*> malloc(J*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12029,7 +13034,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_ealigned = ((int *)malloc((__pyx_v_J * (sizeof(int)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":115
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":115
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1
  *             ealigned = <int*> malloc(J*sizeof(int))
  *             memset(ealigned, 0, J*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12038,7 +13043,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     memset(__pyx_v_ealigned, 0, (__pyx_v_J * (sizeof(int))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":117
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":117
  *             memset(ealigned, 0, J*sizeof(int))
  * 
  *             links = aa._get_sent_links(sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -12047,7 +13052,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_aa->__pyx_vtab)->_get_sent_links(__pyx_v_aa, __pyx_v_sent_id, (&__pyx_v_num_links));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":119
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":119
  *             links = aa._get_sent_links(sent_id, &num_links)
  * 
  *             for l from 0 <= l < num_links:             # <<<<<<<<<<<<<<
@@ -12057,7 +13062,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_num_links;
     for (__pyx_v_l = 0; __pyx_v_l < __pyx_t_7; __pyx_v_l++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":120
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":120
  * 
  *             for l from 0 <= l < num_links:
  *                 i = links[l*2]             # <<<<<<<<<<<<<<
@@ -12066,7 +13071,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_i = (__pyx_v_links[(__pyx_v_l * 2)]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":121
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":121
  *             for l from 0 <= l < num_links:
  *                 i = links[l*2]
  *                 j = links[l*2+1]             # <<<<<<<<<<<<<<
@@ -12075,7 +13080,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_j = (__pyx_v_links[((__pyx_v_l * 2) + 1)]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":122
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":122
  *                 i = links[l*2]
  *                 j = links[l*2+1]
  *                 if i >= I or j >= J:             # <<<<<<<<<<<<<<
@@ -12091,7 +13096,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       if (__pyx_t_10) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":123
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":123
  *                 j = links[l*2+1]
  *                 if i >= I or j >= J:
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))             # <<<<<<<<<<<<<<
@@ -12109,7 +13114,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_12 = PyInt_FromLong((__pyx_v_sent_id + 1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_12);
         __pyx_t_13 = PyTuple_New(5); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+        __Pyx_GOTREF(__pyx_t_13);
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4);
@@ -12129,7 +13134,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __Pyx_GOTREF(((PyObject *)__pyx_t_12));
         __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
         __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+        __Pyx_GOTREF(__pyx_t_13);
         PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_t_12));
         __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
         __pyx_t_12 = 0;
@@ -12143,7 +13148,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       __pyx_L15:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":124
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":124
  *                 if i >= I or j >= J:
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))
  *                 f_i = fsent[i]             # <<<<<<<<<<<<<<
@@ -12152,7 +13157,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_f_i = (__pyx_v_fsent[__pyx_v_i]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":125
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":125
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))
  *                 f_i = fsent[i]
  *                 e_j = esent[j]             # <<<<<<<<<<<<<<
@@ -12161,7 +13166,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_e_j = (__pyx_v_esent[__pyx_v_j]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":126
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":126
  *                 f_i = fsent[i]
  *                 e_j = esent[j]
  *                 fmargin[f_i] = fmargin[f_i]+1             # <<<<<<<<<<<<<<
@@ -12170,7 +13175,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_fmargin[__pyx_v_f_i]) = ((__pyx_v_fmargin[__pyx_v_f_i]) + 1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":127
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":127
  *                 e_j = esent[j]
  *                 fmargin[f_i] = fmargin[f_i]+1
  *                 emargin[e_j] = emargin[e_j]+1             # <<<<<<<<<<<<<<
@@ -12179,7 +13184,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_emargin[__pyx_v_e_j]) = ((__pyx_v_emargin[__pyx_v_e_j]) + 1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":128
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":128
  *                 fmargin[f_i] = fmargin[f_i]+1
  *                 emargin[e_j] = emargin[e_j]+1
  *                 if dict[f_i] == NULL:             # <<<<<<<<<<<<<<
@@ -12189,7 +13194,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_dict[__pyx_v_f_i]) == NULL);
       if (__pyx_t_10) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":129
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":129
  *                 emargin[e_j] = emargin[e_j]+1
  *                 if dict[f_i] == NULL:
  *                     dict[f_i] = new_node(e_j)             # <<<<<<<<<<<<<<
@@ -12198,7 +13203,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_dict[__pyx_v_f_i]) = __pyx_f_3_sa_new_node(__pyx_v_e_j);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":130
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":130
  *                 if dict[f_i] == NULL:
  *                     dict[f_i] = new_node(e_j)
  *                     dict[f_i].val = 1             # <<<<<<<<<<<<<<
@@ -12207,7 +13212,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_dict[__pyx_v_f_i])->val = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":131
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":131
  *                     dict[f_i] = new_node(e_j)
  *                     dict[f_i].val = 1
  *                     num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12219,7 +13224,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":133
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":133
  *                     num_pairs = num_pairs + 1
  *                 else:
  *                     count = get_val(dict[f_i], e_j)             # <<<<<<<<<<<<<<
@@ -12228,7 +13233,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_f_i]), __pyx_v_e_j);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":134
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":134
  *                 else:
  *                     count = get_val(dict[f_i], e_j)
  *                     if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -12238,7 +13243,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_count[0]) == 0);
         if (__pyx_t_10) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":135
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":135
  *                     count = get_val(dict[f_i], e_j)
  *                     if count[0] == 0:
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12250,7 +13255,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         __pyx_L17:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":136
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":136
  *                     if count[0] == 0:
  *                         num_pairs = num_pairs + 1
  *                     count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -12261,7 +13266,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       __pyx_L16:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":138
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":138
  *                     count[0] = count[0] + 1
  *                 # add count
  *                 faligned[i] = 1             # <<<<<<<<<<<<<<
@@ -12270,7 +13275,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_faligned[__pyx_v_i]) = 1;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":139
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":139
  *                 # add count
  *                 faligned[i] = 1
  *                 ealigned[j] = 1             # <<<<<<<<<<<<<<
@@ -12280,7 +13285,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       (__pyx_v_ealigned[__pyx_v_j]) = 1;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":140
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":140
  *                 faligned[i] = 1
  *                 ealigned[j] = 1
  *             for i from 0 <= i < I:             # <<<<<<<<<<<<<<
@@ -12290,7 +13295,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_I;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_7; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":141
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":141
  *                 ealigned[j] = 1
  *             for i from 0 <= i < I:
  *                 if faligned[i] == 0:             # <<<<<<<<<<<<<<
@@ -12300,7 +13305,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_faligned[__pyx_v_i]) == 0);
       if (__pyx_t_10) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":142
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":142
  *             for i from 0 <= i < I:
  *                 if faligned[i] == 0:
  *                     f_i = fsent[i]             # <<<<<<<<<<<<<<
@@ -12309,7 +13314,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_f_i = (__pyx_v_fsent[__pyx_v_i]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":143
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":143
  *                 if faligned[i] == 0:
  *                     f_i = fsent[i]
  *                     fmargin[f_i] = fmargin[f_i] + 1             # <<<<<<<<<<<<<<
@@ -12318,7 +13323,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_fmargin[__pyx_v_f_i]) = ((__pyx_v_fmargin[__pyx_v_f_i]) + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":144
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":144
  *                     f_i = fsent[i]
  *                     fmargin[f_i] = fmargin[f_i] + 1
  *                     emargin[null_word] = emargin[null_word] + 1             # <<<<<<<<<<<<<<
@@ -12327,7 +13332,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_emargin[__pyx_v_null_word]) = ((__pyx_v_emargin[__pyx_v_null_word]) + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":145
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":145
  *                     fmargin[f_i] = fmargin[f_i] + 1
  *                     emargin[null_word] = emargin[null_word] + 1
  *                     if dict[f_i] == NULL:             # <<<<<<<<<<<<<<
@@ -12337,7 +13342,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_dict[__pyx_v_f_i]) == NULL);
         if (__pyx_t_10) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":146
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":146
  *                     emargin[null_word] = emargin[null_word] + 1
  *                     if dict[f_i] == NULL:
  *                         dict[f_i] = new_node(null_word)             # <<<<<<<<<<<<<<
@@ -12346,7 +13351,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_f_i]) = __pyx_f_3_sa_new_node(__pyx_v_null_word);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":147
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":147
  *                     if dict[f_i] == NULL:
  *                         dict[f_i] = new_node(null_word)
  *                         dict[f_i].val = 1             # <<<<<<<<<<<<<<
@@ -12355,7 +13360,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_f_i])->val = 1;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":148
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":148
  *                         dict[f_i] = new_node(null_word)
  *                         dict[f_i].val = 1
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12367,7 +13372,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":150
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":150
  *                         num_pairs = num_pairs + 1
  *                     else:
  *                         count = get_val(dict[f_i], null_word)             # <<<<<<<<<<<<<<
@@ -12376,7 +13381,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_f_i]), __pyx_v_null_word);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":151
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":151
  *                     else:
  *                         count = get_val(dict[f_i], null_word)
  *                         if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -12386,7 +13391,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           __pyx_t_10 = ((__pyx_v_count[0]) == 0);
           if (__pyx_t_10) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":152
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":152
  *                         count = get_val(dict[f_i], null_word)
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12398,7 +13403,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           }
           __pyx_L22:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":153
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":153
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -12413,7 +13418,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_L20:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":154
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":154
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1
  *             for j from 0 <= j < J:             # <<<<<<<<<<<<<<
@@ -12423,7 +13428,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_J;
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_7; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":155
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":155
  *                         count[0] = count[0] + 1
  *             for j from 0 <= j < J:
  *                 if ealigned[j] == 0:             # <<<<<<<<<<<<<<
@@ -12433,7 +13438,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_ealigned[__pyx_v_j]) == 0);
       if (__pyx_t_10) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":156
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":156
  *             for j from 0 <= j < J:
  *                 if ealigned[j] == 0:
  *                     e_j = esent[j]             # <<<<<<<<<<<<<<
@@ -12442,7 +13447,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_e_j = (__pyx_v_esent[__pyx_v_j]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":157
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":157
  *                 if ealigned[j] == 0:
  *                     e_j = esent[j]
  *                     fmargin[null_word] = fmargin[null_word] + 1             # <<<<<<<<<<<<<<
@@ -12451,7 +13456,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_fmargin[__pyx_v_null_word]) = ((__pyx_v_fmargin[__pyx_v_null_word]) + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":158
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":158
  *                     e_j = esent[j]
  *                     fmargin[null_word] = fmargin[null_word] + 1
  *                     emargin[e_j] = emargin[e_j] + 1             # <<<<<<<<<<<<<<
@@ -12460,7 +13465,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_emargin[__pyx_v_e_j]) = ((__pyx_v_emargin[__pyx_v_e_j]) + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":159
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":159
  *                     fmargin[null_word] = fmargin[null_word] + 1
  *                     emargin[e_j] = emargin[e_j] + 1
  *                     if dict[null_word] == NULL:             # <<<<<<<<<<<<<<
@@ -12470,7 +13475,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_dict[__pyx_v_null_word]) == NULL);
         if (__pyx_t_10) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":160
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":160
  *                     emargin[e_j] = emargin[e_j] + 1
  *                     if dict[null_word] == NULL:
  *                         dict[null_word] = new_node(e_j)             # <<<<<<<<<<<<<<
@@ -12479,7 +13484,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_null_word]) = __pyx_f_3_sa_new_node(__pyx_v_e_j);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":161
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":161
  *                     if dict[null_word] == NULL:
  *                         dict[null_word] = new_node(e_j)
  *                         dict[null_word].val = 1             # <<<<<<<<<<<<<<
@@ -12488,7 +13493,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_null_word])->val = 1;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":162
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":162
  *                         dict[null_word] = new_node(e_j)
  *                         dict[null_word].val = 1
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12500,7 +13505,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":164
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":164
  *                         num_pairs = num_pairs + 1
  *                     else:
  *                         count = get_val(dict[null_word], e_j)             # <<<<<<<<<<<<<<
@@ -12509,7 +13514,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_null_word]), __pyx_v_e_j);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":165
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":165
  *                     else:
  *                         count = get_val(dict[null_word], e_j)
  *                         if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -12519,7 +13524,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           __pyx_t_10 = ((__pyx_v_count[0]) == 0);
           if (__pyx_t_10) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":166
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":166
  *                         count = get_val(dict[null_word], e_j)
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12531,7 +13536,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           }
           __pyx_L27:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":167
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":167
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -12546,7 +13551,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_L25:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":168
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":168
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1
  *             free(links)             # <<<<<<<<<<<<<<
@@ -12555,7 +13560,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     free(__pyx_v_links);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":169
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":169
  *                         count[0] = count[0] + 1
  *             free(links)
  *             free(faligned)             # <<<<<<<<<<<<<<
@@ -12564,7 +13569,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     free(__pyx_v_faligned);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":170
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":170
  *             free(links)
  *             free(faligned)
  *             free(ealigned)             # <<<<<<<<<<<<<<
@@ -12574,7 +13579,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     free(__pyx_v_ealigned);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":171
  *             free(faligned)
  *             free(ealigned)
  *         self.f_index = IntList(initial_len=V_F)             # <<<<<<<<<<<<<<
@@ -12587,7 +13592,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_13);
   if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_GIVEREF(__pyx_t_13);
@@ -12596,7 +13601,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_13);
   __pyx_t_13 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":172
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":172
  *             free(ealigned)
  *         self.f_index = IntList(initial_len=V_F)
  *         self.e_index = IntList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -12609,7 +13614,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_12);
   if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
   __Pyx_GIVEREF(__pyx_t_12);
@@ -12618,7 +13623,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
   __pyx_t_12 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":173
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":173
  *         self.f_index = IntList(initial_len=V_F)
  *         self.e_index = IntList(initial_len=num_pairs)
  *         self.col1 = FloatList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -12631,7 +13636,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_13);
   if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_GIVEREF(__pyx_t_13);
@@ -12640,7 +13645,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_13);
   __pyx_t_13 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":174
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":174
  *         self.e_index = IntList(initial_len=num_pairs)
  *         self.col1 = FloatList(initial_len=num_pairs)
  *         self.col2 = FloatList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -12653,7 +13658,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_12);
   if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
   __Pyx_GIVEREF(__pyx_t_12);
@@ -12662,7 +13667,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
   __pyx_t_12 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":176
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":176
  *         self.col2 = FloatList(initial_len=num_pairs)
  * 
  *         num_pairs = 0             # <<<<<<<<<<<<<<
@@ -12671,7 +13676,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_num_pairs = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":177
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":177
  * 
  *         num_pairs = 0
  *         for i from 0 <= i < V_F:             # <<<<<<<<<<<<<<
@@ -12681,7 +13686,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_t_6 = __pyx_v_V_F;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_6; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":179
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":179
  *         for i from 0 <= i < V_F:
  *             #self.f_index[i] = num_pairs
  *             self.f_index.set(i, num_pairs)             # <<<<<<<<<<<<<<
@@ -12690,7 +13695,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->set(__pyx_v_self->f_index, __pyx_v_i, __pyx_v_num_pairs);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":180
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":180
  *             #self.f_index[i] = num_pairs
  *             self.f_index.set(i, num_pairs)
  *             if dict[i] != NULL:             # <<<<<<<<<<<<<<
@@ -12700,7 +13705,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_10 = ((__pyx_v_dict[__pyx_v_i]) != NULL);
     if (__pyx_t_10) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":181
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":181
  *             self.f_index.set(i, num_pairs)
  *             if dict[i] != NULL:
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)             # <<<<<<<<<<<<<<
@@ -12711,7 +13716,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":182
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":182
  *             if dict[i] != NULL:
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)
  *                 del_node(dict[i])             # <<<<<<<<<<<<<<
@@ -12726,7 +13731,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_L30:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":183
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)
  *                 del_node(dict[i])
  *         free(fmargin)             # <<<<<<<<<<<<<<
@@ -12735,7 +13740,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_fmargin);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":184
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":184
  *                 del_node(dict[i])
  *         free(fmargin)
  *         free(emargin)             # <<<<<<<<<<<<<<
@@ -12744,7 +13749,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_emargin);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":185
  *         free(fmargin)
  *         free(emargin)
  *         free(dict)             # <<<<<<<<<<<<<<
@@ -12753,7 +13758,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_dict);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":186
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":186
  *         free(emargin)
  *         free(dict)
  *         return             # <<<<<<<<<<<<<<
@@ -12784,7 +13789,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":189
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":189
  * 
  * 
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):             # <<<<<<<<<<<<<<
@@ -12801,9 +13806,9 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_add_node");
+  __Pyx_RefNannySetupContext("_add_node", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":191
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":191
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):
  *         cdef int loc
  *         if n.smaller != NULL:             # <<<<<<<<<<<<<<
@@ -12813,7 +13818,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   __pyx_t_1 = (__pyx_v_n->smaller != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":192
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":192
  *         cdef int loc
  *         if n.smaller != NULL:
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)             # <<<<<<<<<<<<<<
@@ -12827,7 +13832,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":193
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":193
  *         if n.smaller != NULL:
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)
  *         loc = num_pairs[0]             # <<<<<<<<<<<<<<
@@ -12836,7 +13841,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   __pyx_v_loc = (__pyx_v_num_pairs[0]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":194
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":194
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)
  *         loc = num_pairs[0]
  *         self.e_index.set(loc, n.key)             # <<<<<<<<<<<<<<
@@ -12845,7 +13850,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->set(__pyx_v_self->e_index, __pyx_v_loc, __pyx_v_n->key);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":195
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":195
  *         loc = num_pairs[0]
  *         self.e_index.set(loc, n.key)
  *         self.col1.set(loc, float(n.val)/fmargin)             # <<<<<<<<<<<<<<
@@ -12858,7 +13863,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->set(__pyx_v_self->col1, __pyx_v_loc, (((double)__pyx_v_n->val) / __pyx_v_fmargin));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":196
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":196
  *         self.e_index.set(loc, n.key)
  *         self.col1.set(loc, float(n.val)/fmargin)
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))             # <<<<<<<<<<<<<<
@@ -12871,7 +13876,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->set(__pyx_v_self->col2, __pyx_v_loc, (((double)__pyx_v_n->val) / ((double)(__pyx_v_emargin[__pyx_v_n->key]))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":197
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":197
  *         self.col1.set(loc, float(n.val)/fmargin)
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))
  *         num_pairs[0] = loc + 1             # <<<<<<<<<<<<<<
@@ -12880,7 +13885,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   (__pyx_v_num_pairs[0]) = (__pyx_v_loc + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":198
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))
  *         num_pairs[0] = loc + 1
  *         if n.bigger != NULL:             # <<<<<<<<<<<<<<
@@ -12890,7 +13895,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   __pyx_t_1 = (__pyx_v_n->bigger != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":199
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":199
  *         num_pairs[0] = loc + 1
  *         if n.bigger != NULL:
  *             self._add_node(n.bigger, num_pairs, fmargin, emargin)             # <<<<<<<<<<<<<<
@@ -12916,7 +13921,28 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":202
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_2write_binary(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":202
  * 
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -12924,9 +13950,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -12935,18 +13959,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":204
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":204
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -12955,71 +13970,71 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":205
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":205
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.f_index.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->write_handle(__pyx_v_self->f_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":206
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":206
  *         f = fopen(filename, "w")
  *         self.f_index.write_handle(f)
  *         self.e_index.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->write_handle(__pyx_v_self->e_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":207
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":207
  *         self.f_index.write_handle(f)
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->write_handle(__pyx_v_self->col1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":208
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":208
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->write_handle(__pyx_v_self->col2, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":209
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":209
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)             # <<<<<<<<<<<<<<
  *         self.write_wordlist(self.id2eword, f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
+  __pyx_t_1 = __pyx_v_self->id2fword;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->write_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->write_wordlist(__pyx_v_self, __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":210
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":210
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
+  __pyx_t_2 = __pyx_v_self->id2eword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->write_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->write_wordlist(__pyx_v_self, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":211
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":211
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -13041,7 +14056,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":214
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":214
  * 
  * 
  *     cdef write_wordlist(self, wordlist, FILE* f):             # <<<<<<<<<<<<<<
@@ -13049,7 +14064,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  *         cdef int num_words
  */
 
-static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_wordlist, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_wordlist, FILE *__pyx_v_f) {
   int __pyx_v_word_len;
   int __pyx_v_num_words;
   PyObject *__pyx_v_word = NULL;
@@ -13064,9 +14079,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_wordlist");
+  __Pyx_RefNannySetupContext("write_wordlist", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":218
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":218
  *         cdef int num_words
  * 
  *         num_words = len(wordlist)             # <<<<<<<<<<<<<<
@@ -13076,7 +14091,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
   __pyx_t_1 = PyObject_Length(__pyx_v_wordlist); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_num_words = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":219
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":219
  * 
  *         num_words = len(wordlist)
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -13085,7 +14100,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":220
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":220
  *         num_words = len(wordlist)
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in wordlist:             # <<<<<<<<<<<<<<
@@ -13101,12 +14116,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
     __pyx_t_3 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
@@ -13122,7 +14145,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":221
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":221
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in wordlist:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
@@ -13132,7 +14155,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
     __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":222
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":222
  *         for word in wordlist:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -13141,7 +14164,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":223
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":223
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -13167,7 +14190,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":226
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":226
  * 
  * 
  *     cdef read_wordlist(self, word2id, id2word, FILE* f):             # <<<<<<<<<<<<<<
@@ -13175,11 +14198,11 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
  *         cdef int word_len
  */
 
-static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_word2id, PyObject *__pyx_v_id2word, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_word2id, PyObject *__pyx_v_id2word, FILE *__pyx_v_f) {
   int __pyx_v_num_words;
   int __pyx_v_word_len;
   char *__pyx_v_word;
-  long __pyx_v_i;
+  CYTHON_UNUSED long __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -13189,9 +14212,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_wordlist");
+  __Pyx_RefNannySetupContext("read_wordlist", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":231
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":231
  *         cdef char* word
  * 
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -13200,7 +14223,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":232
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":232
  * 
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i from 0 <= i < num_words:             # <<<<<<<<<<<<<<
@@ -13210,7 +14233,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
   __pyx_t_1 = __pyx_v_num_words;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":233
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":233
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i from 0 <= i < num_words:
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -13219,7 +14242,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":234
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":234
  *         for i from 0 <= i < num_words:
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -13228,7 +14251,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":235
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":235
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -13237,7 +14260,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":236
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":236
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             word2id[word] = len(id2word)             # <<<<<<<<<<<<<<
@@ -13253,7 +14276,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":237
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":237
  *             fread(word, sizeof(char), word_len, f)
  *             word2id[word] = len(id2word)
  *             id2word.append(word)             # <<<<<<<<<<<<<<
@@ -13267,7 +14290,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":238
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":238
  *             word2id[word] = len(id2word)
  *             id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -13290,7 +14313,28 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":240
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_4read_binary(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":240
  *             free(word)
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -13298,9 +14342,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -13310,18 +14352,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":242
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":242
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -13330,77 +14363,77 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":243
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":243
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.f_index.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->read_handle(__pyx_v_self->f_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":244
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":244
  *         f = fopen(filename, "r")
  *         self.f_index.read_handle(f)
  *         self.e_index.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->read_handle(__pyx_v_self->e_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":245
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":245
  *         self.f_index.read_handle(f)
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->read_handle(__pyx_v_self->col1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":246
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":246
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->read_handle(__pyx_v_self->col2, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":247
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":247
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)             # <<<<<<<<<<<<<<
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id;
+  __pyx_t_1 = __pyx_v_self->fword2id;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
+  __pyx_t_2 = __pyx_v_self->id2fword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->read_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_1, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->read_wordlist(__pyx_v_self, __pyx_t_1, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":248
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":248
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_3 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id;
+  __pyx_t_3 = __pyx_v_self->eword2id;
   __Pyx_INCREF(__pyx_t_3);
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
+  __pyx_t_2 = __pyx_v_self->id2eword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->read_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_3, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->read_wordlist(__pyx_v_self, __pyx_t_3, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":249
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":249
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -13423,7 +14456,18 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":252
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_e_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_5BiLex_6get_e_id(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((PyObject *)__pyx_v_eword));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":252
  * 
  * 
  *     def get_e_id(self, eword):             # <<<<<<<<<<<<<<
@@ -13431,9 +14475,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  *             e_id = len(self.id2eword)
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword) {
-  Py_ssize_t __pyx_v_e_id;
+static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_eword) {
+  PyObject *__pyx_v_e_id = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -13442,58 +14485,58 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_e_id");
+  __Pyx_RefNannySetupContext("get_e_id", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":253
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":253
  * 
  *     def get_e_id(self, eword):
  *         if eword not in self.eword2id:             # <<<<<<<<<<<<<<
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":254
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":254
  *     def get_e_id(self, eword):
  *         if eword not in self.eword2id:
  *             e_id = len(self.id2eword)             # <<<<<<<<<<<<<<
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id
  */
-    __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
+    __pyx_t_2 = __pyx_v_self->id2eword;
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_v_e_id = __pyx_t_3;
+    __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_v_e_id = __pyx_t_2;
+    __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":255
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":255
  *         if eword not in self.eword2id:
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)             # <<<<<<<<<<<<<<
  *             self.eword2id[eword] = e_id
  *         return self.eword2id[eword]
  */
-    __pyx_t_2 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword, __pyx_v_eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_self->id2eword, __pyx_v_eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":256
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":256
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id             # <<<<<<<<<<<<<<
  *         return self.eword2id[eword]
  * 
  */
-    __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_e_id); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    if (PyObject_SetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L5;
+    if (PyObject_SetItem(__pyx_v_self->eword2id, __pyx_v_eword, __pyx_v_e_id) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":257
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":257
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id
  *         return self.eword2id[eword]             # <<<<<<<<<<<<<<
@@ -13501,7 +14544,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -13514,12 +14557,24 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
   __Pyx_AddTraceback("_sa.BiLex.get_e_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_e_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":260
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_f_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_5BiLex_8get_f_id(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((PyObject *)__pyx_v_fword));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":260
  * 
  * 
  *     def get_f_id(self, fword):             # <<<<<<<<<<<<<<
@@ -13527,9 +14582,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
  *             f_id = len(self.id2fword)
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword) {
-  Py_ssize_t __pyx_v_f_id;
+static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword) {
+  PyObject *__pyx_v_f_id = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -13538,58 +14592,58 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_f_id");
+  __Pyx_RefNannySetupContext("get_f_id", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":261
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":261
  * 
  *     def get_f_id(self, fword):
  *         if fword not in self.fword2id:             # <<<<<<<<<<<<<<
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":262
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":262
  *     def get_f_id(self, fword):
  *         if fword not in self.fword2id:
  *             f_id = len(self.id2fword)             # <<<<<<<<<<<<<<
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id
  */
-    __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
+    __pyx_t_2 = __pyx_v_self->id2fword;
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_v_f_id = __pyx_t_3;
+    __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_v_f_id = __pyx_t_2;
+    __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":263
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":263
  *         if fword not in self.fword2id:
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)             # <<<<<<<<<<<<<<
  *             self.fword2id[fword] = f_id
  *         return self.fword2id[fword]
  */
-    __pyx_t_2 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword, __pyx_v_fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_self->id2fword, __pyx_v_fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":264
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":264
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id             # <<<<<<<<<<<<<<
  *         return self.fword2id[fword]
  * 
  */
-    __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_f_id); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    if (PyObject_SetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L5;
+    if (PyObject_SetItem(__pyx_v_self->fword2id, __pyx_v_fword, __pyx_v_f_id) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":265
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":265
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id
  *         return self.fword2id[fword]             # <<<<<<<<<<<<<<
@@ -13597,7 +14651,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -13610,12 +14664,34 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
   __Pyx_AddTraceback("_sa.BiLex.get_f_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_f_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":268
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_10read_text(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":268
  * 
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -13623,9 +14699,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
  *         cdef IntList fcount
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_j = 0;
   PyObject *__pyx_v_e_id = 0;
@@ -13670,18 +14744,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":272
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":272
  *         cdef IntList fcount
  * 
  *         fcount = IntList()             # <<<<<<<<<<<<<<
@@ -13693,7 +14758,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
   __pyx_v_fcount = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -13706,7 +14771,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -13716,12 +14781,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -13729,10 +14794,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_v_f = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":275
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":275
  *         with gzip_or_text(filename) as f:
  *             # first loop merely establishes size of array objects
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -13740,102 +14806,119 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 f_id = self.get_f_id(fword)
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_3 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_3)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_line);
-            __pyx_v_line = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_line = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":276
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":276
  *             # first loop merely establishes size of array objects
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()             # <<<<<<<<<<<<<<
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
-              PyObject* sequence = __pyx_t_1;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+              PyObject* sequence = __pyx_t_3;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 4)) {
+                if (size > 4) __Pyx_RaiseTooManyValuesError(4);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
-                  if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
-                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
                 __pyx_t_12 = PyTuple_GET_ITEM(sequence, 3); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
-                  if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
-                __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
+                __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
                 __pyx_t_12 = PyList_GET_ITEM(sequence, 3); 
               }
-              __Pyx_INCREF(__pyx_t_3);
+              __Pyx_INCREF(__pyx_t_2);
               __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else {
+              #else
+              Py_ssize_t i;
+              PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_10,&__pyx_t_11,&__pyx_t_12};
+              for (i=0; i < 4; i++) {
+                PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                *(temps[i]) = item;
+              }
+              #endif
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_10,&__pyx_t_11,&__pyx_t_12};
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              index = 0; __pyx_t_3 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_3);
-              index = 1; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_11);
-              index = 3; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_12);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              for (index=0; index < 4; index++) {
+                PyObject* item = __pyx_t_14(__pyx_t_13); if (unlikely(!item)) goto __pyx_L18_unpacking_failed;
+                __Pyx_GOTREF(item);
+                *(temps[index]) = item;
+              }
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_14 = NULL;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L20_unpacking_done;
-              __pyx_L19_unpacking_failed:;
+              goto __pyx_L19_unpacking_done;
+              __pyx_L18_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_L20_unpacking_done:;
+              __pyx_t_14 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_L19_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_fword);
-            __pyx_v_fword = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_fword = __pyx_t_2;
+            __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_eword);
             __pyx_v_eword = __pyx_t_10;
             __pyx_t_10 = 0;
@@ -13846,51 +14929,51 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
             __pyx_v_score2 = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":277
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":277
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)             # <<<<<<<<<<<<<<
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
             __Pyx_INCREF(__pyx_v_fword);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_fword);
             __Pyx_GIVEREF(__pyx_v_fword);
-            __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XDECREF(__pyx_v_f_id);
             __pyx_v_f_id = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":278
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":278
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)             # <<<<<<<<<<<<<<
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)
  */
-            __pyx_t_11 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
             __Pyx_INCREF(__pyx_v_eword);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_eword);
             __Pyx_GIVEREF(__pyx_v_eword);
-            __pyx_t_1 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_e_id = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":279
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":279
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):             # <<<<<<<<<<<<<<
@@ -13898,42 +14981,41 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  */
             while (1) {
-              __pyx_t_15 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_15 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               if (!__pyx_t_16) break;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":280
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":280
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)             # <<<<<<<<<<<<<<
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  * 
  */
-              __pyx_t_12 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_fcount), __pyx_int_0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_fcount), __pyx_int_0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             }
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":281
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":281
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1             # <<<<<<<<<<<<<<
  * 
  *             # Allocate space for dictionary in arrays
  */
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_fcount->arr[__pyx_t_17]) = ((__pyx_v_fcount->arr[__pyx_t_15]) + 1);
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":284
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":284
  * 
  *             # Allocate space for dictionary in arrays
  *             N = 0             # <<<<<<<<<<<<<<
@@ -13943,192 +15025,192 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_N = __pyx_int_0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":285
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":285
  *             # Allocate space for dictionary in arrays
  *             N = 0
  *             n_f = len(fcount)             # <<<<<<<<<<<<<<
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:
  */
-          __pyx_t_8 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_v_n_f = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_t_8 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_v_n_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":286
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":286
  *             N = 0
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)             # <<<<<<<<<<<<<<
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N
  */
-          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          __pyx_t_12 = PyNumber_Add(__pyx_v_n_f, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __pyx_t_12 = PyNumber_Add(__pyx_v_n_f, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
+          __Pyx_GOTREF(__pyx_v_self->f_index);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->f_index));
+          __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":287
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:             # <<<<<<<<<<<<<<
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  */
-          __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19++) {
-            __pyx_t_12 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_XDECREF(__pyx_v_i);
             __pyx_v_i = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":288
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":288
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N             # <<<<<<<<<<<<<<
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0
  */
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8]) = __pyx_t_20;
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":289
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":289
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]             # <<<<<<<<<<<<<<
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_12 = PyInt_FromLong((__pyx_v_fcount->arr[__pyx_t_8])); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyInt_FromLong((__pyx_v_fcount->arr[__pyx_t_8])); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_2 = PyNumber_Add(__pyx_v_N, __pyx_t_12); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_1 = PyNumber_Add(__pyx_v_N, __pyx_t_12); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             __Pyx_DECREF(__pyx_v_N);
-            __pyx_v_N = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_N = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":290
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":290
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0             # <<<<<<<<<<<<<<
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_fcount->arr[__pyx_t_8]) = 0;
-            __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":287
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:             # <<<<<<<<<<<<<<
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_1 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_XDECREF(__pyx_v_i);
-          __pyx_v_i = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_v_i = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":291
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":291
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N             # <<<<<<<<<<<<<<
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)
  */
-          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8]) = __pyx_t_20;
+          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":292
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":292
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)             # <<<<<<<<<<<<<<
  *             self.col1 = FloatList(initial_len=N)
  *             self.col2 = FloatList(initial_len=N)
  */
-          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
+          __Pyx_GOTREF(__pyx_v_self->e_index);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->e_index));
+          __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":293
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":293
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)             # <<<<<<<<<<<<<<
  *             self.col2 = FloatList(initial_len=N)
  * 
  */
-          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-          __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_2);
-          __pyx_t_2 = 0;
+          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_v_self->col1);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->col1));
+          __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+          __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":294
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":294
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)
  *             self.col2 = FloatList(initial_len=N)             # <<<<<<<<<<<<<<
  * 
  *             # Re-read file, placing words into buckets
  */
-          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
+          __Pyx_GOTREF(__pyx_v_self->col2);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->col2));
+          __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":297
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":297
  * 
  *             # Re-read file, placing words into buckets
  *             f.seek(0)             # <<<<<<<<<<<<<<
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  */
-          __pyx_t_12 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_2 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_1 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":298
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":298
  *             # Re-read file, placing words into buckets
  *             f.seek(0)
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -14136,26 +15218,34 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 f_id = self.get_f_id(fword)
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_12 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_12 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_12 = __pyx_t_9(__pyx_t_2);
+              __pyx_t_12 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_12)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -14165,69 +15255,78 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
             __pyx_v_line = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":299
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":299
  *             f.seek(0)
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()             # <<<<<<<<<<<<<<
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  */
-            __pyx_t_12 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_1 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
-              PyObject* sequence = __pyx_t_1;
+            if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+              PyObject* sequence = __pyx_t_3;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 4)) {
+                if (size > 4) __Pyx_RaiseTooManyValuesError(4);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
-                  if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_12 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
-                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 3); 
+                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 3); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
-                  if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_12 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
-                __pyx_t_3 = PyList_GET_ITEM(sequence, 3); 
+                __pyx_t_2 = PyList_GET_ITEM(sequence, 3); 
               }
               __Pyx_INCREF(__pyx_t_12);
               __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_3);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else {
+              __Pyx_INCREF(__pyx_t_2);
+              #else
+              Py_ssize_t i;
+              PyObject** temps[4] = {&__pyx_t_12,&__pyx_t_11,&__pyx_t_10,&__pyx_t_2};
+              for (i=0; i < 4; i++) {
+                PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                *(temps[i]) = item;
+              }
+              #endif
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              PyObject** temps[4] = {&__pyx_t_12,&__pyx_t_11,&__pyx_t_10,&__pyx_t_2};
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              index = 0; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_12);
-              index = 1; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_11);
-              index = 2; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_10);
-              index = 3; __pyx_t_3 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_3);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              for (index=0; index < 4; index++) {
+                PyObject* item = __pyx_t_14(__pyx_t_13); if (unlikely(!item)) goto __pyx_L26_unpacking_failed;
+                __Pyx_GOTREF(item);
+                *(temps[index]) = item;
+              }
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_14 = NULL;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L28_unpacking_done;
-              __pyx_L27_unpacking_failed:;
+              goto __pyx_L27_unpacking_done;
+              __pyx_L26_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_L28_unpacking_done:;
+              __pyx_t_14 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_L27_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_fword);
             __pyx_v_fword = __pyx_t_12;
@@ -14239,141 +15338,141 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
             __pyx_v_score1 = __pyx_t_10;
             __pyx_t_10 = 0;
             __Pyx_XDECREF(__pyx_v_score2);
-            __pyx_v_score2 = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_score2 = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":300
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":300
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)             # <<<<<<<<<<<<<<
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_v_fword);
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fword);
+            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fword);
             __Pyx_GIVEREF(__pyx_v_fword);
-            __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_f_id);
             __pyx_v_f_id = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":301
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":301
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)             # <<<<<<<<<<<<<<
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_v_eword);
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_eword);
+            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_eword);
             __Pyx_GIVEREF(__pyx_v_eword);
-            __pyx_t_1 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_e_id = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":302
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":302
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]             # <<<<<<<<<<<<<<
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)
  */
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_1 = PyInt_FromLong(((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_15]) + (__pyx_v_fcount->arr[__pyx_t_17]))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_3 = PyInt_FromLong(((__pyx_v_self->f_index->arr[__pyx_t_15]) + (__pyx_v_fcount->arr[__pyx_t_17]))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_XDECREF(__pyx_v_index);
-            __pyx_v_index = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_index = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":303
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":303
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1             # <<<<<<<<<<<<<<
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)
  */
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_fcount->arr[__pyx_t_15]) = ((__pyx_v_fcount->arr[__pyx_t_17]) + 1);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":304
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":304
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)             # <<<<<<<<<<<<<<
  *                 self.col1[index] = float(score1)
  *                 self.col2[index] = float(score2)
  */
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_INCREF(__pyx_v_e_id);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_e_id);
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_e_id);
             __Pyx_GIVEREF(__pyx_v_e_id);
-            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_17]) = __pyx_t_20;
+            __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            (__pyx_v_self->e_index->arr[__pyx_t_17]) = __pyx_t_20;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":305
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":305
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)             # <<<<<<<<<<<<<<
  *                 self.col2[index] = float(score2)
  * 
  */
-            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score1); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_3 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            if (PyObject_SetItem(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1), __pyx_v_index, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score1); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            if (PyObject_SetItem(((PyObject *)__pyx_v_self->col1), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":306
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":306
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)
  *                 self.col2[index] = float(score2)             # <<<<<<<<<<<<<<
  * 
  *         # Sort buckets by eword
  */
-            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score2); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_3 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            if (PyObject_SetItem(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2), __pyx_v_index, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score2); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            if (PyObject_SetItem(((PyObject *)__pyx_v_self->col2), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -14382,57 +15481,57 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_3);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+          __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_22 = PyObject_Call(__pyx_t_4, __pyx_t_10, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_22)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_22)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_22);
           __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_22);
           __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
-          if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_23 = (!__pyx_t_16);
           if (__pyx_t_23) {
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_3);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_3, __pyx_t_1);
-            __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L31;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_3);
+            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L30;
           }
-          __pyx_L31:;
+          __pyx_L30:;
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L16_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -14446,29 +15545,30 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
         if (unlikely(__pyx_t_23 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L32;
-    __pyx_L5_error:;
+    goto __pyx_L31;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L32:;
+    __pyx_L31:;
   }
-  if (unlikely(!__pyx_v_n_f)) { __Pyx_RaiseUnboundLocalError("n_f"); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":309
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":309
  * 
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:             # <<<<<<<<<<<<<<
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  */
+  if (unlikely(!__pyx_v_n_f)) { __Pyx_RaiseUnboundLocalError("n_f"); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_19; __pyx_t_18++) {
-    __pyx_t_1 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_XDECREF(__pyx_v_b);
-    __pyx_v_b = __pyx_t_1;
-    __pyx_t_1 = 0;
+    __pyx_v_b = __pyx_t_3;
+    __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":310
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":310
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:
  *             i = self.f_index.arr[b]             # <<<<<<<<<<<<<<
@@ -14476,30 +15576,30 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             self.qsort(i,j, "")
  */
     __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_b); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_XDECREF(__pyx_v_i);
-    __pyx_v_i = __pyx_t_1;
-    __pyx_t_1 = 0;
+    __pyx_v_i = __pyx_t_3;
+    __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":311
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":311
  *         for b from 0 <= b < n_f:
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]             # <<<<<<<<<<<<<<
  *             self.qsort(i,j, "")
  * 
  */
-    __pyx_t_1 = PyNumber_Add(__pyx_v_b, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = PyNumber_Add(__pyx_v_b, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_XDECREF(__pyx_v_j);
-    __pyx_v_j = __pyx_t_1;
-    __pyx_t_1 = 0;
+    __pyx_v_j = __pyx_t_3;
+    __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":312
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":312
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  *             self.qsort(i,j, "")             # <<<<<<<<<<<<<<
@@ -14508,27 +15608,27 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  */
     __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_24 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_24 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = ((PyObject *)__pyx_kp_s_45);
-    __Pyx_INCREF(__pyx_t_1);
-    __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->qsort(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_20, __pyx_t_24, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_3 = ((PyObject *)__pyx_kp_s_45);
+    __Pyx_INCREF(__pyx_t_3);
+    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->qsort(__pyx_v_self, __pyx_t_20, __pyx_t_24, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_b); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":309
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":309
  * 
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:             # <<<<<<<<<<<<<<
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  */
-  __pyx_t_3 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_v_b);
-  __pyx_v_b = __pyx_t_3;
-  __pyx_t_3 = 0;
+  __pyx_v_b = __pyx_t_2;
+  __pyx_t_2 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -14563,7 +15663,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":315
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":315
  * 
  * 
  *     cdef swap(self, int i, int j):             # <<<<<<<<<<<<<<
@@ -14577,9 +15677,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("swap");
+  __Pyx_RefNannySetupContext("swap", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":319
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":319
  *         cdef float ftmp
  * 
  *         if i == j:             # <<<<<<<<<<<<<<
@@ -14589,7 +15689,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = (__pyx_v_i == __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":320
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":320
  * 
  *         if i == j:
  *             return             # <<<<<<<<<<<<<<
@@ -14603,7 +15703,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":322
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":322
  *             return
  * 
  *         itmp = self.e_index.arr[i]             # <<<<<<<<<<<<<<
@@ -14612,7 +15712,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_itmp = (__pyx_v_self->e_index->arr[__pyx_v_i]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":323
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":323
  * 
  *         itmp = self.e_index.arr[i]
  *         self.e_index.arr[i] = self.e_index.arr[j]             # <<<<<<<<<<<<<<
@@ -14621,7 +15721,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->e_index->arr[__pyx_v_i]) = (__pyx_v_self->e_index->arr[__pyx_v_j]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":324
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":324
  *         itmp = self.e_index.arr[i]
  *         self.e_index.arr[i] = self.e_index.arr[j]
  *         self.e_index.arr[j] = itmp             # <<<<<<<<<<<<<<
@@ -14630,7 +15730,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->e_index->arr[__pyx_v_j]) = __pyx_v_itmp;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":326
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":326
  *         self.e_index.arr[j] = itmp
  * 
  *         ftmp = self.col1.arr[i]             # <<<<<<<<<<<<<<
@@ -14639,7 +15739,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_ftmp = (__pyx_v_self->col1->arr[__pyx_v_i]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":327
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":327
  * 
  *         ftmp = self.col1.arr[i]
  *         self.col1.arr[i] = self.col1.arr[j]             # <<<<<<<<<<<<<<
@@ -14648,7 +15748,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col1->arr[__pyx_v_i]) = (__pyx_v_self->col1->arr[__pyx_v_j]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":328
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":328
  *         ftmp = self.col1.arr[i]
  *         self.col1.arr[i] = self.col1.arr[j]
  *         self.col1.arr[j] = ftmp             # <<<<<<<<<<<<<<
@@ -14657,7 +15757,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col1->arr[__pyx_v_j]) = __pyx_v_ftmp;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":330
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":330
  *         self.col1.arr[j] = ftmp
  * 
  *         ftmp = self.col2.arr[i]             # <<<<<<<<<<<<<<
@@ -14666,7 +15766,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_ftmp = (__pyx_v_self->col2->arr[__pyx_v_i]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":331
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":331
  * 
  *         ftmp = self.col2.arr[i]
  *         self.col2.arr[i] = self.col2.arr[j]             # <<<<<<<<<<<<<<
@@ -14675,7 +15775,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col2->arr[__pyx_v_i]) = (__pyx_v_self->col2->arr[__pyx_v_j]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":332
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":332
  *         ftmp = self.col2.arr[i]
  *         self.col2.arr[i] = self.col2.arr[j]
  *         self.col2.arr[j] = ftmp             # <<<<<<<<<<<<<<
@@ -14691,7 +15791,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":335
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":335
  * 
  * 
  *     cdef qsort(self, int i, int j, pad):             # <<<<<<<<<<<<<<
@@ -14712,9 +15812,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("qsort");
+  __Pyx_RefNannySetupContext("qsort", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":338
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":338
  *         cdef int pval, p
  * 
  *         if i > j:             # <<<<<<<<<<<<<<
@@ -14724,7 +15824,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i > __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":339
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":339
  * 
  *         if i > j:
  *             raise Exception("Sort error in CLex")             # <<<<<<<<<<<<<<
@@ -14740,7 +15840,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":340
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":340
  *         if i > j:
  *             raise Exception("Sort error in CLex")
  *         if i == j: #empty interval             # <<<<<<<<<<<<<<
@@ -14750,7 +15850,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i == __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":341
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":341
  *             raise Exception("Sort error in CLex")
  *         if i == j: #empty interval
  *             return             # <<<<<<<<<<<<<<
@@ -14764,7 +15864,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":342
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":342
  *         if i == j: #empty interval
  *             return
  *         if i == j-1: # singleton interval             # <<<<<<<<<<<<<<
@@ -14774,7 +15874,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i == (__pyx_v_j - 1));
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":343
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":343
  *             return
  *         if i == j-1: # singleton interval
  *             return             # <<<<<<<<<<<<<<
@@ -14788,7 +15888,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":345
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":345
  *             return
  * 
  *         p = (i+j)/2             # <<<<<<<<<<<<<<
@@ -14797,7 +15897,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_p = __Pyx_div_long((__pyx_v_i + __pyx_v_j), 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":346
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":346
  * 
  *         p = (i+j)/2
  *         pval = self.e_index.arr[p]             # <<<<<<<<<<<<<<
@@ -14806,7 +15906,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_pval = (__pyx_v_self->e_index->arr[__pyx_v_p]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":347
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":347
  *         p = (i+j)/2
  *         pval = self.e_index.arr[p]
  *         self.swap(i, p)             # <<<<<<<<<<<<<<
@@ -14817,7 +15917,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":348
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":348
  *         pval = self.e_index.arr[p]
  *         self.swap(i, p)
  *         p = i             # <<<<<<<<<<<<<<
@@ -14826,7 +15926,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_p = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":349
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":349
  *         self.swap(i, p)
  *         p = i
  *         for k from i+1 <= k < j:             # <<<<<<<<<<<<<<
@@ -14836,7 +15936,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_3 = __pyx_v_j;
   for (__pyx_v_k = (__pyx_v_i + 1); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":350
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":350
  *         p = i
  *         for k from i+1 <= k < j:
  *             if pval >= self.e_index.arr[k]:             # <<<<<<<<<<<<<<
@@ -14846,7 +15946,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
     __pyx_t_1 = (__pyx_v_pval >= (__pyx_v_self->e_index->arr[__pyx_v_k]));
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":351
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":351
  *         for k from i+1 <= k < j:
  *             if pval >= self.e_index.arr[k]:
  *                 self.swap(p+1, k)             # <<<<<<<<<<<<<<
@@ -14857,7 +15957,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":352
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":352
  *             if pval >= self.e_index.arr[k]:
  *                 self.swap(p+1, k)
  *                 self.swap(p, p+1)             # <<<<<<<<<<<<<<
@@ -14868,7 +15968,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":353
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":353
  *                 self.swap(p+1, k)
  *                 self.swap(p, p+1)
  *                 p = p + 1             # <<<<<<<<<<<<<<
@@ -14881,7 +15981,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
     __pyx_L8:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":354
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":354
  *                 self.swap(p, p+1)
  *                 p = p + 1
  *         self.qsort(i,p, pad+"    ")             # <<<<<<<<<<<<<<
@@ -14895,7 +15995,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":355
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":355
  *                 p = p + 1
  *         self.qsort(i,p, pad+"    ")
  *         self.qsort(p+1,j, pad+"    ")             # <<<<<<<<<<<<<<
@@ -14922,7 +16022,28 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":358
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_12write_enhanced(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":358
  * 
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -14930,9 +16051,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  *             for i in self.f_index:
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_s1 = NULL;
@@ -14946,9 +16065,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   PyObject *__pyx_t_10 = NULL;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
@@ -14959,18 +16078,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -14981,7 +16091,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -14993,213 +16103,238 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":360
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":360
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             for i in self.f_index:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->f_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->f_index))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->f_index); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->f_index)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":361
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":361
  *         with open(filename, "w") as f:
  *             for i in self.f_index:
  *                 f.write("%d " % i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
-            __pyx_t_9 = 0;
-            __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":362
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_49), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_49), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":363
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":363
  *                 f.write("%d " % i)
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):             # <<<<<<<<<<<<<<
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")
  */
-          __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          PyTuple_SET_ITEM(__pyx_t_9, 1, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          PyTuple_SET_ITEM(__pyx_t_9, 2, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          __pyx_t_1 = PyObject_Call(__pyx_builtin_zip, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-          if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
-            __pyx_t_9 = __pyx_t_1; __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_INCREF(((PyObject *)__pyx_v_self->e_index));
+          PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->e_index));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e_index));
+          __Pyx_INCREF(((PyObject *)__pyx_v_self->col1));
+          PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->col1));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->col1));
+          __Pyx_INCREF(((PyObject *)__pyx_v_self->col2));
+          PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->col2));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->col2));
+          __pyx_t_4 = PyObject_Call(__pyx_builtin_zip, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
+            __pyx_t_2 = __pyx_t_4; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_1 = __pyx_t_8(__pyx_t_9);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_4 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_4)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_4);
             }
-            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
-              PyObject* sequence = __pyx_t_1;
+            if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
+              PyObject* sequence = __pyx_t_4;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 3)) {
+                if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); 
-                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
+                __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-                  if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 0); 
-                __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
+                __pyx_t_1 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
               }
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_2);
+              __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_11);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else {
+              #else
+              __pyx_t_10 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_12 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
               __pyx_t_13 = Py_TYPE(__pyx_t_12)->tp_iternext;
-              index = 0; __pyx_t_10 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
+              index = 0; __pyx_t_10 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_10)) goto __pyx_L20_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_10);
-              index = 1; __pyx_t_2 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_2)) goto __pyx_L21_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_2);
-              index = 2; __pyx_t_11 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L21_unpacking_failed;
+              index = 1; __pyx_t_1 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_1)) goto __pyx_L20_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_1);
+              index = 2; __pyx_t_11 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L20_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_11);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_13 = NULL;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              goto __pyx_L22_unpacking_done;
-              __pyx_L21_unpacking_failed:;
+              goto __pyx_L21_unpacking_done;
+              __pyx_L20_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_L22_unpacking_done:;
+              __pyx_t_13 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_L21_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_i);
             __pyx_v_i = __pyx_t_10;
             __pyx_t_10 = 0;
             __Pyx_XDECREF(__pyx_v_s1);
-            __pyx_v_s1 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_s1 = __pyx_t_1;
+            __pyx_t_1 = 0;
             __Pyx_XDECREF(__pyx_v_s2);
             __pyx_v_s2 = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":364
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":364
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+            __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __Pyx_INCREF(__pyx_v_i);
             PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
@@ -15209,37 +16344,37 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
             __Pyx_INCREF(__pyx_v_s2);
             PyTuple_SET_ITEM(__pyx_t_11, 2, __pyx_v_s2);
             __Pyx_GIVEREF(__pyx_v_s2);
-            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_50), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_50), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
-            PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_t_2));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_t_1));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
+            __pyx_t_1 = 0;
+            __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           }
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":365
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":365
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_51), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_51), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":366
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":366
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):             # <<<<<<<<<<<<<<
@@ -15247,28 +16382,36 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_2 = __pyx_int_0;
-          if (PyList_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword)) {
-            __pyx_t_9 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword; __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_1 = __pyx_int_0;
+          if (PyList_CheckExact(__pyx_v_self->id2fword) || PyTuple_CheckExact(__pyx_v_self->id2fword)) {
+            __pyx_t_2 = __pyx_v_self->id2fword; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self->id2fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_11); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_11); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_11 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_11 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_11 = __pyx_t_8(__pyx_t_9);
+              __pyx_t_11 = __pyx_t_9(__pyx_t_2);
               if (unlikely(!__pyx_t_11)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -15277,64 +16420,64 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
             __Pyx_XDECREF(__pyx_v_w);
             __pyx_v_w = __pyx_t_11;
             __pyx_t_11 = 0;
-            __Pyx_INCREF(__pyx_t_2);
+            __Pyx_INCREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_2;
-            __pyx_t_11 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_11 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_2);
-            __pyx_t_2 = __pyx_t_11;
+            __Pyx_DECREF(__pyx_t_1);
+            __pyx_t_1 = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":367
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":367
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):
  */
-            __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_INCREF(__pyx_v_i);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
             __Pyx_INCREF(__pyx_v_w);
-            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_w);
+            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_w);
             __Pyx_GIVEREF(__pyx_v_w);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":368
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_53), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_53), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":369
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":369
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):             # <<<<<<<<<<<<<<
@@ -15342,28 +16485,36 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_9 = __pyx_int_0;
-          if (PyList_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword)) {
-            __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_2 = __pyx_int_0;
+          if (PyList_CheckExact(__pyx_v_self->id2eword) || PyTuple_CheckExact(__pyx_v_self->id2eword)) {
+            __pyx_t_1 = __pyx_v_self->id2eword; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->id2eword); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_10); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_10); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_10 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_10 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_10 = __pyx_t_8(__pyx_t_2);
+              __pyx_t_10 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_10)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -15372,76 +16523,76 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
             __Pyx_XDECREF(__pyx_v_w);
             __pyx_v_w = __pyx_t_10;
             __pyx_t_10 = 0;
-            __Pyx_INCREF(__pyx_t_9);
+            __Pyx_INCREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_9;
-            __pyx_t_10 = PyNumber_Add(__pyx_t_9, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_v_i = __pyx_t_2;
+            __pyx_t_10 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_9);
-            __pyx_t_9 = __pyx_t_10;
+            __Pyx_DECREF(__pyx_t_2);
+            __pyx_t_2 = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":370
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":370
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_INCREF(__pyx_v_i);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
             __Pyx_INCREF(__pyx_v_w);
-            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_w);
+            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_w);
             __Pyx_GIVEREF(__pyx_v_w);
-            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_11));
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_11));
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_11));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
             __pyx_t_11 = 0;
-            __pyx_t_11 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
           }
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":371
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  * 
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_54), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_54), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
-        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -15450,75 +16601,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_9, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_9);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
-          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
-          __pyx_t_15 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __pyx_t_15 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_16 = (!__pyx_t_14);
           if (__pyx_t_16) {
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_9, __pyx_t_11);
-            __pyx_t_2 = 0; __pyx_t_9 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L29;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_11);
+            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_11 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L28;
           }
-          __pyx_L29:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __pyx_L28:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_55, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_55, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L30;
-    __pyx_L5_error:;
+    goto __pyx_L29;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L30:;
+    __pyx_L29:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -15526,7 +16677,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
@@ -15543,41 +16694,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":374
- * 
- * 
- *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
- *         cdef e_id, f_id, low, high, midpoint, val
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fword = 0;
   PyObject *__pyx_v_eword = 0;
   PyObject *__pyx_v_col = 0;
-  PyObject *__pyx_v_e_id = 0;
-  PyObject *__pyx_v_f_id = 0;
-  PyObject *__pyx_v_low = 0;
-  PyObject *__pyx_v_high = 0;
-  PyObject *__pyx_v_midpoint = 0;
-  PyObject *__pyx_v_val = 0;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
-  __Pyx_RefNannySetupContext("get_score");
+  __Pyx_RefNannySetupContext("get_score (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -15585,26 +16717,23 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fword);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fword)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eword);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eword)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_score", 1, 3, 3, 1); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__col);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__col)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_score", 1, 3, 3, 2); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_score") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_score") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -15625,18 +16754,48 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_14get_score(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_v_fword, __pyx_v_eword, __pyx_v_col);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":377
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":374
+ * 
+ * 
+ *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
+ *         cdef e_id, f_id, low, high, midpoint, val
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword, PyObject *__pyx_v_eword, PyObject *__pyx_v_col) {
+  PyObject *__pyx_v_e_id = 0;
+  PyObject *__pyx_v_f_id = 0;
+  PyObject *__pyx_v_low = 0;
+  PyObject *__pyx_v_high = 0;
+  PyObject *__pyx_v_midpoint = 0;
+  PyObject *__pyx_v_val = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_score", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":377
  *         cdef e_id, f_id, low, high, midpoint, val
  * 
  *         if eword not in self.eword2id:             # <<<<<<<<<<<<<<
  *             return None
  *         if fword not in self.fword2id:
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":378
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":378
  * 
  *         if eword not in self.eword2id:
  *             return None             # <<<<<<<<<<<<<<
@@ -15647,21 +16806,21 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
     __Pyx_INCREF(Py_None);
     __pyx_r = Py_None;
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":379
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":379
  *         if eword not in self.eword2id:
  *             return None
  *         if fword not in self.fword2id:             # <<<<<<<<<<<<<<
  *             return None
  *         f_id = self.fword2id[fword]
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":380
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":380
  *             return None
  *         if fword not in self.fword2id:
  *             return None             # <<<<<<<<<<<<<<
@@ -15672,35 +16831,35 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
     __Pyx_INCREF(Py_None);
     __pyx_r = Py_None;
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":381
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":381
  *         if fword not in self.fword2id:
  *             return None
  *         f_id = self.fword2id[fword]             # <<<<<<<<<<<<<<
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]
  */
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_f_id = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":382
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":382
  *             return None
  *         f_id = self.fword2id[fword]
  *         e_id = self.eword2id[eword]             # <<<<<<<<<<<<<<
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]
  */
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_e_id = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":383
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":383
  *         f_id = self.fword2id[fword]
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]             # <<<<<<<<<<<<<<
@@ -15708,12 +16867,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *         while high - low > 0:
  */
   __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_low = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":384
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":384
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]             # <<<<<<<<<<<<<<
@@ -15724,12 +16883,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_t_2); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_high = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":385
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":385
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]
  *         while high - low > 0:             # <<<<<<<<<<<<<<
@@ -15739,14 +16898,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   while (1) {
     __pyx_t_2 = PyNumber_Subtract(__pyx_v_high, __pyx_v_low); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (!__pyx_t_1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":386
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":386
  *         high = self.f_index.arr[f_id+1]
  *         while high - low > 0:
  *             midpoint = (low+high)/2             # <<<<<<<<<<<<<<
@@ -15762,7 +16920,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
     __pyx_v_midpoint = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":387
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":387
  *         while high - low > 0:
  *             midpoint = (low+high)/2
  *             val = self.e_index.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -15770,39 +16928,37 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *                 if col == 0:
  */
     __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->e_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_XDECREF(__pyx_v_val);
     __pyx_v_val = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":388
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":388
  *             midpoint = (low+high)/2
  *             val = self.e_index.arr[midpoint]
  *             if val == e_id:             # <<<<<<<<<<<<<<
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":389
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":389
  *             val = self.e_index.arr[midpoint]
  *             if val == e_id:
  *                 if col == 0:             # <<<<<<<<<<<<<<
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":390
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":390
  *             if val == e_id:
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -15811,29 +16967,28 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  */
         __Pyx_XDECREF(__pyx_r);
         __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyFloat_FromDouble((__pyx_v_self->col1->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_r = __pyx_t_2;
         __pyx_t_2 = 0;
         goto __pyx_L0;
-        goto __pyx_L11;
+        goto __pyx_L8;
       }
-      __pyx_L11:;
+      __pyx_L8:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":391
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":391
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:             # <<<<<<<<<<<<<<
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":392
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":392
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:
  *                     return self.col2.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -15842,32 +16997,31 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  */
         __Pyx_XDECREF(__pyx_r);
         __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyFloat_FromDouble((__pyx_v_self->col2->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_r = __pyx_t_2;
         __pyx_t_2 = 0;
         goto __pyx_L0;
-        goto __pyx_L12;
+        goto __pyx_L9;
       }
-      __pyx_L12:;
-      goto __pyx_L10;
+      __pyx_L9:;
+      goto __pyx_L7;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":393
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":393
  *                 if col == 1:
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:             # <<<<<<<<<<<<<<
  *                 high = midpoint
  *             if val < e_id:
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":394
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":394
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:
  *                 high = midpoint             # <<<<<<<<<<<<<<
@@ -15877,24 +17031,23 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
       __Pyx_INCREF(__pyx_v_midpoint);
       __Pyx_DECREF(__pyx_v_high);
       __pyx_v_high = __pyx_v_midpoint;
-      goto __pyx_L13;
+      goto __pyx_L10;
     }
-    __pyx_L13:;
+    __pyx_L10:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":395
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":395
  *             if val > e_id:
  *                 high = midpoint
  *             if val < e_id:             # <<<<<<<<<<<<<<
  *                 low = midpoint + 1
  *         return None
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":396
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":396
  *                 high = midpoint
  *             if val < e_id:
  *                 low = midpoint + 1             # <<<<<<<<<<<<<<
@@ -15906,12 +17059,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
       __Pyx_DECREF(__pyx_v_low);
       __pyx_v_low = __pyx_t_2;
       __pyx_t_2 = 0;
-      goto __pyx_L14;
+      goto __pyx_L11;
     }
-    __pyx_L14:;
+    __pyx_L11:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":397
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":397
  *             if val < e_id:
  *                 low = midpoint + 1
  *         return None             # <<<<<<<<<<<<<<
@@ -15942,7 +17095,29 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":400
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static char __pyx_doc_3_sa_5BiLex_16write_text[] = "Note: does not guarantee writing the dictionary in the original order";
+static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_16write_text(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":400
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -15950,10 +17125,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *         cdef i, N, e_id, f_id
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static char __pyx_doc_3_sa_5BiLex_8write_text[] = "Note: does not guarantee writing the dictionary in the original order";
-static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_N = 0;
   PyObject *__pyx_v_e_id = 0;
@@ -15969,29 +17141,20 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  long __pyx_t_8;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
   long __pyx_t_9;
-  int __pyx_t_10;
-  PyObject *__pyx_t_11 = NULL;
+  long __pyx_t_10;
+  int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
   PyObject *__pyx_t_13 = NULL;
   int __pyx_t_14;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -16002,7 +17165,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -16014,39 +17177,40 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":405
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":405
  * 
  *         with open(filename, "w") as f:
  *             N = len(self.e_index)             # <<<<<<<<<<<<<<
  *             f_id = 0
  *             for i from 0 <= i < N:
  */
-          __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_t_7 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_v_N = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_t_4 = ((PyObject *)__pyx_v_self->e_index);
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_t_8 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_v_N = __pyx_t_4;
+          __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":406
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":406
  *         with open(filename, "w") as f:
  *             N = len(self.e_index)
  *             f_id = 0             # <<<<<<<<<<<<<<
@@ -16056,22 +17220,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_f_id = __pyx_int_0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":407
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":407
  *             N = len(self.e_index)
  *             f_id = 0
  *             for i from 0 <= i < N:             # <<<<<<<<<<<<<<
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  */
-          __pyx_t_8 = __Pyx_PyInt_AsLong(__pyx_v_N); if (unlikely((__pyx_t_8 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9++) {
-            __pyx_t_1 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_9 = __Pyx_PyInt_AsLong(__pyx_v_N); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10++) {
+            __pyx_t_4 = PyInt_FromLong(__pyx_t_10); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_i = __pyx_t_4;
+            __pyx_t_4 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":408
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":408
  *             f_id = 0
  *             for i from 0 <= i < N:
  *                 while self.f_index.arr[f_id+1] == i:             # <<<<<<<<<<<<<<
@@ -16079,139 +17243,138 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  *                 e_id = self.e_index.arr[i]
  */
             while (1) {
-              __pyx_t_1 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_7])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_v_i, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_4 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __pyx_t_4 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_v_i, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-              if (!__pyx_t_10) break;
+              if (!__pyx_t_11) break;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":409
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":409
  *             for i from 0 <= i < N:
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1             # <<<<<<<<<<<<<<
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]
  */
-              __pyx_t_2 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_1 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_v_f_id);
-              __pyx_v_f_id = __pyx_t_2;
-              __pyx_t_2 = 0;
+              __pyx_v_f_id = __pyx_t_1;
+              __pyx_t_1 = 0;
             }
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":410
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":410
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  *                 e_id = self.e_index.arr[i]             # <<<<<<<<<<<<<<
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  */
-            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyInt_FromLong((__pyx_v_self->e_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_e_id = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":411
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":411
  *                     f_id = f_id + 1
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]             # <<<<<<<<<<<<<<
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))
  */
-            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->col1->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_score1);
-            __pyx_v_score1 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_score1 = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":412
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":412
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]             # <<<<<<<<<<<<<<
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))
  */
-            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->col2->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_score2);
-            __pyx_v_score2 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_score2 = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":413
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":413
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))             # <<<<<<<<<<<<<<
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword, __pyx_v_f_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_11 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword, __pyx_v_e_id); if (!__pyx_t_11) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_12 = PyTuple_New(4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_1);
-            __Pyx_GIVEREF(__pyx_t_1);
-            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_11);
-            __Pyx_GIVEREF(__pyx_t_11);
+            __pyx_t_4 = PyObject_GetItem(__pyx_v_self->id2fword, __pyx_v_f_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_2 = PyObject_GetItem(__pyx_v_self->id2eword, __pyx_v_e_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_12 = PyTuple_New(4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
+            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_4);
+            __Pyx_GIVEREF(__pyx_t_4);
+            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_v_score1);
             PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_v_score1);
             __Pyx_GIVEREF(__pyx_v_score1);
             __Pyx_INCREF(__pyx_v_score2);
             PyTuple_SET_ITEM(__pyx_t_12, 3, __pyx_v_score2);
             __Pyx_GIVEREF(__pyx_v_score2);
-            __pyx_t_1 = 0;
-            __pyx_t_11 = 0;
-            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_56), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+            __pyx_t_4 = 0;
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_56), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-            PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
-            __pyx_t_11 = 0;
-            __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
+            PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            __pyx_t_9 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_10 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":407
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":407
  *             N = len(self.e_index)
  *             f_id = 0
  *             for i from 0 <= i < N:             # <<<<<<<<<<<<<<
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  */
-          __pyx_t_11 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_2 = PyInt_FromLong(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_XDECREF(__pyx_v_i);
-          __pyx_v_i = __pyx_t_11;
-          __pyx_t_11 = 0;
+          __pyx_v_i = __pyx_t_2;
+          __pyx_t_2 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -16220,75 +17383,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_11, &__pyx_t_12, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_11);
-          __Pyx_GOTREF(__pyx_t_12);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_12, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-          __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
-          __Pyx_GIVEREF(__pyx_t_11);
-          __Pyx_INCREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
-          __Pyx_GIVEREF(__pyx_t_12);
+          __Pyx_GOTREF(__pyx_t_12);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __Pyx_INCREF(__pyx_t_12);
+          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_12);
+          __Pyx_GIVEREF(__pyx_t_12);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __pyx_t_14 = (!__pyx_t_10);
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_14 = (!__pyx_t_11);
           if (__pyx_t_14) {
-            __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_GIVEREF(__pyx_t_12);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_11, __pyx_t_12, __pyx_t_2);
-            __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_GIVEREF(__pyx_t_12);
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_12, __pyx_t_1);
+            __pyx_t_2 = 0; __pyx_t_12 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_57, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_57, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -16296,7 +17459,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -16313,7 +17476,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":21
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":21
  * cdef int LOWER_MASK[32]
  * 
  * cdef void _init_lower_mask():             # <<<<<<<<<<<<<<
@@ -16327,9 +17490,9 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   unsigned int __pyx_t_2;
-  __Pyx_RefNannySetupContext("_init_lower_mask");
+  __Pyx_RefNannySetupContext("_init_lower_mask", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":23
  * cdef void _init_lower_mask():
  *     cdef unsigned i
  *     cdef int mask = 0             # <<<<<<<<<<<<<<
@@ -16338,7 +17501,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
  */
   __pyx_v_mask = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":24
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":24
  *     cdef unsigned i
  *     cdef int mask = 0
  *     for i in range(MIN_BOTTOM_SIZE):             # <<<<<<<<<<<<<<
@@ -16349,7 +17512,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":25
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":25
  *     cdef int mask = 0
  *     for i in range(MIN_BOTTOM_SIZE):
  *         mask = (mask << 1) + 1             # <<<<<<<<<<<<<<
@@ -16358,7 +17521,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
  */
     __pyx_v_mask = ((__pyx_v_mask << 1) + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":26
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":26
  *     for i in range(MIN_BOTTOM_SIZE):
  *         mask = (mask << 1) + 1
  *         LOWER_MASK[i] = mask             # <<<<<<<<<<<<<<
@@ -16371,7 +17534,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":37
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":37
  * 
  * 
  * cdef _BitSet* new_BitSet():             # <<<<<<<<<<<<<<
@@ -16383,9 +17546,9 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   struct __pyx_t_3_sa__BitSet *__pyx_v_b;
   struct __pyx_t_3_sa__BitSet *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_BitSet");
+  __Pyx_RefNannySetupContext("new_BitSet", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":40
  *     cdef _BitSet* b
  * 
  *     b = <_BitSet*> malloc(sizeof(_BitSet))             # <<<<<<<<<<<<<<
@@ -16394,7 +17557,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b = ((struct __pyx_t_3_sa__BitSet *)malloc((sizeof(struct __pyx_t_3_sa__BitSet))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":41
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":41
  * 
  *     b = <_BitSet*> malloc(sizeof(_BitSet))
  *     b.bitset = 0             # <<<<<<<<<<<<<<
@@ -16403,7 +17566,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->bitset = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":42
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":42
  *     b = <_BitSet*> malloc(sizeof(_BitSet))
  *     b.bitset = 0
  *     b.min_val = -1             # <<<<<<<<<<<<<<
@@ -16412,7 +17575,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->min_val = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":43
  *     b.bitset = 0
  *     b.min_val = -1
  *     b.max_val = -1             # <<<<<<<<<<<<<<
@@ -16421,7 +17584,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->max_val = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":44
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":44
  *     b.min_val = -1
  *     b.max_val = -1
  *     b.size = 0             # <<<<<<<<<<<<<<
@@ -16430,7 +17593,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->size = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":45
  *     b.max_val = -1
  *     b.size = 0
  *     return b             # <<<<<<<<<<<<<<
@@ -16446,7 +17609,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":48
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":48
  * 
  * 
  * cdef int bitset_findsucc(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -16465,9 +17628,9 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("bitset_findsucc");
+  __Pyx_RefNannySetupContext("bitset_findsucc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":52
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":52
  *     cdef int low, high, mid
  * 
  *     if b.max_val == -1 or i >= b.max_val:             # <<<<<<<<<<<<<<
@@ -16483,7 +17646,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":53
  * 
  *     if b.max_val == -1 or i >= b.max_val:
  *         return -1             # <<<<<<<<<<<<<<
@@ -16496,7 +17659,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":54
  *     if b.max_val == -1 or i >= b.max_val:
  *         return -1
  *     if i < b.min_val:             # <<<<<<<<<<<<<<
@@ -16506,7 +17669,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   __pyx_t_3 = (__pyx_v_i < __pyx_v_b->min_val);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":55
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":55
  *         return -1
  *     if i < b.min_val:
  *         return b.min_val             # <<<<<<<<<<<<<<
@@ -16519,7 +17682,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":57
  *         return b.min_val
  * 
  *     bitset = b.bitset & ~LOWER_MASK[i]             # <<<<<<<<<<<<<<
@@ -16528,7 +17691,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_bitset = (__pyx_v_b->bitset & (~(__pyx_v_3_sa_LOWER_MASK[__pyx_v_i])));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":58
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":58
  * 
  *     bitset = b.bitset & ~LOWER_MASK[i]
  *     low = i+1             # <<<<<<<<<<<<<<
@@ -16537,7 +17700,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_low = (__pyx_v_i + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":59
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":59
  *     bitset = b.bitset & ~LOWER_MASK[i]
  *     low = i+1
  *     high = b.max_val+1             # <<<<<<<<<<<<<<
@@ -16546,7 +17709,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_high = (__pyx_v_b->max_val + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":60
  *     low = i+1
  *     high = b.max_val+1
  *     while low < high-1:             # <<<<<<<<<<<<<<
@@ -16557,7 +17720,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_t_3 = (__pyx_v_low < (__pyx_v_high - 1));
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":61
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":61
  *     high = b.max_val+1
  *     while low < high-1:
  *         mid = (high + low)/2             # <<<<<<<<<<<<<<
@@ -16566,7 +17729,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
     __pyx_v_mid = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":62
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":62
  *     while low < high-1:
  *         mid = (high + low)/2
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])             # <<<<<<<<<<<<<<
@@ -16575,7 +17738,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
     __pyx_v_mask = (~((__pyx_v_3_sa_LOWER_MASK[(__pyx_v_high - 1)]) ^ (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_mid - 1)])));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":63
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":63
  *         mid = (high + low)/2
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])
  *         if bitset & mask == 0:             # <<<<<<<<<<<<<<
@@ -16585,7 +17748,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_t_3 = ((__pyx_v_bitset & __pyx_v_mask) == 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":64
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":64
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])
  *         if bitset & mask == 0:
  *             low = mid             # <<<<<<<<<<<<<<
@@ -16597,7 +17760,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":66
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":66
  *             low = mid
  *         else:
  *             bitset = bitset & mask             # <<<<<<<<<<<<<<
@@ -16606,7 +17769,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
       __pyx_v_bitset = (__pyx_v_bitset & __pyx_v_mask);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":67
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":67
  *         else:
  *             bitset = bitset & mask
  *             high = mid             # <<<<<<<<<<<<<<
@@ -16618,7 +17781,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_L7:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":68
  *             bitset = bitset & mask
  *             high = mid
  *     return low             # <<<<<<<<<<<<<<
@@ -16634,7 +17797,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":71
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":71
  * 
  * 
  * cdef int bitset_insert(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -16647,9 +17810,9 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("bitset_insert");
+  __Pyx_RefNannySetupContext("bitset_insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":74
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":74
  *     cdef int val
  * 
  *     val = 1 << i             # <<<<<<<<<<<<<<
@@ -16658,7 +17821,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
   __pyx_v_val = (1 << __pyx_v_i);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":75
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":75
  * 
  *     val = 1 << i
  *     if b.bitset & val == 0:             # <<<<<<<<<<<<<<
@@ -16668,7 +17831,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   __pyx_t_1 = ((__pyx_v_b->bitset & __pyx_v_val) == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":76
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":76
  *     val = 1 << i
  *     if b.bitset & val == 0:
  *         b.bitset = b.bitset | val             # <<<<<<<<<<<<<<
@@ -16677,7 +17840,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
     __pyx_v_b->bitset = (__pyx_v_b->bitset | __pyx_v_val);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":77
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":77
  *     if b.bitset & val == 0:
  *         b.bitset = b.bitset | val
  *         if b.size == 0:             # <<<<<<<<<<<<<<
@@ -16687,7 +17850,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     __pyx_t_1 = (__pyx_v_b->size == 0);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":78
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":78
  *         b.bitset = b.bitset | val
  *         if b.size == 0:
  *             b.min_val = i             # <<<<<<<<<<<<<<
@@ -16696,7 +17859,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
       __pyx_v_b->min_val = __pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":79
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":79
  *         if b.size == 0:
  *             b.min_val = i
  *             b.max_val = i             # <<<<<<<<<<<<<<
@@ -16708,7 +17871,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":81
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":81
  *             b.max_val = i
  *         else:
  *             if i < b.min_val:             # <<<<<<<<<<<<<<
@@ -16718,7 +17881,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       __pyx_t_1 = (__pyx_v_i < __pyx_v_b->min_val);
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":82
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":82
  *         else:
  *             if i < b.min_val:
  *                 b.min_val = i             # <<<<<<<<<<<<<<
@@ -16730,7 +17893,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       }
       __pyx_L5:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":83
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":83
  *             if i < b.min_val:
  *                 b.min_val = i
  *             if i > b.max_val:             # <<<<<<<<<<<<<<
@@ -16740,7 +17903,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       __pyx_t_1 = (__pyx_v_i > __pyx_v_b->max_val);
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":84
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":84
  *                 b.min_val = i
  *             if i > b.max_val:
  *                 b.max_val = i             # <<<<<<<<<<<<<<
@@ -16754,7 +17917,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     }
     __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":85
  *             if i > b.max_val:
  *                 b.max_val = i
  *         b.size = b.size + 1             # <<<<<<<<<<<<<<
@@ -16763,7 +17926,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
     __pyx_v_b->size = (__pyx_v_b->size + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":86
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":86
  *                 b.max_val = i
  *         b.size = b.size + 1
  *         return 1             # <<<<<<<<<<<<<<
@@ -16776,7 +17939,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":87
  *         b.size = b.size + 1
  *         return 1
  *     return 0             # <<<<<<<<<<<<<<
@@ -16792,7 +17955,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":90
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":90
  * 
  * 
  * cdef int bitset_contains(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -16805,9 +17968,9 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("bitset_contains");
+  __Pyx_RefNannySetupContext("bitset_contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":93
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":93
  *     cdef int val
  * 
  *     val = 1 << i             # <<<<<<<<<<<<<<
@@ -16816,7 +17979,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_val = (1 << __pyx_v_i);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":94
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":94
  * 
  *     val = 1 << i
  *     if b.bitset & val == 0:             # <<<<<<<<<<<<<<
@@ -16826,7 +17989,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   __pyx_t_1 = ((__pyx_v_b->bitset & __pyx_v_val) == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":95
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":95
  *     val = 1 << i
  *     if b.bitset & val == 0:
  *         return 0             # <<<<<<<<<<<<<<
@@ -16839,7 +18002,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":97
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":97
  *         return 0
  *     else:
  *         return 1             # <<<<<<<<<<<<<<
@@ -16857,7 +18020,18 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":104
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_14BitSetIterator___next__(((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":104
  *     cdef int next_val
  * 
  *     def __next__(self):             # <<<<<<<<<<<<<<
@@ -16865,8 +18039,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_self) {
   int __pyx_v_ret_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -16875,19 +18048,19 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__next__");
+  __Pyx_RefNannySetupContext("__next__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":107
  *         cdef int ret_val
  * 
  *         if self.next_val == -1:             # <<<<<<<<<<<<<<
  *             raise StopIteration()
  *         ret_val = self.next_val
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val == -1);
+  __pyx_t_1 = (__pyx_v_self->next_val == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":108
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":108
  * 
  *         if self.next_val == -1:
  *             raise StopIteration()             # <<<<<<<<<<<<<<
@@ -16899,29 +18072,29 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[6]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":109
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":109
  *         if self.next_val == -1:
  *             raise StopIteration()
  *         ret_val = self.next_val             # <<<<<<<<<<<<<<
  *         self.next_val = bitset_findsucc(self.b, ret_val)
  *         return ret_val
  */
-  __pyx_v_ret_val = ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val;
+  __pyx_v_ret_val = __pyx_v_self->next_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":110
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":110
  *             raise StopIteration()
  *         ret_val = self.next_val
  *         self.next_val = bitset_findsucc(self.b, ret_val)             # <<<<<<<<<<<<<<
  *         return ret_val
  * 
  */
-  ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val = __pyx_f_3_sa_bitset_findsucc(((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->b, __pyx_v_ret_val);
+  __pyx_v_self->next_val = __pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_v_ret_val);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":111
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":111
  *         ret_val = self.next_val
  *         self.next_val = bitset_findsucc(self.b, ret_val)
  *         return ret_val             # <<<<<<<<<<<<<<
@@ -16947,7 +18120,21 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":122
+/* Python wrapper */
+static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_6BitSet___cinit__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":122
  *     cdef _BitSet* b
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -16955,30 +18142,35 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
  * 
  */
 
-static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":123
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":123
  * 
  *     def __cinit__(self):
  *         self.b = new_BitSet()             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b = __pyx_f_3_sa_new_BitSet();
+  __pyx_v_self->b = __pyx_f_3_sa_new_BitSet();
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":125
+/* Python wrapper */
+static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_6BitSet_2__dealloc__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":125
  *         self.b = new_BitSet()
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -16986,24 +18178,34 @@ static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__p
  * 
  */
 
-static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":126
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":126
  * 
  *     def __dealloc__(self):
  *         free(self.b)             # <<<<<<<<<<<<<<
  * 
  *     def __iter__(self):
  */
-  free(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b);
+  free(__pyx_v_self->b);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":128
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_4__iter__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":128
  *         free(self.b)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -17011,8 +18213,7 @@ static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self) {
  *         it = BitSetIterator()
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_it = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -17020,9 +18221,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__");
+  __Pyx_RefNannySetupContext("__iter__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":130
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":130
  *     def __iter__(self):
  *         cdef BitSetIterator it
  *         it = BitSetIterator()             # <<<<<<<<<<<<<<
@@ -17034,25 +18235,25 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
   __pyx_v_it = ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":131
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":131
  *         cdef BitSetIterator it
  *         it = BitSetIterator()
  *         it.b = self.b             # <<<<<<<<<<<<<<
  *         it.next_val = self.b.min_val
  *         return it
  */
-  __pyx_v_it->b = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b;
+  __pyx_v_it->b = __pyx_v_self->b;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":132
  *         it = BitSetIterator()
  *         it.b = self.b
  *         it.next_val = self.b.min_val             # <<<<<<<<<<<<<<
  *         return it
  * 
  */
-  __pyx_v_it->next_val = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val;
+  __pyx_v_it->next_val = __pyx_v_self->b->min_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":133
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":133
  *         it.b = self.b
  *         it.next_val = self.b.min_val
  *         return it             # <<<<<<<<<<<<<<
@@ -17077,7 +18278,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":135
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_6insert(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":135
  *         return it
  * 
  *     def insert(self, i):             # <<<<<<<<<<<<<<
@@ -17085,8 +18297,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17094,9 +18305,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert");
+  __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":136
  * 
  *     def insert(self, i):
  *         return bitset_insert(self.b, i)             # <<<<<<<<<<<<<<
@@ -17105,7 +18316,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_insert(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_insert(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -17123,7 +18334,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":138
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("findsucc (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_8findsucc(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":138
  *         return bitset_insert(self.b, i)
  * 
  *     def findsucc(self, i):             # <<<<<<<<<<<<<<
@@ -17131,8 +18353,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17140,9 +18361,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("findsucc");
+  __Pyx_RefNannySetupContext("findsucc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":139
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":139
  * 
  *     def findsucc(self, i):
  *         return bitset_findsucc(self.b, i)             # <<<<<<<<<<<<<<
@@ -17151,7 +18372,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_findsucc(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -17169,7 +18390,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":141
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_10__str__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":141
  *         return bitset_findsucc(self.b, i)
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -17177,8 +18409,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -17187,9 +18418,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":142
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":142
  * 
  *     def __str__(self):
  *         return dec2bin(self.b.bitset)+"  ("+str(self.b.size)+","+str(self.b.min_val)+","+str(self.b.max_val)+")"             # <<<<<<<<<<<<<<
@@ -17197,15 +18428,15 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
  *     def min(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = ((PyObject *)__pyx_f_3_sa_dec2bin(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->bitset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PyObject *)__pyx_f_3_sa_dec2bin(__pyx_v_self->b->bitset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyNumber_Add(__pyx_t_1, ((PyObject *)__pyx_kp_s_58)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -17219,10 +18450,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   __pyx_t_1 = PyNumber_Add(__pyx_t_3, ((PyObject *)__pyx_kp_s_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromLong(__pyx_v_self->b->min_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -17236,10 +18467,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   __pyx_t_3 = PyNumber_Add(__pyx_t_2, ((PyObject *)__pyx_kp_s_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->max_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_v_self->b->max_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -17271,7 +18502,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":144
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("min (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_12min(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":144
  *         return dec2bin(self.b.bitset)+"  ("+str(self.b.size)+","+str(self.b.min_val)+","+str(self.b.max_val)+")"
  * 
  *     def min(self):             # <<<<<<<<<<<<<<
@@ -17279,17 +18521,16 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("min");
+  __Pyx_RefNannySetupContext("min", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":145
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":145
  * 
  *     def min(self):
  *         return self.b.min_val             # <<<<<<<<<<<<<<
@@ -17297,7 +18538,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSE
  *     def max(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->min_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -17315,7 +18556,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":147
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("max (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_14max(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":147
  *         return self.b.min_val
  * 
  *     def max(self):             # <<<<<<<<<<<<<<
@@ -17323,17 +18575,16 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSE
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("max");
+  __Pyx_RefNannySetupContext("max", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":148
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":148
  * 
  *     def max(self):
  *         return self.b.max_val             # <<<<<<<<<<<<<<
@@ -17341,7 +18592,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSE
  *     def __len__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->max_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->max_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -17359,7 +18610,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":150
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_16__len__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":150
  *         return self.b.max_val
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -17367,20 +18629,19 @@ static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSE
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":151
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":151
  * 
  *     def __len__(self):
  *         return self.b.size             # <<<<<<<<<<<<<<
  * 
  *     def __contains__(self, i):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->size;
+  __pyx_r = __pyx_v_self->b->size;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -17389,7 +18650,18 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":153
+/* Python wrapper */
+static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_18__contains__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":153
  *         return self.b.size
  * 
  *     def __contains__(self, i):             # <<<<<<<<<<<<<<
@@ -17397,8 +18669,7 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17407,9 +18678,9 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__contains__");
+  __Pyx_RefNannySetupContext("__contains__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":154
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":154
  * 
  *     def __contains__(self, i):
  *         return bool(bitset_contains(self.b, i))             # <<<<<<<<<<<<<<
@@ -17417,7 +18688,7 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
  * 
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_contains(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_contains(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -17435,7 +18706,7 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":157
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":157
  * 
  * 
  * cdef str dec2bin(long i):             # <<<<<<<<<<<<<<
@@ -17445,7 +18716,7 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
 
 static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   PyObject *__pyx_v_result = 0;
-  unsigned int __pyx_v_d;
+  CYTHON_UNUSED unsigned int __pyx_v_d;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17455,9 +18726,9 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("dec2bin");
+  __Pyx_RefNannySetupContext("dec2bin", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":158
  * 
  * cdef str dec2bin(long i):
  *     cdef str result = ""             # <<<<<<<<<<<<<<
@@ -17467,7 +18738,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_result = __pyx_kp_s_45;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":160
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":160
  *     cdef str result = ""
  *     cdef unsigned d
  *     for d in range(MIN_BOTTOM_SIZE):             # <<<<<<<<<<<<<<
@@ -17478,7 +18749,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_d = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":161
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":161
  *     cdef unsigned d
  *     for d in range(MIN_BOTTOM_SIZE):
  *         if i & LOWER_MASK[0] == 0:             # <<<<<<<<<<<<<<
@@ -17488,7 +18759,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     __pyx_t_3 = ((__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[0])) == 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":162
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":162
  *     for d in range(MIN_BOTTOM_SIZE):
  *         if i & LOWER_MASK[0] == 0:
  *             result = "0"+result             # <<<<<<<<<<<<<<
@@ -17504,7 +18775,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":164
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":164
  *             result = "0"+result
  *         else:
  *             result = "1"+result             # <<<<<<<<<<<<<<
@@ -17519,7 +18790,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":165
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":165
  *         else:
  *             result = "1"+result
  *         i = i >> 1             # <<<<<<<<<<<<<<
@@ -17529,7 +18800,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     __pyx_v_i = (__pyx_v_i >> 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":166
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":166
  *             result = "1"+result
  *         i = i >> 1
  *     return result             # <<<<<<<<<<<<<<
@@ -17554,7 +18825,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":177
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":177
  *     void** bottom
  * 
  * cdef _VEB* new_VEB(int n):             # <<<<<<<<<<<<<<
@@ -17573,9 +18844,9 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("new_VEB");
+  __Pyx_RefNannySetupContext("new_VEB", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":181
  *     cdef int num_bits, num_top_bits, i
  * 
  *     veb = <_VEB*> malloc(sizeof(_VEB))             # <<<<<<<<<<<<<<
@@ -17584,7 +18855,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb = ((struct __pyx_t_3_sa__VEB *)malloc((sizeof(struct __pyx_t_3_sa__VEB))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":183
  *     veb = <_VEB*> malloc(sizeof(_VEB))
  * 
  *     num_bits = int(ceil(log(n) / log(2)))             # <<<<<<<<<<<<<<
@@ -17599,7 +18870,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_v_num_bits = ((int)ceil((__pyx_t_1 / __pyx_t_2)));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":184
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":184
  * 
  *     num_bits = int(ceil(log(n) / log(2)))
  *     veb.num_bottom_bits = num_bits/2             # <<<<<<<<<<<<<<
@@ -17608,7 +18879,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->num_bottom_bits = __Pyx_div_long(__pyx_v_num_bits, 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":185
  *     num_bits = int(ceil(log(n) / log(2)))
  *     veb.num_bottom_bits = num_bits/2
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -17618,7 +18889,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   __pyx_t_3 = (__pyx_v_veb->num_bottom_bits < __pyx_v_3_sa_MIN_BOTTOM_BITS);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":186
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":186
  *     veb.num_bottom_bits = num_bits/2
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:
  *         veb.num_bottom_bits = MIN_BOTTOM_BITS             # <<<<<<<<<<<<<<
@@ -17630,7 +18901,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":187
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":187
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:
  *         veb.num_bottom_bits = MIN_BOTTOM_BITS
  *     veb.top_universe_size = (n >> veb.num_bottom_bits) + 1             # <<<<<<<<<<<<<<
@@ -17639,7 +18910,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->top_universe_size = ((__pyx_v_n >> __pyx_v_veb->num_bottom_bits) + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":189
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":189
  *     veb.top_universe_size = (n >> veb.num_bottom_bits) + 1
  * 
  *     veb.bottom = <void**> malloc(veb.top_universe_size * sizeof(void*))             # <<<<<<<<<<<<<<
@@ -17648,7 +18919,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->bottom = ((void **)malloc((__pyx_v_veb->top_universe_size * (sizeof(void *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":190
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":190
  * 
  *     veb.bottom = <void**> malloc(veb.top_universe_size * sizeof(void*))
  *     memset(veb.bottom, 0, veb.top_universe_size * sizeof(void*))             # <<<<<<<<<<<<<<
@@ -17657,7 +18928,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   memset(__pyx_v_veb->bottom, 0, (__pyx_v_veb->top_universe_size * (sizeof(void *))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":192
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":192
  *     memset(veb.bottom, 0, veb.top_universe_size * sizeof(void*))
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -17667,7 +18938,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":193
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":193
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         veb.top = new_VEB(veb.top_universe_size)             # <<<<<<<<<<<<<<
@@ -17679,7 +18950,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":195
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":195
  *         veb.top = new_VEB(veb.top_universe_size)
  *     else:
  *         veb.top = new_BitSet()             # <<<<<<<<<<<<<<
@@ -17690,7 +18961,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":197
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":197
  *         veb.top = new_BitSet()
  * 
  *     veb.max_val = -1             # <<<<<<<<<<<<<<
@@ -17699,7 +18970,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->max_val = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":198
  * 
  *     veb.max_val = -1
  *     veb.min_val = -1             # <<<<<<<<<<<<<<
@@ -17708,7 +18979,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->min_val = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":199
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":199
  *     veb.max_val = -1
  *     veb.min_val = -1
  *     veb.size = 0             # <<<<<<<<<<<<<<
@@ -17717,7 +18988,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->size = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":200
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":200
  *     veb.min_val = -1
  *     veb.size = 0
  *     return veb             # <<<<<<<<<<<<<<
@@ -17737,7 +19008,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":203
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":203
  * 
  * 
  * cdef int VEB_insert(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -17756,9 +19027,9 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("VEB_insert");
+  __Pyx_RefNannySetupContext("VEB_insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":208
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":208
  *     cdef int a, b, tmp
  * 
  *     if veb.size == 0:             # <<<<<<<<<<<<<<
@@ -17768,7 +19039,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   __pyx_t_1 = (__pyx_v_veb->size == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":209
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":209
  * 
  *     if veb.size == 0:
  *         veb.min_val = i             # <<<<<<<<<<<<<<
@@ -17777,7 +19048,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_veb->min_val = __pyx_v_i;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":210
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":210
  *     if veb.size == 0:
  *         veb.min_val = i
  *         veb.max_val = i             # <<<<<<<<<<<<<<
@@ -17788,7 +19059,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":211
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":211
  *         veb.min_val = i
  *         veb.max_val = i
  *     elif i == veb.min_val or i == veb.max_val:             # <<<<<<<<<<<<<<
@@ -17804,7 +19075,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":212
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":212
  *         veb.max_val = i
  *     elif i == veb.min_val or i == veb.max_val:
  *         return 0             # <<<<<<<<<<<<<<
@@ -17817,7 +19088,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":214
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":214
  *         return 0
  *     else:
  *         if i < veb.min_val:             # <<<<<<<<<<<<<<
@@ -17827,7 +19098,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_i < __pyx_v_veb->min_val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":215
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":215
  *     else:
  *         if i < veb.min_val:
  *             tmp = i             # <<<<<<<<<<<<<<
@@ -17836,7 +19107,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_tmp = __pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":216
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":216
  *         if i < veb.min_val:
  *             tmp = i
  *             i = veb.min_val             # <<<<<<<<<<<<<<
@@ -17845,7 +19116,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_i = __pyx_v_veb->min_val;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":217
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":217
  *             tmp = i
  *             i = veb.min_val
  *             veb.min_val = tmp             # <<<<<<<<<<<<<<
@@ -17857,7 +19128,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":218
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":218
  *             i = veb.min_val
  *             veb.min_val = tmp
  *         a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -17866,7 +19137,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":219
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":219
  *             veb.min_val = tmp
  *         a = i >> veb.num_bottom_bits
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -17875,7 +19146,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":220
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":220
  *         a = i >> veb.num_bottom_bits
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *         if veb.bottom[a] == NULL:             # <<<<<<<<<<<<<<
@@ -17885,7 +19156,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = ((__pyx_v_veb->bottom[__pyx_v_a]) == NULL);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":221
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":221
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *         if veb.bottom[a] == NULL:
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -17895,7 +19166,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":222
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":222
  *         if veb.bottom[a] == NULL:
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *                 subv = <_VEB*> veb.top             # <<<<<<<<<<<<<<
@@ -17904,7 +19175,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
         __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)__pyx_v_veb->top);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":223
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":223
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *                 subv = <_VEB*> veb.top
  *                 VEB_insert(subv, a)             # <<<<<<<<<<<<<<
@@ -17916,7 +19187,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":225
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":225
  *                 VEB_insert(subv, a)
  *             else:
  *                 subb = <_BitSet*> veb.top             # <<<<<<<<<<<<<<
@@ -17925,7 +19196,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
         __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)__pyx_v_veb->top);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":226
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":226
  *             else:
  *                 subb = <_BitSet*> veb.top
  *                 bitset_insert(subb, a)             # <<<<<<<<<<<<<<
@@ -17936,7 +19207,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       __pyx_L6:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":227
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":227
  *                 subb = <_BitSet*> veb.top
  *                 bitset_insert(subb, a)
  *             if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -17946,7 +19217,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":228
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":228
  *                 bitset_insert(subb, a)
  *             if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *                 veb.bottom[a] = new_VEB(1 << veb.num_bottom_bits)             # <<<<<<<<<<<<<<
@@ -17958,7 +19229,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":230
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":230
  *                 veb.bottom[a] = new_VEB(1 << veb.num_bottom_bits)
  *             else:
  *                 veb.bottom[a] = new_BitSet()             # <<<<<<<<<<<<<<
@@ -17972,7 +19243,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":231
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":231
  *             else:
  *                 veb.bottom[a] = new_BitSet()
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -17982,7 +19253,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":232
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":232
  *                 veb.bottom[a] = new_BitSet()
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -17991,7 +19262,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":233
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":233
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             if VEB_insert(subv, b) == 0:             # <<<<<<<<<<<<<<
@@ -18001,7 +19272,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_f_3_sa_VEB_insert(__pyx_v_subv, __pyx_v_b) == 0);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":234
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":234
  *             subv = <_VEB*> veb.bottom[a]
  *             if VEB_insert(subv, b) == 0:
  *                 return 0             # <<<<<<<<<<<<<<
@@ -18017,7 +19288,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":236
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":236
  *                 return 0
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18026,7 +19297,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":237
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":237
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             if bitset_insert(subb, b) == 0:             # <<<<<<<<<<<<<<
@@ -18036,7 +19307,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_f_3_sa_bitset_insert(__pyx_v_subb, __pyx_v_b) == 0);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":238
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":238
  *             subb = <_BitSet*> veb.bottom[a]
  *             if bitset_insert(subb, b) == 0:
  *                 return 0             # <<<<<<<<<<<<<<
@@ -18051,7 +19322,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":240
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":240
  *                 return 0
  * 
  *         if i > veb.max_val:             # <<<<<<<<<<<<<<
@@ -18061,7 +19332,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_i > __pyx_v_veb->max_val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":241
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":241
  * 
  *         if i > veb.max_val:
  *             veb.max_val = i             # <<<<<<<<<<<<<<
@@ -18075,7 +19346,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":242
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":242
  *         if i > veb.max_val:
  *             veb.max_val = i
  *     veb.size = veb.size + 1             # <<<<<<<<<<<<<<
@@ -18084,7 +19355,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
   __pyx_v_veb->size = (__pyx_v_veb->size + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":243
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":243
  *             veb.max_val = i
  *     veb.size = veb.size + 1
  *     return 1             # <<<<<<<<<<<<<<
@@ -18100,7 +19371,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":246
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":246
  * 
  * 
  * cdef del_VEB(_VEB* veb):             # <<<<<<<<<<<<<<
@@ -18117,9 +19388,9 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("del_VEB");
+  __Pyx_RefNannySetupContext("del_VEB", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":249
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":249
  *     cdef int i
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -18129,7 +19400,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":250
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":250
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         i = (<_VEB*> veb.top).min_val             # <<<<<<<<<<<<<<
@@ -18141,7 +19412,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":252
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":252
  *         i = (<_VEB*> veb.top).min_val
  *     else:
  *         i = (<_BitSet*> veb.top).min_val             # <<<<<<<<<<<<<<
@@ -18152,7 +19423,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":254
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":254
  *         i = (<_BitSet*> veb.top).min_val
  * 
  *     while i != -1:             # <<<<<<<<<<<<<<
@@ -18163,7 +19434,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_i != -1);
     if (!__pyx_t_1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":255
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":255
  * 
  *     while i != -1:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -18173,7 +19444,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":256
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":256
  *     while i != -1:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             del_VEB(<_VEB*> veb.bottom[i])             # <<<<<<<<<<<<<<
@@ -18187,7 +19458,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":258
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":258
  *             del_VEB(<_VEB*> veb.bottom[i])
  *         else:
  *             free(<_BitSet*> veb.bottom[i])             # <<<<<<<<<<<<<<
@@ -18198,7 +19469,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     __pyx_L6:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":260
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":260
  *             free(<_BitSet*> veb.bottom[i])
  * 
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -18208,7 +19479,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":261
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":261
  * 
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             i = VEB_findsucc(<_VEB*> veb.top, i)             # <<<<<<<<<<<<<<
@@ -18220,7 +19491,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":263
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":263
  *             i = VEB_findsucc(<_VEB*> veb.top, i)
  *         else:
  *             i = bitset_findsucc(<_BitSet*> veb.top, i)             # <<<<<<<<<<<<<<
@@ -18232,7 +19503,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_L7:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":265
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":265
  *             i = bitset_findsucc(<_BitSet*> veb.top, i)
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -18242,7 +19513,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":266
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":266
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         del_VEB(<_VEB*> veb.top)             # <<<<<<<<<<<<<<
@@ -18256,7 +19527,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":268
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":268
  *         del_VEB(<_VEB*> veb.top)
  *     else:
  *         free(<_BitSet*> veb.top)             # <<<<<<<<<<<<<<
@@ -18267,7 +19538,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   __pyx_L8:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":269
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":269
  *     else:
  *         free(<_BitSet*> veb.top)
  *     free(veb.bottom)             # <<<<<<<<<<<<<<
@@ -18276,7 +19547,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
  */
   free(__pyx_v_veb->bottom);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":270
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":270
  *         free(<_BitSet*> veb.top)
  *     free(veb.bottom)
  *     free(veb)             # <<<<<<<<<<<<<<
@@ -18297,7 +19568,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":273
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":273
  * 
  * 
  * cdef int VEB_findsucc(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -18318,9 +19589,9 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("VEB_findsucc");
+  __Pyx_RefNannySetupContext("VEB_findsucc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":278
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":278
  *     cdef int a, b, j, c, found
  * 
  *     if veb.max_val == -1 or i>=veb.max_val:             # <<<<<<<<<<<<<<
@@ -18336,7 +19607,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":279
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":279
  * 
  *     if veb.max_val == -1 or i>=veb.max_val:
  *         return -1             # <<<<<<<<<<<<<<
@@ -18349,7 +19620,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":280
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":280
  *     if veb.max_val == -1 or i>=veb.max_val:
  *         return -1
  *     if i < veb.min_val:             # <<<<<<<<<<<<<<
@@ -18359,7 +19630,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = (__pyx_v_i < __pyx_v_veb->min_val);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":281
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":281
  *         return -1
  *     if i < veb.min_val:
  *         return veb.min_val             # <<<<<<<<<<<<<<
@@ -18372,7 +19643,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":283
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":283
  *         return veb.min_val
  * 
  *     a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -18381,7 +19652,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":284
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":284
  * 
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -18390,7 +19661,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":285
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":285
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     found = 0             # <<<<<<<<<<<<<<
@@ -18399,7 +19670,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_found = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":286
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":286
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     found = 0
  *     if veb.bottom[a] != NULL:             # <<<<<<<<<<<<<<
@@ -18409,7 +19680,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = ((__pyx_v_veb->bottom[__pyx_v_a]) != NULL);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":287
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":287
  *     found = 0
  *     if veb.bottom[a] != NULL:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -18419,7 +19690,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":288
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":288
  *     if veb.bottom[a] != NULL:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18428,7 +19699,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":289
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":289
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             if subv.max_val > b:             # <<<<<<<<<<<<<<
@@ -18438,7 +19709,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
       __pyx_t_3 = (__pyx_v_subv->max_val > __pyx_v_b);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":290
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":290
  *             subv = <_VEB*> veb.bottom[a]
  *             if subv.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + VEB_findsucc(subv, b)             # <<<<<<<<<<<<<<
@@ -18447,7 +19718,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
         __pyx_v_j = ((__pyx_v_a << __pyx_v_veb->num_bottom_bits) + __pyx_f_3_sa_VEB_findsucc(__pyx_v_subv, __pyx_v_b));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":291
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":291
  *             if subv.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + VEB_findsucc(subv, b)
  *                 found = 1             # <<<<<<<<<<<<<<
@@ -18462,7 +19733,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":293
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":293
  *                 found = 1
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18471,7 +19742,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":294
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":294
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             if subb.max_val > b:             # <<<<<<<<<<<<<<
@@ -18481,7 +19752,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
       __pyx_t_3 = (__pyx_v_subb->max_val > __pyx_v_b);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":295
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":295
  *             subb = <_BitSet*> veb.bottom[a]
  *             if subb.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)             # <<<<<<<<<<<<<<
@@ -18490,7 +19761,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
         __pyx_v_j = ((__pyx_v_a << __pyx_v_veb->num_bottom_bits) + __pyx_f_3_sa_bitset_findsucc(__pyx_v_subb, __pyx_v_b));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":296
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":296
  *             if subb.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)
  *                 found = 1             # <<<<<<<<<<<<<<
@@ -18507,7 +19778,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":297
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)
  *                 found = 1
  *     if found==0:             # <<<<<<<<<<<<<<
@@ -18517,7 +19788,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = (__pyx_v_found == 0);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":298
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":298
  *                 found = 1
  *     if found==0:
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -18527,7 +19798,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":299
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":299
  *     if found==0:
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             subv = <_VEB*> veb.top             # <<<<<<<<<<<<<<
@@ -18536,7 +19807,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)__pyx_v_veb->top);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":300
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":300
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             subv = <_VEB*> veb.top
  *             c = VEB_findsucc(subv, a)             # <<<<<<<<<<<<<<
@@ -18548,7 +19819,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":302
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":302
  *             c = VEB_findsucc(subv, a)
  *         else:
  *             subb = <_BitSet*> veb.top             # <<<<<<<<<<<<<<
@@ -18557,7 +19828,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)__pyx_v_veb->top);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":303
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":303
  *         else:
  *             subb = <_BitSet*> veb.top
  *             c = bitset_findsucc(subb, a)             # <<<<<<<<<<<<<<
@@ -18568,7 +19839,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     __pyx_L10:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":304
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":304
  *             subb = <_BitSet*> veb.top
  *             c = bitset_findsucc(subb, a)
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -18578,7 +19849,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":305
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":305
  *             c = bitset_findsucc(subb, a)
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[c]             # <<<<<<<<<<<<<<
@@ -18587,7 +19858,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_c]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":306
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":306
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subv.min_val             # <<<<<<<<<<<<<<
@@ -18599,7 +19870,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":308
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":308
  *             j = (c << veb.num_bottom_bits) + subv.min_val
  *         else:
  *             subb = <_BitSet*> veb.bottom[c]             # <<<<<<<<<<<<<<
@@ -18608,7 +19879,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_c]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":309
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":309
  *         else:
  *             subb = <_BitSet*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subb.min_val             # <<<<<<<<<<<<<<
@@ -18622,7 +19893,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L9:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":310
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":310
  *             subb = <_BitSet*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subb.min_val
  *     return j             # <<<<<<<<<<<<<<
@@ -18638,7 +19909,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":313
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":313
  * 
  * 
  * cdef int VEB_contains(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -18657,9 +19928,9 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("VEB_contains");
+  __Pyx_RefNannySetupContext("VEB_contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":318
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":318
  *     cdef int a, b
  * 
  *     if veb.size == 0 or i < veb.min_val or i > veb.max_val:             # <<<<<<<<<<<<<<
@@ -18681,7 +19952,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":319
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":319
  * 
  *     if veb.size == 0 or i < veb.min_val or i > veb.max_val:
  *         return 0             # <<<<<<<<<<<<<<
@@ -18694,7 +19965,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":321
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":321
  *         return 0
  * 
  *     if veb.min_val == i:             # <<<<<<<<<<<<<<
@@ -18704,7 +19975,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_2 = (__pyx_v_veb->min_val == __pyx_v_i);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":322
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":322
  * 
  *     if veb.min_val == i:
  *         return 1             # <<<<<<<<<<<<<<
@@ -18717,7 +19988,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":324
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":324
  *         return 1
  *     else:
  *         if veb.size == 1:             # <<<<<<<<<<<<<<
@@ -18727,7 +19998,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_2 = (__pyx_v_veb->size == 1);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":325
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":325
  *     else:
  *         if veb.size == 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -18742,7 +20013,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":327
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":327
  *             return 0
  * 
  *     a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -18751,7 +20022,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":328
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":328
  * 
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -18760,7 +20031,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":329
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":329
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     if veb.bottom[a] == NULL:             # <<<<<<<<<<<<<<
@@ -18770,7 +20041,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_2 = ((__pyx_v_veb->bottom[__pyx_v_a]) == NULL);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":330
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":330
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     if veb.bottom[a] == NULL:
  *         return 0             # <<<<<<<<<<<<<<
@@ -18783,7 +20054,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":332
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":332
  *         return 0
  *     else:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -18793,7 +20064,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_2 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":333
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":333
  *     else:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18802,7 +20073,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":334
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":334
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             return VEB_contains(subv, b)             # <<<<<<<<<<<<<<
@@ -18815,7 +20086,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":336
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":336
  *             return VEB_contains(subv, b)
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18824,7 +20095,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":337
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":337
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             return bitset_contains(subb, b)             # <<<<<<<<<<<<<<
@@ -18844,7 +20115,18 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":344
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11VEBIterator___next__(((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":344
  *     cdef int next_val
  * 
  *     def __next__(self):             # <<<<<<<<<<<<<<
@@ -18852,8 +20134,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBIterator *__pyx_v_self) {
   int __pyx_v_ret_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -18862,19 +20143,19 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__next__");
+  __Pyx_RefNannySetupContext("__next__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":347
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":347
  *         cdef int ret_val
  * 
  *         if self.next_val == -1:             # <<<<<<<<<<<<<<
  *             raise StopIteration()
  *         ret_val = self.next_val
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val == -1);
+  __pyx_t_1 = (__pyx_v_self->next_val == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":348
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":348
  * 
  *         if self.next_val == -1:
  *             raise StopIteration()             # <<<<<<<<<<<<<<
@@ -18886,29 +20167,29 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[6]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":349
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":349
  *         if self.next_val == -1:
  *             raise StopIteration()
  *         ret_val = self.next_val             # <<<<<<<<<<<<<<
  *         self.next_val = VEB_findsucc(self.v, ret_val)
  *         return ret_val
  */
-  __pyx_v_ret_val = ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val;
+  __pyx_v_ret_val = __pyx_v_self->next_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":350
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":350
  *             raise StopIteration()
  *         ret_val = self.next_val
  *         self.next_val = VEB_findsucc(self.v, ret_val)             # <<<<<<<<<<<<<<
  *         return ret_val
  * 
  */
-  ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val = __pyx_f_3_sa_VEB_findsucc(((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->v, __pyx_v_ret_val);
+  __pyx_v_self->next_val = __pyx_f_3_sa_VEB_findsucc(__pyx_v_self->v, __pyx_v_ret_val);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":351
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":351
  *         ret_val = self.next_val
  *         self.next_val = VEB_findsucc(self.v, ret_val)
  *         return ret_val             # <<<<<<<<<<<<<<
@@ -18934,42 +20215,32 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":360
- *     cdef int _first(self)
- * 
- *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
- *         self.veb = new_VEB(size)
- * 
- */
-
-static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -18986,22 +20257,48 @@ static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_3VEB___cinit__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), __pyx_v_size);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":360
+ *     cdef int _first(self)
+ * 
+ *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
+ *         self.veb = new_VEB(size)
+ * 
+ */
+
+static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_size) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":361
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":361
  * 
  *     def __cinit__(self, int size):
  *         self.veb = new_VEB(size)             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb = __pyx_f_3_sa_new_VEB(__pyx_v_size);
+  __pyx_v_self->veb = __pyx_f_3_sa_new_VEB(__pyx_v_size);
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":363
+/* Python wrapper */
+static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_3VEB_2__dealloc__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":363
  *         self.veb = new_VEB(size)
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -19009,23 +20306,22 @@ static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  * 
  */
 
-static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":364
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":364
  * 
  *     def __dealloc__(self):
  *         del_VEB(self.veb)             # <<<<<<<<<<<<<<
  * 
  *     def __iter__(self):
  */
-  __pyx_t_1 = __pyx_f_3_sa_del_VEB(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_3_sa_del_VEB(__pyx_v_self->veb); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -19037,7 +20333,18 @@ static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":366
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_4__iter__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":366
  *         del_VEB(self.veb)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -19045,8 +20352,7 @@ static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
  *         it = VEBIterator()
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   struct __pyx_obj_3_sa_VEBIterator *__pyx_v_it = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -19054,9 +20360,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__");
+  __Pyx_RefNannySetupContext("__iter__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":368
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":368
  *     def __iter__(self):
  *         cdef VEBIterator it
  *         it = VEBIterator()             # <<<<<<<<<<<<<<
@@ -19068,25 +20374,25 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
   __pyx_v_it = ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":369
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":369
  *         cdef VEBIterator it
  *         it = VEBIterator()
  *         it.v = self.veb             # <<<<<<<<<<<<<<
  *         it.next_val = self.veb.min_val
  *         return it
  */
-  __pyx_v_it->v = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb;
+  __pyx_v_it->v = __pyx_v_self->veb;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":370
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":370
  *         it = VEBIterator()
  *         it.v = self.veb
  *         it.next_val = self.veb.min_val             # <<<<<<<<<<<<<<
  *         return it
  * 
  */
-  __pyx_v_it->next_val = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb->min_val;
+  __pyx_v_it->next_val = __pyx_v_self->veb->min_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":371
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":371
  *         it.v = self.veb
  *         it.next_val = self.veb.min_val
  *         return it             # <<<<<<<<<<<<<<
@@ -19111,7 +20417,18 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":373
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_6insert(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":373
  *         return it
  * 
  *     def insert(self, i):             # <<<<<<<<<<<<<<
@@ -19119,8 +20436,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -19128,9 +20444,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert");
+  __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":374
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":374
  * 
  *     def insert(self, i):
  *         return VEB_insert(self.veb, i)             # <<<<<<<<<<<<<<
@@ -19139,7 +20455,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_insert(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_insert(__pyx_v_self->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -19157,7 +20473,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":376
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":376
  *         return VEB_insert(self.veb, i)
  * 
  *     cdef int _insert(self, int i):             # <<<<<<<<<<<<<<
@@ -19168,9 +20484,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
 static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_insert");
+  __Pyx_RefNannySetupContext("_insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":377
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":377
  * 
  *     cdef int _insert(self, int i):
  *         return VEB_insert(self.veb, i)             # <<<<<<<<<<<<<<
@@ -19186,7 +20502,18 @@ static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":379
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("findsucc (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_8findsucc(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":379
  *         return VEB_insert(self.veb, i)
  * 
  *     def findsucc(self, i):             # <<<<<<<<<<<<<<
@@ -19194,8 +20521,7 @@ static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, in
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -19203,9 +20529,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("findsucc");
+  __Pyx_RefNannySetupContext("findsucc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":380
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":380
  * 
  *     def findsucc(self, i):
  *         return VEB_findsucc(self.veb, i)             # <<<<<<<<<<<<<<
@@ -19214,7 +20540,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_findsucc(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_findsucc(__pyx_v_self->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -19232,7 +20558,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":382
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":382
  *         return VEB_findsucc(self.veb, i)
  * 
  *     cdef int _first(self):             # <<<<<<<<<<<<<<
@@ -19243,9 +20569,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
 static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_first");
+  __Pyx_RefNannySetupContext("_first", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":383
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":383
  * 
  *     cdef int _first(self):
  *         return self.veb.min_val             # <<<<<<<<<<<<<<
@@ -19261,7 +20587,7 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":385
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":385
  *         return self.veb.min_val
  * 
  *     cdef int _findsucc(self, int i):             # <<<<<<<<<<<<<<
@@ -19272,9 +20598,9 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
 static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_findsucc");
+  __Pyx_RefNannySetupContext("_findsucc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":386
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":386
  * 
  *     cdef int _findsucc(self, int i):
  *         return VEB_findsucc(self.veb, i)             # <<<<<<<<<<<<<<
@@ -19290,7 +20616,18 @@ static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":388
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_10__len__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":388
  *         return VEB_findsucc(self.veb, i)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -19298,20 +20635,19 @@ static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":389
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":389
  * 
  *     def __len__(self):
  *         return self.veb.size             # <<<<<<<<<<<<<<
  * 
  *     def __contains__(self, i):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb->size;
+  __pyx_r = __pyx_v_self->veb->size;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -19320,30 +20656,40 @@ static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":391
+/* Python wrapper */
+static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_12__contains__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":391
  *         return self.veb.size
  * 
  *     def __contains__(self, i):             # <<<<<<<<<<<<<<
  *         return VEB_contains(self.veb, i)
  */
 
-static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__contains__");
+  __Pyx_RefNannySetupContext("__contains__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":392
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":392
  * 
  *     def __contains__(self, i):
  *         return VEB_contains(self.veb, i)             # <<<<<<<<<<<<<<
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_f_3_sa_VEB_contains(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1);
+  __pyx_r = __pyx_f_3_sa_VEB_contains(__pyx_v_self->veb, __pyx_t_1);
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -19356,55 +20702,32 @@ static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":9
- *     cdef IntList lcp
- * 
- *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
- *         cdef int i, k, j, h, n
- *         cdef IntList rank
- */
-
-static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa = 0;
-  int __pyx_v_i;
-  int __pyx_v_k;
-  int __pyx_v_j;
-  int __pyx_v_h;
-  int __pyx_v_n;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_rank = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  int __pyx_t_4;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -19422,8 +20745,45 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sa), __pyx_ptype_3_sa_SuffixArray, 1, "sa", 0))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_3LCP___cinit__(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self), __pyx_v_sa);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":9
+ *     cdef IntList lcp
+ * 
+ *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
+ *         cdef int i, k, j, h, n
+ *         cdef IntList rank
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":13
+static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa) {
+  int __pyx_v_i;
+  int __pyx_v_k;
+  int __pyx_v_j;
+  int __pyx_v_h;
+  int __pyx_v_n;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_rank = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
  * 
  *         logger.info("Constructing LCP array")             # <<<<<<<<<<<<<<
@@ -19440,7 +20800,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":14
  * 
  *         logger.info("Constructing LCP array")
  *         self.sa = sa             # <<<<<<<<<<<<<<
@@ -19449,20 +20809,20 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_sa));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_sa));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa = __pyx_v_sa;
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = __pyx_v_sa;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":15
  *         logger.info("Constructing LCP array")
  *         self.sa = sa
  *         n = self.sa.sa.len             # <<<<<<<<<<<<<<
  *         self.lcp = IntList(initial_len=n)
  * 
  */
-  __pyx_v_n = ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa->sa->len;
+  __pyx_v_n = __pyx_v_self->sa->sa->len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":16
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":16
  *         self.sa = sa
  *         n = self.sa.sa.len
  *         self.lcp = IntList(initial_len=n)             # <<<<<<<<<<<<<<
@@ -19475,16 +20835,16 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp));
-  ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->lcp);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->lcp));
+  __pyx_v_self->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":18
  *         self.lcp = IntList(initial_len=n)
  * 
  *         rank = IntList(initial_len=n)             # <<<<<<<<<<<<<<
@@ -19497,13 +20857,13 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":19
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":19
  * 
  *         rank = IntList(initial_len=n)
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -19513,7 +20873,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __pyx_t_3 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":20
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":20
  *         rank = IntList(initial_len=n)
  *         for i from 0 <= i < n:
  *             rank.arr[sa.sa.arr[i]] = i             # <<<<<<<<<<<<<<
@@ -19523,7 +20883,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
     (__pyx_v_rank->arr[(__pyx_v_sa->sa->arr[__pyx_v_i])]) = __pyx_v_i;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":22
  *             rank.arr[sa.sa.arr[i]] = i
  * 
  *         h = 0             # <<<<<<<<<<<<<<
@@ -19532,7 +20892,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
   __pyx_v_h = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":23
  * 
  *         h = 0
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -19542,7 +20902,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __pyx_t_3 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":24
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":24
  *         h = 0
  *         for i from 0 <= i < n:
  *             k = rank.arr[i]             # <<<<<<<<<<<<<<
@@ -19551,7 +20911,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
     __pyx_v_k = (__pyx_v_rank->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":25
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":25
  *         for i from 0 <= i < n:
  *             k = rank.arr[i]
  *             if k == 0:             # <<<<<<<<<<<<<<
@@ -19561,19 +20921,19 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
     __pyx_t_4 = (__pyx_v_k == 0);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":26
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":26
  *             k = rank.arr[i]
  *             if k == 0:
  *                 self.lcp.arr[k] = -1             # <<<<<<<<<<<<<<
  *             else:
  *                 j = sa.sa.arr[k-1]
  */
-      (((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp->arr[__pyx_v_k]) = -1;
-      goto __pyx_L10;
+      (__pyx_v_self->lcp->arr[__pyx_v_k]) = -1;
+      goto __pyx_L7;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":28
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":28
  *                 self.lcp.arr[k] = -1
  *             else:
  *                 j = sa.sa.arr[k-1]             # <<<<<<<<<<<<<<
@@ -19582,7 +20942,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
       __pyx_v_j = (__pyx_v_sa->sa->arr[(__pyx_v_k - 1)]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":29
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":29
  *             else:
  *                 j = sa.sa.arr[k-1]
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:             # <<<<<<<<<<<<<<
@@ -19605,7 +20965,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
         }
         if (!__pyx_t_5) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":30
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":30
  *                 j = sa.sa.arr[k-1]
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:
  *                     h = h+1             # <<<<<<<<<<<<<<
@@ -19615,18 +20975,18 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
         __pyx_v_h = (__pyx_v_h + 1);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":31
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":31
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:
  *                     h = h+1
  *                 self.lcp.arr[k] = h             # <<<<<<<<<<<<<<
  *             if h > 0:
  *                 h = h-1
  */
-      (((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp->arr[__pyx_v_k]) = __pyx_v_h;
+      (__pyx_v_self->lcp->arr[__pyx_v_k]) = __pyx_v_h;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":32
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":32
  *                     h = h+1
  *                 self.lcp.arr[k] = h
  *             if h > 0:             # <<<<<<<<<<<<<<
@@ -19636,7 +20996,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
     __pyx_t_5 = (__pyx_v_h > 0);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":33
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":33
  *                 self.lcp.arr[k] = h
  *             if h > 0:
  *                 h = h-1             # <<<<<<<<<<<<<<
@@ -19644,12 +21004,12 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  * 
  */
       __pyx_v_h = (__pyx_v_h - 1);
-      goto __pyx_L13;
+      goto __pyx_L10;
     }
-    __pyx_L13:;
+    __pyx_L10:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":34
  *             if h > 0:
  *                 h = h-1
  *         logger.info("LCP array completed")             # <<<<<<<<<<<<<<
@@ -19678,9 +21038,31 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n); /*proto*/
+static char __pyx_doc_3_sa_3LCP_2compute_stats[] = "Note: the output of this function is not exact.  In\n        particular, the frequency associated with each word is \n        not guaranteed to be correct.  This is due to a bit of\n        laxness in the design; the function is intended only to\n        obtain a list of the most frequent words; for this \n        purpose it is perfectly fine";
+static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n) {
+  int __pyx_v_max_n;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("compute_stats (wrapper)", 0);
+  assert(__pyx_arg_max_n); {
+    __pyx_v_max_n = __Pyx_PyInt_AsInt(__pyx_arg_max_n); if (unlikely((__pyx_v_max_n == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_3LCP_2compute_stats(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self), ((int)__pyx_v_max_n));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":36
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
  * 
  *     def compute_stats(self, int max_n):             # <<<<<<<<<<<<<<
@@ -19688,51 +21070,46 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *         particular, the frequency associated with each word is
  */
 
-static PyObject *__pyx_pf_3_sa_3LCP_1compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n); /*proto*/
-static char __pyx_doc_3_sa_3LCP_1compute_stats[] = "Note: the output of this function is not exact.  In\n        particular, the frequency associated with each word is \n        not guaranteed to be correct.  This is due to a bit of\n        laxness in the design; the function is intended only to\n        obtain a list of the most frequent words; for this \n        purpose it is perfectly fine";
-static PyObject *__pyx_pf_3_sa_3LCP_1compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n) {
+static PyObject *__pyx_pf_3_sa_3LCP_2compute_stats(struct __pyx_obj_3_sa_LCP *__pyx_v_self, int __pyx_v_max_n) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("compute_stats");
+  __Pyx_RefNannySetupContext("compute_stats", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  assert(__pyx_arg_max_n); {
-    __pyx_cur_scope->__pyx_v_max_n = __Pyx_PyInt_AsInt(__pyx_arg_max_n); if (unlikely((__pyx_cur_scope->__pyx_v_max_n == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_XDECREF((PyObject *)__pyx_cur_scope->__pyx_v_self); __pyx_cur_scope->__pyx_v_self = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_3LCP_2generator1;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  __pyx_cur_scope->__pyx_v_max_n = __pyx_v_max_n;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_3LCP_4generator1, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   int __pyx_t_2;
@@ -19745,8 +21122,8 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   long __pyx_t_9;
   PyObject *__pyx_t_10 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L26_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -19756,16 +21133,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":48
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":48
  *         cdef VEB veb
  * 
  *         N = self.sa.sa.len             # <<<<<<<<<<<<<<
  * 
  *         ngram_starts = []
  */
-  __pyx_cur_scope->__pyx_v_N = ((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->sa->len;
+  __pyx_cur_scope->__pyx_v_N = __pyx_cur_scope->__pyx_v_self->sa->sa->len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":50
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":50
  *         N = self.sa.sa.len
  * 
  *         ngram_starts = []             # <<<<<<<<<<<<<<
@@ -19773,12 +21150,12 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *             ngram_starts.append(IntList(initial_len=N))
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_cur_scope->__pyx_v_ngram_starts = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":51
  * 
  *         ngram_starts = []
  *         for n from 0 <= n < max_n:             # <<<<<<<<<<<<<<
@@ -19788,30 +21165,27 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_t_2 = __pyx_cur_scope->__pyx_v_max_n;
   for (__pyx_cur_scope->__pyx_v_n = 0; __pyx_cur_scope->__pyx_v_n < __pyx_t_2; __pyx_cur_scope->__pyx_v_n++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":52
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":52
  *         ngram_starts = []
  *         for n from 0 <= n < max_n:
  *             ngram_starts.append(IntList(initial_len=N))             # <<<<<<<<<<<<<<
  * 
  *         run_start = IntList(initial_len=max_n)
  */
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_ngram_starts) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __pyx_t_4 = PyList_Append(__pyx_cur_scope->__pyx_v_ngram_starts, __pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":54
  *             ngram_starts.append(IntList(initial_len=N))
  * 
  *         run_start = IntList(initial_len=max_n)             # <<<<<<<<<<<<<<
@@ -19824,14 +21198,14 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_cur_scope->__pyx_v_run_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":55
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":55
  * 
  *         run_start = IntList(initial_len=max_n)
  *         veb = VEB(N)             # <<<<<<<<<<<<<<
@@ -19841,7 +21215,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_t_1 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -19852,7 +21226,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_cur_scope->__pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":57
  *         veb = VEB(N)
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -19862,16 +21236,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_t_2 = __pyx_cur_scope->__pyx_v_N;
   for (__pyx_cur_scope->__pyx_v_i = 0; __pyx_cur_scope->__pyx_v_i < __pyx_t_2; __pyx_cur_scope->__pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":58
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":58
  * 
  *         for i from 0 <= i < N:
  *             h = self.lcp.arr[i]             # <<<<<<<<<<<<<<
  *             if h < 0:
  *                 h = 0
  */
-    __pyx_cur_scope->__pyx_v_h = (((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
+    __pyx_cur_scope->__pyx_v_h = (__pyx_cur_scope->__pyx_v_self->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":59
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":59
  *         for i from 0 <= i < N:
  *             h = self.lcp.arr[i]
  *             if h < 0:             # <<<<<<<<<<<<<<
@@ -19881,7 +21255,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     __pyx_t_5 = (__pyx_cur_scope->__pyx_v_h < 0);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":60
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":60
  *             h = self.lcp.arr[i]
  *             if h < 0:
  *                 h = 0             # <<<<<<<<<<<<<<
@@ -19893,7 +21267,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     }
     __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":61
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":61
  *             if h < 0:
  *                 h = 0
  *             for n from h <= n < max_n:             # <<<<<<<<<<<<<<
@@ -19903,7 +21277,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     __pyx_t_6 = __pyx_cur_scope->__pyx_v_max_n;
     for (__pyx_cur_scope->__pyx_v_n = __pyx_cur_scope->__pyx_v_h; __pyx_cur_scope->__pyx_v_n < __pyx_t_6; __pyx_cur_scope->__pyx_v_n++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":62
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":62
  *                 h = 0
  *             for n from h <= n < max_n:
  *                 rs = run_start.arr[n]             # <<<<<<<<<<<<<<
@@ -19912,7 +21286,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
       __pyx_cur_scope->__pyx_v_rs = (__pyx_cur_scope->__pyx_v_run_start->arr[__pyx_cur_scope->__pyx_v_n]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":63
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":63
  *             for n from h <= n < max_n:
  *                 rs = run_start.arr[n]
  *                 run_start.arr[n] = i             # <<<<<<<<<<<<<<
@@ -19921,7 +21295,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
       (__pyx_cur_scope->__pyx_v_run_start->arr[__pyx_cur_scope->__pyx_v_n]) = __pyx_cur_scope->__pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":64
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":64
  *                 rs = run_start.arr[n]
  *                 run_start.arr[n] = i
  *                 freq = i - rs             # <<<<<<<<<<<<<<
@@ -19930,7 +21304,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
       __pyx_cur_scope->__pyx_v_freq = (__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_rs);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":65
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":65
  *                 run_start.arr[n] = i
  *                 freq = i - rs
  *                 if freq > 1000: # arbitrary, but see note below             # <<<<<<<<<<<<<<
@@ -19940,7 +21314,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
       __pyx_t_5 = (__pyx_cur_scope->__pyx_v_freq > 1000);
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":66
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":66
  *                 freq = i - rs
  *                 if freq > 1000: # arbitrary, but see note below
  *                     veb._insert(freq)             # <<<<<<<<<<<<<<
@@ -19949,7 +21323,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
         ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_cur_scope->__pyx_v_veb->__pyx_vtab)->_insert(__pyx_cur_scope->__pyx_v_veb, __pyx_cur_scope->__pyx_v_freq);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":67
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":67
  *                 if freq > 1000: # arbitrary, but see note below
  *                     veb._insert(freq)
  *                     ngram_start = ngram_starts[n]             # <<<<<<<<<<<<<<
@@ -19965,7 +21339,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
         __pyx_cur_scope->__pyx_v_ngram_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
         __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":68
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":68
  *                     veb._insert(freq)
  *                     ngram_start = ngram_starts[n]
  *                     while ngram_start.arr[freq] > 0:             # <<<<<<<<<<<<<<
@@ -19976,7 +21350,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_t_5 = ((__pyx_cur_scope->__pyx_v_ngram_start->arr[__pyx_cur_scope->__pyx_v_freq]) > 0);
           if (!__pyx_t_5) break;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":69
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":69
  *                     ngram_start = ngram_starts[n]
  *                     while ngram_start.arr[freq] > 0:
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram             # <<<<<<<<<<<<<<
@@ -19986,7 +21360,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_cur_scope->__pyx_v_freq = (__pyx_cur_scope->__pyx_v_freq + 1);
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":70
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":70
  *                     while ngram_start.arr[freq] > 0:
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram
  *                     ngram_start.arr[freq] = rs             # <<<<<<<<<<<<<<
@@ -20000,7 +21374,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":71
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram
  *                     ngram_start.arr[freq] = rs
  *         i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -20009,7 +21383,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
   __pyx_cur_scope->__pyx_v_i = __pyx_cur_scope->__pyx_v_veb->veb->min_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":72
  *                     ngram_start.arr[freq] = rs
  *         i = veb.veb.min_val
  *         while i != -1:             # <<<<<<<<<<<<<<
@@ -20020,7 +21394,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     __pyx_t_5 = (__pyx_cur_scope->__pyx_v_i != -1);
     if (!__pyx_t_5) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":73
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":73
  *         i = veb.veb.min_val
  *         while i != -1:
  *             ii = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -20029,7 +21403,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
     __pyx_cur_scope->__pyx_v_ii = ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_cur_scope->__pyx_v_veb->__pyx_vtab)->_findsucc(__pyx_cur_scope->__pyx_v_veb, __pyx_cur_scope->__pyx_v_i);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":74
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":74
  *         while i != -1:
  *             ii = veb._findsucc(i)
  *             for n from 0 <= n < max_n:             # <<<<<<<<<<<<<<
@@ -20039,7 +21413,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     __pyx_t_2 = __pyx_cur_scope->__pyx_v_max_n;
     for (__pyx_cur_scope->__pyx_v_n = 0; __pyx_cur_scope->__pyx_v_n < __pyx_t_2; __pyx_cur_scope->__pyx_v_n++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":75
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":75
  *             ii = veb._findsucc(i)
  *             for n from 0 <= n < max_n:
  *                 ngram_start = ngram_starts[n]             # <<<<<<<<<<<<<<
@@ -20055,7 +21429,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
       __pyx_cur_scope->__pyx_v_ngram_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
       __pyx_t_1 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":76
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":76
  *             for n from 0 <= n < max_n:
  *                 ngram_start = ngram_starts[n]
  *                 iii = i             # <<<<<<<<<<<<<<
@@ -20064,7 +21438,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
       __pyx_cur_scope->__pyx_v_iii = __pyx_cur_scope->__pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":77
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":77
  *                 ngram_start = ngram_starts[n]
  *                 iii = i
  *                 rs = ngram_start.arr[iii]             # <<<<<<<<<<<<<<
@@ -20073,7 +21447,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
       __pyx_cur_scope->__pyx_v_rs = (__pyx_cur_scope->__pyx_v_ngram_start->arr[__pyx_cur_scope->__pyx_v_iii]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":78
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":78
  *                 iii = i
  *                 rs = ngram_start.arr[iii]
  *                 while (ii==-1 or iii < ii) and rs != 0:             # <<<<<<<<<<<<<<
@@ -20096,16 +21470,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
         }
         if (!__pyx_t_7) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":79
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":79
  *                 rs = ngram_start.arr[iii]
  *                 while (ii==-1 or iii < ii) and rs != 0:
  *                     j = self.sa.sa.arr[rs]             # <<<<<<<<<<<<<<
  *                     valid = 1
  *                     for k from 0 <= k < n+1:
  */
-        __pyx_cur_scope->__pyx_v_j = (((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
+        __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_self->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":80
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":80
  *                 while (ii==-1 or iii < ii) and rs != 0:
  *                     j = self.sa.sa.arr[rs]
  *                     valid = 1             # <<<<<<<<<<<<<<
@@ -20114,7 +21488,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
         __pyx_cur_scope->__pyx_v_valid = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":81
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":81
  *                     j = self.sa.sa.arr[rs]
  *                     valid = 1
  *                     for k from 0 <= k < n+1:             # <<<<<<<<<<<<<<
@@ -20124,17 +21498,17 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
         __pyx_t_9 = (__pyx_cur_scope->__pyx_v_n + 1);
         for (__pyx_cur_scope->__pyx_v_k = 0; __pyx_cur_scope->__pyx_v_k < __pyx_t_9; __pyx_cur_scope->__pyx_v_k++) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":82
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":82
  *                     valid = 1
  *                     for k from 0 <= k < n+1:
  *                         if self.sa.darray.data.arr[j+k] < 2:             # <<<<<<<<<<<<<<
  *                             valid = 0
  *                     if valid:
  */
-          __pyx_t_7 = ((((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
+          __pyx_t_7 = ((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":83
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":83
  *                     for k from 0 <= k < n+1:
  *                         if self.sa.darray.data.arr[j+k] < 2:
  *                             valid = 0             # <<<<<<<<<<<<<<
@@ -20147,7 +21521,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_L22:;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":84
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":84
  *                         if self.sa.darray.data.arr[j+k] < 2:
  *                             valid = 0
  *                     if valid:             # <<<<<<<<<<<<<<
@@ -20156,7 +21530,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
         if (__pyx_cur_scope->__pyx_v_valid) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":85
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":85
  *                             valid = 0
  *                     if valid:
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])             # <<<<<<<<<<<<<<
@@ -20164,13 +21538,13 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *                     iii = iii + 1
  */
           __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __Pyx_GOTREF(__pyx_t_1);
           __pyx_t_9 = (__pyx_cur_scope->__pyx_v_n + 1);
           for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_9; __pyx_t_6+=1) {
             __pyx_cur_scope->__pyx_v_k = __pyx_t_6;
-            __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           }
           __pyx_t_3 = ((PyObject *)PyList_AsTuple(__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -20182,7 +21556,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_cur_scope->__pyx_v_ngram = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":86
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":86
  *                     if valid:
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])
  *                         yield i, n+1, ngram             # <<<<<<<<<<<<<<
@@ -20194,7 +21568,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_t_1 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_n + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+          __Pyx_GOTREF(__pyx_t_10);
           PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
@@ -20210,7 +21584,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __Pyx_XGIVEREF(__pyx_r);
           __Pyx_RefNannyFinishContext();
           /* return from generator, yielding value */
-          __pyx_cur_scope->__pyx_base.resume_label = 1;
+          __pyx_generator->resume_label = 1;
           return __pyx_r;
           __pyx_L26_resume_from_yield:;
           __pyx_t_2 = __pyx_cur_scope->__pyx_t_0;
@@ -20219,7 +21593,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
         }
         __pyx_L23:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":87
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":87
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])
  *                         yield i, n+1, ngram
  *                     iii = iii + 1             # <<<<<<<<<<<<<<
@@ -20228,7 +21602,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
         __pyx_cur_scope->__pyx_v_iii = (__pyx_cur_scope->__pyx_v_iii + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":88
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":88
  *                         yield i, n+1, ngram
  *                     iii = iii + 1
  *                     rs = ngram_start.arr[iii]             # <<<<<<<<<<<<<<
@@ -20238,14 +21612,14 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
       }
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":89
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":89
  *                     iii = iii + 1
  *                     rs = ngram_start.arr[iii]
  *             i = ii             # <<<<<<<<<<<<<<
  */
     __pyx_cur_scope->__pyx_v_i = __pyx_cur_scope->__pyx_v_ii;
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -20254,12 +21628,27 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __Pyx_AddTraceback("compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":12
+/* Python wrapper */
+static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_8Alphabet___cinit__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":12
  *     cdef dict id2sym
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -20267,20 +21656,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *         self.nonterminals = StringMap()
  */
 
-static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":13
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":13
  * 
  *     def __cinit__(self):
  *         self.terminals = StringMap()             # <<<<<<<<<<<<<<
@@ -20290,12 +21675,12 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals));
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->terminals);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->terminals));
+  __pyx_v_self->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":14
  *     def __cinit__(self):
  *         self.terminals = StringMap()
  *         self.nonterminals = StringMap()             # <<<<<<<<<<<<<<
@@ -20305,12 +21690,12 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals));
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->nonterminals);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->nonterminals));
+  __pyx_v_self->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":15
  *         self.terminals = StringMap()
  *         self.nonterminals = StringMap()
  *         self.id2sym = {}             # <<<<<<<<<<<<<<
@@ -20320,19 +21705,19 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym));
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->id2sym);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->id2sym));
+  __pyx_v_self->id2sym = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":16
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":16
  *         self.nonterminals = StringMap()
  *         self.id2sym = {}
  *         self.first_nonterminal = -1             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->first_nonterminal = -1;
+  __pyx_v_self->first_nonterminal = -1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -20345,7 +21730,16 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":18
+/* Python wrapper */
+static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_8Alphabet_2__dealloc__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":18
  *         self.first_nonterminal = -1
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -20353,15 +21747,14 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
  * 
  */
 
-static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":21
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":21
  *         pass
  * 
  *     cdef int isvar(self, int sym):             # <<<<<<<<<<<<<<
@@ -20369,12 +21762,12 @@ static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_isvar(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("isvar");
+  __Pyx_RefNannySetupContext("isvar", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":22
  * 
  *     cdef int isvar(self, int sym):
  *         return sym < 0             # <<<<<<<<<<<<<<
@@ -20390,7 +21783,7 @@ static int __pyx_f_3_sa_8Alphabet_isvar(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":24
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":24
  *         return sym < 0
  * 
  *     cdef int isword(self, int sym):             # <<<<<<<<<<<<<<
@@ -20398,12 +21791,12 @@ static int __pyx_f_3_sa_8Alphabet_isvar(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_isword(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("isword");
+  __Pyx_RefNannySetupContext("isword", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":25
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":25
  * 
  *     cdef int isword(self, int sym):
  *         return sym >= 0             # <<<<<<<<<<<<<<
@@ -20419,7 +21812,7 @@ static int __pyx_f_3_sa_8Alphabet_isword(struct __pyx_obj_3_sa_Alphabet *__pyx_v
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":27
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":27
  *         return sym >= 0
  * 
  *     cdef int getindex(self, int sym):             # <<<<<<<<<<<<<<
@@ -20427,12 +21820,12 @@ static int __pyx_f_3_sa_8Alphabet_isword(struct __pyx_obj_3_sa_Alphabet *__pyx_v
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_getindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getindex");
+  __Pyx_RefNannySetupContext("getindex", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":28
  * 
  *     cdef int getindex(self, int sym):
  *         return -sym & INDEX_MASK             # <<<<<<<<<<<<<<
@@ -20448,7 +21841,7 @@ static int __pyx_f_3_sa_8Alphabet_getindex(struct __pyx_obj_3_sa_Alphabet *__pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":30
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":30
  *         return -sym & INDEX_MASK
  * 
  *     cdef int setindex(self, int sym, int ind):             # <<<<<<<<<<<<<<
@@ -20456,12 +21849,12 @@ static int __pyx_f_3_sa_8Alphabet_getindex(struct __pyx_obj_3_sa_Alphabet *__pyx
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_setindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym, int __pyx_v_ind) {
+static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym, int __pyx_v_ind) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("setindex");
+  __Pyx_RefNannySetupContext("setindex", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":31
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":31
  * 
  *     cdef int setindex(self, int sym, int ind):
  *         return -(-sym & ~INDEX_MASK | ind)             # <<<<<<<<<<<<<<
@@ -20477,7 +21870,7 @@ static int __pyx_f_3_sa_8Alphabet_setindex(struct __pyx_obj_3_sa_Alphabet *__pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":33
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":33
  *         return -(-sym & ~INDEX_MASK | ind)
  * 
  *     cdef int clearindex(self, int sym):             # <<<<<<<<<<<<<<
@@ -20485,12 +21878,12 @@ static int __pyx_f_3_sa_8Alphabet_setindex(struct __pyx_obj_3_sa_Alphabet *__pyx
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_clearindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("clearindex");
+  __Pyx_RefNannySetupContext("clearindex", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":34
  * 
  *     cdef int clearindex(self, int sym):
  *         return -(-sym& ~INDEX_MASK)             # <<<<<<<<<<<<<<
@@ -20506,7 +21899,7 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":36
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":36
  *         return -(-sym& ~INDEX_MASK)
  * 
  *     cdef int match(self, int sym1, int sym2):             # <<<<<<<<<<<<<<
@@ -20517,9 +21910,9 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(struct __pyx_obj_3_sa_Alphabet *__p
 static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym1, int __pyx_v_sym2) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("match");
+  __Pyx_RefNannySetupContext("match", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":37
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":37
  * 
  *     cdef int match(self, int sym1, int sym2):
  *         return self.clearindex(sym1) == self.clearindex(sym2);             # <<<<<<<<<<<<<<
@@ -20535,7 +21928,7 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":39
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":39
  *         return self.clearindex(sym1) == self.clearindex(sym2);
  * 
  *     cdef char* tocat(self, int sym):             # <<<<<<<<<<<<<<
@@ -20546,9 +21939,9 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
 static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("tocat");
+  __Pyx_RefNannySetupContext("tocat", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":40
  * 
  *     cdef char* tocat(self, int sym):
  *         return self.nonterminals.word((-sym >> INDEX_SHIFT)-1)             # <<<<<<<<<<<<<<
@@ -20564,7 +21957,7 @@ static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":42
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":42
  *         return self.nonterminals.word((-sym >> INDEX_SHIFT)-1)
  * 
  *     cdef int fromcat(self, char *s):             # <<<<<<<<<<<<<<
@@ -20577,9 +21970,9 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("fromcat");
+  __Pyx_RefNannySetupContext("fromcat", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":44
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":44
  *     cdef int fromcat(self, char *s):
  *         cdef int i
  *         i = self.nonterminals.index(s)             # <<<<<<<<<<<<<<
@@ -20588,7 +21981,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
  */
   __pyx_v_i = ((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_self->nonterminals->__pyx_vtab)->index(__pyx_v_self->nonterminals, __pyx_v_s);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":45
  *         cdef int i
  *         i = self.nonterminals.index(s)
  *         if self.first_nonterminal == -1:             # <<<<<<<<<<<<<<
@@ -20598,7 +21991,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   __pyx_t_1 = (__pyx_v_self->first_nonterminal == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":46
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":46
  *         i = self.nonterminals.index(s)
  *         if self.first_nonterminal == -1:
  *             self.first_nonterminal = i             # <<<<<<<<<<<<<<
@@ -20610,7 +22003,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":47
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":47
  *         if self.first_nonterminal == -1:
  *             self.first_nonterminal = i
  *         if i > self.last_nonterminal:             # <<<<<<<<<<<<<<
@@ -20620,7 +22013,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   __pyx_t_1 = (__pyx_v_i > __pyx_v_self->last_nonterminal);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":48
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":48
  *             self.first_nonterminal = i
  *         if i > self.last_nonterminal:
  *             self.last_nonterminal = i             # <<<<<<<<<<<<<<
@@ -20632,7 +22025,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":49
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":49
  *         if i > self.last_nonterminal:
  *             self.last_nonterminal = i
  *         return -(i+1 << INDEX_SHIFT)             # <<<<<<<<<<<<<<
@@ -20648,7 +22041,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":51
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":51
  *         return -(i+1 << INDEX_SHIFT)
  * 
  *     cdef char* tostring(self, int sym):             # <<<<<<<<<<<<<<
@@ -20669,9 +22062,9 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("tostring");
+  __Pyx_RefNannySetupContext("tostring", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":53
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":53
  *     cdef char* tostring(self, int sym):
  *         cdef int ind
  *         if self.isvar(sym):             # <<<<<<<<<<<<<<
@@ -20681,7 +22074,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_self->__pyx_vtab)->isvar(__pyx_v_self, __pyx_v_sym);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":54
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":54
  *         cdef int ind
  *         if self.isvar(sym):
  *             if sym in self.id2sym:             # <<<<<<<<<<<<<<
@@ -20691,19 +22084,24 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_2 = PyInt_FromLong(__pyx_v_sym); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    __pyx_t_3 = ((PyDict_Contains(((PyObject *)__pyx_v_self->id2sym), __pyx_t_2))); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = (__Pyx_PyDict_Contains(__pyx_t_2, ((PyObject *)__pyx_v_self->id2sym), Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":55
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":55
  *         if self.isvar(sym):
  *             if sym in self.id2sym:
  *                 return self.id2sym[sym]             # <<<<<<<<<<<<<<
  *             ind = self.getindex(sym)
  *             if ind > 0:
  */
+      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
       __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_4 = PyBytes_AsString(__pyx_t_2); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -20714,7 +22112,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":56
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":56
  *             if sym in self.id2sym:
  *                 return self.id2sym[sym]
  *             ind = self.getindex(sym)             # <<<<<<<<<<<<<<
@@ -20723,7 +22121,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_ind = ((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_self->__pyx_vtab)->getindex(__pyx_v_self, __pyx_v_sym);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":57
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":57
  *                 return self.id2sym[sym]
  *             ind = self.getindex(sym)
  *             if ind > 0:             # <<<<<<<<<<<<<<
@@ -20733,7 +22131,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_3 = (__pyx_v_ind > 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":58
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":58
  *             ind = self.getindex(sym)
  *             if ind > 0:
  *                 self.id2sym[sym] = "[%s,%d]" % (self.tocat(sym), ind)             # <<<<<<<<<<<<<<
@@ -20745,7 +22143,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_5 = PyInt_FromLong(__pyx_v_ind); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+      __Pyx_GOTREF(__pyx_t_6);
       PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -20755,13 +22153,17 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_64), ((PyObject *)__pyx_t_6)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
+      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
       if (__Pyx_SetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, ((PyObject *)__pyx_t_5), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":60
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":60
  *                 self.id2sym[sym] = "[%s,%d]" % (self.tocat(sym), ind)
  *             else:
  *                 self.id2sym[sym] = "[%s]" % self.tocat(sym)             # <<<<<<<<<<<<<<
@@ -20773,18 +22175,26 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_65), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
+      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
       if (__Pyx_SetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, ((PyObject *)__pyx_t_6), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":61
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":61
  *             else:
  *                 self.id2sym[sym] = "[%s]" % self.tocat(sym)
  *             return self.id2sym[sym]             # <<<<<<<<<<<<<<
  *         else:
  *             return self.terminals.word(sym)
  */
+    if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
     __pyx_t_6 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, sizeof(int), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_4 = PyBytes_AsString(__pyx_t_6); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -20795,7 +22205,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":63
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":63
  *             return self.id2sym[sym]
  *         else:
  *             return self.terminals.word(sym)             # <<<<<<<<<<<<<<
@@ -20820,7 +22230,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":65
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":65
  *             return self.terminals.word(sym)
  * 
  *     cdef int fromstring(self, char *s, bint terminal):             # <<<<<<<<<<<<<<
@@ -20846,9 +22256,9 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("fromstring");
+  __Pyx_RefNannySetupContext("fromstring", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":69
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":69
  *         cdef char *comma
  *         cdef int n
  *         n = strlen(s)             # <<<<<<<<<<<<<<
@@ -20857,7 +22267,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
   __pyx_v_n = strlen(__pyx_v_s);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":71
  *         n = strlen(s)
  *         cdef char *sep
  *         sep = strstr(s,"_SEP_")             # <<<<<<<<<<<<<<
@@ -20866,7 +22276,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
   __pyx_v_sep = strstr(__pyx_v_s, __pyx_k___SEP_);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":72
  *         cdef char *sep
  *         sep = strstr(s,"_SEP_")
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:             # <<<<<<<<<<<<<<
@@ -20894,7 +22304,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":73
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":73
  *         sep = strstr(s,"_SEP_")
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:
  *             if terminal:             # <<<<<<<<<<<<<<
@@ -20903,7 +22313,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     if (__pyx_v_terminal) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":74
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":74
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:
  *             if terminal:
  *                 s1 = "\\"+s             # <<<<<<<<<<<<<<
@@ -20918,7 +22328,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_v_s1 = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":75
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":75
  *             if terminal:
  *                 s1 = "\\"+s
  *                 return self.terminals.index(s1)             # <<<<<<<<<<<<<<
@@ -20932,7 +22342,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":76
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":76
  *                 s1 = "\\"+s
  *                 return self.terminals.index(s1)
  *             s[n-1] = c'\0'             # <<<<<<<<<<<<<<
@@ -20941,7 +22351,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     (__pyx_v_s[(__pyx_v_n - 1)]) = '\x00';
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":77
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":77
  *                 return self.terminals.index(s1)
  *             s[n-1] = c'\0'
  *             s = s + 1             # <<<<<<<<<<<<<<
@@ -20950,7 +22360,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_s = (__pyx_v_s + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":78
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":78
  *             s[n-1] = c'\0'
  *             s = s + 1
  *             comma = strrchr(s, c',')             # <<<<<<<<<<<<<<
@@ -20959,7 +22369,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_comma = strrchr(__pyx_v_s, ',');
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":79
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":79
  *             s = s + 1
  *             comma = strrchr(s, c',')
  *             if comma != NULL:             # <<<<<<<<<<<<<<
@@ -20969,7 +22379,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_2 = (__pyx_v_comma != NULL);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":80
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":80
  *             comma = strrchr(s, c',')
  *             if comma != NULL:
  *                 comma[0] = c'\0'             # <<<<<<<<<<<<<<
@@ -20978,7 +22388,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
       (__pyx_v_comma[0]) = '\x00';
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":81
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":81
  *             if comma != NULL:
  *                 comma[0] = c'\0'
  *                 return self.setindex(self.fromcat(s), strtol(comma+1, NULL, 10))             # <<<<<<<<<<<<<<
@@ -20991,7 +22401,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":83
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":83
  *                 return self.setindex(self.fromcat(s), strtol(comma+1, NULL, 10))
  *             else:
  *                 return self.fromcat(s)             # <<<<<<<<<<<<<<
@@ -21006,7 +22416,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":85
  *                 return self.fromcat(s)
  *         else:
  *             return self.terminals.index(s)             # <<<<<<<<<<<<<<
@@ -21031,7 +22441,18 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":8
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8Alphabet_9terminals___get__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":8
  * 
  * cdef class Alphabet:
  *     cdef readonly StringMap terminals, nonterminals             # <<<<<<<<<<<<<<
@@ -21039,14 +22460,13 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  *     cdef dict id2sym
  */
 
-static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->terminals));
+  __pyx_r = ((PyObject *)__pyx_v_self->terminals);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -21056,14 +22476,24 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8Alphabet_12nonterminals___get__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->nonterminals));
+  __pyx_r = ((PyObject *)__pyx_v_self->nonterminals);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -21073,7 +22503,7 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":89
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":89
  * cdef Alphabet ALPHABET = Alphabet()
  * 
  * cdef char* sym_tostring(int sym):             # <<<<<<<<<<<<<<
@@ -21084,9 +22514,9 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_
 static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_tostring");
+  __Pyx_RefNannySetupContext("sym_tostring", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":90
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":90
  * 
  * cdef char* sym_tostring(int sym):
  *     return ALPHABET.tostring(sym)             # <<<<<<<<<<<<<<
@@ -21102,7 +22532,7 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":92
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":92
  *     return ALPHABET.tostring(sym)
  * 
  * cdef char* sym_tocat(int sym):             # <<<<<<<<<<<<<<
@@ -21113,9 +22543,9 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
 static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_tocat");
+  __Pyx_RefNannySetupContext("sym_tocat", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":93
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":93
  * 
  * cdef char* sym_tocat(int sym):
  *     return ALPHABET.tocat(sym)             # <<<<<<<<<<<<<<
@@ -21131,7 +22561,7 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":95
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":95
  *     return ALPHABET.tocat(sym)
  * 
  * cdef int sym_isvar(int sym):             # <<<<<<<<<<<<<<
@@ -21142,9 +22572,9 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_isvar");
+  __Pyx_RefNannySetupContext("sym_isvar", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":96
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":96
  * 
  * cdef int sym_isvar(int sym):
  *     return ALPHABET.isvar(sym)             # <<<<<<<<<<<<<<
@@ -21160,7 +22590,7 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":98
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":98
  *     return ALPHABET.isvar(sym)
  * 
  * cdef int sym_getindex(int sym):             # <<<<<<<<<<<<<<
@@ -21171,9 +22601,9 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_getindex");
+  __Pyx_RefNannySetupContext("sym_getindex", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":99
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":99
  * 
  * cdef int sym_getindex(int sym):
  *     return ALPHABET.getindex(sym)             # <<<<<<<<<<<<<<
@@ -21189,7 +22619,7 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":101
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":101
  *     return ALPHABET.getindex(sym)
  * 
  * cdef int sym_setindex(int sym, int id):             # <<<<<<<<<<<<<<
@@ -21200,9 +22630,9 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_setindex");
+  __Pyx_RefNannySetupContext("sym_setindex", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":102
  * 
  * cdef int sym_setindex(int sym, int id):
  *     return ALPHABET.setindex(sym, id)             # <<<<<<<<<<<<<<
@@ -21218,52 +22648,40 @@ static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
- *     return ALPHABET.setindex(sym, id)
- * 
- * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
- *     return ALPHABET.fromstring(string, terminal)
- */
-
-static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_1sym_fromstring = {__Pyx_NAMESTR("sym_fromstring"), (PyCFunction)__pyx_pf_3_sa_1sym_fromstring, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_3sym_fromstring = {__Pyx_NAMESTR("sym_fromstring"), (PyCFunction)__pyx_pw_3_sa_3sym_fromstring, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_3sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_string;
   int __pyx_v_terminal;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__string,&__pyx_n_s__terminal,0};
-  __Pyx_RefNannySetupContext("sym_fromstring");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("sym_fromstring (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__string,&__pyx_n_s__terminal,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__string);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__string)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__terminal);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__terminal)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("sym_fromstring", 1, 2, 2, 1); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "sym_fromstring") < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "sym_fromstring") < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -21282,8 +22700,28 @@ static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *_
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_2sym_fromstring(__pyx_self, __pyx_v_string, __pyx_v_terminal);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":104
+ *     return ALPHABET.setindex(sym, id)
+ * 
+ * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
+ *     return ALPHABET.fromstring(string, terminal)
+ */
+
+static PyObject *__pyx_pf_3_sa_2sym_fromstring(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_string, int __pyx_v_terminal) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("sym_fromstring", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":105
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":105
  * 
  * def sym_fromstring(char* string, bint terminal):
  *     return ALPHABET.fromstring(string, terminal)             # <<<<<<<<<<<<<<
@@ -21307,50 +22745,32 @@ static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":6
- * cdef class Phrase:
- * 
- *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
- *         cdef int i, j, n, n_vars
- *         n_vars = 0
- */
-
-static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_words = 0;
-  int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_n;
-  int __pyx_v_n_vars;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__words,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__words,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__words);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__words)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -21367,8 +22787,36 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_6Phrase___cinit__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_v_words);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":6
+ * cdef class Phrase:
+ * 
+ *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
+ *         cdef int i, j, n, n_vars
+ *         n_vars = 0
+ */
+
+static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_words) {
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_n;
+  int __pyx_v_n_vars;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  Py_ssize_t __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":8
  *     def __cinit__(self, words):
  *         cdef int i, j, n, n_vars
  *         n_vars = 0             # <<<<<<<<<<<<<<
@@ -21377,7 +22825,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  */
   __pyx_v_n_vars = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":9
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":9
  *         cdef int i, j, n, n_vars
  *         n_vars = 0
  *         n = len(words)             # <<<<<<<<<<<<<<
@@ -21387,16 +22835,16 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   __pyx_t_1 = PyObject_Length(__pyx_v_words); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_n = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":10
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":10
  *         n_vars = 0
  *         n = len(words)
  *         self.syms = <int *>malloc(n*sizeof(int))             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
+  __pyx_v_self->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":11
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":11
  *         n = len(words)
  *         self.syms = <int *>malloc(n*sizeof(int))
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -21406,7 +22854,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   __pyx_t_2 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":12
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":12
  *         self.syms = <int *>malloc(n*sizeof(int))
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]             # <<<<<<<<<<<<<<
@@ -21417,19 +22865,19 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) = __pyx_t_4;
+    (__pyx_v_self->syms[__pyx_v_i]) = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":13
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":13
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
  *                 n_vars += 1
  *         self.n = n
  */
-    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":14
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":14
  *             self.syms[i] = words[i]
  *             if sym_isvar(self.syms[i]):
  *                 n_vars += 1             # <<<<<<<<<<<<<<
@@ -21437,39 +22885,39 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *         self.n_vars = n_vars
  */
       __pyx_v_n_vars = (__pyx_v_n_vars + 1);
-      goto __pyx_L8;
+      goto __pyx_L5;
     }
-    __pyx_L8:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":15
  *             if sym_isvar(self.syms[i]):
  *                 n_vars += 1
  *         self.n = n             # <<<<<<<<<<<<<<
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n = __pyx_v_n;
+  __pyx_v_self->n = __pyx_v_n;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":16
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":16
  *                 n_vars += 1
  *         self.n = n
  *         self.n_vars = n_vars             # <<<<<<<<<<<<<<
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars = __pyx_v_n_vars;
+  __pyx_v_self->n_vars = __pyx_v_n_vars;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":17
  *         self.n = n
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))             # <<<<<<<<<<<<<<
  *         j = 0
  *         for i from 0 <= i < n:
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
+  __pyx_v_self->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":18
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0             # <<<<<<<<<<<<<<
@@ -21478,7 +22926,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  */
   __pyx_v_j = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":19
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":19
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -21488,26 +22936,26 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   __pyx_t_2 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":20
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":20
  *         j = 0
  *         for i from 0 <= i < n:
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
  *                 self.varpos[j] = i
  *                 j = j + 1
  */
-    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":21
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":21
  *         for i from 0 <= i < n:
  *             if sym_isvar(self.syms[i]):
  *                 self.varpos[j] = i             # <<<<<<<<<<<<<<
  *                 j = j + 1
  * 
  */
-      (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_v_j]) = __pyx_v_i;
+      (__pyx_v_self->varpos[__pyx_v_j]) = __pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":22
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":22
  *             if sym_isvar(self.syms[i]):
  *                 self.varpos[j] = i
  *                 j = j + 1             # <<<<<<<<<<<<<<
@@ -21515,9 +22963,9 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *     def __dealloc__(self):
  */
       __pyx_v_j = (__pyx_v_j + 1);
-      goto __pyx_L11;
+      goto __pyx_L8;
     }
-    __pyx_L11:;
+    __pyx_L8:;
   }
 
   __pyx_r = 0;
@@ -21531,7 +22979,16 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":24
+/* Python wrapper */
+static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_6Phrase_2__dealloc__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":24
  *                 j = j + 1
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -21539,33 +22996,43 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *         free(self.varpos)
  */
 
-static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":25
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":25
  * 
  *     def __dealloc__(self):
  *         free(self.syms)             # <<<<<<<<<<<<<<
  *         free(self.varpos)
  * 
  */
-  free(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms);
+  free(__pyx_v_self->syms);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":26
  *     def __dealloc__(self):
  *         free(self.syms)
  *         free(self.varpos)             # <<<<<<<<<<<<<<
  * 
  *     def __str__(self):
  */
-  free(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos);
+  free(__pyx_v_self->varpos);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":28
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_4__str__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":28
  *         free(self.varpos)
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -21573,8 +23040,7 @@ static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self) {
  *         cdef int i, s
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_v_strs = NULL;
   int __pyx_v_i;
   int __pyx_v_s;
@@ -21588,9 +23054,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":29
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":29
  * 
  *     def __str__(self):
  *         strs = []             # <<<<<<<<<<<<<<
@@ -21598,46 +23064,43 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
  *         for i from 0 <= i < self.n:
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":31
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":31
  *         strs = []
  *         cdef int i, s
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":32
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":32
  *         cdef int i, s
  *         for i from 0 <= i < self.n:
  *             s = self.syms[i]             # <<<<<<<<<<<<<<
  *             strs.append(sym_tostring(s))
  *         return ' '.join(strs)
  */
-    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]);
+    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":33
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":33
  *         for i from 0 <= i < self.n:
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))             # <<<<<<<<<<<<<<
  *         return ' '.join(strs)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_strs) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_v_s)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_3 = PyList_Append(__pyx_v_strs, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":34
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))
  *         return ' '.join(strs)             # <<<<<<<<<<<<<<
@@ -21648,7 +23111,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(((PyObject *)__pyx_v_strs));
   PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_strs));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_strs));
@@ -21675,7 +23138,19 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":36
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_3_sa_6Phrase_6handle[] = "return a hashable representation that normalizes the ordering\n        of the nonterminal indices";
+static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("handle (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_6handle(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":36
  *         return ' '.join(strs)
  * 
  *     def handle(self):             # <<<<<<<<<<<<<<
@@ -21683,9 +23158,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
  *         of the nonterminal indices"""
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static char __pyx_doc_3_sa_6Phrase_3handle[] = "return a hashable representation that normalizes the ordering\n        of the nonterminal indices";
-static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_v_norm = NULL;
   int __pyx_v_i;
   int __pyx_v_j;
@@ -21699,9 +23172,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("handle");
+  __Pyx_RefNannySetupContext("handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":39
  *         """return a hashable representation that normalizes the ordering
  *         of the nonterminal indices"""
  *         norm = []             # <<<<<<<<<<<<<<
@@ -21709,11 +23182,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *         i = 1
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":41
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":41
  *         norm = []
  *         cdef int i, j, s
  *         i = 1             # <<<<<<<<<<<<<<
@@ -21722,7 +23195,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  */
   __pyx_v_i = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":42
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":42
  *         cdef int i, j, s
  *         i = 1
  *         j = 0             # <<<<<<<<<<<<<<
@@ -21731,26 +23204,26 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  */
   __pyx_v_j = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":43
  *         i = 1
  *         j = 0
  *         for j from 0 <= j < self.n:             # <<<<<<<<<<<<<<
  *             s = self.syms[j]
  *             if sym_isvar(s):
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":44
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":44
  *         j = 0
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]             # <<<<<<<<<<<<<<
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  */
-    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_j]);
+    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":45
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":45
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]
  *             if sym_isvar(s):             # <<<<<<<<<<<<<<
@@ -21760,7 +23233,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
     __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_v_s);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":46
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":46
  *             s = self.syms[j]
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)             # <<<<<<<<<<<<<<
@@ -21769,7 +23242,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  */
       __pyx_v_s = __pyx_f_3_sa_sym_setindex(__pyx_v_s, __pyx_v_i);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":47
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":47
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  *                 i = i + 1             # <<<<<<<<<<<<<<
@@ -21777,27 +23250,24 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *         return tuple(norm)
  */
       __pyx_v_i = (__pyx_v_i + 1);
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":48
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":48
  *                 s = sym_setindex(s,i)
  *                 i = i + 1
  *             norm.append(s)             # <<<<<<<<<<<<<<
  *         return tuple(norm)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyInt_FromLong(__pyx_v_s); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyList_Append(__pyx_v_norm, __pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":49
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":49
  *                 i = i + 1
  *             norm.append(s)
  *         return tuple(norm)             # <<<<<<<<<<<<<<
@@ -21805,9 +23275,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *     def strhandle(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
   __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_v_norm)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_r = ((PyObject *)__pyx_t_1);
@@ -21827,7 +23294,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":51
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("strhandle (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_8strhandle(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":51
  *         return tuple(norm)
  * 
  *     def strhandle(self):             # <<<<<<<<<<<<<<
@@ -21835,9 +23313,8 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *         norm = []
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_v_strs = NULL;
+static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *__pyx_v_strs = NULL;
   PyObject *__pyx_v_norm = NULL;
   int __pyx_v_i;
   int __pyx_v_j;
@@ -21853,9 +23330,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("strhandle");
+  __Pyx_RefNannySetupContext("strhandle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":52
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":52
  * 
  *     def strhandle(self):
  *         strs = []             # <<<<<<<<<<<<<<
@@ -21863,11 +23340,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *         cdef int i, j, s
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":53
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":53
  *     def strhandle(self):
  *         strs = []
  *         norm = []             # <<<<<<<<<<<<<<
@@ -21875,11 +23352,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *         i = 1
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":55
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":55
  *         norm = []
  *         cdef int i, j, s
  *         i = 1             # <<<<<<<<<<<<<<
@@ -21888,7 +23365,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  */
   __pyx_v_i = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":56
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":56
  *         cdef int i, j, s
  *         i = 1
  *         j = 0             # <<<<<<<<<<<<<<
@@ -21897,26 +23374,26 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  */
   __pyx_v_j = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":57
  *         i = 1
  *         j = 0
  *         for j from 0 <= j < self.n:             # <<<<<<<<<<<<<<
  *             s = self.syms[j]
  *             if sym_isvar(s):
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":58
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":58
  *         j = 0
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]             # <<<<<<<<<<<<<<
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  */
-    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_j]);
+    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":59
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":59
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]
  *             if sym_isvar(s):             # <<<<<<<<<<<<<<
@@ -21926,7 +23403,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
     __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_v_s);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":60
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":60
  *             s = self.syms[j]
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)             # <<<<<<<<<<<<<<
@@ -21935,7 +23412,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  */
       __pyx_v_s = __pyx_f_3_sa_sym_setindex(__pyx_v_s, __pyx_v_i);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":61
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":61
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  *                 i = i + 1             # <<<<<<<<<<<<<<
@@ -21943,27 +23420,24 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *         return ' '.join(norm)
  */
       __pyx_v_i = (__pyx_v_i + 1);
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":62
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":62
  *                 s = sym_setindex(s,i)
  *                 i = i + 1
  *             norm.append(sym_tostring(s))             # <<<<<<<<<<<<<<
  *         return ' '.join(norm)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_v_s)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyList_Append(__pyx_v_norm, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":63
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":63
  *                 i = i + 1
  *             norm.append(sym_tostring(s))
  *         return ' '.join(norm)             # <<<<<<<<<<<<<<
@@ -21974,7 +23448,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+  __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_norm));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_norm));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_norm));
@@ -22002,7 +23476,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":65
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("arity (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_10arity(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":65
  *         return ' '.join(norm)
  * 
  *     def arity(self):             # <<<<<<<<<<<<<<
@@ -22010,17 +23495,16 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("arity");
+  __Pyx_RefNannySetupContext("arity", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":66
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":66
  * 
  *     def arity(self):
  *         return self.n_vars             # <<<<<<<<<<<<<<
@@ -22028,7 +23512,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNU
  *     def getvarpos(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -22046,7 +23530,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNU
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":68
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getvarpos (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_12getvarpos(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":68
  *         return self.n_vars
  * 
  *     def getvarpos(self, i):             # <<<<<<<<<<<<<<
@@ -22054,8 +23549,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNU
  *             return self.varpos[i]
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -22065,30 +23559,28 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getvarpos");
+  __Pyx_RefNannySetupContext("getvarpos", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":69
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":69
  * 
  *     def getvarpos(self, i):
  *         if 0 <= i < self.n_vars:             # <<<<<<<<<<<<<<
  *             return self.varpos[i]
  *         else:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
     __Pyx_DECREF(__pyx_t_1);
-    __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":70
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":70
  *     def getvarpos(self, i):
  *         if 0 <= i < self.n_vars:
  *             return self.varpos[i]             # <<<<<<<<<<<<<<
@@ -22097,16 +23589,16 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_t_4])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->varpos[__pyx_t_4])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":72
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":72
  *             return self.varpos[i]
  *         else:
  *             raise IndexError             # <<<<<<<<<<<<<<
@@ -22116,7 +23608,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
     __Pyx_Raise(__pyx_builtin_IndexError, 0, 0, 0);
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -22131,7 +23623,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":74
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getvar (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_14getvar(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":74
  *             raise IndexError
  * 
  *     def getvar(self, i):             # <<<<<<<<<<<<<<
@@ -22139,8 +23642,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
  *             return self.syms[self.varpos[i]]
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -22150,30 +23652,28 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getvar");
+  __Pyx_RefNannySetupContext("getvar", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":75
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":75
  * 
  *     def getvar(self, i):
  *         if 0 <= i < self.n_vars:             # <<<<<<<<<<<<<<
  *             return self.syms[self.varpos[i]]
  *         else:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
     __Pyx_DECREF(__pyx_t_1);
-    __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":76
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":76
  *     def getvar(self, i):
  *         if 0 <= i < self.n_vars:
  *             return self.syms[self.varpos[i]]             # <<<<<<<<<<<<<<
@@ -22182,16 +23682,16 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_t_4])])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->syms[(__pyx_v_self->varpos[__pyx_t_4])])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":78
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":78
  *             return self.syms[self.varpos[i]]
  *         else:
  *             raise IndexError             # <<<<<<<<<<<<<<
@@ -22201,7 +23701,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
     __Pyx_Raise(__pyx_builtin_IndexError, 0, 0, 0);
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -22216,7 +23716,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":80
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":80
  *             raise IndexError
  * 
  *     cdef int chunkpos(self, int k):             # <<<<<<<<<<<<<<
@@ -22228,9 +23728,9 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("chunkpos");
+  __Pyx_RefNannySetupContext("chunkpos", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":81
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":81
  * 
  *     cdef int chunkpos(self, int k):
  *         if k == 0:             # <<<<<<<<<<<<<<
@@ -22240,7 +23740,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":82
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":82
  *     cdef int chunkpos(self, int k):
  *         if k == 0:
  *             return 0             # <<<<<<<<<<<<<<
@@ -22253,7 +23753,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":84
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":84
  *             return 0
  *         else:
  *             return self.varpos[k-1]+1             # <<<<<<<<<<<<<<
@@ -22271,7 +23771,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":86
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":86
  *             return self.varpos[k-1]+1
  * 
  *     cdef int chunklen(self, int k):             # <<<<<<<<<<<<<<
@@ -22283,9 +23783,9 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("chunklen");
+  __Pyx_RefNannySetupContext("chunklen", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":87
  * 
  *     cdef int chunklen(self, int k):
  *         if self.n_vars == 0:             # <<<<<<<<<<<<<<
@@ -22295,7 +23795,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_self->n_vars == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":88
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":88
  *     cdef int chunklen(self, int k):
  *         if self.n_vars == 0:
  *             return self.n             # <<<<<<<<<<<<<<
@@ -22307,7 +23807,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":89
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":89
  *         if self.n_vars == 0:
  *             return self.n
  *         elif k == 0:             # <<<<<<<<<<<<<<
@@ -22317,7 +23817,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":90
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":90
  *             return self.n
  *         elif k == 0:
  *             return self.varpos[0]             # <<<<<<<<<<<<<<
@@ -22329,7 +23829,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":91
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":91
  *         elif k == 0:
  *             return self.varpos[0]
  *         elif k == self.n_vars:             # <<<<<<<<<<<<<<
@@ -22339,7 +23839,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == __pyx_v_self->n_vars);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":92
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":92
  *             return self.varpos[0]
  *         elif k == self.n_vars:
  *             return self.n-self.varpos[k-1]-1             # <<<<<<<<<<<<<<
@@ -22352,7 +23852,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":94
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":94
  *             return self.n-self.varpos[k-1]-1
  *         else:
  *             return self.varpos[k]-self.varpos[k-1]-1             # <<<<<<<<<<<<<<
@@ -22370,7 +23870,18 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":96
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("clen (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_16clen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_k));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":96
  *             return self.varpos[k]-self.varpos[k-1]-1
  * 
  *     def clen(self, k):             # <<<<<<<<<<<<<<
@@ -22378,8 +23889,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k) {
+static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_k) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -22387,9 +23897,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("clen");
+  __Pyx_RefNannySetupContext("clen", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":97
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":97
  * 
  *     def clen(self, k):
  *          return self.chunklen(k)             # <<<<<<<<<<<<<<
@@ -22398,7 +23908,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_k); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunklen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -22416,7 +23926,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":99
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getchunk (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_18getchunk(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_ci));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":99
  *          return self.chunklen(k)
  * 
  *     def getchunk(self, ci):             # <<<<<<<<<<<<<<
@@ -22424,8 +23945,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
  *         start = self.chunkpos(ci)
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci) {
+static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_ci) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_chunk = NULL;
@@ -22438,9 +23958,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getchunk");
+  __Pyx_RefNannySetupContext("getchunk", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":101
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":101
  *     def getchunk(self, ci):
  *         cdef int start, stop
  *         start = self.chunkpos(ci)             # <<<<<<<<<<<<<<
@@ -22448,9 +23968,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  *         chunk = []
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunkpos(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1);
+  __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunkpos(__pyx_v_self, __pyx_t_1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":102
  *         cdef int start, stop
  *         start = self.chunkpos(ci)
  *         stop = start+self.chunklen(ci)             # <<<<<<<<<<<<<<
@@ -22458,9 +23978,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  *         for i from start <= i < stop:
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunklen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1));
+  __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":103
  *         start = self.chunkpos(ci)
  *         stop = start+self.chunklen(ci)
  *         chunk = []             # <<<<<<<<<<<<<<
@@ -22468,11 +23988,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  *             chunk.append(self.syms[i])
  */
   __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_chunk = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":104
  *         stop = start+self.chunklen(ci)
  *         chunk = []
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -22482,23 +24002,20 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = __pyx_v_stop;
   for (__pyx_v_i = __pyx_v_start; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":105
  *         chunk = []
  *         for i from start <= i < stop:
  *             chunk.append(self.syms[i])             # <<<<<<<<<<<<<<
  *         return chunk
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_chunk) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->syms[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_3 = PyList_Append(__pyx_v_chunk, __pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":106
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":106
  *         for i from start <= i < stop:
  *             chunk.append(self.syms[i])
  *         return chunk             # <<<<<<<<<<<<<<
@@ -22523,7 +24040,20 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":108
+/* Python wrapper */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cmp__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_20__cmp__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_other));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+#endif /*!(#if PY_MAJOR_VERSION < 3)*/
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":108
  *         return chunk
  * 
  *     def __cmp__(self, other):             # <<<<<<<<<<<<<<
@@ -22532,8 +24062,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  */
 
 #if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_other) {
   struct __pyx_obj_3_sa_Phrase *__pyx_v_otherp = 0;
   int __pyx_v_i;
   int __pyx_r;
@@ -22545,9 +24074,9 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cmp__");
+  __Pyx_RefNannySetupContext("__cmp__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":111
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":111
  *         cdef Phrase otherp
  *         cdef int i
  *         otherp = other             # <<<<<<<<<<<<<<
@@ -22558,7 +24087,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
   __Pyx_INCREF(__pyx_v_other);
   __pyx_v_otherp = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_other);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":112
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":112
  *         cdef int i
  *         otherp = other
  *         for i from 0 <= i < min(self.n, otherp.n):             # <<<<<<<<<<<<<<
@@ -22566,7 +24095,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  *                 return -1
  */
   __pyx_t_1 = __pyx_v_otherp->n;
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   if ((__pyx_t_1 < __pyx_t_2)) {
     __pyx_t_3 = __pyx_t_1;
   } else {
@@ -22575,17 +24104,17 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
   __pyx_t_1 = __pyx_t_3;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":113
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":113
  *         otherp = other
  *         for i from 0 <= i < min(self.n, otherp.n):
  *             if self.syms[i] < otherp.syms[i]:             # <<<<<<<<<<<<<<
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:
  */
-    __pyx_t_4 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
+    __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":114
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":114
  *         for i from 0 <= i < min(self.n, otherp.n):
  *             if self.syms[i] < otherp.syms[i]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -22594,20 +24123,20 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
       __pyx_r = -1;
       goto __pyx_L0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":115
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":115
  *             if self.syms[i] < otherp.syms[i]:
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:             # <<<<<<<<<<<<<<
  *                 return 1
  *         if self.n < otherp.n:
  */
-    __pyx_t_4 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
+    __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":116
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":116
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -22616,22 +24145,22 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
       __pyx_r = 1;
       goto __pyx_L0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":117
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":117
  *             elif self.syms[i] > otherp.syms[i]:
  *                 return 1
  *         if self.n < otherp.n:             # <<<<<<<<<<<<<<
  *             return -1
  *         elif self.n > otherp.n:
  */
-  __pyx_t_4 = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n < __pyx_v_otherp->n);
+  __pyx_t_4 = (__pyx_v_self->n < __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":118
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":118
  *                 return 1
  *         if self.n < otherp.n:
  *             return -1             # <<<<<<<<<<<<<<
@@ -22640,20 +24169,20 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
     __pyx_r = -1;
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L6;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":119
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":119
  *         if self.n < otherp.n:
  *             return -1
  *         elif self.n > otherp.n:             # <<<<<<<<<<<<<<
  *             return 1
  *         else:
  */
-  __pyx_t_4 = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n > __pyx_v_otherp->n);
+  __pyx_t_4 = (__pyx_v_self->n > __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":120
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":120
  *             return -1
  *         elif self.n > otherp.n:
  *             return 1             # <<<<<<<<<<<<<<
@@ -22662,11 +24191,11 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
     __pyx_r = 1;
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L6;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":122
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":122
  *             return 1
  *         else:
  *             return 0             # <<<<<<<<<<<<<<
@@ -22676,7 +24205,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
     __pyx_r = 0;
     goto __pyx_L0;
   }
-  __pyx_L8:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -22690,7 +24219,18 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":124
+/* Python wrapper */
+static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self); /*proto*/
+static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self) {
+  Py_hash_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_22__hash__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":124
  *             return 0
  * 
  *     def __hash__(self):             # <<<<<<<<<<<<<<
@@ -22698,17 +24238,16 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  *         cdef unsigned h
  */
 
-static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
+static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   int __pyx_v_i;
   unsigned int __pyx_v_h;
   Py_hash_t __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("__hash__");
+  __Pyx_RefNannySetupContext("__hash__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":127
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":127
  *         cdef int i
  *         cdef unsigned h
  *         h = 0             # <<<<<<<<<<<<<<
@@ -22717,51 +24256,51 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
  */
   __pyx_v_h = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":128
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":128
  *         cdef unsigned h
  *         h = 0
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             if self.syms[i] > 0:
  *                 h = (h << 1) + self.syms[i]
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_1 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":129
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":129
  *         h = 0
  *         for i from 0 <= i < self.n:
  *             if self.syms[i] > 0:             # <<<<<<<<<<<<<<
  *                 h = (h << 1) + self.syms[i]
  *             else:
  */
-    __pyx_t_2 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) > 0);
+    __pyx_t_2 = ((__pyx_v_self->syms[__pyx_v_i]) > 0);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":130
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":130
  *         for i from 0 <= i < self.n:
  *             if self.syms[i] > 0:
  *                 h = (h << 1) + self.syms[i]             # <<<<<<<<<<<<<<
  *             else:
  *                 h = (h << 1) + -self.syms[i]
  */
-      __pyx_v_h = ((__pyx_v_h << 1) + (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
-      goto __pyx_L7;
+      __pyx_v_h = ((__pyx_v_h << 1) + (__pyx_v_self->syms[__pyx_v_i]));
+      goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":132
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":132
  *                 h = (h << 1) + self.syms[i]
  *             else:
  *                 h = (h << 1) + -self.syms[i]             # <<<<<<<<<<<<<<
  *         return h
  * 
  */
-      __pyx_v_h = ((__pyx_v_h << 1) + (-(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])));
+      __pyx_v_h = ((__pyx_v_h << 1) + (-(__pyx_v_self->syms[__pyx_v_i])));
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":133
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":133
  *             else:
  *                 h = (h << 1) + -self.syms[i]
  *         return h             # <<<<<<<<<<<<<<
@@ -22778,7 +24317,18 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":135
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_24__len__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":135
  *         return h
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -22786,20 +24336,19 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":136
  * 
  *     def __len__(self):
  *         return self.n             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, i):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_r = __pyx_v_self->n;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -22808,7 +24357,18 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":138
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_26__getitem__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":138
  *         return self.n
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -22816,8 +24376,7 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -22825,9 +24384,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":139
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":139
  * 
  *     def __getitem__(self, i):
  *         return self.syms[i]             # <<<<<<<<<<<<<<
@@ -22836,7 +24395,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyO
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->syms[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -22853,9 +24412,20 @@ static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyO
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_28__iter__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -22863,42 +24433,51 @@ static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_
  *         for i from 0 <= i < self.n:
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_14__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_14__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_28__iter__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__iter__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_4___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_4___iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_6Phrase_15generator2;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_6Phrase_30generator2, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.Phrase.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -22908,24 +24487,24 @@ static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":143
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":143
  *     def __iter__(self):
  *         cdef int i
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             yield self.syms[i]
  * 
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_self)->n;
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->n;
   for (__pyx_cur_scope->__pyx_v_i = 0; __pyx_cur_scope->__pyx_v_i < __pyx_t_1; __pyx_cur_scope->__pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":144
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":144
  *         cdef int i
  *         for i from 0 <= i < self.n:
  *             yield self.syms[i]             # <<<<<<<<<<<<<<
  * 
  *     def subst(self, start, children):
  */
-    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_self)->syms[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->syms[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
@@ -22933,74 +24512,58 @@ static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":146
- *             yield self.syms[i]
- * 
- *     def subst(self, start, children):             # <<<<<<<<<<<<<<
- *         cdef int i
- *         for i from 0 <= i < self.n:
- */
-
-static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_children = 0;
-  int __pyx_v_i;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  long __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
-  __Pyx_RefNannySetupContext("subst");
+  __Pyx_RefNannySetupContext("subst (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("subst", 1, 2, 2, 1); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "subst") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "subst") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -23019,36 +24582,62 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_6Phrase_31subst(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_v_start, __pyx_v_children);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":146
+ *             yield self.syms[i]
+ * 
+ *     def subst(self, start, children):             # <<<<<<<<<<<<<<
+ *         cdef int i
+ *         for i from 0 <= i < self.n:
+ */
+
+static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_children) {
+  int __pyx_v_i;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  long __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("subst", 0);
   __Pyx_INCREF(__pyx_v_start);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":148
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":148
  *     def subst(self, start, children):
  *         cdef int i
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             if sym_isvar(self.syms[i]):
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_1 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":149
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":149
  *         cdef int i
  *         for i from 0 <= i < self.n:
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  *             else:
  */
-    __pyx_t_2 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+    __pyx_t_2 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":150
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":150
  *         for i from 0 <= i < self.n:
  *             if sym_isvar(self.syms[i]):
  *                 start = start + children[sym_getindex(self.syms[i])-1]             # <<<<<<<<<<<<<<
  *             else:
  *                 start = start + (self.syms[i],)
  */
-      __pyx_t_3 = (__pyx_f_3_sa_sym_getindex((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])) - 1);
+      __pyx_t_3 = (__pyx_f_3_sa_sym_getindex((__pyx_v_self->syms[__pyx_v_i])) - 1);
       __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_children, __pyx_t_3, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_5 = PyNumber_Add(__pyx_v_start, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -23057,21 +24646,21 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
       __Pyx_DECREF(__pyx_v_start);
       __pyx_v_start = __pyx_t_5;
       __pyx_t_5 = 0;
-      goto __pyx_L8;
+      goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":152
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":152
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  *             else:
  *                 start = start + (self.syms[i],)             # <<<<<<<<<<<<<<
  *         return start
  * 
  */
-      __pyx_t_5 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_self->syms[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
@@ -23082,10 +24671,10 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
       __pyx_v_start = __pyx_t_5;
       __pyx_t_5 = 0;
     }
-    __pyx_L8:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":153
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":153
  *             else:
  *                 start = start + (self.syms[i],)
  *         return start             # <<<<<<<<<<<<<<
@@ -23111,7 +24700,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":156
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_5words___get__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":156
  * 
  *     property words:
  *         def __get__(self):             # <<<<<<<<<<<<<<
@@ -23119,8 +24719,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_v_w = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -23134,9 +24733,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":157
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":157
  *     property words:
  *         def __get__(self):
  *             return [sym_tostring(w) for w in self if not sym_isvar(w)]             # <<<<<<<<<<<<<<
@@ -23145,22 +24744,30 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (PyList_CheckExact(__pyx_v_self) || PyTuple_CheckExact(__pyx_v_self)) {
-    __pyx_t_2 = __pyx_v_self; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self))) {
+    __pyx_t_2 = ((PyObject *)__pyx_v_self); __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
@@ -23181,11 +24788,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-      if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_INCREF(((PyObject *)__pyx_t_1));
@@ -23208,16 +24815,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":161
- * cdef class Rule:
- * 
- *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
- *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
- *         self.lhs = lhs
- */
-
-static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_lhs;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_f = 0;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_e = 0;
@@ -23225,21 +24825,24 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   PyObject *__pyx_v_word_alignments = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
     PyObject* values[5] = {0,0,0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":161
+ * cdef class Rule:
+ * 
+ *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
+ *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
+ *         self.lhs = lhs
+ */
     values[3] = ((PyObject *)Py_None);
     values[4] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -23249,20 +24852,17 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lhs);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lhs)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -23278,7 +24878,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -23307,8 +24907,27 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_e), __pyx_ptype_3_sa_Phrase, 1, "e", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_4Rule___cinit__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), __pyx_v_lhs, __pyx_v_f, __pyx_v_e, __pyx_v_scores, __pyx_v_word_alignments);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":162
+static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, int __pyx_v_lhs, struct __pyx_obj_3_sa_Phrase *__pyx_v_f, struct __pyx_obj_3_sa_Phrase *__pyx_v_e, PyObject *__pyx_v_scores, PyObject *__pyx_v_word_alignments) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":162
  * 
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)             # <<<<<<<<<<<<<<
@@ -23323,7 +24942,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -23333,20 +24952,20 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":163
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":163
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
  *         self.lhs = lhs             # <<<<<<<<<<<<<<
  *         self.f = f
  *         self.e = e
  */
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs = __pyx_v_lhs;
+  __pyx_v_self->lhs = __pyx_v_lhs;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":164
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":164
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
  *         self.lhs = lhs
  *         self.f = f             # <<<<<<<<<<<<<<
@@ -23355,11 +24974,11 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_f));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_f));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f = __pyx_v_f;
+  __Pyx_GOTREF(__pyx_v_self->f);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
+  __pyx_v_self->f = __pyx_v_f;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":165
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":165
  *         self.lhs = lhs
  *         self.f = f
  *         self.e = e             # <<<<<<<<<<<<<<
@@ -23368,11 +24987,11 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_e));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_e));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e = __pyx_v_e;
+  __Pyx_GOTREF(__pyx_v_self->e);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->e));
+  __pyx_v_self->e = __pyx_v_e;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":166
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":166
  *         self.f = f
  *         self.e = e
  *         self.word_alignments = word_alignments             # <<<<<<<<<<<<<<
@@ -23381,11 +25000,11 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  */
   __Pyx_INCREF(__pyx_v_word_alignments);
   __Pyx_GIVEREF(__pyx_v_word_alignments);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments = __pyx_v_word_alignments;
+  __Pyx_GOTREF(__pyx_v_self->word_alignments);
+  __Pyx_DECREF(__pyx_v_self->word_alignments);
+  __pyx_v_self->word_alignments = __pyx_v_word_alignments;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":167
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":167
  *         self.e = e
  *         self.word_alignments = word_alignments
  *         self.scores = scores             # <<<<<<<<<<<<<<
@@ -23395,9 +25014,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   if (!(likely(((__pyx_v_scores) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_scores, __pyx_ptype_3_sa_FeatureVector))))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_scores);
   __Pyx_GIVEREF(__pyx_v_scores);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores));
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_scores);
+  __Pyx_GOTREF(__pyx_v_self->scores);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->scores));
+  __pyx_v_self->scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_scores);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -23411,7 +25030,18 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":169
+/* Python wrapper */
+static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self); /*proto*/
+static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self) {
+  Py_hash_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_2__hash__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":169
  *         self.scores = scores
  * 
  *     def __hash__(self):             # <<<<<<<<<<<<<<
@@ -23419,8 +25049,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  * 
  */
 
-static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
+static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   Py_hash_t __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23429,27 +25058,27 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__hash__");
+  __Pyx_RefNannySetupContext("__hash__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":170
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":170
  * 
  *     def __hash__(self):
  *         return hash((self.lhs, self.f, self.e))             # <<<<<<<<<<<<<<
  * 
  *     def __cmp__(self, Rule other):
  */
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->f));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e));
   __pyx_t_1 = 0;
   __pyx_t_3 = PyObject_Hash(((PyObject *)__pyx_t_2)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -23469,7 +25098,25 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":172
+/* Python wrapper */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cmp__ (wrapper)", 0);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_ptype_3_sa_Rule, 1, "other", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_4Rule_4__cmp__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), ((struct __pyx_obj_3_sa_Rule *)__pyx_v_other));
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+#endif /*!(#if PY_MAJOR_VERSION < 3)*/
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":172
  *         return hash((self.lhs, self.f, self.e))
  * 
  *     def __cmp__(self, Rule other):             # <<<<<<<<<<<<<<
@@ -23478,8 +25125,7 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
  */
 
 #if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Rule *__pyx_v_other) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23489,58 +25135,57 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cmp__");
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_ptype_3_sa_Rule, 1, "other", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("__cmp__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":173
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":173
  * 
  *     def __cmp__(self, Rule other):
  *         return cmp((self.lhs, self.f, self.e, self.word_alignments),             # <<<<<<<<<<<<<<
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  PyTuple_SET_ITEM(__pyx_t_2, 3, ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  __Pyx_GIVEREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->f));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e));
+  __Pyx_INCREF(__pyx_v_self->word_alignments);
+  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->word_alignments);
+  __Pyx_GIVEREF(__pyx_v_self->word_alignments);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":174
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":174
  *     def __cmp__(self, Rule other):
  *         return cmp((self.lhs, self.f, self.e, self.word_alignments),
  *                 (other.lhs, other.f, other.e, self.word_alignments))             # <<<<<<<<<<<<<<
  * 
  *     def fmerge(self, Phrase f):
  */
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_other->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
-  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
-  PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  PyTuple_SET_ITEM(__pyx_t_3, 3, ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  __Pyx_GIVEREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_INCREF(((PyObject *)__pyx_v_other->f));
+  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_other->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_other->f));
+  __Pyx_INCREF(((PyObject *)__pyx_v_other->e));
+  PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)__pyx_v_other->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_other->e));
+  __Pyx_INCREF(__pyx_v_self->word_alignments);
+  PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_v_self->word_alignments);
+  __Pyx_GIVEREF(__pyx_v_self->word_alignments);
   __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_3));
@@ -23569,7 +25214,23 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":176
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("fmerge (wrapper)", 0);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_4Rule_6fmerge(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_f));
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":176
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
  *     def fmerge(self, Phrase f):             # <<<<<<<<<<<<<<
@@ -23577,8 +25238,7 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
  *             self.f = f
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Phrase *__pyx_v_f) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23586,37 +25246,35 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("fmerge");
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("fmerge", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":177
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":177
  * 
  *     def fmerge(self, Phrase f):
  *         if self.f == f:             # <<<<<<<<<<<<<<
  *             self.f = f
  * 
  */
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f), __pyx_v_f, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_self->f), ((PyObject *)__pyx_v_f), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":178
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":178
  *     def fmerge(self, Phrase f):
  *         if self.f == f:
  *             self.f = f             # <<<<<<<<<<<<<<
  * 
  *     def arity(self):
  */
-    __Pyx_INCREF(__pyx_v_f);
-    __Pyx_GIVEREF(__pyx_v_f);
-    __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
-    __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-    ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_f);
-    goto __pyx_L5;
+    __Pyx_INCREF(((PyObject *)__pyx_v_f));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_f));
+    __Pyx_GOTREF(__pyx_v_self->f);
+    __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
+    __pyx_v_self->f = __pyx_v_f;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -23630,7 +25288,18 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":180
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("arity (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_8arity(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":180
  *             self.f = f
  * 
  *     def arity(self):             # <<<<<<<<<<<<<<
@@ -23638,8 +25307,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23647,9 +25315,9 @@ static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSE
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("arity");
+  __Pyx_RefNannySetupContext("arity", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":181
  * 
  *     def arity(self):
  *         return self.f.arity()             # <<<<<<<<<<<<<<
@@ -23657,7 +25325,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSE
  *     def __str__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->f), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -23678,9 +25346,20 @@ static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSE
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_10__str__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
@@ -23688,45 +25367,53 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7__str___genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7__str___genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_4Rule_7__str___genexpr(PyObject *__pyx_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("genexpr");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)__pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *) __pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  __pyx_self = __pyx_self;
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7__str___1generator7;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_7__str___2generator7, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.Rule.__str__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   Py_ssize_t __pyx_t_3;
   PyObject *(*__pyx_t_4)(PyObject *);
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -23735,7 +25422,8 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self, __pyx_n_s__alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self), __pyx_n_s__alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -23750,12 +25438,20 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_2 = __pyx_t_4(__pyx_t_1);
       if (unlikely(!__pyx_t_2)) {
@@ -23783,7 +25479,7 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -23794,7 +25490,7 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -23802,12 +25498,13 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":183
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":183
  *         return self.f.arity()
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -23815,8 +25512,7 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *__pyx_cur_scope;
   PyObject *__pyx_v_fields = NULL;
   PyObject *__pyx_r = NULL;
@@ -23831,52 +25527,52 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_5___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_5___str__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":185
  *     def __str__(self):
  *         cdef unsigned i
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]             # <<<<<<<<<<<<<<
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  */
-  __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->lhs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_cur_scope->__pyx_v_self->lhs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
   __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
   __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
+  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
   __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyList_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
@@ -23892,32 +25588,29 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   __pyx_v_fields = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":186
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":186
  *         cdef unsigned i
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:             # <<<<<<<<<<<<<<
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  *         return ' ||| '.join(fields)
  */
-  __pyx_t_6 = (((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments != Py_None);
+  __pyx_t_6 = (__pyx_cur_scope->__pyx_v_self->word_alignments != Py_None);
   if (__pyx_t_6) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
  *         return ' ||| '.join(fields)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_fields) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_5 = __pyx_pf_3_sa_7__str___genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __pyx_pf_3_sa_4Rule_7__str___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
@@ -23927,11 +25620,11 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_t_7 = PyList_Append(__pyx_v_fields, __pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":188
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":188
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  *         return ' ||| '.join(fields)             # <<<<<<<<<<<<<<
@@ -23942,7 +25635,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_18), __pyx_n_s__join); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(((PyObject *)__pyx_v_fields));
   PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_fields));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fields));
@@ -23971,9 +25664,20 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":190
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("alignments (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_12alignments(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
  * 
  *     def alignments(self):             # <<<<<<<<<<<<<<
@@ -23981,36 +25685,45 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
  *             yield point/65536, point%65536
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_6alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_6alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_4Rule_12alignments(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("alignments");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("alignments", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)__pyx_ptype_3_sa___pyx_scope_struct_7_alignments->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_7_alignments, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_7generator3;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_14generator3, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.Rule.alignments", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
@@ -24019,8 +25732,8 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -24030,27 +25743,35 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":191
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":191
  * 
  *     def alignments(self):
  *         for point in self.word_alignments:             # <<<<<<<<<<<<<<
  *             yield point/65536, point%65536
  */
-  if (PyList_CheckExact(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments)) {
-    __pyx_t_1 = ((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_self->word_alignments) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_self->word_alignments)) {
+    __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->word_alignments; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_self->word_alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -24068,7 +25789,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     __pyx_cur_scope->__pyx_v_point = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":192
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":192
  *     def alignments(self):
  *         for point in self.word_alignments:
  *             yield point/65536, point%65536             # <<<<<<<<<<<<<<
@@ -24078,7 +25799,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     __pyx_t_5 = PyNumber_Remainder(__pyx_cur_scope->__pyx_v_point, __pyx_int_65536); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -24094,7 +25815,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -24105,7 +25826,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -24115,11 +25836,23 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
   __Pyx_AddTraceback("alignments", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_1f___get__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "_sa.pxd":37
  * cdef class Rule:
  *     cdef int lhs
@@ -24128,14 +25861,13 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
  *     cdef int n_scores
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
+  __pyx_r = ((PyObject *)__pyx_v_self->f);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -24145,14 +25877,24 @@ static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_1e_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_1e_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_1e___get__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
+  __pyx_r = ((PyObject *)__pyx_v_self->e);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -24162,7 +25904,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":21
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":21
  *     int arr_len
  * 
  * cdef _Trie_Node* new_trie_node():             # <<<<<<<<<<<<<<
@@ -24174,9 +25916,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   struct __pyx_t_3_sa__Trie_Node *__pyx_v_node;
   struct __pyx_t_3_sa__Trie_Node *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_trie_node");
+  __Pyx_RefNannySetupContext("new_trie_node", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":23
  * cdef _Trie_Node* new_trie_node():
  *     cdef _Trie_Node* node
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))             # <<<<<<<<<<<<<<
@@ -24185,7 +25927,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node = ((struct __pyx_t_3_sa__Trie_Node *)malloc((sizeof(struct __pyx_t_3_sa__Trie_Node))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":24
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":24
  *     cdef _Trie_Node* node
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))
  *     node.root = NULL             # <<<<<<<<<<<<<<
@@ -24194,7 +25936,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->root = NULL;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":25
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":25
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))
  *     node.root = NULL
  *     node.arr_len = 0             # <<<<<<<<<<<<<<
@@ -24203,7 +25945,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->arr_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":26
  *     node.root = NULL
  *     node.arr_len = 0
  *     node.arr = <int*> malloc(sizeof(0*sizeof(int)))             # <<<<<<<<<<<<<<
@@ -24212,7 +25954,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->arr = ((int *)malloc((sizeof((0 * (sizeof(int)))))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":27
  *     node.arr_len = 0
  *     node.arr = <int*> malloc(sizeof(0*sizeof(int)))
  *     return node             # <<<<<<<<<<<<<<
@@ -24228,7 +25970,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":29
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":29
  *     return node
  * 
  * cdef _Trie_Edge* new_trie_edge(int val):             # <<<<<<<<<<<<<<
@@ -24240,9 +25982,9 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   struct __pyx_t_3_sa__Trie_Edge *__pyx_v_edge;
   struct __pyx_t_3_sa__Trie_Edge *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_trie_edge");
+  __Pyx_RefNannySetupContext("new_trie_edge", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":31
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":31
  * cdef _Trie_Edge* new_trie_edge(int val):
  *     cdef _Trie_Edge* edge
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))             # <<<<<<<<<<<<<<
@@ -24251,7 +25993,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge = ((struct __pyx_t_3_sa__Trie_Edge *)malloc((sizeof(struct __pyx_t_3_sa__Trie_Edge))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":32
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":32
  *     cdef _Trie_Edge* edge
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))
  *     edge.node = new_trie_node()             # <<<<<<<<<<<<<<
@@ -24260,7 +26002,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->node = __pyx_f_3_sa_new_trie_node();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":33
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":33
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))
  *     edge.node = new_trie_node()
  *     edge.bigger = NULL             # <<<<<<<<<<<<<<
@@ -24269,7 +26011,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->bigger = NULL;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":34
  *     edge.node = new_trie_node()
  *     edge.bigger = NULL
  *     edge.smaller = NULL             # <<<<<<<<<<<<<<
@@ -24278,7 +26020,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->smaller = NULL;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":35
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":35
  *     edge.bigger = NULL
  *     edge.smaller = NULL
  *     edge.val = val             # <<<<<<<<<<<<<<
@@ -24287,7 +26029,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->val = __pyx_v_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":36
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":36
  *     edge.smaller = NULL
  *     edge.val = val
  *     return edge             # <<<<<<<<<<<<<<
@@ -24303,7 +26045,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":38
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":38
  *     return edge
  * 
  * cdef free_trie_node(_Trie_Node* node):             # <<<<<<<<<<<<<<
@@ -24319,9 +26061,9 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("free_trie_node");
+  __Pyx_RefNannySetupContext("free_trie_node", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":39
  * 
  * cdef free_trie_node(_Trie_Node* node):
  *     if node != NULL:             # <<<<<<<<<<<<<<
@@ -24331,7 +26073,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   __pyx_t_1 = (__pyx_v_node != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":40
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":40
  * cdef free_trie_node(_Trie_Node* node):
  *     if node != NULL:
  *         free_trie_edge(node.root)             # <<<<<<<<<<<<<<
@@ -24342,7 +26084,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":41
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":41
  *     if node != NULL:
  *         free_trie_edge(node.root)
  *         free(node.arr)             # <<<<<<<<<<<<<<
@@ -24366,7 +26108,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":43
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":43
  *         free(node.arr)
  * 
  * cdef free_trie_edge(_Trie_Edge* edge):             # <<<<<<<<<<<<<<
@@ -24382,9 +26124,9 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("free_trie_edge");
+  __Pyx_RefNannySetupContext("free_trie_edge", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":44
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":44
  * 
  * cdef free_trie_edge(_Trie_Edge* edge):
  *     if edge != NULL:             # <<<<<<<<<<<<<<
@@ -24394,7 +26136,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   __pyx_t_1 = (__pyx_v_edge != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":45
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":45
  * cdef free_trie_edge(_Trie_Edge* edge):
  *     if edge != NULL:
  *         free_trie_node(edge.node)             # <<<<<<<<<<<<<<
@@ -24405,7 +26147,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":46
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":46
  *     if edge != NULL:
  *         free_trie_node(edge.node)
  *         free_trie_edge(edge.bigger)             # <<<<<<<<<<<<<<
@@ -24416,7 +26158,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":47
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":47
  *         free_trie_node(edge.node)
  *         free_trie_edge(edge.bigger)
  *         free_trie_edge(edge.smaller)             # <<<<<<<<<<<<<<
@@ -24442,7 +26184,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":49
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":49
  *         free_trie_edge(edge.smaller)
  * 
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -24457,9 +26199,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("trie_find");
+  __Pyx_RefNannySetupContext("trie_find", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":51
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):
  *     cdef _Trie_Edge* cur
  *     cur = node.root             # <<<<<<<<<<<<<<
@@ -24468,7 +26210,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
  */
   __pyx_v_cur = __pyx_v_node->root;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":52
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":52
  *     cdef _Trie_Edge* cur
  *     cur = node.root
  *     while cur != NULL and cur.val != val:             # <<<<<<<<<<<<<<
@@ -24485,7 +26227,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":53
  *     cur = node.root
  *     while cur != NULL and cur.val != val:
  *         if val > cur.val:             # <<<<<<<<<<<<<<
@@ -24495,7 +26237,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_t_3 = (__pyx_v_val > __pyx_v_cur->val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":54
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":54
  *     while cur != NULL and cur.val != val:
  *         if val > cur.val:
  *             cur = cur.bigger             # <<<<<<<<<<<<<<
@@ -24506,7 +26248,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
       goto __pyx_L5;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":55
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":55
  *         if val > cur.val:
  *             cur = cur.bigger
  *         elif val < cur.val:             # <<<<<<<<<<<<<<
@@ -24516,7 +26258,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_t_3 = (__pyx_v_val < __pyx_v_cur->val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":56
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":56
  *             cur = cur.bigger
  *         elif val < cur.val:
  *             cur = cur.smaller             # <<<<<<<<<<<<<<
@@ -24529,7 +26271,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":57
  *         elif val < cur.val:
  *             cur = cur.smaller
  *     if cur == NULL:             # <<<<<<<<<<<<<<
@@ -24539,7 +26281,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   __pyx_t_3 = (__pyx_v_cur == NULL);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":58
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":58
  *             cur = cur.smaller
  *     if cur == NULL:
  *         return NULL             # <<<<<<<<<<<<<<
@@ -24552,7 +26294,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":60
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":60
  *         return NULL
  *     else:
  *         return cur.node             # <<<<<<<<<<<<<<
@@ -24570,7 +26312,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":62
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":62
  *         return cur.node
  * 
  * cdef trie_node_data_append(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -24582,9 +26324,9 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   int __pyx_v_new_len;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("trie_node_data_append");
+  __Pyx_RefNannySetupContext("trie_node_data_append", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":64
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":64
  * cdef trie_node_data_append(_Trie_Node* node, int val):
  *     cdef int new_len
  *     new_len = node.arr_len + 1             # <<<<<<<<<<<<<<
@@ -24593,7 +26335,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_new_len = (__pyx_v_node->arr_len + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":65
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":65
  *     cdef int new_len
  *     new_len = node.arr_len + 1
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -24602,7 +26344,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_node->arr = ((int *)realloc(__pyx_v_node->arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":66
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":66
  *     new_len = node.arr_len + 1
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     node.arr[node.arr_len] = val             # <<<<<<<<<<<<<<
@@ -24611,7 +26353,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   (__pyx_v_node->arr[__pyx_v_node->arr_len]) = __pyx_v_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":67
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":67
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     node.arr[node.arr_len] = val
  *     node.arr_len = new_len             # <<<<<<<<<<<<<<
@@ -24626,7 +26368,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":69
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":69
  *     node.arr_len = new_len
  * 
  * cdef trie_node_data_extend(_Trie_Node* node, int* vals, int num_vals):             # <<<<<<<<<<<<<<
@@ -24638,9 +26380,9 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   int __pyx_v_new_len;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("trie_node_data_extend");
+  __Pyx_RefNannySetupContext("trie_node_data_extend", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":71
  * cdef trie_node_data_extend(_Trie_Node* node, int* vals, int num_vals):
  *     cdef int new_len
  *     new_len = node.arr_len + num_vals             # <<<<<<<<<<<<<<
@@ -24649,7 +26391,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_new_len = (__pyx_v_node->arr_len + __pyx_v_num_vals);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":72
  *     cdef int new_len
  *     new_len = node.arr_len + num_vals
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -24658,7 +26400,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_node->arr = ((int *)realloc(__pyx_v_node->arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":73
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":73
  *     new_len = node.arr_len + num_vals
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     memcpy(node.arr + node.arr_len, vals, num_vals*sizeof(int))             # <<<<<<<<<<<<<<
@@ -24667,7 +26409,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   memcpy((__pyx_v_node->arr + __pyx_v_node->arr_len), __pyx_v_vals, (__pyx_v_num_vals * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":74
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":74
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     memcpy(node.arr + node.arr_len, vals, num_vals*sizeof(int))
  *     node.arr_len = new_len             # <<<<<<<<<<<<<<
@@ -24682,7 +26424,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":77
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":77
  * 
  * 
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -24697,9 +26439,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("trie_insert");
+  __Pyx_RefNannySetupContext("trie_insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":79
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":79
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):
  *     cdef _Trie_Edge** cur
  *     cur = &node.root             # <<<<<<<<<<<<<<
@@ -24708,7 +26450,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
  */
   __pyx_v_cur = (&__pyx_v_node->root);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":80
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":80
  *     cdef _Trie_Edge** cur
  *     cur = &node.root
  *     while cur[0] != NULL and cur[0].val != val:             # <<<<<<<<<<<<<<
@@ -24725,7 +26467,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":81
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":81
  *     cur = &node.root
  *     while cur[0] != NULL and cur[0].val != val:
  *         if val > cur[0].val:             # <<<<<<<<<<<<<<
@@ -24735,7 +26477,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_t_3 = (__pyx_v_val > (__pyx_v_cur[0])->val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":82
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":82
  *     while cur[0] != NULL and cur[0].val != val:
  *         if val > cur[0].val:
  *             cur = &cur[0].bigger             # <<<<<<<<<<<<<<
@@ -24746,7 +26488,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
       goto __pyx_L5;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":83
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":83
  *         if val > cur[0].val:
  *             cur = &cur[0].bigger
  *         elif val < cur[0].val:             # <<<<<<<<<<<<<<
@@ -24756,7 +26498,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_t_3 = (__pyx_v_val < (__pyx_v_cur[0])->val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":84
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":84
  *             cur = &cur[0].bigger
  *         elif val < cur[0].val:
  *             cur = &cur[0].smaller             # <<<<<<<<<<<<<<
@@ -24769,7 +26511,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":85
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":85
  *         elif val < cur[0].val:
  *             cur = &cur[0].smaller
  *     if cur[0] == NULL:             # <<<<<<<<<<<<<<
@@ -24779,7 +26521,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   __pyx_t_3 = ((__pyx_v_cur[0]) == NULL);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":86
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":86
  *             cur = &cur[0].smaller
  *     if cur[0] == NULL:
  *         cur[0] = new_trie_edge(val)             # <<<<<<<<<<<<<<
@@ -24791,7 +26533,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":87
  *     if cur[0] == NULL:
  *         cur[0] = new_trie_edge(val)
  *     return cur[0].node             # <<<<<<<<<<<<<<
@@ -24807,7 +26549,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":89
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":89
  *     return cur[0].node
  * 
  * cdef trie_node_to_map(_Trie_Node* node, result, prefix, int include_zeros):             # <<<<<<<<<<<<<<
@@ -24825,9 +26567,9 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("trie_node_to_map");
+  __Pyx_RefNannySetupContext("trie_node_to_map", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":92
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":92
  *     cdef IntList arr
  * 
  *     if include_zeros or node.arr_len > 0:             # <<<<<<<<<<<<<<
@@ -24842,7 +26584,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   }
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":93
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":93
  * 
  *     if include_zeros or node.arr_len > 0:
  *         arr = IntList()             # <<<<<<<<<<<<<<
@@ -24854,7 +26596,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":94
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":94
  *     if include_zeros or node.arr_len > 0:
  *         arr = IntList()
  *         free(arr.arr)             # <<<<<<<<<<<<<<
@@ -24863,7 +26605,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     free(__pyx_v_arr->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":95
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":95
  *         arr = IntList()
  *         free(arr.arr)
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -24872,7 +26614,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->arr = ((int *)malloc((__pyx_v_node->arr_len * (sizeof(int)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":96
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":96
  *         free(arr.arr)
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -24881,7 +26623,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     memcpy(__pyx_v_arr->arr, __pyx_v_node->arr, (__pyx_v_node->arr_len * (sizeof(int))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":97
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":97
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))
  *         arr.len = node.arr_len             # <<<<<<<<<<<<<<
@@ -24890,7 +26632,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->len = __pyx_v_node->arr_len;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":98
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":98
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))
  *         arr.len = node.arr_len
  *         arr.size = node.arr_len             # <<<<<<<<<<<<<<
@@ -24899,7 +26641,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->size = __pyx_v_node->arr_len;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":99
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":99
  *         arr.len = node.arr_len
  *         arr.size = node.arr_len
  *         result[prefix] = arr             # <<<<<<<<<<<<<<
@@ -24911,7 +26653,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":100
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":100
  *         arr.size = node.arr_len
  *         result[prefix] = arr
  *     trie_edge_to_map(node.root, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -24935,7 +26677,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":102
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":102
  *     trie_edge_to_map(node.root, result, prefix, include_zeros)
  * 
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):             # <<<<<<<<<<<<<<
@@ -24952,10 +26694,10 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("trie_edge_to_map");
+  __Pyx_RefNannySetupContext("trie_edge_to_map", 0);
   __Pyx_INCREF(__pyx_v_prefix);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":103
  * 
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):
  *     if edge != NULL:             # <<<<<<<<<<<<<<
@@ -24965,7 +26707,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   __pyx_t_1 = (__pyx_v_edge != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":104
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":104
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):
  *     if edge != NULL:
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -24976,7 +26718,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":105
  *     if edge != NULL:
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -24987,7 +26729,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":106
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":106
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)
  *         prefix = prefix + (edge.val,)             # <<<<<<<<<<<<<<
@@ -24997,7 +26739,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __pyx_t_2 = PyInt_FromLong(__pyx_v_edge->val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
@@ -25008,7 +26750,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __pyx_v_prefix = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":107
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":107
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)
  *         prefix = prefix + (edge.val,)
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -25036,42 +26778,32 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":114
- *     cdef int V
- * 
- *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
- *         self.V = alphabet_size
- *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
- */
-
-static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_alphabet_size;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alphabet_size);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alphabet_size)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -25088,40 +26820,66 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7TrieMap___cinit__(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_alphabet_size);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":114
+ *     cdef int V
+ * 
+ *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
+ *         self.V = alphabet_size
+ *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":115
+static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, int __pyx_v_alphabet_size) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":115
  * 
  *     def __cinit__(self, int alphabet_size):
  *         self.V = alphabet_size             # <<<<<<<<<<<<<<
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))
  */
-  ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V = __pyx_v_alphabet_size;
+  __pyx_v_self->V = __pyx_v_alphabet_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":116
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":116
  *     def __cinit__(self, int alphabet_size):
  *         self.V = alphabet_size
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))             # <<<<<<<<<<<<<<
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))
  * 
  */
-  ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
+  __pyx_v_self->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":117
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":117
  *         self.V = alphabet_size
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  memset(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root, 0, (((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *))));
+  memset(__pyx_v_self->root, 0, (__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":120
+/* Python wrapper */
+static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_7TrieMap_2__dealloc__(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":120
  * 
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -25129,8 +26887,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         for i from 0 <= i < self.V:
  */
 
-static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self) {
   int __pyx_v_i;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -25139,51 +26896,51 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":122
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":122
  *     def __dealloc__(self):
  *         cdef int i
  *         for i from 0 <= i < self.V:             # <<<<<<<<<<<<<<
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V;
+  __pyx_t_1 = __pyx_v_self->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":123
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":123
  *         cdef int i
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:             # <<<<<<<<<<<<<<
  *                 free_trie_node(self.root[i])
  *         free(self.root)
  */
-    __pyx_t_2 = ((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]) != NULL);
+    __pyx_t_2 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":124
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":124
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])             # <<<<<<<<<<<<<<
  *         free(self.root)
  * 
  */
-      __pyx_t_3 = __pyx_f_3_sa_free_trie_node((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __pyx_f_3_sa_free_trie_node((__pyx_v_self->root[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":125
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":125
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])
  *         free(self.root)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  free(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root);
+  free(__pyx_v_self->root);
 
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -25193,7 +26950,18 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":128
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7TrieMap_4insert(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":128
  * 
  * 
  *     def insert(self, pattern):             # <<<<<<<<<<<<<<
@@ -25201,8 +26969,7 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
  *         cdef int i, l
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern) {
   int *__pyx_v_p;
   int __pyx_v_i;
   int __pyx_v_l;
@@ -25215,9 +26982,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert");
+  __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":131
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":131
  *         cdef int* p
  *         cdef int i, l
  *         l = len(pattern)             # <<<<<<<<<<<<<<
@@ -25227,7 +26994,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
   __pyx_t_1 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_l = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":132
  *         cdef int i, l
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))             # <<<<<<<<<<<<<<
@@ -25236,7 +27003,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
  */
   __pyx_v_p = ((int *)malloc((__pyx_v_l * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":133
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":133
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:             # <<<<<<<<<<<<<<
@@ -25246,7 +27013,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
   __pyx_t_2 = __pyx_v_l;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":134
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":134
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]             # <<<<<<<<<<<<<<
@@ -25260,16 +27027,16 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
     (__pyx_v_p[__pyx_v_i]) = __pyx_t_4;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":135
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":135
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]
  *         self._insert(p,l)             # <<<<<<<<<<<<<<
  *         free(p)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_TrieMap *)((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->__pyx_vtab)->_insert(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_p, __pyx_v_l);
+  ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_insert(__pyx_v_self, __pyx_v_p, __pyx_v_l);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":136
  *             p[i] = pattern[i]
  *         self._insert(p,l)
  *         free(p)             # <<<<<<<<<<<<<<
@@ -25290,7 +27057,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":139
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":139
  * 
  * 
  *     cdef _Trie_Node* _insert(self, int* pattern, int pattern_len):             # <<<<<<<<<<<<<<
@@ -25305,9 +27072,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("_insert");
+  __Pyx_RefNannySetupContext("_insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":142
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":142
  *         cdef int i
  *         cdef _Trie_Node* node
  *         if self.root[pattern[0]] == NULL:             # <<<<<<<<<<<<<<
@@ -25317,7 +27084,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __pyx_t_1 = ((__pyx_v_self->root[(__pyx_v_pattern[0])]) == NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":143
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":143
  *         cdef _Trie_Node* node
  *         if self.root[pattern[0]] == NULL:
  *             self.root[pattern[0]] = new_trie_node()             # <<<<<<<<<<<<<<
@@ -25329,7 +27096,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":144
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":144
  *         if self.root[pattern[0]] == NULL:
  *             self.root[pattern[0]] = new_trie_node()
  *         node = self.root[pattern[0]]             # <<<<<<<<<<<<<<
@@ -25338,7 +27105,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
  */
   __pyx_v_node = (__pyx_v_self->root[(__pyx_v_pattern[0])]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":145
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":145
  *             self.root[pattern[0]] = new_trie_node()
  *         node = self.root[pattern[0]]
  *         for i from 1 <= i < pattern_len:             # <<<<<<<<<<<<<<
@@ -25348,7 +27115,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __pyx_t_2 = __pyx_v_pattern_len;
   for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":146
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":146
  *         node = self.root[pattern[0]]
  *         for i from 1 <= i < pattern_len:
  *             node = trie_insert(node, pattern[i])             # <<<<<<<<<<<<<<
@@ -25358,7 +27125,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_pattern[__pyx_v_i]));
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":147
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":147
  *         for i from 1 <= i < pattern_len:
  *             node = trie_insert(node, pattern[i])
  *         return node             # <<<<<<<<<<<<<<
@@ -25374,7 +27141,18 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":149
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("contains (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7TrieMap_6contains(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":149
  *         return node
  * 
  *     def contains(self, pattern):             # <<<<<<<<<<<<<<
@@ -25382,8 +27160,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
  *         cdef int i, l
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern) {
   int *__pyx_v_p;
   int __pyx_v_i;
   int __pyx_v_l;
@@ -25398,9 +27175,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("contains");
+  __Pyx_RefNannySetupContext("contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":153
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":153
  *         cdef int i, l
  *         cdef _Trie_Node* node
  *         l = len(pattern)             # <<<<<<<<<<<<<<
@@ -25410,7 +27187,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   __pyx_t_1 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_l = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":154
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":154
  *         cdef _Trie_Node* node
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))             # <<<<<<<<<<<<<<
@@ -25419,7 +27196,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
  */
   __pyx_v_p = ((int *)malloc((__pyx_v_l * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":155
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:             # <<<<<<<<<<<<<<
@@ -25429,7 +27206,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   __pyx_t_2 = __pyx_v_l;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":156
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":156
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]             # <<<<<<<<<<<<<<
@@ -25443,16 +27220,16 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
     (__pyx_v_p[__pyx_v_i]) = __pyx_t_4;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":157
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":157
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]
  *         node = self._contains(p,l)             # <<<<<<<<<<<<<<
  *         free(p)
  *         if node == NULL:
  */
-  __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->__pyx_vtab)->_contains(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_p, __pyx_v_l);
+  __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_contains(__pyx_v_self, __pyx_v_p, __pyx_v_l);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":158
  *             p[i] = pattern[i]
  *         node = self._contains(p,l)
  *         free(p)             # <<<<<<<<<<<<<<
@@ -25461,7 +27238,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
  */
   free(__pyx_v_p);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":159
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":159
  *         node = self._contains(p,l)
  *         free(p)
  *         if node == NULL:             # <<<<<<<<<<<<<<
@@ -25471,7 +27248,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   __pyx_t_5 = (__pyx_v_node == NULL);
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":160
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":160
  *         free(p)
  *         if node == NULL:
  *             return False             # <<<<<<<<<<<<<<
@@ -25484,11 +27261,11 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
     __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":162
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":162
  *             return False
  *         else:
  *             return True             # <<<<<<<<<<<<<<
@@ -25502,7 +27279,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
     __pyx_t_3 = 0;
     goto __pyx_L0;
   }
-  __pyx_L7:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -25516,7 +27293,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":164
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":164
  *             return True
  * 
  *     cdef _Trie_Node* _contains(self, int* pattern, int pattern_len):             # <<<<<<<<<<<<<<
@@ -25532,9 +27309,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("_contains");
+  __Pyx_RefNannySetupContext("_contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":167
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":167
  *         cdef int i
  *         cdef _Trie_Node* node
  *         node = self.root[pattern[0]]             # <<<<<<<<<<<<<<
@@ -25543,7 +27320,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
   __pyx_v_node = (__pyx_v_self->root[(__pyx_v_pattern[0])]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":168
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":168
  *         cdef _Trie_Node* node
  *         node = self.root[pattern[0]]
  *         i = 1             # <<<<<<<<<<<<<<
@@ -25552,7 +27329,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
   __pyx_v_i = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":169
  *         node = self.root[pattern[0]]
  *         i = 1
  *         while node != NULL and i < pattern_len:             # <<<<<<<<<<<<<<
@@ -25569,7 +27346,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":170
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":170
  *         i = 1
  *         while node != NULL and i < pattern_len:
  *             node = trie_find(node, pattern[i])             # <<<<<<<<<<<<<<
@@ -25578,7 +27355,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
     __pyx_v_node = __pyx_f_3_sa_trie_find(__pyx_v_node, (__pyx_v_pattern[__pyx_v_i]));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":171
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":171
  *         while node != NULL and i < pattern_len:
  *             node = trie_find(node, pattern[i])
  *             i = i+1             # <<<<<<<<<<<<<<
@@ -25588,7 +27365,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
     __pyx_v_i = (__pyx_v_i + 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":172
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":172
  *             node = trie_find(node, pattern[i])
  *             i = i+1
  *         return node             # <<<<<<<<<<<<<<
@@ -25604,7 +27381,18 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":174
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
+static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("toMap (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7TrieMap_8toMap(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_flag));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":174
  *         return node
  * 
  *     def toMap(self, flag):             # <<<<<<<<<<<<<<
@@ -25612,8 +27400,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
-static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_flag) {
   int __pyx_v_i;
   int __pyx_v_include_zeros;
   PyObject *__pyx_v_result = NULL;
@@ -25626,9 +27413,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("toMap");
+  __Pyx_RefNannySetupContext("toMap", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":177
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":177
  *         cdef int i, include_zeros
  * 
  *         if flag:             # <<<<<<<<<<<<<<
@@ -25638,7 +27425,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
   __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_flag); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":178
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":178
  * 
  *         if flag:
  *             include_zeros=1             # <<<<<<<<<<<<<<
@@ -25646,11 +27433,11 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
  *             include_zeros=0
  */
     __pyx_v_include_zeros = 1;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":180
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":180
  *             include_zeros=1
  *         else:
  *             include_zeros=0             # <<<<<<<<<<<<<<
@@ -25659,9 +27446,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
  */
     __pyx_v_include_zeros = 0;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":181
  *         else:
  *             include_zeros=0
  *         result = {}             # <<<<<<<<<<<<<<
@@ -25673,27 +27460,27 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
   __pyx_v_result = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":182
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":182
  *             include_zeros=0
  *         result = {}
  *         for i from 0 <= i < self.V:             # <<<<<<<<<<<<<<
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  */
-  __pyx_t_3 = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V;
+  __pyx_t_3 = __pyx_v_self->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":183
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":183
  *         result = {}
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:             # <<<<<<<<<<<<<<
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  *         return result
  */
-    __pyx_t_1 = ((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]) != NULL);
+    __pyx_t_1 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":184
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":184
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)             # <<<<<<<<<<<<<<
@@ -25703,20 +27490,20 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
       __pyx_t_2 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_2 = 0;
-      __pyx_t_2 = __pyx_f_3_sa_trie_node_to_map((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]), ((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_4), __pyx_v_include_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __pyx_f_3_sa_trie_node_to_map((__pyx_v_self->root[__pyx_v_i]), ((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_4), __pyx_v_include_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      goto __pyx_L8;
+      goto __pyx_L6;
     }
-    __pyx_L8:;
+    __pyx_L6:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":185
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  *         return result             # <<<<<<<<<<<<<<
@@ -25742,16 +27529,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":200
- *     cdef write_map(self, m, FILE* f)
- * 
- *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
- *             precompute_rank=1000, precompute_secondary_rank=20,
- *             max_length=5, max_nonterminals=2,
- */
-
-static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fsarray = 0;
   PyObject *__pyx_v_from_stats = 0;
   PyObject *__pyx_v_from_binary = 0;
@@ -25763,18 +27543,18 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   PyObject *__pyx_v_train_min_gap_size = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
     PyObject* values[9] = {0,0,0,0,0,0,0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":200
+ *     cdef write_map(self, m, FILE* f)
+ * 
+ *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
+ *             precompute_rank=1000, precompute_secondary_rank=20,
+ *             max_length=5, max_nonterminals=2,
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
@@ -25786,7 +27566,8 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
     values[8] = ((PyObject *)__pyx_int_2);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
         case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
         case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
@@ -25800,7 +27581,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
@@ -25848,7 +27629,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -25883,8 +27664,25 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14Precomputation___cinit__(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_from_stats, __pyx_v_from_binary, __pyx_v_precompute_rank, __pyx_v_precompute_secondary_rank, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":204
+static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_from_stats, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_precompute_rank, PyObject *__pyx_v_precompute_secondary_rank, PyObject *__pyx_v_max_length, PyObject *__pyx_v_max_nonterminals, PyObject *__pyx_v_train_max_initial_size, PyObject *__pyx_v_train_min_gap_size) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":204
  *             max_length=5, max_nonterminals=2,
  *             train_max_initial_size=10, train_min_gap_size=2):
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
@@ -25892,9 +27690,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.max_length = max_length
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank = __pyx_t_1;
+  __pyx_v_self->precompute_rank = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":205
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":205
  *             train_max_initial_size=10, train_min_gap_size=2):
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
@@ -25902,9 +27700,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.max_nonterminals = max_nonterminals
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_secondary_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank = __pyx_t_1;
+  __pyx_v_self->precompute_secondary_rank = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":206
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":206
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
@@ -25912,9 +27710,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.train_max_initial_size = train_max_initial_size
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_length); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length = __pyx_t_1;
+  __pyx_v_self->max_length = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":207
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":207
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
@@ -25922,9 +27720,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.train_min_gap_size = train_min_gap_size
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_nonterminals); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals = __pyx_t_1;
+  __pyx_v_self->max_nonterminals = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":208
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":208
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
@@ -25932,9 +27730,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         if from_binary:
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_max_initial_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size = __pyx_t_1;
+  __pyx_v_self->train_max_initial_size = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":209
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":209
  *         self.max_nonterminals = max_nonterminals
  *         self.train_max_initial_size = train_max_initial_size
  *         self.train_min_gap_size = train_min_gap_size             # <<<<<<<<<<<<<<
@@ -25942,9 +27740,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *             self.read_binary(from_binary)
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_min_gap_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size = __pyx_t_1;
+  __pyx_v_self->train_min_gap_size = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":210
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":210
  *         self.train_max_initial_size = train_max_initial_size
  *         self.train_min_gap_size = train_min_gap_size
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -25954,17 +27752,17 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":211
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":211
  *         self.train_min_gap_size = train_min_gap_size
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_stats:
  *             self.precompute(from_stats, fsarray)
  */
-    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -25973,10 +27771,10 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":212
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":212
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_stats:             # <<<<<<<<<<<<<<
@@ -25986,17 +27784,17 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_stats); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":213
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":213
  *             self.read_binary(from_binary)
  *         elif from_stats:
  *             self.precompute(from_stats, fsarray)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__precompute); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_from_stats);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_from_stats);
     __Pyx_GIVEREF(__pyx_v_from_stats);
@@ -26008,9 +27806,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -26025,7 +27823,28 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":216
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14Precomputation_2read_binary(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":216
  * 
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -26033,9 +27852,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -26043,18 +27860,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":218
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":218
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -26063,91 +27871,91 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":219
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":219
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":220
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":220
  *         f = fopen(filename, "r")
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":221
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":221
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":222
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":222
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":223
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":223
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":224
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":224
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":225
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":225
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)             # <<<<<<<<<<<<<<
  *         self.precomputed_collocations = self.read_map(f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->read_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->read_map(__pyx_v_self, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
+  __Pyx_DECREF(__pyx_v_self->precomputed_index);
+  __pyx_v_self->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":226
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":226
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->read_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->read_map(__pyx_v_self, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
+  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
+  __pyx_v_self->precomputed_collocations = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":227
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":227
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -26168,7 +27976,28 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":230
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14Precomputation_4write_binary(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":230
  * 
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -26176,9 +28005,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -26187,18 +28014,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":232
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":232
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -26207,89 +28025,89 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":233
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":233
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":234
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":234
  *         f = fopen(filename, "w")
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":235
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":235
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":236
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":236
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":237
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":237
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":238
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":238
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":239
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":239
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)             # <<<<<<<<<<<<<<
  *         self.write_map(self.precomputed_collocations, f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index;
+  __pyx_t_1 = __pyx_v_self->precomputed_index;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->write_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->write_map(__pyx_v_self, __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":240
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":240
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
+  __pyx_t_2 = __pyx_v_self->precomputed_collocations;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->write_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->write_map(__pyx_v_self, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":241
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":241
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -26311,7 +28129,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":244
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":244
  * 
  * 
  *     cdef write_map(self, m, FILE* f):             # <<<<<<<<<<<<<<
@@ -26319,7 +28137,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         cdef IntList arr
  */
 
-static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_m, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_m, FILE *__pyx_v_f) {
   int __pyx_v_i;
   int __pyx_v_N;
   struct __pyx_obj_3_sa_IntList *__pyx_v_arr = 0;
@@ -26330,21 +28148,19 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *(*__pyx_t_4)(PyObject *);
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  Py_ssize_t __pyx_t_9;
-  PyObject *(*__pyx_t_10)(PyObject *);
-  int __pyx_t_11;
+  int __pyx_t_7;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_map");
+  __Pyx_RefNannySetupContext("write_map", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":248
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":248
  *         cdef IntList arr
  * 
  *         N = len(m)             # <<<<<<<<<<<<<<
@@ -26354,7 +28170,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
   __pyx_t_1 = PyObject_Length(__pyx_v_m); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":249
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":249
  * 
  *         N = len(m)
  *         fwrite(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26363,87 +28179,29 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  */
   fwrite((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":250
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":250
  *         N = len(m)
  *         fwrite(&(N), sizeof(int), 1, f)
  *         for pattern, val in m.iteritems():             # <<<<<<<<<<<<<<
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)
  */
-  __pyx_t_2 = PyObject_GetAttr(__pyx_v_m, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-    __pyx_t_2 = __pyx_t_3; __Pyx_INCREF(__pyx_t_2); __pyx_t_1 = 0;
-    __pyx_t_4 = NULL;
-  } else {
-    __pyx_t_1 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v_m == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
-      if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
-      if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
-    } else {
-      __pyx_t_3 = __pyx_t_4(__pyx_t_2);
-      if (unlikely(!__pyx_t_3)) {
-        if (PyErr_Occurred()) {
-          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        break;
-      }
-      __Pyx_GOTREF(__pyx_t_3);
-    }
-    if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-      PyObject* sequence = __pyx_t_3;
-      if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
-        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
-      } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
-        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
-      }
-      __Pyx_INCREF(__pyx_t_5);
-      __Pyx_INCREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    } else {
-      Py_ssize_t index = -1;
-      __pyx_t_7 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
-      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_5);
-      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_6);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L6_unpacking_done;
-      __pyx_L5_unpacking_failed:;
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L6_unpacking_done:;
-    }
+  __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_m, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_2);
+  __pyx_t_2 = __pyx_t_5;
+  __pyx_t_5 = 0;
+  while (1) {
+    __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_2, __pyx_t_3, &__pyx_t_1, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4);
+    if (unlikely(__pyx_t_7 == 0)) break;
+    if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_XDECREF(__pyx_v_pattern);
     __pyx_v_pattern = __pyx_t_5;
     __pyx_t_5 = 0;
@@ -26451,17 +28209,17 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
     __pyx_v_val = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":251
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":251
  *         fwrite(&(N), sizeof(int), 1, f)
  *         for pattern, val in m.iteritems():
  *             N = len(pattern)             # <<<<<<<<<<<<<<
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:
  */
-    __pyx_t_9 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_N = __pyx_t_9;
+    __pyx_t_8 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_N = __pyx_t_8;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":252
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":252
  *         for pattern, val in m.iteritems():
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26470,7 +28228,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  */
     fwrite((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":253
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":253
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -26478,46 +28236,54 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  *                 fwrite(&(i), sizeof(int), 1, f)
  */
     if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-      __pyx_t_3 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_3); __pyx_t_9 = 0;
-      __pyx_t_10 = NULL;
+      __pyx_t_6 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_6); __pyx_t_8 = 0;
+      __pyx_t_9 = NULL;
     } else {
-      __pyx_t_9 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_10 = Py_TYPE(__pyx_t_3)->tp_iternext;
+      __pyx_t_8 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_9 = Py_TYPE(__pyx_t_6)->tp_iternext;
     }
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_3)) {
-        if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_3)) break;
-        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++;
-      } else if (PyTuple_CheckExact(__pyx_t_3)) {
-        if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++;
+      if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_6)) {
+        if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_6)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_6)) {
+        if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
-        __pyx_t_6 = __pyx_t_10(__pyx_t_3);
-        if (unlikely(!__pyx_t_6)) {
+        __pyx_t_5 = __pyx_t_9(__pyx_t_6);
+        if (unlikely(!__pyx_t_5)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
             else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
-        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_GOTREF(__pyx_t_5);
       }
       __Pyx_XDECREF(__pyx_v_word_id);
-      __pyx_v_word_id = __pyx_t_6;
-      __pyx_t_6 = 0;
+      __pyx_v_word_id = __pyx_t_5;
+      __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":254
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":254
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:
  *                 i = word_id             # <<<<<<<<<<<<<<
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val
  */
-      __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_i = __pyx_t_11;
+      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_i = __pyx_t_7;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":255
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":255
  *             for word_id in pattern:
  *                 i = word_id
  *                 fwrite(&(i), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26526,9 +28292,9 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  */
       fwrite((&__pyx_v_i), (sizeof(int)), 1, __pyx_v_f);
     }
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":256
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":256
  *                 i = word_id
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val             # <<<<<<<<<<<<<<
@@ -26540,7 +28306,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
     __Pyx_XDECREF(((PyObject *)__pyx_v_arr));
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_val);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":257
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":257
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val
  *             arr.write_handle(f)             # <<<<<<<<<<<<<<
@@ -26555,10 +28321,8 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_5);
   __Pyx_XDECREF(__pyx_t_6);
-  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_AddTraceback("_sa.Precomputation.write_map", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
@@ -26571,7 +28335,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":260
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":260
  * 
  * 
  *     cdef read_map(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -26579,10 +28343,10 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  *         cdef IntList arr
  */
 
-static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, FILE *__pyx_v_f) {
   int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_k;
+  CYTHON_UNUSED int __pyx_v_j;
+  CYTHON_UNUSED int __pyx_v_k;
   int __pyx_v_word_id;
   int __pyx_v_N;
   struct __pyx_obj_3_sa_IntList *__pyx_v_arr = 0;
@@ -26597,9 +28361,9 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_map");
+  __Pyx_RefNannySetupContext("read_map", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":264
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":264
  *         cdef IntList arr
  * 
  *         m = {}             # <<<<<<<<<<<<<<
@@ -26611,7 +28375,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
   __pyx_v_m = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":265
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":265
  * 
  *         m = {}
  *         fread(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26620,7 +28384,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  */
   fread((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":266
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":266
  *         m = {}
  *         fread(&(N), sizeof(int), 1, f)
  *         for j from 0 <= j < N:             # <<<<<<<<<<<<<<
@@ -26630,7 +28394,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
   __pyx_t_2 = __pyx_v_N;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":267
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":267
  *         fread(&(N), sizeof(int), 1, f)
  *         for j from 0 <= j < N:
  *             fread(&(i), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26639,7 +28403,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  */
     fread((&__pyx_v_i), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":268
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":268
  *         for j from 0 <= j < N:
  *             fread(&(i), sizeof(int), 1, f)
  *             key = ()             # <<<<<<<<<<<<<<
@@ -26650,7 +28414,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
     __Pyx_XDECREF(((PyObject *)__pyx_v_key));
     __pyx_v_key = __pyx_empty_tuple;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":269
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":269
  *             fread(&(i), sizeof(int), 1, f)
  *             key = ()
  *             for k from 0 <= k < i:             # <<<<<<<<<<<<<<
@@ -26660,7 +28424,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
     __pyx_t_3 = __pyx_v_i;
     for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":270
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":270
  *             key = ()
  *             for k from 0 <= k < i:
  *                 fread(&(word_id), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26669,7 +28433,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  */
       fread((&__pyx_v_word_id), (sizeof(int)), 1, __pyx_v_f);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":271
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":271
  *             for k from 0 <= k < i:
  *                 fread(&(word_id), sizeof(int), 1, f)
  *                 key = key + (word_id,)             # <<<<<<<<<<<<<<
@@ -26679,7 +28443,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
       __pyx_t_1 = PyInt_FromLong(__pyx_v_word_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
@@ -26691,7 +28455,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
       __pyx_t_1 = 0;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":272
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":272
  *                 fread(&(word_id), sizeof(int), 1, f)
  *                 key = key + (word_id,)
  *             arr = IntList()             # <<<<<<<<<<<<<<
@@ -26704,7 +28468,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":273
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":273
  *                 key = key + (word_id,)
  *             arr = IntList()
  *             arr.read_handle(f)             # <<<<<<<<<<<<<<
@@ -26713,7 +28477,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_arr->__pyx_vtab)->read_handle(__pyx_v_arr, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":274
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":274
  *             arr = IntList()
  *             arr.read_handle(f)
  *             m[key] = arr             # <<<<<<<<<<<<<<
@@ -26723,7 +28487,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
     if (PyDict_SetItem(((PyObject *)__pyx_v_m), ((PyObject *)__pyx_v_key), ((PyObject *)__pyx_v_arr)) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":275
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":275
  *             arr.read_handle(f)
  *             m[key] = arr
  *         return m             # <<<<<<<<<<<<<<
@@ -26751,7 +28515,68 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":278
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_stats = 0;
+  struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("precompute (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__sarray,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stats)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sarray)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, 1); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "precompute") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_stats = values[0];
+    __pyx_v_sarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sarray), __pyx_ptype_3_sa_SuffixArray, 1, "sarray", 0))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_14Precomputation_6precompute(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_stats, __pyx_v_sarray);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":278
  * 
  * 
  *     def precompute(self, stats, SuffixArray sarray):             # <<<<<<<<<<<<<<
@@ -26759,10 +28584,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  *         cdef DataArray darray = sarray.darray
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_stats = 0;
-  struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray = 0;
+static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray) {
   int __pyx_v_i;
   int __pyx_v_l;
   int __pyx_v_N;
@@ -26795,7 +28617,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   PyObject *__pyx_v_pattern_rank = NULL;
   float __pyx_v_start_time;
   PyObject *__pyx_v_rank = NULL;
-  PyObject *__pyx_v__ = NULL;
+  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
   PyObject *__pyx_v_phrase = NULL;
   int __pyx_v_sa_word_id;
   PyObject *__pyx_v_x = NULL;
@@ -26810,7 +28632,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   PyObject *__pyx_v_arity = NULL;
   PyObject *__pyx_v_cumul_cost = NULL;
   PyObject *__pyx_v_cumul_count = NULL;
-  Py_ssize_t __pyx_v_num_found_patterns;
+  PyObject *__pyx_v_num_found_patterns = NULL;
   float __pyx_v_stop_time;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -26837,54 +28659,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__sarray,0};
-  __Pyx_RefNannySetupContext("precompute");
-  {
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stats);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sarray);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, 1); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "precompute") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-    }
-    __pyx_v_stats = values[0];
-    __pyx_v_sarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sarray), __pyx_ptype_3_sa_SuffixArray, 1, "sarray", 0))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("precompute", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":280
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":280
  *     def precompute(self, stats, SuffixArray sarray):
  *         cdef int i, l, N, max_pattern_len, i1, l1, i2, l2, i3, l3, ptr1, ptr2, ptr3, is_super, sent_count, max_rank
  *         cdef DataArray darray = sarray.darray             # <<<<<<<<<<<<<<
@@ -26894,7 +28671,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_INCREF(((PyObject *)__pyx_v_sarray->darray));
   __pyx_v_darray = __pyx_v_sarray->darray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":285
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":285
  *         cdef _Trie_Node* node
  * 
  *         data = darray.data             # <<<<<<<<<<<<<<
@@ -26904,7 +28681,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_INCREF(((PyObject *)__pyx_v_darray->data));
   __pyx_v_data = __pyx_v_darray->data;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":287
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":287
  *         data = darray.data
  * 
  *         frequent_patterns = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -26918,7 +28695,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -26928,7 +28705,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_frequent_patterns = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":288
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":288
  * 
  *         frequent_patterns = TrieMap(len(darray.id2word))
  *         super_frequent_patterns = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -26942,7 +28719,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -26952,7 +28729,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_super_frequent_patterns = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":289
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":289
  *         frequent_patterns = TrieMap(len(darray.id2word))
  *         super_frequent_patterns = TrieMap(len(darray.id2word))
  *         collocations = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -26966,7 +28743,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -26976,7 +28753,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_collocations = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":291
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":291
  *         collocations = TrieMap(len(darray.id2word))
  * 
  *         I_set = set()             # <<<<<<<<<<<<<<
@@ -26988,7 +28765,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_I_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":292
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":292
  * 
  *         I_set = set()
  *         J_set = set()             # <<<<<<<<<<<<<<
@@ -27000,7 +28777,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_J_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":293
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":293
  *         I_set = set()
  *         J_set = set()
  *         J2_set = set()             # <<<<<<<<<<<<<<
@@ -27012,7 +28789,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_J2_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":294
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":294
  *         J_set = set()
  *         J2_set = set()
  *         IJ_set = set()             # <<<<<<<<<<<<<<
@@ -27024,7 +28801,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_IJ_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":295
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":295
  *         J2_set = set()
  *         IJ_set = set()
  *         pattern_rank = {}             # <<<<<<<<<<<<<<
@@ -27036,7 +28813,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_pattern_rank = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":297
  *         pattern_rank = {}
  * 
  *         logger.info("Precomputing frequent intersections")             # <<<<<<<<<<<<<<
@@ -27053,7 +28830,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":298
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":298
  * 
  *         logger.info("Precomputing frequent intersections")
  *         cdef float start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -27062,7 +28839,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
   __pyx_v_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":300
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":300
  *         cdef float start_time = monitor_cpu()
  * 
  *         max_pattern_len = 0             # <<<<<<<<<<<<<<
@@ -27071,7 +28848,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
   __pyx_v_max_pattern_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":301
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":301
  * 
  *         max_pattern_len = 0
  *         for rank, (_, _, phrase) in enumerate(stats):             # <<<<<<<<<<<<<<
@@ -27089,12 +28866,20 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_3)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_3)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_5)) {
@@ -27108,21 +28893,22 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
       PyObject* sequence = __pyx_t_5;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 3)) {
+        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-          if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_8 = PyTuple_GET_ITEM(sequence, 2); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-          if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_8 = PyList_GET_ITEM(sequence, 2); 
@@ -27130,28 +28916,35 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_INCREF(__pyx_t_6);
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_8);
+      #else
+      __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
       __pyx_t_9 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_10 = Py_TYPE(__pyx_t_9)->tp_iternext;
-      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
+      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
-      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L8_unpacking_failed;
+      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L8_unpacking_failed;
+      index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_8);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_9), 3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = NULL;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      goto __pyx_L9_unpacking_done;
-      __pyx_L8_unpacking_failed:;
+      goto __pyx_L6_unpacking_done;
+      __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      __pyx_t_10 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L9_unpacking_done:;
+      __pyx_L6_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v__);
     __pyx_v__ = __pyx_t_6;
@@ -27171,35 +28964,34 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":302
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":302
  *         max_pattern_len = 0
  *         for rank, (_, _, phrase) in enumerate(stats):
  *             if rank >= self.precompute_rank:             # <<<<<<<<<<<<<<
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  */
-    __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(__pyx_v_self->precompute_rank); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_8 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_5, Py_GE); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_8 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
     if (__pyx_t_11) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":303
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":303
  *         for rank, (_, _, phrase) in enumerate(stats):
  *             if rank >= self.precompute_rank:
  *                 break             # <<<<<<<<<<<<<<
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)
  */
-      goto __pyx_L7_break;
-      goto __pyx_L10;
+      goto __pyx_L4_break;
+      goto __pyx_L7;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":304
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":304
  *             if rank >= self.precompute_rank:
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))             # <<<<<<<<<<<<<<
@@ -27215,7 +29007,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     }
     __pyx_v_max_pattern_len = __pyx_t_14;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":305
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":305
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)             # <<<<<<<<<<<<<<
@@ -27225,7 +29017,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_frequent_patterns), __pyx_n_s__insert); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_phrase);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_phrase);
     __Pyx_GIVEREF(__pyx_v_phrase);
@@ -27235,19 +29027,16 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":306
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":306
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)
  *             I_set.add(phrase)             # <<<<<<<<<<<<<<
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:
  */
-    if (unlikely(((PyObject *)__pyx_v_I_set) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_15 = PySet_Add(__pyx_v_I_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":307
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":307
  *             frequent_patterns.insert(phrase)
  *             I_set.add(phrase)
  *             pattern_rank[phrase] = rank             # <<<<<<<<<<<<<<
@@ -27256,23 +29045,22 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
     if (PyDict_SetItem(((PyObject *)__pyx_v_pattern_rank), __pyx_v_phrase, __pyx_v_rank) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":308
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":308
  *             I_set.add(phrase)
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:             # <<<<<<<<<<<<<<
  *                 super_frequent_patterns.insert(phrase)
  *                 J_set.add(phrase)
  */
-    __pyx_t_7 = PyInt_FromLong(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyInt_FromLong(__pyx_v_self->precompute_secondary_rank); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_7, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_5 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_7, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_11) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":309
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":309
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:
  *                 super_frequent_patterns.insert(phrase)             # <<<<<<<<<<<<<<
@@ -27282,7 +29070,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_super_frequent_patterns), __pyx_n_s__insert); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_7));
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_v_phrase);
@@ -27292,26 +29080,23 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":310
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":310
  *             if rank < self.precompute_secondary_rank:
  *                 super_frequent_patterns.insert(phrase)
  *                 J_set.add(phrase)             # <<<<<<<<<<<<<<
  * 
  *         queue = IntList(increment=1000)
  */
-      if (unlikely(((PyObject *)__pyx_v_J_set) == Py_None)) {
-        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-      }
       __pyx_t_15 = PySet_Add(__pyx_v_J_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L11;
+      goto __pyx_L8;
     }
-    __pyx_L11:;
+    __pyx_L8:;
   }
-  __pyx_L7_break:;
+  __pyx_L4_break:;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":312
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":312
  *                 J_set.add(phrase)
  * 
  *         queue = IntList(increment=1000)             # <<<<<<<<<<<<<<
@@ -27321,13 +29106,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__increment), __pyx_int_1000) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_queue = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":314
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":314
  *         queue = IntList(increment=1000)
  * 
  *         logger.info("    Computing inverted indexes...")             # <<<<<<<<<<<<<<
@@ -27344,7 +29129,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":315
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":315
  * 
  *         logger.info("    Computing inverted indexes...")
  *         N = len(data)             # <<<<<<<<<<<<<<
@@ -27354,7 +29139,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_data)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":316
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":316
  *         logger.info("    Computing inverted indexes...")
  *         N = len(data)
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -27364,7 +29149,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_13 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":317
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":317
  *         N = len(data)
  *         for i from 0 <= i < N:
  *             sa_word_id = data.arr[i]             # <<<<<<<<<<<<<<
@@ -27373,7 +29158,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
     __pyx_v_sa_word_id = (__pyx_v_data->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":318
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":318
  *         for i from 0 <= i < N:
  *             sa_word_id = data.arr[i]
  *             if sa_word_id == 1:             # <<<<<<<<<<<<<<
@@ -27383,7 +29168,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_11 = (__pyx_v_sa_word_id == 1);
     if (__pyx_t_11) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":319
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":319
  *             sa_word_id = data.arr[i]
  *             if sa_word_id == 1:
  *                 queue._append(-1)             # <<<<<<<<<<<<<<
@@ -27391,11 +29176,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 for l from 1 <= l <= max_pattern_len:
  */
       ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, -1);
-      goto __pyx_L14;
+      goto __pyx_L11;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":321
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":321
  *                 queue._append(-1)
  *             else:
  *                 for l from 1 <= l <= max_pattern_len:             # <<<<<<<<<<<<<<
@@ -27405,7 +29190,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_t_16 = __pyx_v_max_pattern_len;
       for (__pyx_v_l = 1; __pyx_v_l <= __pyx_t_16; __pyx_v_l++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":322
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":322
  *             else:
  *                 for l from 1 <= l <= max_pattern_len:
  *                     node = frequent_patterns._contains(data.arr+i, l)             # <<<<<<<<<<<<<<
@@ -27414,7 +29199,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i), __pyx_v_l);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":323
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":323
  *                 for l from 1 <= l <= max_pattern_len:
  *                     node = frequent_patterns._contains(data.arr+i, l)
  *                     if node == NULL:             # <<<<<<<<<<<<<<
@@ -27424,19 +29209,19 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_t_11 = (__pyx_v_node == NULL);
         if (__pyx_t_11) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":324
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":324
  *                     node = frequent_patterns._contains(data.arr+i, l)
  *                     if node == NULL:
  *                         break             # <<<<<<<<<<<<<<
  *                     queue._append(i)
  *                     queue._append(l)
  */
-          goto __pyx_L16_break;
-          goto __pyx_L17;
+          goto __pyx_L13_break;
+          goto __pyx_L14;
         }
-        __pyx_L17:;
+        __pyx_L14:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":325
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":325
  *                     if node == NULL:
  *                         break
  *                     queue._append(i)             # <<<<<<<<<<<<<<
@@ -27445,7 +29230,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, __pyx_v_i);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":326
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":326
  *                         break
  *                     queue._append(i)
  *                     queue._append(l)             # <<<<<<<<<<<<<<
@@ -27454,7 +29239,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, __pyx_v_l);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":327
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":327
  *                     queue._append(i)
  *                     queue._append(l)
  *                     trie_node_data_append(node, i)             # <<<<<<<<<<<<<<
@@ -27465,12 +29250,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       }
-      __pyx_L16_break:;
+      __pyx_L13_break:;
     }
-    __pyx_L14:;
+    __pyx_L11:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":329
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":329
  *                     trie_node_data_append(node, i)
  * 
  *         logger.info("    Computing collocations...")             # <<<<<<<<<<<<<<
@@ -27487,7 +29272,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":330
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":330
  * 
  *         logger.info("    Computing collocations...")
  *         N = len(queue)             # <<<<<<<<<<<<<<
@@ -27497,7 +29282,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_queue)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":331
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":331
  *         logger.info("    Computing collocations...")
  *         N = len(queue)
  *         ptr1 = 0             # <<<<<<<<<<<<<<
@@ -27506,7 +29291,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
   __pyx_v_ptr1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":332
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":332
  *         N = len(queue)
  *         ptr1 = 0
  *         sent_count = 0             # <<<<<<<<<<<<<<
@@ -27515,7 +29300,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
   __pyx_v_sent_count = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":333
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":333
  *         ptr1 = 0
  *         sent_count = 0
  *         while ptr1 < N:    # main loop             # <<<<<<<<<<<<<<
@@ -27526,7 +29311,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_11 = (__pyx_v_ptr1 < __pyx_v_N);
     if (!__pyx_t_11) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":334
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":334
  *         sent_count = 0
  *         while ptr1 < N:    # main loop
  *             i1 = queue.arr[ptr1]             # <<<<<<<<<<<<<<
@@ -27535,7 +29320,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
     __pyx_v_i1 = (__pyx_v_queue->arr[__pyx_v_ptr1]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":335
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":335
  *         while ptr1 < N:    # main loop
  *             i1 = queue.arr[ptr1]
  *             if i1 > -1:             # <<<<<<<<<<<<<<
@@ -27545,7 +29330,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_11 = (__pyx_v_i1 > -1);
     if (__pyx_t_11) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":336
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":336
  *             i1 = queue.arr[ptr1]
  *             if i1 > -1:
  *                 l1 = queue.arr[ptr1+1]             # <<<<<<<<<<<<<<
@@ -27554,7 +29339,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_l1 = (__pyx_v_queue->arr[(__pyx_v_ptr1 + 1)]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":337
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":337
  *             if i1 > -1:
  *                 l1 = queue.arr[ptr1+1]
  *                 ptr2 = ptr1 + 2             # <<<<<<<<<<<<<<
@@ -27563,7 +29348,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_ptr2 = (__pyx_v_ptr1 + 2);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":338
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":338
  *                 l1 = queue.arr[ptr1+1]
  *                 ptr2 = ptr1 + 2
  *                 while ptr2 < N:             # <<<<<<<<<<<<<<
@@ -27574,7 +29359,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_t_11 = (__pyx_v_ptr2 < __pyx_v_N);
         if (!__pyx_t_11) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":339
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":339
  *                 ptr2 = ptr1 + 2
  *                 while ptr2 < N:
  *                     i2 = queue.arr[ptr2]             # <<<<<<<<<<<<<<
@@ -27583,7 +29368,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_v_i2 = (__pyx_v_queue->arr[__pyx_v_ptr2]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":340
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":340
  *                 while ptr2 < N:
  *                     i2 = queue.arr[ptr2]
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -27592,26 +29377,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_t_11 = (__pyx_v_i2 == -1);
         if (!__pyx_t_11) {
-          __pyx_t_17 = ((__pyx_v_i2 - __pyx_v_i1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+          __pyx_t_17 = ((__pyx_v_i2 - __pyx_v_i1) >= __pyx_v_self->train_max_initial_size);
           __pyx_t_18 = __pyx_t_17;
         } else {
           __pyx_t_18 = __pyx_t_11;
         }
         if (__pyx_t_18) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":341
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":341
  *                     i2 = queue.arr[ptr2]
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
  *                         break             # <<<<<<<<<<<<<<
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  */
-          goto __pyx_L22_break;
-          goto __pyx_L23;
+          goto __pyx_L19_break;
+          goto __pyx_L20;
         }
-        __pyx_L23:;
+        __pyx_L20:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":342
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":342
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
  *                         break
  *                     l2 = queue.arr[ptr2+1]             # <<<<<<<<<<<<<<
@@ -27620,34 +29405,34 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_v_l2 = (__pyx_v_queue->arr[(__pyx_v_ptr2 + 1)]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":343
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":343
  *                         break
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):
  */
-        __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size);
+        __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= __pyx_v_self->train_min_gap_size);
         if (__pyx_t_18) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":344
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":344
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  *                             i2 + l2 - i1 <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)
  */
-          __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+          __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
           if (__pyx_t_11) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":345
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":345
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):             # <<<<<<<<<<<<<<
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)
  */
-            __pyx_t_17 = (((__pyx_v_l1 + __pyx_v_l2) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+            __pyx_t_17 = (((__pyx_v_l1 + __pyx_v_l2) + 1) <= __pyx_v_self->max_length);
             __pyx_t_19 = __pyx_t_17;
           } else {
             __pyx_t_19 = __pyx_t_11;
@@ -27658,7 +29443,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         }
         if (__pyx_t_11) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":346
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":346
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)             # <<<<<<<<<<<<<<
@@ -27667,7 +29452,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
           __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_collocations->__pyx_vtab)->_insert(__pyx_v_collocations, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":347
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":347
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -27676,7 +29461,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
           __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":348
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":348
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)
  *                         for i from i2 <= i < i2+l2:             # <<<<<<<<<<<<<<
@@ -27686,7 +29471,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __pyx_t_13 = (__pyx_v_i2 + __pyx_v_l2);
           for (__pyx_v_i = __pyx_v_i2; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":349
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":349
  *                         node = trie_insert(node, -1)
  *                         for i from i2 <= i < i2+l2:
  *                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -27696,7 +29481,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
             __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":350
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":350
  *                         for i from i2 <= i < i2+l2:
  *                             node = trie_insert(node, data.arr[i])
  *                         trie_node_data_append(node, i1)             # <<<<<<<<<<<<<<
@@ -27707,7 +29492,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":351
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":351
  *                             node = trie_insert(node, data.arr[i])
  *                         trie_node_data_append(node, i1)
  *                         trie_node_data_append(node, i2)             # <<<<<<<<<<<<<<
@@ -27718,7 +29503,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":352
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":352
  *                         trie_node_data_append(node, i1)
  *                         trie_node_data_append(node, i2)
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:             # <<<<<<<<<<<<<<
@@ -27728,7 +29513,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __pyx_t_11 = (((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_super_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_super_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i2), __pyx_v_l2) != NULL);
           if (__pyx_t_11) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":353
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":353
  *                         trie_node_data_append(node, i2)
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:
  *                             if super_frequent_patterns._contains(data.arr+i1, l1) != NULL:             # <<<<<<<<<<<<<<
@@ -27738,7 +29523,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
             __pyx_t_11 = (((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_super_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_super_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1) != NULL);
             if (__pyx_t_11) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":354
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":354
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:
  *                             if super_frequent_patterns._contains(data.arr+i1, l1) != NULL:
  *                                 is_super = 1             # <<<<<<<<<<<<<<
@@ -27746,11 +29531,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                                 is_super = 0
  */
               __pyx_v_is_super = 1;
-              goto __pyx_L28;
+              goto __pyx_L25;
             }
             /*else*/ {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":356
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":356
  *                                 is_super = 1
  *                             else:
  *                                 is_super = 0             # <<<<<<<<<<<<<<
@@ -27759,9 +29544,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_v_is_super = 0;
             }
-            __pyx_L28:;
+            __pyx_L25:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":357
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":357
  *                             else:
  *                                 is_super = 0
  *                             ptr3 = ptr2 + 2             # <<<<<<<<<<<<<<
@@ -27770,7 +29555,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
             __pyx_v_ptr3 = (__pyx_v_ptr2 + 2);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":358
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":358
  *                                 is_super = 0
  *                             ptr3 = ptr2 + 2
  *                             while ptr3 < N:             # <<<<<<<<<<<<<<
@@ -27781,7 +29566,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
               __pyx_t_11 = (__pyx_v_ptr3 < __pyx_v_N);
               if (!__pyx_t_11) break;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":359
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":359
  *                             ptr3 = ptr2 + 2
  *                             while ptr3 < N:
  *                                 i3 = queue.arr[ptr3]             # <<<<<<<<<<<<<<
@@ -27790,7 +29575,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_v_i3 = (__pyx_v_queue->arr[__pyx_v_ptr3]);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":360
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":360
  *                             while ptr3 < N:
  *                                 i3 = queue.arr[ptr3]
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -27799,26 +29584,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_t_11 = (__pyx_v_i3 == -1);
               if (!__pyx_t_11) {
-                __pyx_t_18 = ((__pyx_v_i3 - __pyx_v_i1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+                __pyx_t_18 = ((__pyx_v_i3 - __pyx_v_i1) >= __pyx_v_self->train_max_initial_size);
                 __pyx_t_19 = __pyx_t_18;
               } else {
                 __pyx_t_19 = __pyx_t_11;
               }
               if (__pyx_t_19) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":361
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":361
  *                                 i3 = queue.arr[ptr3]
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
  *                                     break             # <<<<<<<<<<<<<<
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  */
-                goto __pyx_L30_break;
-                goto __pyx_L31;
+                goto __pyx_L27_break;
+                goto __pyx_L28;
               }
-              __pyx_L31:;
+              __pyx_L28:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":362
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":362
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
  *                                     break
  *                                 l3 = queue.arr[ptr3+1]             # <<<<<<<<<<<<<<
@@ -27827,34 +29612,34 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_v_l3 = (__pyx_v_queue->arr[(__pyx_v_ptr3 + 1)]);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":363
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":363
  *                                     break
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):
  */
-              __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size);
+              __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= __pyx_v_self->train_min_gap_size);
               if (__pyx_t_19) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":364
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":364
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  */
-                __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+                __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
                 if (__pyx_t_11) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":365
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":365
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):             # <<<<<<<<<<<<<<
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)
  */
-                  __pyx_t_18 = ((((__pyx_v_l1 + __pyx_v_l2) + __pyx_v_l3) + 2) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+                  __pyx_t_18 = ((((__pyx_v_l1 + __pyx_v_l2) + __pyx_v_l3) + 2) <= __pyx_v_self->max_length);
                   __pyx_t_17 = __pyx_t_18;
                 } else {
                   __pyx_t_17 = __pyx_t_11;
@@ -27865,7 +29650,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
               }
               if (__pyx_t_11) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":366
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":366
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:             # <<<<<<<<<<<<<<
@@ -27880,7 +29665,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                 }
                 if (__pyx_t_19) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":367
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":367
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)             # <<<<<<<<<<<<<<
@@ -27889,7 +29674,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
                   __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_collocations->__pyx_vtab)->_insert(__pyx_v_collocations, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":368
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":368
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)
  *                                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -27898,7 +29683,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
                   __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":369
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":369
  *                                         node = collocations._insert(data.arr+i1, l1)
  *                                         node = trie_insert(node, -1)
  *                                         for i from i2 <= i < i2+l2:             # <<<<<<<<<<<<<<
@@ -27908,7 +29693,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __pyx_t_13 = (__pyx_v_i2 + __pyx_v_l2);
                   for (__pyx_v_i = __pyx_v_i2; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":370
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":370
  *                                         node = trie_insert(node, -1)
  *                                         for i from i2 <= i < i2+l2:
  *                                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -27918,7 +29703,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
                   }
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":371
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":371
  *                                         for i from i2 <= i < i2+l2:
  *                                             node = trie_insert(node, data.arr[i])
  *                                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -27927,7 +29712,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
                   __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":372
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":372
  *                                             node = trie_insert(node, data.arr[i])
  *                                         node = trie_insert(node, -1)
  *                                         for i from i3 <= i < i3+l3:             # <<<<<<<<<<<<<<
@@ -27937,7 +29722,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __pyx_t_13 = (__pyx_v_i3 + __pyx_v_l3);
                   for (__pyx_v_i = __pyx_v_i3; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":373
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":373
  *                                         node = trie_insert(node, -1)
  *                                         for i from i3 <= i < i3+l3:
  *                                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -27947,7 +29732,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
                   }
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":374
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":374
  *                                         for i from i3 <= i < i3+l3:
  *                                             node = trie_insert(node, data.arr[i])
  *                                         trie_node_data_append(node, i1)             # <<<<<<<<<<<<<<
@@ -27958,7 +29743,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":375
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":375
  *                                             node = trie_insert(node, data.arr[i])
  *                                         trie_node_data_append(node, i1)
  *                                         trie_node_data_append(node, i2)             # <<<<<<<<<<<<<<
@@ -27969,7 +29754,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":376
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":376
  *                                         trie_node_data_append(node, i1)
  *                                         trie_node_data_append(node, i2)
  *                                         trie_node_data_append(node, i3)             # <<<<<<<<<<<<<<
@@ -27979,14 +29764,14 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __pyx_t_3 = __pyx_f_3_sa_trie_node_data_append(__pyx_v_node, __pyx_v_i3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                  goto __pyx_L33;
+                  goto __pyx_L30;
                 }
-                __pyx_L33:;
-                goto __pyx_L32;
+                __pyx_L30:;
+                goto __pyx_L29;
               }
-              __pyx_L32:;
+              __pyx_L29:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":377
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":377
  *                                         trie_node_data_append(node, i2)
  *                                         trie_node_data_append(node, i3)
  *                                 ptr3 = ptr3 + 2             # <<<<<<<<<<<<<<
@@ -27995,15 +29780,15 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_v_ptr3 = (__pyx_v_ptr3 + 2);
             }
-            __pyx_L30_break:;
-            goto __pyx_L27;
+            __pyx_L27_break:;
+            goto __pyx_L24;
           }
-          __pyx_L27:;
-          goto __pyx_L24;
+          __pyx_L24:;
+          goto __pyx_L21;
         }
-        __pyx_L24:;
+        __pyx_L21:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":378
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":378
  *                                         trie_node_data_append(node, i3)
  *                                 ptr3 = ptr3 + 2
  *                     ptr2 = ptr2 + 2             # <<<<<<<<<<<<<<
@@ -28012,9 +29797,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_v_ptr2 = (__pyx_v_ptr2 + 2);
       }
-      __pyx_L22_break:;
+      __pyx_L19_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":379
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":379
  *                                 ptr3 = ptr3 + 2
  *                     ptr2 = ptr2 + 2
  *                 ptr1 = ptr1 + 2             # <<<<<<<<<<<<<<
@@ -28022,11 +29807,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 sent_count = sent_count + 1
  */
       __pyx_v_ptr1 = (__pyx_v_ptr1 + 2);
-      goto __pyx_L20;
+      goto __pyx_L17;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":381
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":381
  *                 ptr1 = ptr1 + 2
  *             else:
  *                 sent_count = sent_count + 1             # <<<<<<<<<<<<<<
@@ -28035,7 +29820,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_sent_count = (__pyx_v_sent_count + 1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":382
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":382
  *             else:
  *                 sent_count = sent_count + 1
  *                 if sent_count % 10000 == 0:             # <<<<<<<<<<<<<<
@@ -28045,7 +29830,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_t_19 = (__Pyx_mod_long(__pyx_v_sent_count, 10000) == 0);
       if (__pyx_t_19) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":383
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":383
  *                 sent_count = sent_count + 1
  *                 if sent_count % 10000 == 0:
  *                     logger.debug("        %d sentences", sent_count)             # <<<<<<<<<<<<<<
@@ -28060,7 +29845,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_t_3 = PyInt_FromLong(__pyx_v_sent_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+        __Pyx_GOTREF(__pyx_t_8);
         __Pyx_INCREF(((PyObject *)__pyx_kp_s_78));
         PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_78));
         __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_78));
@@ -28072,11 +29857,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        goto __pyx_L38;
+        goto __pyx_L35;
       }
-      __pyx_L38:;
+      __pyx_L35:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":384
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":384
  *                 if sent_count % 10000 == 0:
  *                     logger.debug("        %d sentences", sent_count)
  *                 ptr1 = ptr1 + 1             # <<<<<<<<<<<<<<
@@ -28085,10 +29870,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_ptr1 = (__pyx_v_ptr1 + 1);
     }
-    __pyx_L20:;
+    __pyx_L17:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":386
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":386
  *                 ptr1 = ptr1 + 1
  * 
  *         self.precomputed_collocations = collocations.toMap(False)             # <<<<<<<<<<<<<<
@@ -28100,7 +29885,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_8 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
   __pyx_t_8 = 0;
@@ -28109,12 +29894,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_8);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations = __pyx_t_8;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
+  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
+  __pyx_v_self->precomputed_collocations = __pyx_t_8;
   __pyx_t_8 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":387
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":387
  * 
  *         self.precomputed_collocations = collocations.toMap(False)
  *         self.precomputed_index = frequent_patterns.toMap(True)             # <<<<<<<<<<<<<<
@@ -28126,7 +29911,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -28135,12 +29920,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
+  __Pyx_DECREF(__pyx_v_self->precomputed_index);
+  __pyx_v_self->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":389
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":389
  *         self.precomputed_index = frequent_patterns.toMap(True)
  * 
  *         x = 0             # <<<<<<<<<<<<<<
@@ -28150,7 +29935,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_x = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":390
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":390
  * 
  *         x = 0
  *         for pattern1 in J_set:             # <<<<<<<<<<<<<<
@@ -28176,7 +29961,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":391
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":391
  *         x = 0
  *         for pattern1 in J_set:
  *             for pattern2 in J_set:             # <<<<<<<<<<<<<<
@@ -28202,7 +29987,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_v_pattern2 = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":392
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":392
  *         for pattern1 in J_set:
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:             # <<<<<<<<<<<<<<
@@ -28211,10 +29996,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":393
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":393
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -28230,26 +30015,23 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_v_combined_pattern = __pyx_t_7;
         __pyx_t_7 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":394
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":394
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     J2_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  * 
  *         for pattern1 in I_set:
  */
-        if (unlikely(((PyObject *)__pyx_v_J2_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_J2_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L43;
+        goto __pyx_L40;
       }
-      __pyx_L43:;
+      __pyx_L40:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":396
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":396
  *                     J2_set.add(combined_pattern)
  * 
  *         for pattern1 in I_set:             # <<<<<<<<<<<<<<
@@ -28275,7 +30057,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":397
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":397
  * 
  *         for pattern1 in I_set:
  *             for pattern2 in I_set:             # <<<<<<<<<<<<<<
@@ -28301,7 +30083,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_v_pattern2 = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":398
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":398
  *         for pattern1 in I_set:
  *             for pattern2 in I_set:
  *                 x = x+1             # <<<<<<<<<<<<<<
@@ -28314,7 +30096,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_v_x = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":399
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":399
  *             for pattern2 in I_set:
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:             # <<<<<<<<<<<<<<
@@ -28323,10 +30105,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+      __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":400
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":400
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -28342,26 +30124,23 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_v_combined_pattern = __pyx_t_8;
         __pyx_t_8 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":401
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":401
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  * 
  *         for pattern1 in I_set:
  */
-        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L48;
+        goto __pyx_L45;
       }
-      __pyx_L48:;
+      __pyx_L45:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":403
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":403
  *                     IJ_set.add(combined_pattern)
  * 
  *         for pattern1 in I_set:             # <<<<<<<<<<<<<<
@@ -28387,7 +30166,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":404
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":404
  * 
  *         for pattern1 in I_set:
  *             for pattern2 in J2_set:             # <<<<<<<<<<<<<<
@@ -28413,7 +30192,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_v_pattern2 = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":405
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":405
  *         for pattern1 in I_set:
  *             for pattern2 in J2_set:
  *                 x = x+2             # <<<<<<<<<<<<<<
@@ -28426,7 +30205,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_v_x = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":406
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":406
  *             for pattern2 in J2_set:
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:             # <<<<<<<<<<<<<<
@@ -28435,10 +30214,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":407
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":407
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -28454,19 +30233,16 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_v_combined_pattern = __pyx_t_7;
         __pyx_t_7 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":408
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":408
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  *                     IJ_set.add(combined_pattern)
  */
-        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":409
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":409
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1             # <<<<<<<<<<<<<<
@@ -28482,39 +30258,33 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_v_combined_pattern = __pyx_t_8;
         __pyx_t_8 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":410
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":410
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  * 
  *         N = len(pattern_rank)
  */
-        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L53;
+        goto __pyx_L50;
       }
-      __pyx_L53:;
+      __pyx_L50:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":412
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":412
  *                     IJ_set.add(combined_pattern)
  * 
  *         N = len(pattern_rank)             # <<<<<<<<<<<<<<
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)
  */
-  if (unlikely(((PyObject *)__pyx_v_pattern_rank) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); 
+  __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_14;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":413
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":413
  * 
  *         N = len(pattern_rank)
  *         cost_by_rank = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -28527,13 +30297,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_cost_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":414
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":414
  *         N = len(pattern_rank)
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -28546,111 +30316,53 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __pyx_v_count_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":415
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":415
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)
  *         for pattern, arr in self.precomputed_collocations.iteritems():             # <<<<<<<<<<<<<<
  *             if pattern not in IJ_set:
  *                 s = ""
  */
-  __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-    __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_14 = 0;
-    __pyx_t_4 = NULL;
-  } else {
-    __pyx_t_14 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  __pyx_t_14 = 0;
+  if (unlikely(__pyx_v_self->precomputed_collocations == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
-      if (__pyx_t_14 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
-      if (__pyx_t_14 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++;
-    } else {
-      __pyx_t_3 = __pyx_t_4(__pyx_t_1);
-      if (unlikely(!__pyx_t_3)) {
-        if (PyErr_Occurred()) {
-          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        break;
-      }
-      __Pyx_GOTREF(__pyx_t_3);
-    }
-    if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-      PyObject* sequence = __pyx_t_3;
-      if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
-        __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
-      } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
-        __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
-      }
-      __Pyx_INCREF(__pyx_t_8);
-      __Pyx_INCREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    } else {
-      Py_ssize_t index = -1;
-      __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_10 = Py_TYPE(__pyx_t_5)->tp_iternext;
-      index = 0; __pyx_t_8 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_8)) goto __pyx_L56_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_8);
-      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_7)) goto __pyx_L56_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_7);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_5), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L57_unpacking_done;
-      __pyx_L56_unpacking_failed:;
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L57_unpacking_done:;
-    }
+  __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_self->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_2), (&__pyx_t_13)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_1);
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_t_3 = 0;
+  while (1) {
+    __pyx_t_16 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_2, &__pyx_t_14, &__pyx_t_3, &__pyx_t_8, NULL, __pyx_t_13);
+    if (unlikely(__pyx_t_16 == 0)) break;
+    if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_8;
-    __pyx_t_8 = 0;
+    __pyx_v_pattern = __pyx_t_3;
+    __pyx_t_3 = 0;
     __Pyx_XDECREF(__pyx_v_arr);
-    __pyx_v_arr = __pyx_t_7;
-    __pyx_t_7 = 0;
+    __pyx_v_arr = __pyx_t_8;
+    __pyx_t_8 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":416
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":416
  *         count_by_rank = IntList(initial_len=N)
  *         for pattern, arr in self.precomputed_collocations.iteritems():
  *             if pattern not in IJ_set:             # <<<<<<<<<<<<<<
  *                 s = ""
  *                 for word_id in pattern:
  */
-    __pyx_t_19 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_IJ_set), __pyx_v_pattern))); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, ((PyObject *)__pyx_v_IJ_set), Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":417
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":417
  *         for pattern, arr in self.precomputed_collocations.iteritems():
  *             if pattern not in IJ_set:
  *                 s = ""             # <<<<<<<<<<<<<<
@@ -28661,7 +30373,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_XDECREF(__pyx_v_s);
       __pyx_v_s = ((PyObject *)__pyx_kp_s_45);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":418
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":418
  *             if pattern not in IJ_set:
  *                 s = ""
  *                 for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -28669,117 +30381,124 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         s = s + "X "
  */
       if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-        __pyx_t_3 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
-        __pyx_t_20 = NULL;
+        __pyx_t_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_12 = 0;
+        __pyx_t_4 = NULL;
       } else {
-        __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_20 = Py_TYPE(__pyx_t_3)->tp_iternext;
+        __pyx_t_12 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_4 = Py_TYPE(__pyx_t_8)->tp_iternext;
       }
       for (;;) {
-        if (PyList_CheckExact(__pyx_t_3)) {
-          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-          __pyx_t_7 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
-        } else if (PyTuple_CheckExact(__pyx_t_3)) {
-          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-          __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
+        if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_8)) {
+          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_8)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_12); __Pyx_INCREF(__pyx_t_3); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_8)) {
+          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_12); __Pyx_INCREF(__pyx_t_3); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
         } else {
-          __pyx_t_7 = __pyx_t_20(__pyx_t_3);
-          if (unlikely(!__pyx_t_7)) {
+          __pyx_t_3 = __pyx_t_4(__pyx_t_8);
+          if (unlikely(!__pyx_t_3)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
               else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_GOTREF(__pyx_t_3);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_7;
-        __pyx_t_7 = 0;
+        __pyx_v_word_id = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":419
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":419
  *                 s = ""
  *                 for word_id in pattern:
  *                     if word_id == -1:             # <<<<<<<<<<<<<<
  *                         s = s + "X "
  *                     else:
  */
-        __pyx_t_7 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __pyx_t_3 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_19) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":420
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":420
  *                 for word_id in pattern:
  *                     if word_id == -1:
  *                         s = s + "X "             # <<<<<<<<<<<<<<
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "
  */
-          __pyx_t_7 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_7);
+          __pyx_t_3 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_7;
-          __pyx_t_7 = 0;
-          goto __pyx_L61;
+          __pyx_v_s = __pyx_t_3;
+          __pyx_t_3 = 0;
+          goto __pyx_L56;
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":422
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":422
  *                         s = s + "X "
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "             # <<<<<<<<<<<<<<
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)
  *             else:
  */
-          __pyx_t_7 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_7 = PyNumber_Add(__pyx_v_s, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_7);
-          __pyx_t_8 = PyNumber_Add(__pyx_v_s, __pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __pyx_t_3 = PyNumber_Add(__pyx_t_7, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-          __pyx_t_7 = PyNumber_Add(__pyx_t_8, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_7;
-          __pyx_t_7 = 0;
+          __pyx_v_s = __pyx_t_3;
+          __pyx_t_3 = 0;
         }
-        __pyx_L61:;
+        __pyx_L56:;
       }
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":423
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":423
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)             # <<<<<<<<<<<<<<
  *             else:
  *                 chunk = ()
  */
-      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__warn); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_7 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_84));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_84));
+      PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_84));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_84));
       __Pyx_INCREF(__pyx_v_s);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_s);
+      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_s);
       __Pyx_GIVEREF(__pyx_v_s);
-      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      goto __pyx_L58;
+      goto __pyx_L53;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":425
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":425
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)
  *             else:
  *                 chunk = ()             # <<<<<<<<<<<<<<
@@ -28790,7 +30509,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_XDECREF(((PyObject *)__pyx_v_chunk));
       __pyx_v_chunk = __pyx_empty_tuple;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":426
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":426
  *             else:
  *                 chunk = ()
  *                 max_rank = 0             # <<<<<<<<<<<<<<
@@ -28799,7 +30518,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_max_rank = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":427
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":427
  *                 chunk = ()
  *                 max_rank = 0
  *                 arity = 0             # <<<<<<<<<<<<<<
@@ -28810,7 +30529,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_XDECREF(__pyx_v_arity);
       __pyx_v_arity = __pyx_int_0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":428
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":428
  *                 max_rank = 0
  *                 arity = 0
  *                 for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -28818,93 +30537,99 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  */
       if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-        __pyx_t_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_2 = 0;
-        __pyx_t_20 = NULL;
+        __pyx_t_7 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_7); __pyx_t_12 = 0;
+        __pyx_t_4 = NULL;
       } else {
-        __pyx_t_2 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_20 = Py_TYPE(__pyx_t_8)->tp_iternext;
+        __pyx_t_12 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_4 = Py_TYPE(__pyx_t_7)->tp_iternext;
       }
       for (;;) {
-        if (PyList_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_8)) break;
-          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
-        } else if (PyTuple_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
-          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
+        if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_7)) {
+          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_7)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_8 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_8); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_7)) {
+          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_8); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
         } else {
-          __pyx_t_3 = __pyx_t_20(__pyx_t_8);
-          if (unlikely(!__pyx_t_3)) {
+          __pyx_t_8 = __pyx_t_4(__pyx_t_7);
+          if (unlikely(!__pyx_t_8)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
               else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(__pyx_t_8);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_word_id = __pyx_t_8;
+        __pyx_t_8 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":429
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":429
  *                 arity = 0
  *                 for word_id in pattern:
  *                     if word_id == -1:             # <<<<<<<<<<<<<<
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1
  */
-        __pyx_t_3 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_8 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
         if (__pyx_t_19) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":430
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":430
  *                 for word_id in pattern:
  *                     if word_id == -1:
  *                         max_rank = max(max_rank, pattern_rank[chunk])             # <<<<<<<<<<<<<<
  *                         arity = arity + 1
  *                         chunk = ()
  */
-          __pyx_t_3 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_13 = __pyx_v_max_rank;
-          __pyx_t_5 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_16 = __pyx_v_max_rank;
+          __pyx_t_5 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
-          __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, __pyx_t_5, Py_GT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_5, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
           __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
           if (__pyx_t_19) {
-            __Pyx_INCREF(__pyx_t_3);
-            __pyx_t_7 = __pyx_t_3;
+            __Pyx_INCREF(__pyx_t_8);
+            __pyx_t_3 = __pyx_t_8;
           } else {
-            __pyx_t_6 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_6 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_6);
-            __pyx_t_7 = __pyx_t_6;
+            __pyx_t_3 = __pyx_t_6;
             __pyx_t_6 = 0;
           }
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-          __pyx_v_max_rank = __pyx_t_13;
+          __pyx_v_max_rank = __pyx_t_16;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":431
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":431
  *                     if word_id == -1:
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1             # <<<<<<<<<<<<<<
  *                         chunk = ()
  *                     else:
  */
-          __pyx_t_7 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_7);
+          __pyx_t_3 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_v_arity);
-          __pyx_v_arity = __pyx_t_7;
-          __pyx_t_7 = 0;
+          __pyx_v_arity = __pyx_t_3;
+          __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":432
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":432
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1
  *                         chunk = ()             # <<<<<<<<<<<<<<
@@ -28914,105 +30639,104 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
           __pyx_v_chunk = __pyx_empty_tuple;
-          goto __pyx_L64;
+          goto __pyx_L59;
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":434
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":434
  *                         chunk = ()
  *                     else:
  *                         chunk = chunk + (word_id,)             # <<<<<<<<<<<<<<
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  */
-          __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_7));
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_v_word_id);
-          PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_word_id);
+          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_word_id);
           __Pyx_GIVEREF(__pyx_v_word_id);
-          __pyx_t_3 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-          __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+          __pyx_t_8 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
-          __pyx_v_chunk = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __pyx_v_chunk = __pyx_t_8;
+          __pyx_t_8 = 0;
         }
-        __pyx_L64:;
+        __pyx_L59:;
       }
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":435
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":435
  *                     else:
  *                         chunk = chunk + (word_id,)
  *                 max_rank = max(max_rank, pattern_rank[chunk])             # <<<<<<<<<<<<<<
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  */
-      __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_13 = __pyx_v_max_rank;
-      __pyx_t_7 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_7, Py_GT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_16 = __pyx_v_max_rank;
+      __pyx_t_3 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_6 = PyObject_RichCompare(__pyx_t_7, __pyx_t_3, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       if (__pyx_t_19) {
-        __Pyx_INCREF(__pyx_t_8);
-        __pyx_t_3 = __pyx_t_8;
+        __Pyx_INCREF(__pyx_t_7);
+        __pyx_t_8 = __pyx_t_7;
       } else {
-        __pyx_t_6 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_3 = __pyx_t_6;
+        __pyx_t_8 = __pyx_t_6;
         __pyx_t_6 = 0;
       }
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_v_max_rank = __pyx_t_13;
+      __pyx_v_max_rank = __pyx_t_16;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":436
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":436
  *                         chunk = chunk + (word_id,)
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))             # <<<<<<<<<<<<<<
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  * 
  */
-      __pyx_t_2 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_2));
+      __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_12));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":437
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":437
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))             # <<<<<<<<<<<<<<
  * 
  *         cumul_cost = 0
  */
-      __pyx_t_3 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_2 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyInt_FromSsize_t(__pyx_t_12); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_6 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = __Pyx_PyNumber_Divide(__pyx_t_8, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyNumber_Add(__pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyNumber_Add(__pyx_t_8, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_13;
+      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_16;
     }
-    __pyx_L58:;
+    __pyx_L53:;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":439
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":439
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  * 
  *         cumul_cost = 0             # <<<<<<<<<<<<<<
@@ -29022,7 +30746,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_cumul_cost = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":440
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":440
  * 
  *         cumul_cost = 0
  *         cumul_count = 0             # <<<<<<<<<<<<<<
@@ -29032,7 +30756,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_cumul_count = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":441
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":441
  *         cumul_cost = 0
  *         cumul_count = 0
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -29042,7 +30766,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_13 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":442
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":442
  *         cumul_count = 0
  *         for i from 0 <= i < N:
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]             # <<<<<<<<<<<<<<
@@ -29058,7 +30782,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_v_cumul_cost = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":443
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":443
  *         for i from 0 <= i < N:
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]
  *             cumul_count = cumul_count + count_by_rank.arr[i]             # <<<<<<<<<<<<<<
@@ -29074,7 +30798,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_v_cumul_count = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":444
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":444
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]
  *             cumul_count = cumul_count + count_by_rank.arr[i]
  *             logger.debug("RANK %d\tCOUNT, COST: %d    %d\tCUMUL: %d, %d", i, count_by_rank.arr[i], cost_by_rank.arr[i], cumul_count, cumul_cost)             # <<<<<<<<<<<<<<
@@ -29088,104 +30812,107 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_7 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_8 = PyTuple_New(6); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+    __pyx_t_8 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_7 = PyTuple_New(6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_85));
+    PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_85));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
-    PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7);
-    __Pyx_GIVEREF(__pyx_t_7);
-    PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_8);
+    __Pyx_GIVEREF(__pyx_t_8);
     __Pyx_INCREF(__pyx_v_cumul_count);
-    PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_v_cumul_count);
+    PyTuple_SET_ITEM(__pyx_t_7, 4, __pyx_v_cumul_count);
     __Pyx_GIVEREF(__pyx_v_cumul_count);
     __Pyx_INCREF(__pyx_v_cumul_cost);
-    PyTuple_SET_ITEM(__pyx_t_8, 5, __pyx_v_cumul_cost);
+    PyTuple_SET_ITEM(__pyx_t_7, 5, __pyx_v_cumul_cost);
     __Pyx_GIVEREF(__pyx_v_cumul_cost);
     __pyx_t_1 = 0;
-    __pyx_t_7 = 0;
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_8 = 0;
+    __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":446
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":446
  *             logger.debug("RANK %d\tCOUNT, COST: %d    %d\tCUMUL: %d, %d", i, count_by_rank.arr[i], cost_by_rank.arr[i], cumul_count, cumul_cost)
  * 
  *         num_found_patterns = len(self.precomputed_collocations)             # <<<<<<<<<<<<<<
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:
  */
-  __pyx_t_3 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_3);
-  __pyx_t_14 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_num_found_patterns = __pyx_t_14;
+  __pyx_t_8 = __pyx_v_self->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_8);
+  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_v_num_found_patterns = __pyx_t_8;
+  __pyx_t_8 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":447
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":447
  * 
  *         num_found_patterns = len(self.precomputed_collocations)
  *         for pattern in IJ_set:             # <<<<<<<<<<<<<<
  *             if pattern not in self.precomputed_collocations:
  *                 self.precomputed_collocations[pattern] = IntList()
  */
-  __pyx_t_3 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
+  __pyx_t_8 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_4 = Py_TYPE(__pyx_t_8)->tp_iternext;
   for (;;) {
     {
-      __pyx_t_8 = __pyx_t_4(__pyx_t_3);
-      if (unlikely(!__pyx_t_8)) {
+      __pyx_t_7 = __pyx_t_4(__pyx_t_8);
+      if (unlikely(!__pyx_t_7)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
           else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
-      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_GOTREF(__pyx_t_7);
     }
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_8;
-    __pyx_t_8 = 0;
+    __pyx_v_pattern = __pyx_t_7;
+    __pyx_t_7 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":448
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":448
  *         num_found_patterns = len(self.precomputed_collocations)
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:             # <<<<<<<<<<<<<<
  *                 self.precomputed_collocations[pattern] = IntList()
  * 
  */
-    __pyx_t_19 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_v_pattern))); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, __pyx_v_self->precomputed_collocations, Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":449
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":449
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:
  *                 self.precomputed_collocations[pattern] = IntList()             # <<<<<<<<<<<<<<
  * 
  *         cdef float stop_time = monitor_cpu()
  */
-      __pyx_t_8 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      if (PyObject_SetItem(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_v_pattern, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      goto __pyx_L69;
+      __pyx_t_7 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_pattern, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L64;
     }
-    __pyx_L69:;
+    __pyx_L64:;
   }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":451
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":451
  *                 self.precomputed_collocations[pattern] = IntList()
  * 
  *         cdef float stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -29194,102 +30921,100 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
   __pyx_v_stop_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":452
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":452
  * 
  *         cdef float stop_time = monitor_cpu()
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)             # <<<<<<<<<<<<<<
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))
  */
-  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_num_found_patterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_6 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_6);
-  __pyx_t_14 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_14); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __pyx_v_self->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_8);
+  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_6 = PyTuple_New(4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_86));
-  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_86));
+  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_s_86));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_86));
-  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_3);
-  __Pyx_GIVEREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_6);
-  __Pyx_GIVEREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_v_num_found_patterns);
+  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_v_num_found_patterns);
+  __Pyx_GIVEREF(__pyx_v_num_found_patterns);
+  PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
   __Pyx_INCREF(__pyx_v_x);
-  PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_v_x);
+  PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_v_x);
   __Pyx_GIVEREF(__pyx_v_x);
-  __pyx_t_3 = 0;
-  __pyx_t_6 = 0;
-  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":453
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":453
  *         cdef float stop_time = monitor_cpu()
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))             # <<<<<<<<<<<<<<
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))
  */
-  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_6 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_7 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __pyx_v_self->precomputed_index;
+  __Pyx_INCREF(__pyx_t_8);
+  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index;
-  __Pyx_INCREF(__pyx_t_6);
-  __pyx_t_14 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_14); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_8));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_87));
+  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_87));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6);
-  __Pyx_GIVEREF(__pyx_t_6);
-  __pyx_t_6 = 0;
-  __pyx_t_6 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":454
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":454
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
  */
-  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_88));
-  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_88));
+  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_s_88));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_88));
-  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6);
-  __Pyx_GIVEREF(__pyx_t_6);
-  __pyx_t_6 = 0;
-  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
+  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -29332,43 +31057,39 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_XDECREF(__pyx_v_arity);
   __Pyx_XDECREF(__pyx_v_cumul_cost);
   __Pyx_XDECREF(__pyx_v_cumul_count);
+  __Pyx_XDECREF(__pyx_v_num_found_patterns);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":11
- *     cdef IntList ha
- * 
- *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
- *         self.darray = DataArray()
- *         self.sa = IntList()
- */
-
-static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
     PyObject* values[3] = {0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":11
+ *     cdef IntList ha
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
+ *         self.darray = DataArray()
+ *         self.sa = IntList()
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -29376,7 +31097,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -29394,7 +31115,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -29417,8 +31138,24 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray___cinit__(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text, __pyx_v_side);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":12
+static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":12
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):
  *         self.darray = DataArray()             # <<<<<<<<<<<<<<
@@ -29428,12 +31165,12 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->darray);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->darray));
+  __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":13
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":13
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):
  *         self.darray = DataArray()
  *         self.sa = IntList()             # <<<<<<<<<<<<<<
@@ -29443,12 +31180,12 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":14
  *         self.darray = DataArray()
  *         self.sa = IntList()
  *         self.ha = IntList()             # <<<<<<<<<<<<<<
@@ -29458,12 +31195,12 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->ha);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->ha));
+  __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":15
  *         self.sa = IntList()
  *         self.ha = IntList()
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -29473,17 +31210,17 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":16
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":16
  *         self.ha = IntList()
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_text:
  *             self.read_text(from_text, side)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -29492,10 +31229,10 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":17
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -29505,17 +31242,17 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":18
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":18
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             self.read_text(from_text, side)             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, i):
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -29527,9 +31264,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -29544,7 +31281,18 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":20
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_2__getitem__(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":20
  *             self.read_text(from_text, side)
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -29552,8 +31300,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -29561,18 +31308,18 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":21
  * 
  *     def __getitem__(self, i):
  *         return self.sa.arr[i]             # <<<<<<<<<<<<<<
  * 
- *     def getSentId(self, i):
+ *     def get_sentence_id(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sa->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -29590,16 +31337,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":23
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_4get_sentence_id(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":23
  *         return self.sa.arr[i]
  * 
- *     def getSentId(self, i):             # <<<<<<<<<<<<<<
- *         return self.darray.getSentId(i)
+ *     def get_sentence_id(self, i):             # <<<<<<<<<<<<<<
+ *         return self.darray.get_sentence_id(i)
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -29608,20 +31365,20 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentId");
+  __Pyx_RefNannySetupContext("get_sentence_id", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":24
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":24
  * 
- *     def getSentId(self, i):
- *         return self.darray.getSentId(i)             # <<<<<<<<<<<<<<
+ *     def get_sentence_id(self, i):
+ *         return self.darray.get_sentence_id(i)             # <<<<<<<<<<<<<<
  * 
- *     def getSent(self, i):
+ *     def get_sentence(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__getSentId); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__get_sentence_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_i);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -29639,7 +31396,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self,
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.SuffixArray.getSentId", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.SuffixArray.get_sentence_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -29647,16 +31404,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2getSentId(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":26
- *         return self.darray.getSentId(i)
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_6get_sentence(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":26
+ *         return self.darray.get_sentence_id(i)
  * 
- *     def getSent(self, i):             # <<<<<<<<<<<<<<
- *         return self.darray.getSent(i)
+ *     def get_sentence(self, i):             # <<<<<<<<<<<<<<
+ *         return self.darray.get_sentence(i)
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -29665,20 +31432,20 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSent");
+  __Pyx_RefNannySetupContext("get_sentence", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":27
  * 
- *     def getSent(self, i):
- *         return self.darray.getSent(i)             # <<<<<<<<<<<<<<
+ *     def get_sentence(self, i):
+ *         return self.darray.get_sentence(i)             # <<<<<<<<<<<<<<
  * 
- *     def getSentPos(self, loc):
+ *     def get_sentence_position(self, loc):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__getSent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__get_sentence); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_i);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -29696,7 +31463,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, Py
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.SuffixArray.getSent", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.SuffixArray.get_sentence", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -29704,16 +31471,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3getSent(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":29
- *         return self.darray.getSent(i)
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence_position (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_8get_sentence_position(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":29
+ *         return self.darray.get_sentence(i)
  * 
- *     def getSentPos(self, loc):             # <<<<<<<<<<<<<<
- *         return self.darray.getSentPos(loc)
+ *     def get_sentence_position(self, loc):             # <<<<<<<<<<<<<<
+ *         return self.darray.get_sentence_position(loc)
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -29722,20 +31499,20 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getSentPos");
+  __Pyx_RefNannySetupContext("get_sentence_position", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":30
  * 
- *     def getSentPos(self, loc):
- *         return self.darray.getSentPos(loc)             # <<<<<<<<<<<<<<
+ *     def get_sentence_position(self, loc):
+ *         return self.darray.get_sentence_position(loc)             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, filename, side):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__getSentPos); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_89); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_loc);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_loc);
   __Pyx_GIVEREF(__pyx_v_loc);
@@ -29753,7 +31530,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self,
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.SuffixArray.getSentPos", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.SuffixArray.get_sentence_position", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -29761,75 +31538,40 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4getSentPos(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":32
- *         return self.darray.getSentPos(loc)
- * 
- *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
- *         '''Constructs suffix array using the algorithm
- *         of Larsson & Sadahkane (1999)'''
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_5read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
-static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_10read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
+static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_filename = 0;
   PyObject *__pyx_v_side = 0;
-  int __pyx_v_V;
-  int __pyx_v_N;
-  int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_h;
-  int __pyx_v_a_i;
-  int __pyx_v_n;
-  int __pyx_v_current_run;
-  int __pyx_v_skip;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_word_count = 0;
-  float __pyx_v_sort_start_time;
-  float __pyx_v_start_time;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  long __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
-  __Pyx_RefNannySetupContext("read_text");
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("read_text", 1, 2, 2, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -29848,8 +31590,52 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_10read_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":38
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":32
+ *         return self.darray.get_sentence_position(loc)
+ * 
+ *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
+ *         '''Constructs suffix array using the algorithm
+ *         of Larsson & Sadahkane (1999)'''
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side) {
+  int __pyx_v_V;
+  int __pyx_v_N;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_h;
+  int __pyx_v_a_i;
+  int __pyx_v_n;
+  int __pyx_v_current_run;
+  int __pyx_v_skip;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_word_count = 0;
+  float __pyx_v_sort_start_time;
+  float __pyx_v_start_time;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  long __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_text", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":38
  *         cdef IntList isa, word_count
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)             # <<<<<<<<<<<<<<
@@ -29864,42 +31650,42 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__use_sent_id), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->darray);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->darray));
+  __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":39
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)             # <<<<<<<<<<<<<<
  *         V = len(self.darray.id2word)
  * 
  */
-  __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
+  __pyx_t_2 = ((PyObject *)__pyx_v_self->darray);
   __Pyx_INCREF(__pyx_t_2);
   __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_v_N = __pyx_t_3;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":40
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)
  *         V = len(self.darray.id2word)             # <<<<<<<<<<<<<<
  * 
  *         self.sa = IntList(initial_len=N)
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->id2word;
+  __pyx_t_2 = __pyx_v_self->darray->id2word;
   __Pyx_INCREF(__pyx_t_2);
   __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_v_V = __pyx_t_3;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":42
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":42
  *         V = len(self.darray.id2word)
  * 
  *         self.sa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -29912,16 +31698,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":43
  * 
  *         self.sa = IntList(initial_len=N)
  *         self.ha = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
@@ -29934,16 +31720,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->ha);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->ha));
+  __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":45
  *         self.ha = IntList(initial_len=V+1)
  * 
  *         isa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -29956,13 +31742,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_isa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":46
  * 
  *         isa = IntList(initial_len=N)
  *         word_count = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
@@ -29975,13 +31761,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_word_count = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":49
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":49
  * 
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -29990,7 +31776,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
   __pyx_v_sort_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":50
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":50
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()
  *         cdef float start_time = sort_start_time             # <<<<<<<<<<<<<<
@@ -29999,7 +31785,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
   __pyx_v_start_time = __pyx_v_sort_start_time;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":51
  *         cdef float sort_start_time = monitor_cpu()
  *         cdef float start_time = sort_start_time
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -30009,16 +31795,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":52
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":52
  *         cdef float start_time = sort_start_time
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  */
-    __pyx_v_a_i = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->data->arr[__pyx_v_i]);
+    __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":53
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1             # <<<<<<<<<<<<<<
@@ -30028,7 +31814,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     (__pyx_v_word_count->arr[__pyx_v_a_i]) = ((__pyx_v_word_count->arr[__pyx_v_a_i]) + 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":55
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":55
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  *         n = 0             # <<<<<<<<<<<<<<
@@ -30037,7 +31823,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
   __pyx_v_n = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":56
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":56
  * 
  *         n = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -30047,16 +31833,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_5 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":57
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":57
  *         n = 0
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n             # <<<<<<<<<<<<<<
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i]) = __pyx_v_n;
+    (__pyx_v_self->ha->arr[__pyx_v_i]) = __pyx_v_n;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":58
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":58
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]             # <<<<<<<<<<<<<<
@@ -30065,7 +31851,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_n = (__pyx_v_n + (__pyx_v_word_count->arr[__pyx_v_i]));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":59
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":59
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0             # <<<<<<<<<<<<<<
@@ -30075,7 +31861,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     (__pyx_v_word_count->arr[__pyx_v_i]) = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":61
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":61
  *             word_count.arr[i] = 0
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -30085,34 +31871,34 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":62
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":62
  * 
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  */
-    __pyx_v_a_i = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->data->arr[__pyx_v_i]);
+    __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":63
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":63
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i             # <<<<<<<<<<<<<<
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
+    (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":64
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":64
  *             a_i = self.darray.data.arr[i]
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket             # <<<<<<<<<<<<<<
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  */
-    (__pyx_v_isa->arr[__pyx_v_i]) = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[(__pyx_v_a_i + 1)]) - 1);
+    (__pyx_v_isa->arr[__pyx_v_i]) = ((__pyx_v_self->ha->arr[(__pyx_v_a_i + 1)]) - 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":65
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":65
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1             # <<<<<<<<<<<<<<
@@ -30122,7 +31908,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     (__pyx_v_word_count->arr[__pyx_v_a_i]) = ((__pyx_v_word_count->arr[__pyx_v_a_i]) + 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":68
  * 
  *         '''Determine size of initial runs'''
  *         current_run = 0             # <<<<<<<<<<<<<<
@@ -30131,7 +31917,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
   __pyx_v_current_run = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":69
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":69
  *         '''Determine size of initial runs'''
  *         current_run = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -30141,7 +31927,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_5 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":70
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":70
  *         current_run = 0
  *         for i from 0 <= i < V+1:
  *             if i < V and self.ha.arr[i+1] - self.ha.arr[i] == 1:             # <<<<<<<<<<<<<<
@@ -30150,14 +31936,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_t_6 = (__pyx_v_i < __pyx_v_V);
     if (__pyx_t_6) {
-      __pyx_t_7 = (((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[(__pyx_v_i + 1)]) - (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i])) == 1);
+      __pyx_t_7 = (((__pyx_v_self->ha->arr[(__pyx_v_i + 1)]) - (__pyx_v_self->ha->arr[__pyx_v_i])) == 1);
       __pyx_t_8 = __pyx_t_7;
     } else {
       __pyx_t_8 = __pyx_t_6;
     }
     if (__pyx_t_8) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":71
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":71
  *         for i from 0 <= i < V+1:
  *             if i < V and self.ha.arr[i+1] - self.ha.arr[i] == 1:
  *                 current_run = current_run + 1             # <<<<<<<<<<<<<<
@@ -30165,11 +31951,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                 if current_run > 0:
  */
       __pyx_v_current_run = (__pyx_v_current_run + 1);
-      goto __pyx_L14;
+      goto __pyx_L11;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":73
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":73
  *                 current_run = current_run + 1
  *             else:
  *                 if current_run > 0:             # <<<<<<<<<<<<<<
@@ -30179,16 +31965,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
       __pyx_t_8 = (__pyx_v_current_run > 0);
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":74
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":74
  *             else:
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run             # <<<<<<<<<<<<<<
  *                     current_run = 0
  * 
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
+        (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":75
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":75
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run
  *                     current_run = 0             # <<<<<<<<<<<<<<
@@ -30196,14 +31982,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))
  */
         __pyx_v_current_run = 0;
-        goto __pyx_L15;
+        goto __pyx_L12;
       }
-      __pyx_L15:;
+      __pyx_L12:;
     }
-    __pyx_L14:;
+    __pyx_L11:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":77
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":77
  *                     current_run = 0
  * 
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
@@ -30218,10 +32004,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_2 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_89));
-  PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_89));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_89));
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_90));
+  PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_90));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_90));
   PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -30231,7 +32017,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":80
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":80
  * 
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1             # <<<<<<<<<<<<<<
@@ -30240,7 +32026,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
   __pyx_v_h = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":81
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":81
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1
  *         while self.sa.arr[0] != -N:             # <<<<<<<<<<<<<<
@@ -30248,10 +32034,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *             logger.debug("    Refining, sort depth = %d", h)
  */
   while (1) {
-    __pyx_t_8 = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[0]) != (-__pyx_v_N));
+    __pyx_t_8 = ((__pyx_v_self->sa->arr[0]) != (-__pyx_v_N));
     if (!__pyx_t_8) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":82
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":82
  *         h = 1
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -30260,7 +32046,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_sort_start_time = __pyx_f_3_sa_monitor_cpu();
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":83
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":83
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)             # <<<<<<<<<<<<<<
@@ -30275,10 +32061,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __pyx_t_2 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-    __Pyx_INCREF(((PyObject *)__pyx_kp_s_90));
-    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_90));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_90));
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_s_91));
+    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_91));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_91));
     PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
@@ -30288,7 +32074,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":84
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":84
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0             # <<<<<<<<<<<<<<
@@ -30297,7 +32083,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_i = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":85
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0
  *             skip = 0             # <<<<<<<<<<<<<<
@@ -30306,7 +32092,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_skip = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":86
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":86
  *             i = 0
  *             skip = 0
  *             while i < N:             # <<<<<<<<<<<<<<
@@ -30317,38 +32103,38 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
       __pyx_t_8 = (__pyx_v_i < __pyx_v_N);
       if (!__pyx_t_8) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":87
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":87
  *             skip = 0
  *             while i < N:
  *                 if self.sa.arr[i] < 0:             # <<<<<<<<<<<<<<
  *                     skip = skip + self.sa.arr[i]
  *                     i = i - self.sa.arr[i]
  */
-      __pyx_t_8 = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) < 0);
+      __pyx_t_8 = ((__pyx_v_self->sa->arr[__pyx_v_i]) < 0);
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":88
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":88
  *             while i < N:
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]             # <<<<<<<<<<<<<<
  *                     i = i - self.sa.arr[i]
  *                 else:
  */
-        __pyx_v_skip = (__pyx_v_skip + (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]));
+        __pyx_v_skip = (__pyx_v_skip + (__pyx_v_self->sa->arr[__pyx_v_i]));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":89
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":89
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]
  *                     i = i - self.sa.arr[i]             # <<<<<<<<<<<<<<
  *                 else:
  *                     if skip < 0:
  */
-        __pyx_v_i = (__pyx_v_i - (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]));
-        goto __pyx_L20;
+        __pyx_v_i = (__pyx_v_i - (__pyx_v_self->sa->arr[__pyx_v_i]));
+        goto __pyx_L17;
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":91
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":91
  *                     i = i - self.sa.arr[i]
  *                 else:
  *                     if skip < 0:             # <<<<<<<<<<<<<<
@@ -30358,16 +32144,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
         __pyx_t_8 = (__pyx_v_skip < 0);
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":92
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":92
  *                 else:
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  */
-          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
+          (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":93
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":93
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0             # <<<<<<<<<<<<<<
@@ -30375,27 +32161,27 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                     self.q3sort(i, j, h, isa)
  */
           __pyx_v_skip = 0;
-          goto __pyx_L21;
+          goto __pyx_L18;
         }
-        __pyx_L21:;
+        __pyx_L18:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":94
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":94
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]             # <<<<<<<<<<<<<<
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  */
-        __pyx_v_j = (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i])]);
+        __pyx_v_j = (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":95
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":95
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)             # <<<<<<<<<<<<<<
  *                     i = j+1
  *             if skip < 0:
  */
-        __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
@@ -30404,7 +32190,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
         __pyx_t_10 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __pyx_t_11 = PyTuple_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+        __Pyx_GOTREF(__pyx_t_11);
         PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_9);
@@ -30423,7 +32209,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
         __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":96
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":96
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1             # <<<<<<<<<<<<<<
@@ -30432,10 +32218,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
         __pyx_v_i = (__pyx_v_j + 1);
       }
-      __pyx_L20:;
+      __pyx_L17:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":97
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":97
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  *             if skip < 0:             # <<<<<<<<<<<<<<
@@ -30445,19 +32231,19 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __pyx_t_8 = (__pyx_v_skip < 0);
     if (__pyx_t_8) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":98
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":98
  *                     i = j+1
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
  *             h = h * 2
  *             logger.debug("    Refinement took %f seconds", (monitor_cpu() - sort_start_time))
  */
-      (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
-      goto __pyx_L22;
+      (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
+      goto __pyx_L19;
     }
-    __pyx_L22:;
+    __pyx_L19:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":99
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":99
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2             # <<<<<<<<<<<<<<
@@ -30466,7 +32252,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_h = (__pyx_v_h * 2);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":100
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":100
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2
  *             logger.debug("    Refinement took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
@@ -30481,10 +32267,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __Pyx_INCREF(((PyObject *)__pyx_kp_s_91));
-    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_91));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_91));
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_s_92));
+    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_92));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_92));
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_10);
     __Pyx_GIVEREF(__pyx_t_10);
     __pyx_t_10 = 0;
@@ -30495,7 +32281,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":103
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
@@ -30507,12 +32293,12 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_2 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-  __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_93), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_94), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":104
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -30522,7 +32308,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":105
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]             # <<<<<<<<<<<<<<
@@ -30531,17 +32317,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_j = (__pyx_v_isa->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":106
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":106
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i             # <<<<<<<<<<<<<<
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
  * 
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_j]) = __pyx_v_i;
+    (__pyx_v_self->sa->arr[__pyx_v_j]) = __pyx_v_i;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":107
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))             # <<<<<<<<<<<<<<
@@ -30556,10 +32342,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
   __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_11));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_94));
-  PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_kp_s_94));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_94));
+  __Pyx_GOTREF(__pyx_t_11);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_95));
+  PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_kp_s_95));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_95));
   PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_10);
   __Pyx_GIVEREF(__pyx_t_10);
   __pyx_t_10 = 0;
@@ -30587,49 +32373,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":109
- *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
- * 
- *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
- *         '''This is a ternary quicksort. It divides the array into
- *         three partitions: items less than the pivot, items equal
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_6q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_12q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
+static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_h;
   struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
   PyObject *__pyx_v_pad = 0;
-  int __pyx_v_k;
-  int __pyx_v_midpoint;
-  int __pyx_v_pval;
-  int __pyx_v_phead;
-  int __pyx_v_ptail;
-  int __pyx_v_tmp;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  long __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *__pyx_t_8 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__i,&__pyx_n_s__j,&__pyx_n_s__h,&__pyx_n_s__isa,&__pyx_n_s__pad,0};
-  __Pyx_RefNannySetupContext("q3sort");
+  __Pyx_RefNannySetupContext("q3sort (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__i,&__pyx_n_s__j,&__pyx_n_s__h,&__pyx_n_s__isa,&__pyx_n_s__pad,0};
     PyObject* values[5] = {0,0,0,0,0};
     values[4] = ((PyObject *)__pyx_kp_s_45);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -30639,26 +32402,22 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -30669,7 +32428,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -30697,8 +32456,46 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_isa), __pyx_ptype_3_sa_IntList, 1, "isa", 0))) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_12q3sort(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_i, __pyx_v_j, __pyx_v_h, __pyx_v_isa, __pyx_v_pad);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":109
+ *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
+ * 
+ *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
+ *         '''This is a ternary quicksort. It divides the array into
+ *         three partitions: items less than the pivot, items equal
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":116
+static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad) {
+  int __pyx_v_k;
+  int __pyx_v_midpoint;
+  int __pyx_v_pval;
+  int __pyx_v_phead;
+  int __pyx_v_ptail;
+  int __pyx_v_tmp;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  long __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("q3sort", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":116
  *         cdef int k, midpoint, pval, phead, ptail, tmp
  * 
  *         if j-i < -1:             # <<<<<<<<<<<<<<
@@ -30708,7 +32505,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) < -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":117
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":117
  * 
  *         if j-i < -1:
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))             # <<<<<<<<<<<<<<
@@ -30720,18 +32517,18 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __pyx_t_3 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_2 = 0;
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_95), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_96), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -30741,11 +32538,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":118
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":118
  *         if j-i < -1:
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))
  *         if j-i == -1:    # recursive base case -- empty interval             # <<<<<<<<<<<<<<
@@ -30755,7 +32552,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":119
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":119
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return             # <<<<<<<<<<<<<<
@@ -30765,11 +32562,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_XDECREF(__pyx_r);
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":120
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":120
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return
  *         if (j-i == 0):    # recursive base case -- singleton interval             # <<<<<<<<<<<<<<
@@ -30779,25 +32576,25 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":121
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":121
  *             return
  *         if (j-i == 0):    # recursive base case -- singleton interval
  *             isa.arr[self.sa.arr[i]] = i             # <<<<<<<<<<<<<<
  *             self.sa.arr[i] = -1
  *             return
  */
-    (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i])]) = __pyx_v_i;
+    (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]) = __pyx_v_i;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":122
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":122
  *         if (j-i == 0):    # recursive base case -- singleton interval
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1             # <<<<<<<<<<<<<<
  *             return
  * 
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) = -1;
+    (__pyx_v_self->sa->arr[__pyx_v_i]) = -1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":123
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":123
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1
  *             return             # <<<<<<<<<<<<<<
@@ -30807,11 +32604,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_XDECREF(__pyx_r);
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L5;
   }
-  __pyx_L8:;
+  __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":132
  *         # If the method of assigning word_id's is changed, this method
  *         # may need to be reconsidered as well.
  *         midpoint = (i+j)/2             # <<<<<<<<<<<<<<
@@ -30820,16 +32617,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_i + __pyx_v_j), 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":133
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":133
  *         # may need to be reconsidered as well.
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]             # <<<<<<<<<<<<<<
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  */
-  __pyx_v_pval = (__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
+  __pyx_v_pval = (__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":134
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":134
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:             # <<<<<<<<<<<<<<
@@ -30839,37 +32636,37 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_1 = (__pyx_v_i != __pyx_v_midpoint);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":135
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":135
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]             # <<<<<<<<<<<<<<
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  */
-    __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]);
+    __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_midpoint]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":136
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":136
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]             # <<<<<<<<<<<<<<
  *             self.sa.arr[i] = tmp
  *         phead = i
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]);
+    (__pyx_v_self->sa->arr[__pyx_v_midpoint]) = (__pyx_v_self->sa->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":137
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":137
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp             # <<<<<<<<<<<<<<
  *         phead = i
  *         ptail = i
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) = __pyx_v_tmp;
-    goto __pyx_L9;
+    (__pyx_v_self->sa->arr[__pyx_v_i]) = __pyx_v_tmp;
+    goto __pyx_L6;
   }
-  __pyx_L9:;
+  __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":138
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":138
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  *         phead = i             # <<<<<<<<<<<<<<
@@ -30878,7 +32675,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  */
   __pyx_v_phead = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":139
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":139
  *             self.sa.arr[i] = tmp
  *         phead = i
  *         ptail = i             # <<<<<<<<<<<<<<
@@ -30887,7 +32684,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  */
   __pyx_v_ptail = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":143
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":143
  *         # find the three partitions.    phead marks the first element
  *         # of the middle partition, and ptail marks the last element
  *         for k from i+1 <= k < j+1:             # <<<<<<<<<<<<<<
@@ -30897,17 +32694,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_5 = (__pyx_v_j + 1);
   for (__pyx_v_k = (__pyx_v_i + 1); __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":144
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":144
  *         # of the middle partition, and ptail marks the last element
  *         for k from i+1 <= k < j+1:
  *             if isa.arr[self.sa.arr[k] + h] < pval:             # <<<<<<<<<<<<<<
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]
  */
-    __pyx_t_1 = ((__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
+    __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":145
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":145
  *         for k from i+1 <= k < j+1:
  *             if isa.arr[self.sa.arr[k] + h] < pval:
  *                 if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -30917,75 +32714,75 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
       __pyx_t_1 = (__pyx_v_k > (__pyx_v_ptail + 1));
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":146
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":146
  *             if isa.arr[self.sa.arr[k] + h] < pval:
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  */
-        __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]);
+        __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":147
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":147
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  *                     self.sa.arr[ptail+1] = tmp
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
+        (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":148
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":148
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]);
+        (__pyx_v_self->sa->arr[__pyx_v_k]) = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":149
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":149
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  *                     self.sa.arr[ptail+1] = tmp             # <<<<<<<<<<<<<<
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]) = __pyx_v_tmp;
-        goto __pyx_L13;
+        (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = __pyx_v_tmp;
+        goto __pyx_L10;
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":151
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":151
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  */
-        __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]);
+        __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":152
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":152
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
+        (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":153
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":153
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp             # <<<<<<<<<<<<<<
  *                 phead = phead + 1
  *                 ptail = ptail + 1
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
+        (__pyx_v_self->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
       }
-      __pyx_L13:;
+      __pyx_L10:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":154
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":154
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1             # <<<<<<<<<<<<<<
@@ -30994,7 +32791,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  */
       __pyx_v_phead = (__pyx_v_phead + 1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":155
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":155
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  *                 ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -31002,21 +32799,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  */
       __pyx_v_ptail = (__pyx_v_ptail + 1);
-      goto __pyx_L12;
+      goto __pyx_L9;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":157
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":157
  *                 ptail = ptail + 1
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:             # <<<<<<<<<<<<<<
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]
  */
-      __pyx_t_1 = ((__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
+      __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":158
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":158
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -31026,37 +32823,37 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
         __pyx_t_1 = (__pyx_v_k > (__pyx_v_ptail + 1));
         if (__pyx_t_1) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":159
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":159
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]             # <<<<<<<<<<<<<<
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp
  */
-          __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]);
+          __pyx_v_tmp = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":160
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":160
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]             # <<<<<<<<<<<<<<
  *                         self.sa.arr[k] = tmp
  *                     ptail = ptail + 1
  */
-          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
+          (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":161
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":161
  *                         tmp = self.sa.arr[ptail+1]
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp             # <<<<<<<<<<<<<<
  *                     ptail = ptail + 1
  * 
  */
-          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
-          goto __pyx_L15;
+          (__pyx_v_self->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
+          goto __pyx_L12;
         }
-        __pyx_L15:;
+        __pyx_L12:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":162
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":162
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp
  *                     ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -31064,21 +32861,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *         # recursively sort smaller suffixes
  */
         __pyx_v_ptail = (__pyx_v_ptail + 1);
-        goto __pyx_L14;
+        goto __pyx_L11;
       }
-      __pyx_L14:;
+      __pyx_L11:;
     }
-    __pyx_L12:;
+    __pyx_L9:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":165
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":165
  * 
  *         # recursively sort smaller suffixes
  *         self.q3sort(i, phead-1, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
  * 
  *         # update suffixes with pivot value
  */
-  __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_4 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
@@ -31089,7 +32886,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_7 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __pyx_t_8 = PyTuple_New(5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+  __Pyx_GOTREF(__pyx_t_8);
   PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
@@ -31111,7 +32908,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":169
  *         # update suffixes with pivot value
  *         # corresponds to update_group function in Larsson & Sadakane
  *         for k from phead <= k < ptail+1:             # <<<<<<<<<<<<<<
@@ -31121,17 +32918,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_5 = (__pyx_v_ptail + 1);
   for (__pyx_v_k = __pyx_v_phead; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":170
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":170
  *         # corresponds to update_group function in Larsson & Sadakane
  *         for k from phead <= k < ptail+1:
  *             isa.arr[self.sa.arr[k]] = ptail             # <<<<<<<<<<<<<<
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1
  */
-    (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
+    (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":171
  *         for k from phead <= k < ptail+1:
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:             # <<<<<<<<<<<<<<
@@ -31141,26 +32938,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_1 = (__pyx_v_phead == __pyx_v_ptail);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":172
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":172
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1             # <<<<<<<<<<<<<<
  * 
  *         # recursively sort larger suffixes
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = -1;
-    goto __pyx_L18;
+    (__pyx_v_self->sa->arr[__pyx_v_phead]) = -1;
+    goto __pyx_L15;
   }
-  __pyx_L18:;
+  __pyx_L15:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":175
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":175
  * 
  *         # recursively sort larger suffixes
  *         self.q3sort(ptail+1, j, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_7 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __pyx_t_8 = PyInt_FromLong((__pyx_v_ptail + 1)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
@@ -31171,7 +32968,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_2 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
   PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -31210,7 +33007,28 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":178
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_14write_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":178
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -31218,9 +33036,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -31229,30 +33045,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":179
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":179
  * 
  *     def write_text(self, char* filename):
  *         self.darray.write_text(filename)             # <<<<<<<<<<<<<<
  * 
  *     def read_binary(self, char* filename):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_t_2 = 0;
@@ -31276,24 +33083,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":181
- *         self.darray.write_text(filename)
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE *f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -31303,8 +33099,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_16read_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":181
+ *         self.darray.write_text(filename)
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE *f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":183
  *     def read_binary(self, char* filename):
  *         cdef FILE *f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -31313,34 +33127,34 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":184
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":184
  *         cdef FILE *f
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->read_handle(__pyx_v_self->darray, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":185
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.ha.read_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->read_handle(__pyx_v_self->sa, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":186
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":186
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->read_handle(__pyx_v_self->ha, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":187
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":187
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -31355,24 +33169,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":189
- *         fclose(f)
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -31382,8 +33185,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_18write_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":189
+ *         fclose(f)
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":191
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":191
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -31392,34 +33213,34 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":192
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":192
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->write_handle(__pyx_v_self->darray, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":193
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":193
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.ha.write_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->write_handle(__pyx_v_self->sa, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":194
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":194
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->write_handle(__pyx_v_self->ha, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":195
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":195
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -31434,7 +33255,28 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":197
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_20write_enhanced(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":197
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -31442,9 +33284,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
  *             self.darray.write_enhanced_handle(f)
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_a_i = NULL;
   PyObject *__pyx_v_w_i = NULL;
@@ -31466,18 +33306,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -31488,7 +33319,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -31500,203 +33331,220 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":199
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":199
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.darray.write_enhanced_handle(f)             # <<<<<<<<<<<<<<
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
           __Pyx_INCREF(__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":200
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":200
  *         with open(filename, "w") as f:
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa))) {
-            __pyx_t_7 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa); __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->sa)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sa))) {
+            __pyx_t_2 = ((PyObject *)__pyx_v_self->sa); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_7);
-            __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sa)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_7)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_7)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_7);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_a_i);
-            __pyx_v_a_i = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_a_i = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":201
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":201
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for w_i in self.ha:
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_1));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-            __pyx_t_1 = 0;
-            __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_4));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
+            __pyx_t_4 = 0;
+            __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           }
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":202
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":202
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  */
-          __pyx_t_7 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __pyx_t_1 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_k_tuple_96), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":203
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":203
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  *             for w_i in self.ha:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % w_i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha); __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->ha)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->ha))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->ha); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->ha)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_7 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_7); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_7); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_7 = __pyx_t_9(__pyx_t_1);
-              if (unlikely(!__pyx_t_7)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_7);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_w_i);
-            __pyx_v_w_i = __pyx_t_7;
-            __pyx_t_7 = 0;
+            __pyx_v_w_i = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":204
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":204
  *             f.write("\n")
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_7 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_7);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_10));
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":205
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":205
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_98), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -31705,75 +33553,75 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_1, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_4, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_7));
           __Pyx_INCREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
-          __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_7, NULL);
+          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
+            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_1, __pyx_t_2);
-            __pyx_t_10 = 0; __pyx_t_1 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_4, __pyx_t_1);
+            __pyx_t_10 = 0; __pyx_t_4 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_98, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_99, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -31781,7 +33629,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -31794,7 +33642,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":207
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":207
  *             f.write("\n")
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -31807,9 +33655,9 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__search_high");
+  __Pyx_RefNannySetupContext("__search_high", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":210
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":210
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -31819,7 +33667,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":211
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":211
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -31832,7 +33680,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":212
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":212
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -31841,7 +33689,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":213
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":213
  *             return high
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -31851,27 +33699,27 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":214
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":214
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__search_high(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
  *         else:
  *             return self.__search_high(word_id, offset, low, midpoint)
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
     goto __pyx_L0;
     goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":216
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":216
  *             return self.__search_high(word_id, offset, midpoint+1, high)
  *         else:
  *             return self.__search_high(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
  * 
  *     cdef int __search_low(self, int word_id, int offset, int low, int high):
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
     goto __pyx_L0;
   }
   __pyx_L4:;
@@ -31882,7 +33730,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":218
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":218
  *             return self.__search_high(word_id, offset, low, midpoint)
  * 
  *     cdef int __search_low(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -31895,9 +33743,9 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__search_low");
+  __Pyx_RefNannySetupContext("__search_low", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":221
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":221
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -31907,7 +33755,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":222
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":222
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -31920,7 +33768,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":223
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":223
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -31929,7 +33777,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":224
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":224
  *             return high
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -31939,27 +33787,27 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":225
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":225
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__search_low(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
  *         else:
  *             return self.__search_low(word_id, offset, midpoint+1, high)
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
     goto __pyx_L0;
     goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":227
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":227
  *             return self.__search_low(word_id, offset, low, midpoint)
  *         else:
  *             return self.__search_low(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
     goto __pyx_L0;
   }
   __pyx_L4:;
@@ -31970,7 +33818,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":229
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":229
  *             return self.__search_low(word_id, offset, midpoint+1, high)
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):             # <<<<<<<<<<<<<<
@@ -31987,9 +33835,9 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get_range");
+  __Pyx_RefNannySetupContext("__get_range", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":230
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":230
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  *         return (self.__search_low(word_id, offset, low, midpoint),             # <<<<<<<<<<<<<<
@@ -31997,20 +33845,20 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":231
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":231
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  *         return (self.__search_low(word_id, offset, low, midpoint),
  *                 self.__search_high(word_id, offset, midpoint, high))             # <<<<<<<<<<<<<<
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):
  */
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -32035,7 +33883,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":233
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":233
  *                 self.__search_high(word_id, offset, midpoint, high))
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -32054,9 +33902,9 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__lookup_helper");
+  __Pyx_RefNannySetupContext("__lookup_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":236
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":236
  *         cdef int midpoint
  * 
  *         if offset == 0:             # <<<<<<<<<<<<<<
@@ -32066,7 +33914,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = (__pyx_v_offset == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":237
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":237
  * 
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])             # <<<<<<<<<<<<<<
@@ -32079,7 +33927,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
     __pyx_t_3 = PyInt_FromLong((__pyx_v_self->ha->arr[(__pyx_v_word_id + 1)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -32093,7 +33941,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":238
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":238
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -32103,7 +33951,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":239
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":239
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])
  *         if low >= high:
  *             return None             # <<<<<<<<<<<<<<
@@ -32118,7 +33966,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":241
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":241
  *             return None
  * 
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -32127,7 +33975,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":242
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":242
  * 
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -32137,7 +33985,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":243
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":243
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__get_range(word_id, offset, low, high, midpoint)             # <<<<<<<<<<<<<<
@@ -32145,7 +33993,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -32154,7 +34002,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":244
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":244
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__get_range(word_id, offset, low, high, midpoint)
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] > word_id:             # <<<<<<<<<<<<<<
@@ -32164,7 +34012,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) > __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":245
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":245
  *             return self.__get_range(word_id, offset, low, high, midpoint)
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] > word_id:
  *             return self.__lookup_helper(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
@@ -32172,7 +34020,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -32181,7 +34029,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":247
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":247
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  *         else:
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
@@ -32189,7 +34037,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *     def lookup(self, word, int offset, int low, int high):
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -32211,37 +34059,23 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":249
- *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
- * 
- *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
- *         cdef int wordid
- *         if low == -1:
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_word = 0;
   int __pyx_v_offset;
   int __pyx_v_low;
   int __pyx_v_high;
-  PyObject *__pyx_v_word_id = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
-  __Pyx_RefNannySetupContext("lookup");
+  __Pyx_RefNannySetupContext("lookup (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
     PyObject* values[4] = {0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -32250,32 +34084,28 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -32298,8 +34128,33 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_22lookup(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_word, __pyx_v_offset, __pyx_v_low, __pyx_v_high);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":249
+ *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
+ * 
+ *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
+ *         cdef int wordid
+ *         if low == -1:
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":251
+static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high) {
+  PyObject *__pyx_v_word_id = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("lookup", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":251
  *     def lookup(self, word, int offset, int low, int high):
  *         cdef int wordid
  *         if low == -1:             # <<<<<<<<<<<<<<
@@ -32309,7 +34164,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
   __pyx_t_1 = (__pyx_v_low == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":252
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":252
  *         cdef int wordid
  *         if low == -1:
  *             low = 0             # <<<<<<<<<<<<<<
@@ -32317,11 +34172,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  *             high = len(self.sa)
  */
     __pyx_v_low = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":253
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":253
  *         if low == -1:
  *             low = 0
  *         if high == -1:             # <<<<<<<<<<<<<<
@@ -32331,45 +34186,45 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
   __pyx_t_1 = (__pyx_v_high == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":254
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":254
  *             low = 0
  *         if high == -1:
  *             high = len(self.sa)             # <<<<<<<<<<<<<<
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]
  */
-    __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
+    __pyx_t_2 = ((PyObject *)__pyx_v_self->sa);
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_v_high = __pyx_t_3;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":255
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":255
  *         if high == -1:
  *             high = len(self.sa)
  *         if word in self.darray.word2id:             # <<<<<<<<<<<<<<
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)
  */
-  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->word2id, __pyx_v_word))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->darray->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":256
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":256
  *             high = len(self.sa)
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]             # <<<<<<<<<<<<<<
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  */
-    __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_word_id = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":257
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":257
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)             # <<<<<<<<<<<<<<
@@ -32378,16 +34233,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->__pyx_vtab)->__lookup_helper(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":259
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":259
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  *             return None             # <<<<<<<<<<<<<<
@@ -32397,7 +34252,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
     __pyx_r = Py_None;
     goto __pyx_L0;
   }
-  __pyx_L8:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -32412,7 +34267,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":35
+/* Python wrapper */
+static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_8TrieNode___cinit__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":35
  *     cdef public children
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -32420,20 +34289,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  * 
  */
 
-static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":36
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":36
  * 
  *     def __cinit__(self):
  *         self.children = {}             # <<<<<<<<<<<<<<
@@ -32443,9 +34308,9 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->children);
+  __Pyx_DECREF(__pyx_v_self->children);
+  __pyx_v_self->children = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   __pyx_r = 0;
@@ -32459,7 +34324,18 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":33
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children___get__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":33
  * 
  * cdef class TrieNode:
  *     cdef public children             # <<<<<<<<<<<<<<
@@ -32467,14 +34343,13 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *_
  *     def __cinit__(self):
  */
 
-static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __pyx_r = ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children;
+  __Pyx_INCREF(__pyx_v_self->children);
+  __pyx_r = __pyx_v_self->children;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32484,66 +34359,85 @@ static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_8TrieNode_8children_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_8TrieNode_8children_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_8TrieNode_8children_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_8TrieNode_8children_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children_2__set__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->children);
+  __Pyx_DECREF(__pyx_v_self->children);
+  __pyx_v_self->children = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_8TrieNode_8children_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_8TrieNode_8children_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_8TrieNode_8children_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_8TrieNode_8children_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children_4__del__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_8TrieNode_8children_4__del__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->children);
+  __Pyx_DECREF(__pyx_v_self->children);
+  __pyx_v_self->children = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":43
- *     cdef public suffix_link
- * 
- *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
- *         self.phrase = phrase
- *         self.phrase_location = phrase_location
- */
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_phrase = 0;
   PyObject *__pyx_v_phrase_location = 0;
   PyObject *__pyx_v_suffix_link = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
     PyObject* values[3] = {0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":43
+ *     cdef public suffix_link
+ * 
+ *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
+ *         self.phrase = phrase
+ *         self.phrase_location = phrase_location
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -32551,7 +34445,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__phrase);
@@ -32569,7 +34463,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -32592,8 +34486,17 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), __pyx_v_phrase, __pyx_v_phrase_location, __pyx_v_suffix_link);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":44
+static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_phrase, PyObject *__pyx_v_phrase_location, PyObject *__pyx_v_suffix_link) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":44
  * 
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase             # <<<<<<<<<<<<<<
@@ -32602,11 +34505,11 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  */
   __Pyx_INCREF(__pyx_v_phrase);
   __Pyx_GIVEREF(__pyx_v_phrase);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = __pyx_v_phrase;
+  __Pyx_GOTREF(__pyx_v_self->phrase);
+  __Pyx_DECREF(__pyx_v_self->phrase);
+  __pyx_v_self->phrase = __pyx_v_phrase;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":45
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location             # <<<<<<<<<<<<<<
@@ -32615,11 +34518,11 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  */
   __Pyx_INCREF(__pyx_v_phrase_location);
   __Pyx_GIVEREF(__pyx_v_phrase_location);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = __pyx_v_phrase_location;
+  __Pyx_GOTREF(__pyx_v_self->phrase_location);
+  __Pyx_DECREF(__pyx_v_self->phrase_location);
+  __pyx_v_self->phrase_location = __pyx_v_phrase_location;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":46
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location
  *         self.suffix_link = suffix_link             # <<<<<<<<<<<<<<
@@ -32628,16 +34531,27 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  */
   __Pyx_INCREF(__pyx_v_suffix_link);
   __Pyx_GIVEREF(__pyx_v_suffix_link);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = __pyx_v_suffix_link;
+  __Pyx_GOTREF(__pyx_v_self->suffix_link);
+  __Pyx_DECREF(__pyx_v_self->suffix_link);
+  __pyx_v_self->suffix_link = __pyx_v_suffix_link;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":39
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":39
  * 
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase             # <<<<<<<<<<<<<<
@@ -32645,14 +34559,13 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  *     cdef public suffix_link
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase;
+  __Pyx_INCREF(__pyx_v_self->phrase);
+  __pyx_r = __pyx_v_self->phrase;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32662,39 +34575,70 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__py
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->phrase);
+  __Pyx_DECREF(__pyx_v_self->phrase);
+  __pyx_v_self->phrase = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->phrase);
+  __Pyx_DECREF(__pyx_v_self->phrase);
+  __pyx_v_self->phrase = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":40
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":40
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase
  *     cdef public phrase_location             # <<<<<<<<<<<<<<
@@ -32702,14 +34646,13 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_s
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location;
+  __Pyx_INCREF(__pyx_v_self->phrase_location);
+  __pyx_r = __pyx_v_self->phrase_location;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32719,39 +34662,70 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyOb
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->phrase_location);
+  __Pyx_DECREF(__pyx_v_self->phrase_location);
+  __pyx_v_self->phrase_location = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->phrase_location);
+  __Pyx_DECREF(__pyx_v_self->phrase_location);
+  __pyx_v_self->phrase_location = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":41
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":41
  *     cdef public phrase
  *     cdef public phrase_location
  *     cdef public suffix_link             # <<<<<<<<<<<<<<
@@ -32759,14 +34733,13 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link;
+  __Pyx_INCREF(__pyx_v_self->suffix_link);
+  __pyx_r = __pyx_v_self->suffix_link;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32776,71 +34749,79 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->suffix_link);
+  __Pyx_DECREF(__pyx_v_self->suffix_link);
+  __pyx_v_self->suffix_link = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->suffix_link);
+  __Pyx_DECREF(__pyx_v_self->suffix_link);
+  __pyx_v_self->suffix_link = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":53
- *     cdef public int count
- *     cdef public root
- *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
- *         self.count = 0
- *         self.extended = extended
- */
-
-static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_extended = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
     PyObject* values[1] = {0};
-    values[0] = __pyx_k_99;
+    values[0] = __pyx_k_100;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__extended);
@@ -32848,7 +34829,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -32867,17 +34848,40 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9TrieTable___cinit__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), __pyx_v_extended);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":53
+ *     cdef public int count
+ *     cdef public root
+ *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
+ *         self.count = 0
+ *         self.extended = extended
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":54
+static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_extended) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":54
  *     cdef public root
  *     def __cinit__(self, extended=False):
  *         self.count = 0             # <<<<<<<<<<<<<<
  *         self.extended = extended
  *         if extended:
  */
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count = 0;
+  __pyx_v_self->count = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":55
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":55
  *     def __cinit__(self, extended=False):
  *         self.count = 0
  *         self.extended = extended             # <<<<<<<<<<<<<<
@@ -32885,9 +34889,9 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
  *             self.root = ExtendedTrieNode()
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_extended); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended = __pyx_t_1;
+  __pyx_v_self->extended = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":56
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":56
  *         self.count = 0
  *         self.extended = extended
  *         if extended:             # <<<<<<<<<<<<<<
@@ -32897,7 +34901,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_extended); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":57
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":57
  *         self.extended = extended
  *         if extended:
  *             self.root = ExtendedTrieNode()             # <<<<<<<<<<<<<<
@@ -32907,15 +34911,15 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
     __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_t_3;
+    __Pyx_GOTREF(__pyx_v_self->root);
+    __Pyx_DECREF(__pyx_v_self->root);
+    __pyx_v_self->root = __pyx_t_3;
     __pyx_t_3 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":59
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":59
  *             self.root = ExtendedTrieNode()
  *         else:
  *             self.root = TrieNode()             # <<<<<<<<<<<<<<
@@ -32925,12 +34929,12 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
     __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_t_3;
+    __Pyx_GOTREF(__pyx_v_self->root);
+    __Pyx_DECREF(__pyx_v_self->root);
+    __pyx_v_self->root = __pyx_t_3;
     __pyx_t_3 = 0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -32943,7 +34947,18 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":50
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_8extended___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":50
  * 
  * cdef class TrieTable:
  *     cdef public int extended             # <<<<<<<<<<<<<<
@@ -32951,17 +34966,16 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
  *     cdef public root
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -32979,17 +34993,27 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_8extended_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_8extended_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_8extended_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__", 0);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended = __pyx_t_1;
+  __pyx_v_self->extended = __pyx_t_1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33001,7 +35025,18 @@ static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":51
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_5count___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":51
  * cdef class TrieTable:
  *     cdef public int extended
  *     cdef public int count             # <<<<<<<<<<<<<<
@@ -33009,17 +35044,16 @@ static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, P
  *     def __cinit__(self, extended=False):
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -33037,17 +35071,27 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_5count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_5count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_5count_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__", 0);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count = __pyx_t_1;
+  __pyx_v_self->count = __pyx_t_1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33059,7 +35103,18 @@ static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":52
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":52
  *     cdef public int extended
  *     cdef public int count
  *     cdef public root             # <<<<<<<<<<<<<<
@@ -33067,14 +35122,13 @@ static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyOb
  *         self.count = 0
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  __pyx_r = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root;
+  __Pyx_INCREF(__pyx_v_self->root);
+  __pyx_r = __pyx_v_self->root;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -33084,39 +35138,59 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_4root_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_4root_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_4root_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_4root_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_4root_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->root);
+  __Pyx_DECREF(__pyx_v_self->root);
+  __pyx_v_self->root = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_4root_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_4root_5__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root_4__del__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->root);
+  __Pyx_DECREF(__pyx_v_self->root);
+  __pyx_v_self->root = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":79
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":79
  * 
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -33124,12 +35198,12 @@ static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self) {
  * 
  */
 
-static int __pyx_f_3_sa_14PhraseLocation_contains(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sent_id) {
+static int __pyx_f_3_sa_14PhraseLocation_contains(CYTHON_UNUSED struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, CYTHON_UNUSED int __pyx_v_sent_id) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("contains");
+  __Pyx_RefNannySetupContext("contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":80
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":80
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):
  *         return 1             # <<<<<<<<<<<<<<
@@ -33145,16 +35219,9 @@ static int __pyx_f_3_sa_14PhraseLocation_contains(struct __pyx_obj_3_sa_PhraseLo
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":82
- *         return 1
- * 
- *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
- *             arr=None, int num_subpatterns=1):
- *         self.sa_low = sa_low
- */
-
-static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_sa_low;
   int __pyx_v_sa_high;
   int __pyx_v_arr_low;
@@ -33163,15 +35230,12 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
   int __pyx_v_num_subpatterns;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
     PyObject* values[6] = {0,0,0,0,0,0};
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":83
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":83
  * 
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):             # <<<<<<<<<<<<<<
@@ -33181,7 +35245,8 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
     values[4] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -33192,7 +35257,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa_low);
@@ -33225,7 +35290,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -33274,44 +35339,64 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14PhraseLocation___cinit__(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self), __pyx_v_sa_low, __pyx_v_sa_high, __pyx_v_arr_low, __pyx_v_arr_high, __pyx_v_arr, __pyx_v_num_subpatterns);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":82
+ *         return 1
+ * 
+ *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
+ *             arr=None, int num_subpatterns=1):
+ *         self.sa_low = sa_low
+ */
+
+static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sa_low, int __pyx_v_sa_high, int __pyx_v_arr_low, int __pyx_v_arr_high, PyObject *__pyx_v_arr, int __pyx_v_num_subpatterns) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":84
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":84
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low             # <<<<<<<<<<<<<<
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->sa_low = __pyx_v_sa_low;
+  __pyx_v_self->sa_low = __pyx_v_sa_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":85
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":85
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high             # <<<<<<<<<<<<<<
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->sa_high = __pyx_v_sa_high;
+  __pyx_v_self->sa_high = __pyx_v_sa_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":86
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":86
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low             # <<<<<<<<<<<<<<
  *         self.arr_high = arr_high
  *         self.arr = arr
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr_low = __pyx_v_arr_low;
+  __pyx_v_self->arr_low = __pyx_v_arr_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":87
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high             # <<<<<<<<<<<<<<
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr_high = __pyx_v_arr_high;
+  __pyx_v_self->arr_high = __pyx_v_arr_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":88
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  *         self.arr = arr             # <<<<<<<<<<<<<<
@@ -33321,18 +35406,18 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
   if (!(likely(((__pyx_v_arr) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_arr, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_arr);
   __Pyx_GIVEREF(__pyx_v_arr);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr));
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
+  __Pyx_GOTREF(__pyx_v_self->arr);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->arr));
+  __pyx_v_self->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":89
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":89
  *         self.arr_high = arr_high
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->num_subpatterns = __pyx_v_num_subpatterns;
+  __pyx_v_self->num_subpatterns = __pyx_v_num_subpatterns;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33344,54 +35429,39 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":99
- *     cdef IntList sa
- * 
- *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
- *         self.sample_size = sample_size
- *         self.sa = fsarray.sa
- */
-
-static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_sample_size;
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_size);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_size)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -33411,17 +35481,45 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_7Sampler___cinit__(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), __pyx_v_sample_size, __pyx_v_fsarray);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":99
+ *     cdef IntList sa
+ * 
+ *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
+ *         self.sample_size = sample_size
+ *         self.sa = fsarray.sa
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":100
+static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, int __pyx_v_sample_size, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":100
  * 
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size             # <<<<<<<<<<<<<<
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  */
-  ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size = __pyx_v_sample_size;
+  __pyx_v_self->sample_size = __pyx_v_sample_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":101
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":101
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa             # <<<<<<<<<<<<<<
@@ -33430,11 +35528,11 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray->sa));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray->sa));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa = __pyx_v_fsarray->sa;
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = __pyx_v_fsarray->sa;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":102
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa
  *         if sample_size > 0:             # <<<<<<<<<<<<<<
@@ -33444,7 +35542,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
   __pyx_t_1 = (__pyx_v_sample_size > 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":103
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":103
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)             # <<<<<<<<<<<<<<
@@ -33459,10 +35557,10 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
     __pyx_t_2 = PyInt_FromLong(__pyx_v_sample_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    __Pyx_INCREF(((PyObject *)__pyx_kp_s_100));
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_100));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_100));
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_s_101));
+    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_101));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_101));
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
@@ -33471,11 +35569,11 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":105
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
@@ -33487,12 +35585,12 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_102), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_103), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33507,7 +35605,24 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":107
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location); /*proto*/
+static char __pyx_doc_3_sa_7Sampler_2sample[] = "Returns a sample of the locations for\n        the phrase.    If there are less than self.sample_size\n        locations, return all of them; otherwise, return\n        up to self.sample_size locations.    In the latter case,\n        we choose to sample UNIFORMLY -- that is, the locations\n        are chosen at uniform intervals over the entire set, rather\n        than randomly.    This makes the algorithm deterministic, which\n        is good for things like MERT";
+static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("sample (wrapper)", 0);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_7Sampler_2sample(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location));
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":107
  *             logger.info("Sampling strategy: no sampling")
  * 
  *     def sample(self, PhraseLocation phrase_location):             # <<<<<<<<<<<<<<
@@ -33515,9 +35630,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         the phrase.    If there are less than self.sample_size
  */
 
-static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location); /*proto*/
-static char __pyx_doc_3_sa_7Sampler_1sample[] = "Returns a sample of the locations for\n        the phrase.    If there are less than self.sample_size\n        locations, return all of them; otherwise, return\n        up to self.sample_size locations.    In the latter case,\n        we choose to sample UNIFORMLY -- that is, the locations\n        are chosen at uniform intervals over the entire set, rather\n        than randomly.    This makes the algorithm deterministic, which\n        is good for things like MERT";
-static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location) {
+static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location) {
   struct __pyx_obj_3_sa_IntList *__pyx_v_sample = 0;
   double __pyx_v_i;
   double __pyx_v_stepsize;
@@ -33534,10 +35647,9 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sample");
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("sample", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":120
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":120
  *         cdef int num_locations, val, j
  * 
  *         sample = IntList()             # <<<<<<<<<<<<<<
@@ -33549,76 +35661,76 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
   __pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":121
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":121
  * 
  *         sample = IntList()
  *         if phrase_location.arr is None:             # <<<<<<<<<<<<<<
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  */
-  __pyx_t_2 = (((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr) == Py_None);
+  __pyx_t_2 = (((PyObject *)__pyx_v_phrase_location->arr) == Py_None);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":122
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":122
  *         sample = IntList()
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low             # <<<<<<<<<<<<<<
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  */
-    __pyx_v_num_locations = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_high - ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low);
+    __pyx_v_num_locations = (__pyx_v_phrase_location->sa_high - __pyx_v_phrase_location->sa_low);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":123
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":123
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  */
-    __pyx_t_2 = (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size == -1);
+    __pyx_t_2 = (__pyx_v_self->sample_size == -1);
     if (!__pyx_t_2) {
-      __pyx_t_3 = (__pyx_v_num_locations <= ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
+      __pyx_t_3 = (__pyx_v_num_locations <= __pyx_v_self->sample_size);
       __pyx_t_4 = __pyx_t_3;
     } else {
       __pyx_t_4 = __pyx_t_2;
     }
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":124
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":124
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)             # <<<<<<<<<<<<<<
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  */
-      ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa->arr + ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low), __pyx_v_num_locations);
-      goto __pyx_L6;
+      ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_self->sa->arr + __pyx_v_phrase_location->sa_low), __pyx_v_num_locations);
+      goto __pyx_L4;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":126
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":126
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:
  */
-      if (unlikely(((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size) == 0)) {
+      if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size));
+      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":127
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":127
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low             # <<<<<<<<<<<<<<
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:
  *                     '''Note: int(i) not guaranteed to have the desired
  */
-      __pyx_v_i = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low;
+      __pyx_v_i = __pyx_v_phrase_location->sa_low;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":128
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":128
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:             # <<<<<<<<<<<<<<
@@ -33626,16 +35738,16 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  *                     effect, according to the python documentation'''
  */
       while (1) {
-        __pyx_t_4 = (__pyx_v_i < ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_high);
+        __pyx_t_4 = (__pyx_v_i < __pyx_v_phrase_location->sa_high);
         if (__pyx_t_4) {
-          __pyx_t_2 = (__pyx_v_sample->len < ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
+          __pyx_t_2 = (__pyx_v_sample->len < __pyx_v_self->sample_size);
           __pyx_t_3 = __pyx_t_2;
         } else {
           __pyx_t_3 = __pyx_t_4;
         }
         if (!__pyx_t_3) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":131
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":131
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -33645,7 +35757,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_t_3 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":132
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":132
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -33653,11 +35765,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  *                         val = int(floor(i))
  */
           __pyx_v_val = ((int)ceil(__pyx_v_i));
-          goto __pyx_L9;
+          goto __pyx_L7;
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":134
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":134
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -33666,18 +35778,18 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  */
           __pyx_v_val = ((int)floor(__pyx_v_i));
         }
-        __pyx_L9:;
+        __pyx_L7:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":135
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":135
  *                     else:
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])             # <<<<<<<<<<<<<<
  *                     i = i + stepsize
  *         else:
  */
-        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa->arr[__pyx_v_val]));
+        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (__pyx_v_self->sa->arr[__pyx_v_val]));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":136
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":136
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -33687,82 +35799,82 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_v_i = (__pyx_v_i + __pyx_v_stepsize);
       }
     }
-    __pyx_L6:;
-    goto __pyx_L5;
+    __pyx_L4:;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":138
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":138
  *                     i = i + stepsize
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns             # <<<<<<<<<<<<<<
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr
  */
-    __pyx_t_5 = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_high - ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low);
-    if (unlikely(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns == 0)) {
+    __pyx_t_5 = (__pyx_v_phrase_location->arr_high - __pyx_v_phrase_location->arr_low);
+    if (unlikely(__pyx_v_phrase_location->num_subpatterns == 0)) {
       PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    else if (sizeof(int) == sizeof(long) && unlikely(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
+    else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_phrase_location->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
       PyErr_Format(PyExc_OverflowError, "value too large to perform division");
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns);
+    __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, __pyx_v_phrase_location->num_subpatterns);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":139
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":139
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
  *                 sample = phrase_location.arr
  *             else:
  */
-    __pyx_t_3 = (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size == -1);
+    __pyx_t_3 = (__pyx_v_self->sample_size == -1);
     if (!__pyx_t_3) {
-      __pyx_t_4 = (__pyx_v_num_locations <= ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
+      __pyx_t_4 = (__pyx_v_num_locations <= __pyx_v_self->sample_size);
       __pyx_t_2 = __pyx_t_4;
     } else {
       __pyx_t_2 = __pyx_t_3;
     }
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":140
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":140
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr             # <<<<<<<<<<<<<<
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  */
-      __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr));
+      __Pyx_INCREF(((PyObject *)__pyx_v_phrase_location->arr));
       __Pyx_DECREF(((PyObject *)__pyx_v_sample));
-      __pyx_v_sample = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr;
-      goto __pyx_L10;
+      __pyx_v_sample = __pyx_v_phrase_location->arr;
+      goto __pyx_L8;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":142
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":142
  *                 sample = phrase_location.arr
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:
  */
-      if (unlikely(((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size) == 0)) {
+      if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size));
+      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":143
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":143
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low             # <<<<<<<<<<<<<<
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:
  *                     '''Note: int(i) not guaranteed to have the desired
  */
-      __pyx_v_i = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low;
+      __pyx_v_i = __pyx_v_phrase_location->arr_low;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":144
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":144
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -33772,14 +35884,14 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
       while (1) {
         __pyx_t_2 = (__pyx_v_i < __pyx_v_num_locations);
         if (__pyx_t_2) {
-          __pyx_t_3 = (__pyx_v_sample->len < (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size * ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns));
+          __pyx_t_3 = (__pyx_v_sample->len < (__pyx_v_self->sample_size * __pyx_v_phrase_location->num_subpatterns));
           __pyx_t_4 = __pyx_t_3;
         } else {
           __pyx_t_4 = __pyx_t_2;
         }
         if (!__pyx_t_4) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":147
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":147
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -33789,7 +35901,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_t_4 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":148
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":148
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -33797,11 +35909,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  *                         val = int(floor(i))
  */
           __pyx_v_val = ((int)ceil(__pyx_v_i));
-          goto __pyx_L13;
+          goto __pyx_L11;
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":150
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":150
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -33810,27 +35922,27 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  */
           __pyx_v_val = ((int)floor(__pyx_v_i));
         }
-        __pyx_L13:;
+        __pyx_L11:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":151
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":151
  *                     else:
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  */
-        __pyx_v_j = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low + (__pyx_v_val * ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns));
+        __pyx_v_j = (__pyx_v_phrase_location->arr_low + (__pyx_v_val * __pyx_v_phrase_location->num_subpatterns));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":152
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":152
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
  *                     i = i + stepsize
  *         return sample
  */
-        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr->arr + __pyx_v_j), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns);
+        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_phrase_location->arr->arr + __pyx_v_j), __pyx_v_phrase_location->num_subpatterns);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":153
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":153
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -33840,11 +35952,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_v_i = (__pyx_v_i + __pyx_v_stepsize);
       }
     }
-    __pyx_L10:;
+    __pyx_L8:;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":154
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":154
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  *         return sample             # <<<<<<<<<<<<<<
@@ -33869,7 +35981,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":166
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":166
  * 
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):             # <<<<<<<<<<<<<<
@@ -33879,9 +35991,9 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
 
 static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m, int *__pyx_v_arr, int __pyx_v_start, int __pyx_v_step, int *__pyx_v_sent_id_arr) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("assign_matching");
+  __Pyx_RefNannySetupContext("assign_matching", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":167
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":167
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr             # <<<<<<<<<<<<<<
@@ -33890,7 +36002,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->arr = __pyx_v_arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":168
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":168
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr
  *     m.start = start             # <<<<<<<<<<<<<<
@@ -33899,7 +36011,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->start = __pyx_v_start;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":169
  *     m.arr = arr
  *     m.start = start
  *     m.end = start + step             # <<<<<<<<<<<<<<
@@ -33908,7 +36020,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->end = (__pyx_v_start + __pyx_v_step);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":170
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":170
  *     m.start = start
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]             # <<<<<<<<<<<<<<
@@ -33917,7 +36029,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->sent_id = (__pyx_v_sent_id_arr[(__pyx_v_arr[__pyx_v_start])]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":171
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]
  *     m.size = step             # <<<<<<<<<<<<<<
@@ -33929,7 +36041,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":174
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":174
  * 
  * 
  * cdef int* append_combined_matching(int* arr, Matching* loc1, Matching* loc2,             # <<<<<<<<<<<<<<
@@ -33937,16 +36049,16 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  *     cdef int i, new_len
  */
 
-static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx_t_3_sa_Matching *__pyx_v_loc1, struct __pyx_t_3_sa_Matching *__pyx_v_loc2, int __pyx_v_offset_by_one, int __pyx_v_num_subpatterns, int *__pyx_v_result_len) {
+static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx_t_3_sa_Matching *__pyx_v_loc1, struct __pyx_t_3_sa_Matching *__pyx_v_loc2, CYTHON_UNUSED int __pyx_v_offset_by_one, int __pyx_v_num_subpatterns, int *__pyx_v_result_len) {
   int __pyx_v_i;
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("append_combined_matching");
+  __Pyx_RefNannySetupContext("append_combined_matching", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":178
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":178
  *     cdef int i, new_len
  * 
  *     new_len = result_len[0] + num_subpatterns             # <<<<<<<<<<<<<<
@@ -33955,7 +36067,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_new_len = ((__pyx_v_result_len[0]) + __pyx_v_num_subpatterns);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":179
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":179
  * 
  *     new_len = result_len[0] + num_subpatterns
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -33964,7 +36076,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":181
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  * 
  *     for i from 0 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -33974,7 +36086,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_1 = __pyx_v_loc1->size;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":182
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":182
  * 
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]             # <<<<<<<<<<<<<<
@@ -33984,7 +36096,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
     (__pyx_v_arr[((__pyx_v_result_len[0]) + __pyx_v_i)]) = (__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":183
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:             # <<<<<<<<<<<<<<
@@ -33994,7 +36106,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_2 = (__pyx_v_num_subpatterns > __pyx_v_loc1->size);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":184
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":184
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]             # <<<<<<<<<<<<<<
@@ -34006,7 +36118,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":185
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -34015,7 +36127,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   (__pyx_v_result_len[0]) = __pyx_v_new_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":186
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":186
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -34031,7 +36143,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":189
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":189
  * 
  * 
  * cdef int* extend_arr(int* arr, int* arr_len, int* appendix, int appendix_len):             # <<<<<<<<<<<<<<
@@ -34043,9 +36155,9 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("extend_arr");
+  __Pyx_RefNannySetupContext("extend_arr", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":192
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":192
  *     cdef int new_len
  * 
  *     new_len = arr_len[0] + appendix_len             # <<<<<<<<<<<<<<
@@ -34054,7 +36166,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_appendix_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":193
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":193
  * 
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -34063,7 +36175,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":194
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":194
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -34072,7 +36184,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_appendix, (__pyx_v_appendix_len * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":195
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":195
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -34081,7 +36193,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":196
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":196
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -34097,7 +36209,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":198
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":198
  *     return arr
  * 
  * cdef int median(int low, int high, int step):             # <<<<<<<<<<<<<<
@@ -34112,9 +36224,9 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("median");
+  __Pyx_RefNannySetupContext("median", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":199
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":199
  * 
  * cdef int median(int low, int high, int step):
  *     return low + (((high - low)/step)/2)*step             # <<<<<<<<<<<<<<
@@ -34143,7 +36255,7 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":202
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":202
  * 
  * 
  * cdef void find_comparable_matchings(int low, int high, int* arr, int step, int loc, int* loc_minus, int* loc_plus):             # <<<<<<<<<<<<<<
@@ -34156,9 +36268,9 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("find_comparable_matchings");
+  __Pyx_RefNannySetupContext("find_comparable_matchings", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":206
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":206
  *     # in which all matchings have the same first index as the one
  *     # starting at loc
  *     loc_plus[0] = loc + step             # <<<<<<<<<<<<<<
@@ -34167,7 +36279,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_plus[0]) = (__pyx_v_loc + __pyx_v_step);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":207
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":207
  *     # starting at loc
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -34184,7 +36296,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":208
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":208
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step             # <<<<<<<<<<<<<<
@@ -34194,7 +36306,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     (__pyx_v_loc_plus[0]) = ((__pyx_v_loc_plus[0]) + __pyx_v_step);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":209
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":209
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc             # <<<<<<<<<<<<<<
@@ -34203,7 +36315,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_minus[0]) = __pyx_v_loc;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":210
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":210
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -34220,7 +36332,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_2) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":211
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":211
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:
  *         loc_minus[0] = loc_minus[0] - step             # <<<<<<<<<<<<<<
@@ -34233,16 +36345,9 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":263
- *     cdef IntList findexes1
- * 
- *     def __cinit__(self,             # <<<<<<<<<<<<<<
- *             # compiled alignment object (REQUIRED)
- *             Alignment alignment,
- */
-
-static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment = 0;
   float __pyx_v_by_slack_factor;
   char *__pyx_v_category;
@@ -34266,21 +36371,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   int __pyx_v_use_index;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_103,&__pyx_n_s_104,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_104,&__pyx_n_s_105,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
     PyObject* values[21] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":271
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":271
  *             char* category="[X]",
  *             # maximum number of contiguous chunks of terminal symbols in RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_chunks=None,             # <<<<<<<<<<<<<<
@@ -34289,7 +36385,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
     values[3] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":279
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":279
  *             unsigned max_nonterminals=2,
  *             # maximum number of contiguous chunks of terminal symbols in target-side RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_target_chunks=None,             # <<<<<<<<<<<<<<
@@ -34298,7 +36394,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
     values[7] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":281
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":281
  *             max_target_chunks=None,
  *             # maximum number of target side symbols (both T and NT) allowed in a rule. If None, defaults to max_initial_size
  *             max_target_length=None,             # <<<<<<<<<<<<<<
@@ -34307,7 +36403,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
     values[8] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":285
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":285
  *             unsigned min_gap_size=2,
  *             # filename of file containing precomputed collocations
  *             precompute_file=None,             # <<<<<<<<<<<<<<
@@ -34317,7 +36413,8 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
     values[10] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case 21: values[20] = PyTuple_GET_ITEM(__pyx_args, 20);
         case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);
         case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
@@ -34343,10 +36440,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
         if (kw_args > 0) {
@@ -34410,12 +36506,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
         }
         case 13:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_103);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_104);
           if (value) { values[13] = value; kw_args--; }
         }
         case 14:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_104);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_105);
           if (value) { values[14] = value; kw_args--; }
         }
         case 15:
@@ -34450,7 +36546,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -34481,10 +36577,10 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
     }
     __pyx_v_alignment = ((struct __pyx_obj_3_sa_Alignment *)values[0]);
     if (values[1]) {
-      __pyx_v_by_slack_factor = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_by_slack_factor = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":267
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":267
  *             Alignment alignment,
  *             # parameter for double-binary search; doesn't seem to matter much
  *             float by_slack_factor=1.0,             # <<<<<<<<<<<<<<
@@ -34496,7 +36592,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
     if (values[2]) {
       __pyx_v_category = PyBytes_AsString(values[2]); if (unlikely((!__pyx_v_category) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_category = ((char *)__pyx_k_105);
+      __pyx_v_category = ((char *)__pyx_k_106);
     }
     __pyx_v_max_chunks = values[3];
     if (values[4]) {
@@ -34536,7 +36632,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_require_aligned_terminal = __Pyx_PyObject_IsTrue(values[13]); if (unlikely((__pyx_v_require_aligned_terminal == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":291
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":291
  *             unsigned precompute_rank=100,
  *             # require extracted rules to have at least one aligned word
  *             bint require_aligned_terminal=True,             # <<<<<<<<<<<<<<
@@ -34549,7 +36645,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_require_aligned_chunks = __Pyx_PyObject_IsTrue(values[14]); if (unlikely((__pyx_v_require_aligned_chunks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":293
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":293
  *             bint require_aligned_terminal=True,
  *             # require each contiguous chunk of extracted rules to have at least one aligned word
  *             bint require_aligned_chunks=False,             # <<<<<<<<<<<<<<
@@ -34572,7 +36668,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_tight_phrases = __Pyx_PyObject_IsTrue(values[17]); if (unlikely((__pyx_v_tight_phrases == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":299
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":299
  *             unsigned train_min_gap_size=2,
  *             # True if phrases should be tight, False otherwise (False == slower but better results)
  *             bint tight_phrases=False,             # <<<<<<<<<<<<<<
@@ -34585,7 +36681,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_use_baeza_yates = __Pyx_PyObject_IsTrue(values[18]); if (unlikely((__pyx_v_use_baeza_yates == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":301
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":301
  *             bint tight_phrases=False,
  *             # True to require use of double-binary alg, false otherwise
  *             bint use_baeza_yates=True,             # <<<<<<<<<<<<<<
@@ -34598,7 +36694,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_use_collocations = __Pyx_PyObject_IsTrue(values[19]); if (unlikely((__pyx_v_use_collocations == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":303
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":303
  *             bint use_baeza_yates=True,
  *             # True to enable used of precomputed collocations
  *             bint use_collocations=True,             # <<<<<<<<<<<<<<
@@ -34611,7 +36707,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_use_index = __Pyx_PyObject_IsTrue(values[20]); if (unlikely((__pyx_v_use_index == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":305
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":305
  *             bint use_collocations=True,
  *             # True to enable use of precomputed inverted indices
  *             bint use_index=True):             # <<<<<<<<<<<<<<
@@ -34630,8 +36726,38 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_alignment), __pyx_ptype_3_sa_Alignment, 1, "alignment", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_alignment, __pyx_v_by_slack_factor, __pyx_v_category, __pyx_v_max_chunks, __pyx_v_max_initial_size, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_max_target_chunks, __pyx_v_max_target_length, __pyx_v_min_gap_size, __pyx_v_precompute_file, __pyx_v_precompute_secondary_rank, __pyx_v_precompute_rank, __pyx_v_require_aligned_terminal, __pyx_v_require_aligned_chunks, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size, __pyx_v_tight_phrases, __pyx_v_use_baeza_yates, __pyx_v_use_collocations, __pyx_v_use_index);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":263
+ *     cdef IntList findexes1
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *             # compiled alignment object (REQUIRED)
+ *             Alignment alignment,
+ */
+
+static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment, float __pyx_v_by_slack_factor, char *__pyx_v_category, PyObject *__pyx_v_max_chunks, unsigned int __pyx_v_max_initial_size, unsigned int __pyx_v_max_length, unsigned int __pyx_v_max_nonterminals, PyObject *__pyx_v_max_target_chunks, PyObject *__pyx_v_max_target_length, unsigned int __pyx_v_min_gap_size, PyObject *__pyx_v_precompute_file, unsigned int __pyx_v_precompute_secondary_rank, unsigned int __pyx_v_precompute_rank, int __pyx_v_require_aligned_terminal, int __pyx_v_require_aligned_chunks, unsigned int __pyx_v_train_max_initial_size, unsigned int __pyx_v_train_min_gap_size, int __pyx_v_tight_phrases, int __pyx_v_use_baeza_yates, int __pyx_v_use_collocations, int __pyx_v_use_index) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":311
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":311
  *         respectively.    This is because Chiang's model does not require
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache             # <<<<<<<<<<<<<<
@@ -34641,7 +36767,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -34649,12 +36775,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->rules);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->rules));
+  __pyx_v_self->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":312
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":312
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
@@ -34667,16 +36793,16 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root = __pyx_t_2;
+  __Pyx_GOTREF(__pyx_v_self->rules->root);
+  __Pyx_DECREF(__pyx_v_self->rules->root);
+  __pyx_v_self->rules->root = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":313
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":313
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:             # <<<<<<<<<<<<<<
@@ -34686,23 +36812,23 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (((PyObject *)__pyx_v_alignment) == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":314
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":314
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
  *         self.alignment = alignment
  * 
  */
-    __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_107), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_108), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":315
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":315
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")
  *         self.alignment = alignment             # <<<<<<<<<<<<<<
@@ -34711,65 +36837,65 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_alignment));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_alignment));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment = __pyx_v_alignment;
+  __Pyx_GOTREF(__pyx_v_self->alignment);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->alignment));
+  __pyx_v_self->alignment = __pyx_v_alignment;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":319
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":319
  *         # grammar parameters and settings
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length = __pyx_v_max_length;
+  __pyx_v_self->max_length = __pyx_v_max_length;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":320
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":320
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals = __pyx_v_max_nonterminals;
+  __pyx_v_self->max_nonterminals = __pyx_v_max_nonterminals;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":321
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":321
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size             # <<<<<<<<<<<<<<
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size = __pyx_v_max_initial_size;
+  __pyx_v_self->max_initial_size = __pyx_v_max_initial_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":322
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":322
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size = __pyx_v_train_max_initial_size;
+  __pyx_v_self->train_max_initial_size = __pyx_v_train_max_initial_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":323
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":323
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size             # <<<<<<<<<<<<<<
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->min_gap_size = __pyx_v_min_gap_size;
+  __pyx_v_self->min_gap_size = __pyx_v_min_gap_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":324
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":324
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size             # <<<<<<<<<<<<<<
  *         self.category = sym_fromstring(category, False)
  * 
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size = __pyx_v_train_min_gap_size;
+  __pyx_v_self->train_min_gap_size = __pyx_v_train_min_gap_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":325
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":325
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)             # <<<<<<<<<<<<<<
@@ -34783,7 +36909,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_4 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+  __Pyx_GOTREF(__pyx_t_5);
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4);
@@ -34796,9 +36922,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
   __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category = __pyx_t_6;
+  __pyx_v_self->category = __pyx_t_6;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":327
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":327
  *         self.category = sym_fromstring(category, False)
  * 
  *         if max_chunks is None:             # <<<<<<<<<<<<<<
@@ -34808,19 +36934,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (__pyx_v_max_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":328
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":328
  * 
  *         if max_chunks is None:
  *             self.max_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_chunks = max_chunks
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_chunks = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals + 1);
-    goto __pyx_L7;
+    __pyx_v_self->max_chunks = (__pyx_v_self->max_nonterminals + 1);
+    goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":330
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":330
  *             self.max_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_chunks = max_chunks             # <<<<<<<<<<<<<<
@@ -34828,11 +36954,11 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  *         if max_target_chunks is None:
  */
     __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_chunks = __pyx_t_6;
+    __pyx_v_self->max_chunks = __pyx_t_6;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":332
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":332
  *             self.max_chunks = max_chunks
  * 
  *         if max_target_chunks is None:             # <<<<<<<<<<<<<<
@@ -34842,19 +36968,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (__pyx_v_max_target_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":333
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":333
  * 
  *         if max_target_chunks is None:
  *             self.max_target_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_target_chunks = max_target_chunks
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_chunks = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals + 1);
-    goto __pyx_L8;
+    __pyx_v_self->max_target_chunks = (__pyx_v_self->max_nonterminals + 1);
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":335
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":335
  *             self.max_target_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_target_chunks = max_target_chunks             # <<<<<<<<<<<<<<
@@ -34862,11 +36988,11 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  *         if max_target_length is None:
  */
     __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_chunks = __pyx_t_6;
+    __pyx_v_self->max_target_chunks = __pyx_t_6;
   }
-  __pyx_L8:;
+  __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":337
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":337
  *             self.max_target_chunks = max_target_chunks
  * 
  *         if max_target_length is None:             # <<<<<<<<<<<<<<
@@ -34876,19 +37002,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (__pyx_v_max_target_length == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":338
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":338
  * 
  *         if max_target_length is None:
  *             self.max_target_length = max_initial_size             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_target_length = max_target_length
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_length = __pyx_v_max_initial_size;
-    goto __pyx_L9;
+    __pyx_v_self->max_target_length = __pyx_v_max_initial_size;
+    goto __pyx_L6;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":340
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":340
  *             self.max_target_length = max_initial_size
  *         else:
  *             self.max_target_length = max_target_length             # <<<<<<<<<<<<<<
@@ -34896,11 +37022,11 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  *         # algorithmic parameters and settings
  */
     __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_length = __pyx_t_6;
+    __pyx_v_self->max_target_length = __pyx_t_6;
   }
-  __pyx_L9:;
+  __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":343
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":343
  * 
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}             # <<<<<<<<<<<<<<
@@ -34910,12 +37036,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
+  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
+  __pyx_v_self->precomputed_collocations = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":344
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":344
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}             # <<<<<<<<<<<<<<
@@ -34925,30 +37051,30 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
+  __Pyx_DECREF(__pyx_v_self->precomputed_index);
+  __pyx_v_self->precomputed_index = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":345
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":345
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}
  *         self.use_index = use_index             # <<<<<<<<<<<<<<
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_index = __pyx_v_use_index;
+  __pyx_v_self->use_index = __pyx_v_use_index;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":346
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":346
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations             # <<<<<<<<<<<<<<
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_collocations = __pyx_v_use_collocations;
+  __pyx_v_self->use_collocations = __pyx_v_use_collocations;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":347
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":347
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}             # <<<<<<<<<<<<<<
@@ -34958,12 +37084,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(__pyx_v_self->max_rank);
+  __Pyx_DECREF(__pyx_v_self->max_rank);
+  __pyx_v_self->max_rank = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":348
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":348
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file             # <<<<<<<<<<<<<<
@@ -34972,47 +37098,47 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   __Pyx_INCREF(__pyx_v_precompute_file);
   __Pyx_GIVEREF(__pyx_v_precompute_file);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file = __pyx_v_precompute_file;
+  __Pyx_GOTREF(__pyx_v_self->precompute_file);
+  __Pyx_DECREF(__pyx_v_self->precompute_file);
+  __pyx_v_self->precompute_file = __pyx_v_precompute_file;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":349
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":349
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_rank = __pyx_v_precompute_rank;
+  __pyx_v_self->precompute_rank = __pyx_v_precompute_rank;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":350
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":350
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
+  __pyx_v_self->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":351
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":351
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates             # <<<<<<<<<<<<<<
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_baeza_yates = __pyx_v_use_baeza_yates;
+  __pyx_v_self->use_baeza_yates = __pyx_v_use_baeza_yates;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":352
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":352
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor             # <<<<<<<<<<<<<<
  *         if tight_phrases:
  *             self.tight_phrases = 1
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->by_slack_factor = __pyx_v_by_slack_factor;
+  __pyx_v_self->by_slack_factor = __pyx_v_by_slack_factor;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":353
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":353
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:             # <<<<<<<<<<<<<<
@@ -35021,30 +37147,30 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   if (__pyx_v_tight_phrases) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":354
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":354
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  *             self.tight_phrases = 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.tight_phrases = 0
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->tight_phrases = 1;
-    goto __pyx_L10;
+    __pyx_v_self->tight_phrases = 1;
+    goto __pyx_L7;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":356
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":356
  *             self.tight_phrases = 1
  *         else:
  *             self.tight_phrases = 0             # <<<<<<<<<<<<<<
  * 
  *         if require_aligned_chunks:
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->tight_phrases = 0;
+    __pyx_v_self->tight_phrases = 0;
   }
-  __pyx_L10:;
+  __pyx_L7:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":358
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":358
  *             self.tight_phrases = 0
  * 
  *         if require_aligned_chunks:             # <<<<<<<<<<<<<<
@@ -35053,27 +37179,27 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   if (__pyx_v_require_aligned_chunks) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":360
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":360
  *         if require_aligned_chunks:
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 1;
+    __pyx_v_self->require_aligned_chunks = 1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":361
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":361
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 1;
-    goto __pyx_L11;
+    __pyx_v_self->require_aligned_terminal = 1;
+    goto __pyx_L8;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":362
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":362
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -35082,48 +37208,48 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   if (__pyx_v_require_aligned_terminal) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":363
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":363
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 1
  *         else:
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 0;
+    __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":364
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":364
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.require_aligned_chunks = 0
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 1;
-    goto __pyx_L11;
+    __pyx_v_self->require_aligned_terminal = 1;
+    goto __pyx_L8;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":366
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":366
  *             self.require_aligned_terminal = 1
  *         else:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 0
  * 
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 0;
+    __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":367
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":367
  *         else:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 0             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 0;
+    __pyx_v_self->require_aligned_terminal = 0;
   }
-  __pyx_L11:;
+  __pyx_L8:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":371
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":371
  * 
  *         # diagnostics
  *         self.prev_norm_prefix = ()             # <<<<<<<<<<<<<<
@@ -35132,11 +37258,11 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
+  __Pyx_GOTREF(__pyx_v_self->prev_norm_prefix);
+  __Pyx_DECREF(__pyx_v_self->prev_norm_prefix);
+  __pyx_v_self->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":373
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":373
  *         self.prev_norm_prefix = ()
  * 
  *         self.findexes = IntList(initial_len=10)             # <<<<<<<<<<<<<<
@@ -35146,16 +37272,16 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_5 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
   __Pyx_GIVEREF(__pyx_t_5);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
+  __Pyx_GOTREF(__pyx_v_self->findexes);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->findexes));
+  __pyx_v_self->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
   __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":374
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":374
  * 
  *         self.findexes = IntList(initial_len=10)
  *         self.findexes1 = IntList(initial_len=10)             # <<<<<<<<<<<<<<
@@ -35165,13 +37291,13 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_5));
   if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
   __Pyx_GIVEREF(__pyx_t_4);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_4);
+  __Pyx_GOTREF(__pyx_v_self->findexes1);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->findexes1));
+  __pyx_v_self->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_4);
   __pyx_t_4 = 0;
 
   __pyx_r = 0;
@@ -35188,35 +37314,24 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":376
- *         self.findexes1 = IntList(initial_len=10)
- * 
- *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
- *             Sampler sampler, Scorer scorer):
- *         '''This gives the RuleFactory access to the Context object.
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_23HieroCachingRuleFactory_1configure[] = "This gives the RuleFactory access to the Context object.\n        Here we also use it to precompute the most expensive intersections\n        in the corpus quickly.";
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_23HieroCachingRuleFactory_2configure[] = "This gives the RuleFactory access to the Context object.\n        Here we also use it to precompute the most expensive intersections\n        in the corpus quickly.";
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray = 0;
   struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray = 0;
   struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler = 0;
   struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer = 0;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
-  __Pyx_RefNannySetupContext("configure");
+  __Pyx_RefNannySetupContext("configure (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
     PyObject* values[4] = {0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -35225,32 +37340,28 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -35277,8 +37388,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_edarray), __pyx_ptype_3_sa_DataArray, 1, "edarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sampler), __pyx_ptype_3_sa_Sampler, 1, "sampler", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_scorer), __pyx_ptype_3_sa_Scorer, 1, "scorer", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_edarray, __pyx_v_sampler, __pyx_v_scorer);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":376
+ *         self.findexes1 = IntList(initial_len=10)
+ * 
+ *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
+ *             Sampler sampler, Scorer scorer):
+ *         '''This gives the RuleFactory access to the Context object.
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray, struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray, struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler, struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("configure", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":381
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":381
  *         Here we also use it to precompute the most expensive intersections
  *         in the corpus quickly.'''
  *         self.fsa = fsarray             # <<<<<<<<<<<<<<
@@ -35287,11 +37424,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa = __pyx_v_fsarray;
+  __Pyx_GOTREF(__pyx_v_self->fsa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->fsa));
+  __pyx_v_self->fsa = __pyx_v_fsarray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":382
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":382
  *         in the corpus quickly.'''
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray             # <<<<<<<<<<<<<<
@@ -35300,11 +37437,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray->darray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray->darray));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda = __pyx_v_fsarray->darray;
+  __Pyx_GOTREF(__pyx_v_self->fda);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->fda));
+  __pyx_v_self->fda = __pyx_v_fsarray->darray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":383
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":383
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray
  *         self.eda = edarray             # <<<<<<<<<<<<<<
@@ -35313,63 +37450,63 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_edarray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_edarray));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda = __pyx_v_edarray;
+  __Pyx_GOTREF(__pyx_v_self->eda);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->eda));
+  __pyx_v_self->eda = __pyx_v_edarray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":384
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":384
  *         self.fda = fsarray.darray
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)             # <<<<<<<<<<<<<<
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  */
-  __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda);
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->fda);
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->__pyx_vtab)->set_idmap(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->fid2symid);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->fid2symid));
+  __pyx_v_self->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":385
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":385
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)             # <<<<<<<<<<<<<<
  *         self.precompute()
  *         self.sampler = sampler
  */
-  __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda);
+  __pyx_t_2 = ((PyObject *)__pyx_v_self->eda);
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->__pyx_vtab)->set_idmap(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->eid2symid);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->eid2symid));
+  __pyx_v_self->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":386
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":386
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()             # <<<<<<<<<<<<<<
  *         self.sampler = sampler
  *         self.scorer = scorer
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":387
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":387
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  *         self.sampler = sampler             # <<<<<<<<<<<<<<
@@ -35378,11 +37515,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_sampler));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_sampler));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler = __pyx_v_sampler;
+  __Pyx_GOTREF(__pyx_v_self->sampler);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sampler));
+  __pyx_v_self->sampler = __pyx_v_sampler;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":388
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":388
  *         self.precompute()
  *         self.sampler = sampler
  *         self.scorer = scorer             # <<<<<<<<<<<<<<
@@ -35391,9 +37528,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_scorer));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_scorer));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer = __pyx_v_scorer;
+  __Pyx_GOTREF(__pyx_v_self->scorer);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->scorer));
+  __pyx_v_self->scorer = __pyx_v_scorer;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -35408,7 +37545,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":390
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":390
  *         self.scorer = scorer
  * 
  *     cdef set_idmap(self, DataArray darray):             # <<<<<<<<<<<<<<
@@ -35416,7 +37553,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  *         cdef IntList idmap
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_DataArray *__pyx_v_darray) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_DataArray *__pyx_v_darray) {
   int __pyx_v_word_id;
   int __pyx_v_new_word_id;
   int __pyx_v_N;
@@ -35433,9 +37570,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set_idmap");
+  __Pyx_RefNannySetupContext("set_idmap", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":394
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":394
  *         cdef IntList idmap
  * 
  *         N = len(darray.id2word)             # <<<<<<<<<<<<<<
@@ -35448,7 +37585,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_N = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":395
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":395
  * 
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -35461,13 +37598,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_idmap = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":396
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":396
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:             # <<<<<<<<<<<<<<
@@ -35477,7 +37614,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_word_id = 0; __pyx_v_word_id < __pyx_t_4; __pyx_v_word_id++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":397
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":397
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)             # <<<<<<<<<<<<<<
@@ -35491,7 +37628,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
     __pyx_t_5 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -35506,7 +37643,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_v_new_word_id = __pyx_t_7;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":398
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":398
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id             # <<<<<<<<<<<<<<
@@ -35516,7 +37653,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
     (__pyx_v_idmap->arr[__pyx_v_word_id]) = __pyx_v_new_word_id;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":399
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":399
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id
  *         return idmap             # <<<<<<<<<<<<<<
@@ -35544,7 +37681,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":402
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("pattern2phrase (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":402
  * 
  * 
  *     def pattern2phrase(self, pattern):             # <<<<<<<<<<<<<<
@@ -35552,8 +37700,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
  *         result = ()
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern) {
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_arity = NULL;
   PyObject *__pyx_v_word_id = NULL;
@@ -35572,9 +37719,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("pattern2phrase");
+  __Pyx_RefNannySetupContext("pattern2phrase", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":404
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":404
  *     def pattern2phrase(self, pattern):
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()             # <<<<<<<<<<<<<<
@@ -35584,7 +37731,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":405
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":405
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -35594,7 +37741,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":406
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":406
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -35610,12 +37757,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -35631,20 +37786,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":407
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":407
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":408
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":408
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
@@ -35657,7 +37811,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":409
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":409
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
@@ -35665,16 +37819,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_XDECREF(__pyx_v_new_id);
       __pyx_v_new_id = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":411
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":411
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
@@ -35683,12 +37837,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
  */
       __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+      __Pyx_GOTREF(__pyx_t_9);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
       __Pyx_GIVEREF(__pyx_t_7);
       PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
@@ -35703,9 +37857,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
       __pyx_v_new_id = __pyx_t_8;
       __pyx_t_8 = 0;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":412
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":412
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
@@ -35713,7 +37867,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
  * 
  */
     __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_INCREF(__pyx_v_new_id);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_new_id);
     __Pyx_GIVEREF(__pyx_v_new_id);
@@ -35726,7 +37880,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":413
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":413
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         return Phrase(result)             # <<<<<<<<<<<<<<
@@ -35735,7 +37889,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
@@ -35766,7 +37920,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":415
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("pattern2phrase_plus (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":415
  *         return Phrase(result)
  * 
  *     def pattern2phrase_plus(self, pattern):             # <<<<<<<<<<<<<<
@@ -35774,8 +37939,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
  *         # suffixed/prefixed with the NT category.
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern) {
   PyObject *__pyx_v_patterns = NULL;
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_arity = NULL;
@@ -35796,9 +37960,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("pattern2phrase_plus");
+  __Pyx_RefNannySetupContext("pattern2phrase_plus", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":418
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":418
  *         # returns a list containing both the pattern, and pattern
  *         # suffixed/prefixed with the NT category.
  *         patterns = []             # <<<<<<<<<<<<<<
@@ -35806,11 +37970,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
  *         arity = 0
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_patterns = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":419
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":419
  *         # suffixed/prefixed with the NT category.
  *         patterns = []
  *         result = ()             # <<<<<<<<<<<<<<
@@ -35820,7 +37984,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":420
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":420
  *         patterns = []
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -35830,7 +37994,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":421
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":421
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -35846,12 +38010,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -35867,20 +38039,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":422
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":422
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":423
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":423
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
@@ -35893,7 +38064,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":424
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":424
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
@@ -35901,16 +38072,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_XDECREF(__pyx_v_new_id);
       __pyx_v_new_id = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":426
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":426
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
@@ -35919,12 +38090,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
  */
       __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+      __Pyx_GOTREF(__pyx_t_9);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
       __Pyx_GIVEREF(__pyx_t_7);
       PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
@@ -35939,9 +38110,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
       __pyx_v_new_id = __pyx_t_8;
       __pyx_t_8 = 0;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":427
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":427
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
@@ -35949,7 +38120,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  */
     __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_INCREF(__pyx_v_new_id);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_new_id);
     __Pyx_GIVEREF(__pyx_v_new_id);
@@ -35962,18 +38133,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":428
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":428
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  */
-  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
@@ -35983,20 +38151,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":429
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":429
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns
  */
-  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9);
   __Pyx_GIVEREF(__pyx_t_9);
   __pyx_t_9 = 0;
@@ -36004,7 +38169,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __Pyx_GOTREF(((PyObject *)__pyx_t_9));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_9));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
   __pyx_t_9 = 0;
@@ -36014,20 +38179,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":430
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":430
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))             # <<<<<<<<<<<<<<
  *         return patterns
  * 
  */
-  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9);
   __Pyx_GIVEREF(__pyx_t_9);
   __pyx_t_9 = 0;
@@ -36035,7 +38197,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __Pyx_GOTREF(((PyObject *)__pyx_t_9));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_9));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
   __pyx_t_9 = 0;
@@ -36045,7 +38207,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":431
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":431
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns             # <<<<<<<<<<<<<<
@@ -36078,7 +38240,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":433
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("precompute (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":433
  *         return patterns
  * 
  *     def precompute(self):             # <<<<<<<<<<<<<<
@@ -36086,8 +38259,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self) {
   struct __pyx_obj_3_sa_Precomputation *__pyx_v_pre = 0;
   PyObject *__pyx_v_start_time = NULL;
   PyObject *__pyx_v_pattern = NULL;
@@ -36103,27 +38275,27 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   Py_ssize_t __pyx_t_6;
-  PyObject *(*__pyx_t_7)(PyObject *);
-  PyObject *__pyx_t_8 = NULL;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_t_9;
   Py_ssize_t __pyx_t_10;
   PyObject *(*__pyx_t_11)(PyObject *);
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("precompute");
+  __Pyx_RefNannySetupContext("precompute", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":436
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":436
  *         cdef Precomputation pre
  * 
  *         if self.precompute_file is not None:             # <<<<<<<<<<<<<<
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file != Py_None);
+  __pyx_t_1 = (__pyx_v_self->precompute_file != Py_None);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":437
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":437
  * 
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -36135,7 +38307,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
     __pyx_v_start_time = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":438
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":438
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)             # <<<<<<<<<<<<<<
@@ -36148,20 +38320,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __Pyx_INCREF(((PyObject *)__pyx_kp_s_108));
-    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_108));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_108));
-    __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-    PyTuple_SET_ITEM(__pyx_t_2, 1, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-    __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_s_109));
+    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_109));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_109));
+    __Pyx_INCREF(__pyx_v_self->precompute_file);
+    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->precompute_file);
+    __Pyx_GIVEREF(__pyx_v_self->precompute_file);
     __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":439
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":439
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  *             pre = Precomputation(from_binary=self.precompute_file)             # <<<<<<<<<<<<<<
@@ -36170,24 +38342,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  */
     __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), __pyx_v_self->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_v_pre = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_t_2);
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":441
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":441
  *             pre = Precomputation(from_binary=self.precompute_file)
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:             # <<<<<<<<<<<<<<
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  */
-    __pyx_t_1 = (__pyx_v_pre->max_nonterminals != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals);
+    __pyx_t_1 = (__pyx_v_pre->max_nonterminals != __pyx_v_self->max_nonterminals);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":442
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":442
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)             # <<<<<<<<<<<<<<
@@ -36201,13 +38373,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_109));
-      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_s_109));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_109));
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
+      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_s_110));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_110));
       PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3);
@@ -36219,21 +38391,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L6;
+      goto __pyx_L4;
     }
-    __pyx_L6:;
+    __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":443
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":443
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:             # <<<<<<<<<<<<<<
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  */
-    __pyx_t_1 = (__pyx_v_pre->max_length != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length);
+    __pyx_t_1 = (__pyx_v_pre->max_length != __pyx_v_self->max_length);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":444
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":444
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)             # <<<<<<<<<<<<<<
@@ -36247,13 +38419,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_v_self->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
-      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_110));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_110));
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_111));
+      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_111));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_111));
       PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
       __Pyx_GIVEREF(__pyx_t_3);
       PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_4);
@@ -36265,21 +38437,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":445
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":445
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:             # <<<<<<<<<<<<<<
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  */
-    __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size);
+    __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != __pyx_v_self->train_max_initial_size);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":446
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":446
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))             # <<<<<<<<<<<<<<
@@ -36288,21 +38460,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  */
       __pyx_t_4 = PyInt_FromLong(__pyx_v_pre->train_max_initial_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+      __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_4 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_111), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_112), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+      __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       __pyx_t_2 = 0;
@@ -36312,21 +38484,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_Raise(__pyx_t_2, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L8;
+      goto __pyx_L6;
     }
-    __pyx_L8:;
+    __pyx_L6:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":447
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":447
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:             # <<<<<<<<<<<<<<
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  */
-    __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size);
+    __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != __pyx_v_self->train_min_gap_size);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":448
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":448
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))             # <<<<<<<<<<<<<<
@@ -36335,21 +38507,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  */
       __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(__pyx_v_self->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_2 = 0;
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_112), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_113), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_5));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
       __pyx_t_5 = 0;
@@ -36359,20 +38531,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_Raise(__pyx_t_5, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L9;
+      goto __pyx_L7;
     }
-    __pyx_L9:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":449
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":449
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:             # <<<<<<<<<<<<<<
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  */
-    if (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_index) {
+    if (__pyx_v_self->use_index) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":450
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":450
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))             # <<<<<<<<<<<<<<
@@ -36391,10 +38563,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_113));
-      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_113));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_113));
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_114));
+      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_114));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_114));
       PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
@@ -36404,117 +38576,59 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":451
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":451
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():             # <<<<<<<<<<<<<<
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  */
-      __pyx_t_5 = PyObject_GetAttr(__pyx_v_pre->precomputed_index, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
-        __pyx_t_5 = __pyx_t_2; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0;
-        __pyx_t_7 = NULL;
-      } else {
-        __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
+      __pyx_t_6 = 0;
+      if (unlikely(__pyx_v_pre->precomputed_index == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      for (;;) {
-        if (PyList_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_2 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++;
-        } else if (PyTuple_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++;
-        } else {
-          __pyx_t_2 = __pyx_t_7(__pyx_t_5);
-          if (unlikely(!__pyx_t_2)) {
-            if (PyErr_Occurred()) {
-              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            break;
-          }
-          __Pyx_GOTREF(__pyx_t_2);
-        }
-        if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
-          PyObject* sequence = __pyx_t_2;
-          if (likely(PyTuple_CheckExact(sequence))) {
-            if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-              if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
-            __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
-          } else {
-            if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-              if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
-            __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
-          }
-          __Pyx_INCREF(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_3);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        } else {
-          Py_ssize_t index = -1;
-          __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
-          index = 0; __pyx_t_4 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L13_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_4);
-          index = 1; __pyx_t_3 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_3)) goto __pyx_L13_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_3);
-          if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          goto __pyx_L14_unpacking_done;
-          __pyx_L13_unpacking_failed:;
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-          if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_L14_unpacking_done:;
-        }
+      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_index, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_XDECREF(__pyx_t_5);
+      __pyx_t_5 = __pyx_t_2;
+      __pyx_t_2 = 0;
+      while (1) {
+        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_7, &__pyx_t_6, &__pyx_t_2, &__pyx_t_4, NULL, __pyx_t_8);
+        if (unlikely(__pyx_t_9 == 0)) break;
+        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(__pyx_t_4);
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_4;
-        __pyx_t_4 = 0;
+        __pyx_v_pattern = __pyx_t_2;
+        __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_arr = __pyx_t_4;
+        __pyx_t_4 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":452
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":452
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)             # <<<<<<<<<<<<<<
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  */
-        __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_3));
         __Pyx_INCREF(__pyx_v_pattern);
-        PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_pattern);
+        PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
-        __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+        __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_v_phrases);
-        __pyx_v_phrases = __pyx_t_4;
-        __pyx_t_4 = 0;
+        __pyx_v_phrases = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":453
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":453
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:             # <<<<<<<<<<<<<<
@@ -36522,61 +38636,69 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  *             if self.use_collocations:
  */
         if (PyList_CheckExact(__pyx_v_phrases) || PyTuple_CheckExact(__pyx_v_phrases)) {
-          __pyx_t_4 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_4); __pyx_t_10 = 0;
+          __pyx_t_3 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
           __pyx_t_11 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_11 = Py_TYPE(__pyx_t_4)->tp_iternext;
+          __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
         }
         for (;;) {
-          if (PyList_CheckExact(__pyx_t_4)) {
-            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_4)) break;
-            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
-          } else if (PyTuple_CheckExact(__pyx_t_4)) {
-            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
+          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_3)) {
+            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_3)) {
+            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
           } else {
-            __pyx_t_3 = __pyx_t_11(__pyx_t_4);
-            if (unlikely(!__pyx_t_3)) {
+            __pyx_t_2 = __pyx_t_11(__pyx_t_3);
+            if (unlikely(!__pyx_t_2)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
                 else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
-            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_GOTREF(__pyx_t_2);
           }
           __Pyx_XDECREF(__pyx_v_phrase);
-          __pyx_v_phrase = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __pyx_v_phrase = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":454
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":454
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr             # <<<<<<<<<<<<<<
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  */
-          if (PyObject_SetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyObject_SetItem(__pyx_v_self->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L10;
+      goto __pyx_L8;
     }
-    __pyx_L10:;
+    __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":455
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":455
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:             # <<<<<<<<<<<<<<
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  */
-    if (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_collocations) {
+    if (__pyx_v_self->use_collocations) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":456
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":456
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))             # <<<<<<<<<<<<<<
@@ -36585,128 +38707,70 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  */
       __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_5 = __pyx_v_pre->precomputed_collocations;
       __Pyx_INCREF(__pyx_t_5);
-      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_114));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_114));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_114));
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5);
+      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
+      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_115));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_115));
+      PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":457
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":457
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():             # <<<<<<<<<<<<<<
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  */
-      __pyx_t_5 = PyObject_GetAttr(__pyx_v_pre->precomputed_collocations, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-        __pyx_t_5 = __pyx_t_3; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0;
-        __pyx_t_7 = NULL;
-      } else {
-        __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
+      __pyx_t_7 = 0;
+      if (unlikely(__pyx_v_pre->precomputed_collocations == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      for (;;) {
-        if (PyList_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
-        } else if (PyTuple_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
-        } else {
-          __pyx_t_3 = __pyx_t_7(__pyx_t_5);
-          if (unlikely(!__pyx_t_3)) {
-            if (PyErr_Occurred()) {
-              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            break;
-          }
-          __Pyx_GOTREF(__pyx_t_3);
-        }
-        if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-          PyObject* sequence = __pyx_t_3;
-          if (likely(PyTuple_CheckExact(sequence))) {
-            if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-              if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
-            __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
-          } else {
-            if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-              if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
-            __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
-          }
-          __Pyx_INCREF(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        } else {
-          Py_ssize_t index = -1;
-          __pyx_t_8 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
-          index = 0; __pyx_t_4 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L20_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_4);
-          index = 1; __pyx_t_2 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_2)) goto __pyx_L20_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_2);
-          if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          goto __pyx_L21_unpacking_done;
-          __pyx_L20_unpacking_failed:;
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-          if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_L21_unpacking_done:;
-        }
+      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_6), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_XDECREF(__pyx_t_5);
+      __pyx_t_5 = __pyx_t_2;
+      __pyx_t_2 = 0;
+      while (1) {
+        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_6, &__pyx_t_7, &__pyx_t_2, &__pyx_t_3, NULL, __pyx_t_8);
+        if (unlikely(__pyx_t_9 == 0)) break;
+        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(__pyx_t_3);
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_4;
-        __pyx_t_4 = 0;
-        __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_2;
+        __pyx_v_pattern = __pyx_t_2;
         __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_v_arr);
+        __pyx_v_arr = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":458
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":458
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)             # <<<<<<<<<<<<<<
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  */
-        __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+        __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(__pyx_v_pattern);
         PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
@@ -36718,21 +38782,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
         __pyx_v_phrase = __pyx_t_4;
         __pyx_t_4 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":459
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":459
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr             # <<<<<<<<<<<<<<
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)
  */
-        if (PyObject_SetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L17;
+      goto __pyx_L13;
     }
-    __pyx_L17:;
+    __pyx_L13:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":460
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":460
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -36744,7 +38808,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
     __pyx_v_stop_time = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":461
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":461
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)             # <<<<<<<<<<<<<<
@@ -36759,10 +38823,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
     __pyx_t_5 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
-    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_115));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_115));
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_s_116));
+    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_116));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_116));
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
@@ -36771,9 +38835,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -36782,7 +38846,6 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -36798,7 +38861,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":464
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_precomputed_collocation (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_phrase));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":464
  * 
  * 
  *     def get_precomputed_collocation(self, phrase):             # <<<<<<<<<<<<<<
@@ -36806,8 +38880,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  *             arr = self.precomputed_collocations[phrase]
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_phrase) {
   PyObject *__pyx_v_arr = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -36819,31 +38892,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_colloc
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_precomputed_collocation");
+  __Pyx_RefNannySetupContext("get_precomputed_collocation", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":465
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":465
  * 
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:             # <<<<<<<<<<<<<<
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  */
-  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_phrase, __pyx_v_self->precomputed_collocations, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":466
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":466
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]             # <<<<<<<<<<<<<<
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None
  */
-    __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_arr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":467
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":467
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)             # <<<<<<<<<<<<<<
@@ -36870,17 +38943,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_colloc
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":468
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":468
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None             # <<<<<<<<<<<<<<
@@ -36907,7 +38980,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_colloc
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":471
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":471
  * 
  * 
  *     cdef int* baeza_yates_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -36951,9 +39024,9 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("baeza_yates_helper");
+  __Pyx_RefNannySetupContext("baeza_yates_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":484
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":484
  *         cdef Matching loc1, loc2
  * 
  *         result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -36962,7 +39035,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":486
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":486
  *         result = <int*> malloc(0*sizeof(int*))
  * 
  *         d_first = 0             # <<<<<<<<<<<<<<
@@ -36971,7 +39044,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_d_first = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":487
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":487
  * 
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:             # <<<<<<<<<<<<<<
@@ -36981,7 +39054,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_1 = ((__pyx_v_high1 - __pyx_v_low1) > (__pyx_v_high2 - __pyx_v_low2));
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":488
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":488
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:
  *             d_first = 1             # <<<<<<<<<<<<<<
@@ -36993,7 +39066,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":492
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":492
  *         # First, check to see if we are at any of the recursive base cases
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:             # <<<<<<<<<<<<<<
@@ -37009,7 +39082,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":493
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":493
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:
  *             return result             # <<<<<<<<<<<<<<
@@ -37022,7 +39095,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":496
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":496
  * 
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37031,7 +39104,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, (__pyx_v_high1 - __pyx_v_step1), __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":497
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":497
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37040,7 +39113,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_low2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":498
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":498
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:             # <<<<<<<<<<<<<<
@@ -37050,7 +39123,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == -1);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":499
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":499
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:
  *             return result             # <<<<<<<<<<<<<<
@@ -37063,7 +39136,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":501
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":501
  *             return result
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37072,7 +39145,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_low1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":502
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":502
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37081,7 +39154,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_high2 - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":503
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":503
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -37091,7 +39164,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":504
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":504
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *             return result             # <<<<<<<<<<<<<<
@@ -37104,7 +39177,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":508
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":508
  *         # Case 3: query set and data set do not meet size mismatch constraints;
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1             # <<<<<<<<<<<<<<
@@ -37122,7 +39195,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_v_qsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":509
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":509
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2             # <<<<<<<<<<<<<<
@@ -37140,7 +39213,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_v_dsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":510
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":510
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -37149,7 +39222,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":511
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":511
  *         dsetsize = (high2-low2) / step2
  *         if d_first:
  *             tmp = qsetsize             # <<<<<<<<<<<<<<
@@ -37158,7 +39231,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_qsetsize;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":512
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":512
  *         if d_first:
  *             tmp = qsetsize
  *             qsetsize = dsetsize             # <<<<<<<<<<<<<<
@@ -37167,7 +39240,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_qsetsize = __pyx_v_dsetsize;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":513
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":513
  *             tmp = qsetsize
  *             qsetsize = dsetsize
  *             dsetsize = tmp             # <<<<<<<<<<<<<<
@@ -37179,7 +39252,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L7:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":515
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":515
  *             dsetsize = tmp
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:             # <<<<<<<<<<<<<<
@@ -37195,7 +39268,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = ((__pyx_t_5 / __pyx_t_6) > __pyx_v_dsetsize);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":516
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":516
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)             # <<<<<<<<<<<<<<
@@ -37204,7 +39277,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     free(__pyx_v_result);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":517
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":517
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)
  *             return self.merge_helper(low1, high1, arr1, step1, low2, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -37217,7 +39290,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L8:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":521
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":521
  *         # binary search.    There are two flavors, depending on
  *         # whether the queryset or dataset is first
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -37226,7 +39299,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":522
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":522
  *         # whether the queryset or dataset is first
  *         if d_first:
  *             med2 = median(low2, high2, step2)             # <<<<<<<<<<<<<<
@@ -37235,7 +39308,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_low2, __pyx_v_high2, __pyx_v_step2);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":523
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":523
  *         if d_first:
  *             med2 = median(low2, high2, step2)
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37244,7 +39317,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":525
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":525
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  * 
  *             search_low = low1             # <<<<<<<<<<<<<<
@@ -37253,7 +39326,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":526
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":526
  * 
  *             search_low = low1
  *             search_high = high1             # <<<<<<<<<<<<<<
@@ -37262,7 +39335,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":527
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":527
  *             search_low = low1
  *             search_high = high1
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -37273,7 +39346,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":528
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":528
  *             search_high = high1
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)             # <<<<<<<<<<<<<<
@@ -37282,7 +39355,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":529
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":529
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -37291,7 +39364,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":530
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":530
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -37300,7 +39373,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":533
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":533
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37309,7 +39382,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":531
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":531
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37318,7 +39391,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":532
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":532
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_low = med1_plus             # <<<<<<<<<<<<<<
@@ -37328,7 +39401,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_low = __pyx_v_med1_plus;
         break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":533
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":533
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37337,7 +39410,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":534
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":534
  *                     search_low = med1_plus
  *                 elif comparison == 1:
  *                     search_high = med1_minus             # <<<<<<<<<<<<<<
@@ -37348,7 +39421,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":536
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":536
  *                     search_high = med1_minus
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -37364,7 +39437,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":538
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":538
  *                     break
  *         else:
  *             med1 = median(low1, high1, step1)             # <<<<<<<<<<<<<<
@@ -37373,7 +39446,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_low1, __pyx_v_high1, __pyx_v_step1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":539
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":539
  *         else:
  *             med1 = median(low1, high1, step1)
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -37382,7 +39455,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":541
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":541
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  * 
  *             search_low = low2             # <<<<<<<<<<<<<<
@@ -37391,7 +39464,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":542
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":542
  * 
  *             search_low = low2
  *             search_high = high2             # <<<<<<<<<<<<<<
@@ -37400,7 +39473,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":543
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":543
  *             search_low = low2
  *             search_high = high2
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -37411,7 +39484,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":544
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":544
  *             search_high = high2
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)             # <<<<<<<<<<<<<<
@@ -37420,7 +39493,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step2);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":545
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":545
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37429,7 +39502,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":546
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":546
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -37438,7 +39511,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":549
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":549
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37447,7 +39520,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":547
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":547
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37456,7 +39529,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":548
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":548
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_high = med2             # <<<<<<<<<<<<<<
@@ -37466,7 +39539,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_high = __pyx_v_med2;
         break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":549
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":549
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37475,7 +39548,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":550
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":550
  *                     search_high = med2
  *                 elif comparison == 1:
  *                     search_low = med2 + step2             # <<<<<<<<<<<<<<
@@ -37486,7 +39559,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":552
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":552
  *                     search_low = med2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -37501,7 +39574,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L9:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":554
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":554
  *                     break
  * 
  *         med_result_len = 0             # <<<<<<<<<<<<<<
@@ -37510,7 +39583,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":555
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":555
  * 
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -37519,7 +39592,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":556
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":556
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))
  *         if search_high > search_low:             # <<<<<<<<<<<<<<
@@ -37529,7 +39602,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (__pyx_v_search_high > __pyx_v_search_low);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":562
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":562
  *             # want to store the bindings for all of those elements.    We can
  *             # subsequently throw all of them away.
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -37538,7 +39611,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":563
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":563
  *             # subsequently throw all of them away.
  *             med2_minus = med2
  *             med2_plus = med2 + step2             # <<<<<<<<<<<<<<
@@ -37547,7 +39620,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = (__pyx_v_med2 + __pyx_v_step2);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":564
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":564
  *             med2_minus = med2
  *             med2_plus = med2 + step2
  *             i1 = med1_minus             # <<<<<<<<<<<<<<
@@ -37556,7 +39629,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_i1 = __pyx_v_med1_minus;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":565
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":565
  *             med2_plus = med2 + step2
  *             i1 = med1_minus
  *             while i1 < med1_plus:             # <<<<<<<<<<<<<<
@@ -37567,7 +39640,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i1 < __pyx_v_med1_plus);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":566
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":566
  *             i1 = med1_minus
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37576,7 +39649,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":567
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":567
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:             # <<<<<<<<<<<<<<
@@ -37587,7 +39660,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = ((__pyx_v_med2_minus - __pyx_v_step2) >= __pyx_v_low2);
         if (!__pyx_t_3) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":568
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":568
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37596,7 +39669,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_med2_minus - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":569
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":569
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:             # <<<<<<<<<<<<<<
@@ -37606,7 +39679,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) < 1);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":570
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":570
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:
  *                         med2_minus = med2_minus - step2             # <<<<<<<<<<<<<<
@@ -37618,7 +39691,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":572
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":572
  *                         med2_minus = med2_minus - step2
  *                     else:
  *                         break             # <<<<<<<<<<<<<<
@@ -37631,7 +39704,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L18_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":573
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":573
  *                     else:
  *                         break
  *                 i2 = med2_minus             # <<<<<<<<<<<<<<
@@ -37640,7 +39713,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_i2 = __pyx_v_med2_minus;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":574
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":574
  *                         break
  *                 i2 = med2_minus
  *                 while i2 < high2:             # <<<<<<<<<<<<<<
@@ -37651,7 +39724,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
         if (!__pyx_t_3) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":575
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":575
  *                 i2 = med2_minus
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37660,7 +39733,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":576
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":576
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -37669,7 +39742,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":577
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":577
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -37679,7 +39752,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == 0);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":579
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":579
  *                     if comparison == 0:
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)             # <<<<<<<<<<<<<<
@@ -37691,7 +39764,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L22:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":580
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":580
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37701,7 +39774,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == -1);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":581
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":581
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -37713,7 +39786,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L23:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":582
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":582
  *                     if comparison == -1:
  *                         break
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -37724,7 +39797,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L21_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":583
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":583
  *                         break
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:             # <<<<<<<<<<<<<<
@@ -37734,7 +39807,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i2 > __pyx_v_med2_plus);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":584
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":584
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:
  *                     med2_plus = i2             # <<<<<<<<<<<<<<
@@ -37746,7 +39819,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L24:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":585
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":585
  *                 if i2 > med2_plus:
  *                     med2_plus = i2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -37756,7 +39829,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_v_i1 = (__pyx_v_i1 + __pyx_v_step1);
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":587
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":587
  *                 i1 = i1 + step1
  * 
  *             tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -37765,7 +39838,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_med1_minus;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":588
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":588
  * 
  *             tmp = med1_minus
  *             med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -37774,7 +39847,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":589
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":589
  *             tmp = med1_minus
  *             med1_minus = med1_plus
  *             med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -37786,7 +39859,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":592
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":592
  *         else:
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -37795,7 +39868,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":593
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":593
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2
  *             med2_plus = med2             # <<<<<<<<<<<<<<
@@ -37804,7 +39877,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = __pyx_v_med2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":594
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":594
  *             med2_minus = med2
  *             med2_plus = med2
  *             if d_first:             # <<<<<<<<<<<<<<
@@ -37813,7 +39886,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     if (__pyx_v_d_first) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":595
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":595
  *             med2_plus = med2
  *             if d_first:
  *                 med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -37822,7 +39895,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":596
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":596
  *             if d_first:
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37832,7 +39905,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == -1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":597
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":597
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:
  *                     med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -37844,7 +39917,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L26:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":598
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":598
  *                 if comparison == -1:
  *                     med1_minus = med1_plus
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -37854,7 +39927,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":599
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":599
  *                     med1_minus = med1_plus
  *                 if comparison == 1:
  *                     med1_plus = med1_minus             # <<<<<<<<<<<<<<
@@ -37869,7 +39942,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":601
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":601
  *                     med1_plus = med1_minus
  *             else:
  *                 tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -37878,7 +39951,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_tmp = __pyx_v_med1_minus;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":602
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":602
  *             else:
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -37887,7 +39960,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":603
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":603
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -37896,7 +39969,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_plus = __pyx_v_tmp;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":604
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":604
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -37906,7 +39979,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":605
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":605
  *                 med1_plus = tmp
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -37915,7 +39988,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":606
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":606
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2
  *                     med2_plus = med2_plus + step2             # <<<<<<<<<<<<<<
@@ -37931,7 +40004,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L14:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":608
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":608
  *                     med2_plus = med2_plus + step2
  * 
  *         low_result_len = 0             # <<<<<<<<<<<<<<
@@ -37940,7 +40013,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":609
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":609
  * 
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)             # <<<<<<<<<<<<<<
@@ -37949,7 +40022,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_low1, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, __pyx_v_low2, __pyx_v_med2_plus, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_low_result_len));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":610
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":610
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0             # <<<<<<<<<<<<<<
@@ -37958,7 +40031,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":611
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":611
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)             # <<<<<<<<<<<<<<
@@ -37967,7 +40040,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med2_minus, __pyx_v_high2, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_high_result_len));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":613
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":613
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)             # <<<<<<<<<<<<<<
@@ -37976,7 +40049,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_low_result, __pyx_v_low_result_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":614
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":614
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)             # <<<<<<<<<<<<<<
@@ -37985,7 +40058,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_med_result, __pyx_v_med_result_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":615
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":615
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)             # <<<<<<<<<<<<<<
@@ -37994,7 +40067,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_high_result, __pyx_v_high_result_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":616
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":616
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)             # <<<<<<<<<<<<<<
@@ -38003,7 +40076,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_low_result);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":617
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":617
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)
  *         free(med_result)             # <<<<<<<<<<<<<<
@@ -38012,7 +40085,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_med_result);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":618
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":618
  *         free(low_result)
  *         free(med_result)
  *         free(high_result)             # <<<<<<<<<<<<<<
@@ -38021,7 +40094,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_high_result);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":620
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":620
  *         free(high_result)
  * 
  *         return result             # <<<<<<<<<<<<<<
@@ -38041,7 +40114,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":624
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":624
  * 
  * 
  *     cdef long compare_matchings_set(self, int i1_minus, int i1_plus, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -38058,9 +40131,9 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   long __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("compare_matchings_set");
+  __Pyx_RefNannySetupContext("compare_matchings_set", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":635
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":635
  *         cdef Matching* loc1
  * 
  *         loc1 = &l1_stack             # <<<<<<<<<<<<<<
@@ -38069,7 +40142,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_loc1 = (&__pyx_v_l1_stack);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":637
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":637
  *         loc1 = &l1_stack
  * 
  *         i1 = i1_minus             # <<<<<<<<<<<<<<
@@ -38078,7 +40151,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_i1 = __pyx_v_i1_minus;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":638
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":638
  * 
  *         i1 = i1_minus
  *         while i1 < i1_plus:             # <<<<<<<<<<<<<<
@@ -38089,7 +40162,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 < __pyx_v_i1_plus);
     if (!__pyx_t_1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":639
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":639
  *         i1 = i1_minus
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38098,7 +40171,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_f_3_sa_assign_matching(__pyx_v_loc1, __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":640
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":640
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -38107,7 +40180,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, __pyx_v_loc1, __pyx_v_loc2, __pyx_v_offset_by_one, __pyx_v_len_last);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":641
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":641
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:             # <<<<<<<<<<<<<<
@@ -38117,7 +40190,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_comparison == 0);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":642
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":642
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:
  *                 prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -38126,7 +40199,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
       __pyx_v_prev_comparison = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":643
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":643
  *             if comparison == 0:
  *                 prev_comparison = 0
  *                 break             # <<<<<<<<<<<<<<
@@ -38137,7 +40210,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       goto __pyx_L5;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":644
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":644
  *                 prev_comparison = 0
  *                 break
  *             elif i1 == i1_minus:             # <<<<<<<<<<<<<<
@@ -38147,7 +40220,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 == __pyx_v_i1_minus);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":645
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":645
  *                 break
  *             elif i1 == i1_minus:
  *                 prev_comparison = comparison             # <<<<<<<<<<<<<<
@@ -38159,7 +40232,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":647
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":647
  *                 prev_comparison = comparison
  *             else:
  *                 if comparison != prev_comparison:             # <<<<<<<<<<<<<<
@@ -38169,7 +40242,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       __pyx_t_1 = (__pyx_v_comparison != __pyx_v_prev_comparison);
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":648
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":648
  *             else:
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -38178,7 +40251,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
         __pyx_v_prev_comparison = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":649
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":649
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -38192,7 +40265,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":650
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":650
  *                     prev_comparison = 0
  *                     break
  *             i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -38203,7 +40276,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   }
   __pyx_L4_break:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":651
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":651
  *                     break
  *             i1 = i1 + step1
  *         return prev_comparison             # <<<<<<<<<<<<<<
@@ -38219,7 +40292,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":654
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":654
  * 
  * 
  *     cdef long compare_matchings(self, Matching* loc1, Matching* loc2, int offset_by_one, int len_last):             # <<<<<<<<<<<<<<
@@ -38235,9 +40308,9 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("compare_matchings");
+  __Pyx_RefNannySetupContext("compare_matchings", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":657
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":657
  *         cdef int i
  * 
  *         if loc1.sent_id > loc2.sent_id:             # <<<<<<<<<<<<<<
@@ -38247,7 +40320,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc1->sent_id > __pyx_v_loc2->sent_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":658
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":658
  * 
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1             # <<<<<<<<<<<<<<
@@ -38260,7 +40333,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":659
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":659
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:             # <<<<<<<<<<<<<<
@@ -38270,7 +40343,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc2->sent_id > __pyx_v_loc1->sent_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":660
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":660
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:
  *             return -1             # <<<<<<<<<<<<<<
@@ -38283,7 +40356,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":662
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":662
  *             return -1
  * 
  *         if loc1.size == 1 and loc2.size == 1:             # <<<<<<<<<<<<<<
@@ -38299,7 +40372,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":663
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":663
  * 
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:             # <<<<<<<<<<<<<<
@@ -38309,7 +40382,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc2->arr[__pyx_v_loc2->start]) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) <= __pyx_v_self->train_min_gap_size);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":664
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":664
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -38324,7 +40397,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     goto __pyx_L5;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":666
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":666
  *                 return 1
  * 
  *         elif offset_by_one:             # <<<<<<<<<<<<<<
@@ -38333,7 +40406,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
  */
   if (__pyx_v_offset_by_one) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":667
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":667
  * 
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -38343,7 +40416,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":668
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":668
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -38353,7 +40426,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":669
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":669
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -38366,7 +40439,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L9:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":670
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":670
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -38376,7 +40449,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":671
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":671
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -38393,7 +40466,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":674
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":674
  * 
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -38403,7 +40476,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) > (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":675
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":675
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -38416,7 +40489,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L11:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":676
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":676
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -38426,7 +40499,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) < (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":677
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":677
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -38439,7 +40512,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L12:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":679
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":679
  *                 return -1
  * 
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -38449,7 +40522,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":680
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":680
  * 
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -38459,7 +40532,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":681
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":681
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -38472,7 +40545,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L15:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":682
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":682
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -38482,7 +40555,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":683
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":683
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -38498,7 +40571,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":685
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":685
  *                     return -1
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -38508,7 +40581,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_3 = ((((__pyx_v_loc2->arr[(__pyx_v_loc2->end - 1)]) + __pyx_v_len_last) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) > __pyx_v_self->train_max_initial_size);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":686
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":686
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1             # <<<<<<<<<<<<<<
@@ -38521,7 +40594,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L17:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":687
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":687
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1
  *         return 0             # <<<<<<<<<<<<<<
@@ -38537,7 +40610,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":690
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":690
  * 
  * 
  *     cdef int* merge_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -38559,9 +40632,9 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("merge_helper");
+  __Pyx_RefNannySetupContext("merge_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":698
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":698
  *         cdef Matching loc1, loc2
  * 
  *         result_len[0] = 0             # <<<<<<<<<<<<<<
@@ -38570,7 +40643,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   (__pyx_v_result_len[0]) = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":699
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":699
  * 
  *         result_len[0] = 0
  *         result = <int*> malloc(0*sizeof(int))             # <<<<<<<<<<<<<<
@@ -38579,7 +40652,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":701
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":701
  *         result = <int*> malloc(0*sizeof(int))
  * 
  *         i1 = low1             # <<<<<<<<<<<<<<
@@ -38588,7 +40661,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i1 = __pyx_v_low1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":702
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":702
  * 
  *         i1 = low1
  *         i2 = low2             # <<<<<<<<<<<<<<
@@ -38597,7 +40670,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i2 = __pyx_v_low2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":703
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":703
  *         i1 = low1
  *         i2 = low2
  *         while i1 < high1 and i2 < high2:             # <<<<<<<<<<<<<<
@@ -38614,7 +40687,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":706
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":706
  * 
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38623,7 +40696,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":707
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":707
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:             # <<<<<<<<<<<<<<
@@ -38634,7 +40707,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":708
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":708
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38643,7 +40716,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":709
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":709
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -38653,7 +40726,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":710
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":710
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -38665,7 +40738,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":712
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":712
  *                     i2 = i2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -38678,7 +40751,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     __pyx_L6_break:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":715
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":715
  * 
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1             # <<<<<<<<<<<<<<
@@ -38687,7 +40760,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_v_j1 = __pyx_v_i1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":716
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":716
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:             # <<<<<<<<<<<<<<
@@ -38704,7 +40777,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       if (!__pyx_t_2) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":717
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":717
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38713,7 +40786,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":718
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":718
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2             # <<<<<<<<<<<<<<
@@ -38722,7 +40795,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_v_j2 = __pyx_v_i2;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":719
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":719
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2
  *                 while j2 < high2:             # <<<<<<<<<<<<<<
@@ -38733,7 +40806,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_j2 < __pyx_v_high2);
         if (!__pyx_t_2) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":720
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":720
  *                 j2 = i2
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38742,7 +40815,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_j2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":721
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":721
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -38751,7 +40824,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":722
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":722
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -38761,7 +40834,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == 0);
         if (__pyx_t_2) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":723
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":723
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -38773,7 +40846,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L12:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":724
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":724
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)
  *                     if comparison == 1:             # <<<<<<<<<<<<<<
@@ -38786,7 +40859,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L13:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":726
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":726
  *                     if comparison == 1:
  *                         pass
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -38796,7 +40869,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == -1);
         if (__pyx_t_2) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":727
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":727
  *                         pass
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -38808,7 +40881,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":729
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":729
  *                         break
  *                     else:
  *                         j2 = j2 + step2             # <<<<<<<<<<<<<<
@@ -38821,7 +40894,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       __pyx_L11_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":730
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":730
  *                     else:
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -38832,7 +40905,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":731
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":731
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1
  *         return result             # <<<<<<<<<<<<<<
@@ -38848,7 +40921,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":734
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":734
  * 
  * 
  *     cdef void sort_phrase_loc(self, IntList arr, PhraseLocation loc, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -38868,19 +40941,19 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sort_phrase_loc");
+  __Pyx_RefNannySetupContext("sort_phrase_loc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":739
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":739
  *         cdef IntList result
  * 
  *         if phrase in self.precomputed_index:             # <<<<<<<<<<<<<<
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  */
-  __pyx_t_1 = ((PySequence_Contains(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 739; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_phrase), __pyx_v_self->precomputed_index, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 739; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":740
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":740
  * 
  *         if phrase in self.precomputed_index:
  *             loc.arr = self.precomputed_index[phrase]             # <<<<<<<<<<<<<<
@@ -38899,7 +40972,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":742
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":742
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)             # <<<<<<<<<<<<<<
@@ -38912,7 +40985,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __Pyx_GOTREF(__pyx_t_3);
     if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_GIVEREF(__pyx_t_3);
@@ -38921,7 +40994,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_v_loc->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":743
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":743
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)             # <<<<<<<<<<<<<<
@@ -38931,7 +41004,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_3 = PyInt_FromLong(__pyx_v_arr->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
@@ -38941,7 +41014,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":744
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":744
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:             # <<<<<<<<<<<<<<
@@ -38951,7 +41024,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = __pyx_v_loc->sa_high;
     for (__pyx_v_i = __pyx_v_loc->sa_low; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":745
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":745
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])             # <<<<<<<<<<<<<<
@@ -38961,7 +41034,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
       ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_v_veb->__pyx_vtab)->_insert(__pyx_v_veb, (__pyx_v_arr->arr[__pyx_v_i]));
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":746
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":746
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -38970,7 +41043,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
     __pyx_v_i = __pyx_v_veb->veb->min_val;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":747
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":747
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:             # <<<<<<<<<<<<<<
@@ -38980,7 +41053,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = (__pyx_v_loc->sa_high - __pyx_v_loc->sa_low);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":748
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":748
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i             # <<<<<<<<<<<<<<
@@ -38989,7 +41062,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
       (__pyx_v_loc->arr->arr[__pyx_v_j]) = __pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":749
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":749
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -39001,7 +41074,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":750
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":750
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0             # <<<<<<<<<<<<<<
@@ -39010,7 +41083,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
   __pyx_v_loc->arr_low = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":751
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":751
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0
  *         loc.arr_high = loc.arr.len             # <<<<<<<<<<<<<<
@@ -39029,7 +41102,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":754
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":754
  * 
  * 
  *     cdef intersect_helper(self, Phrase prefix, Phrase suffix,             # <<<<<<<<<<<<<<
@@ -39064,9 +41137,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("intersect_helper");
+  __Pyx_RefNannySetupContext("intersect_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":761
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":761
  *         cdef int* result_ptr
  * 
  *         result_len = 0             # <<<<<<<<<<<<<<
@@ -39075,7 +41148,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":763
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":763
  *         result_len = 0
  * 
  *         if sym_isvar(suffix[0]):             # <<<<<<<<<<<<<<
@@ -39089,7 +41162,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_t_2);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":764
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":764
  * 
  *         if sym_isvar(suffix[0]):
  *             offset_by_one = 1             # <<<<<<<<<<<<<<
@@ -39101,7 +41174,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":766
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":766
  *             offset_by_one = 1
  *         else:
  *             offset_by_one = 0             # <<<<<<<<<<<<<<
@@ -39112,7 +41185,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":768
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":768
  *             offset_by_one = 0
  * 
  *         len_last = len(suffix.getchunk(suffix.arity()))             # <<<<<<<<<<<<<<
@@ -39127,7 +41200,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
   __Pyx_GIVEREF(__pyx_t_5);
   __pyx_t_5 = 0;
@@ -39139,7 +41212,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_len_last = __pyx_t_6;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":770
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":770
  *         len_last = len(suffix.getchunk(suffix.arity()))
  * 
  *         if prefix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -39149,7 +41222,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_prefix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":771
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":771
  * 
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)             # <<<<<<<<<<<<<<
@@ -39164,7 +41237,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":772
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":772
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr             # <<<<<<<<<<<<<<
@@ -39174,7 +41247,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_prefix_loc->arr));
   __pyx_v_arr1 = __pyx_v_prefix_loc->arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":773
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":773
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -39183,7 +41256,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low1 = __pyx_v_prefix_loc->arr_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":774
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":774
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -39192,7 +41265,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high1 = __pyx_v_prefix_loc->arr_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":775
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":775
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high
  *         step1 = prefix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -39201,7 +41274,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step1 = __pyx_v_prefix_loc->num_subpatterns;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":777
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":777
  *         step1 = prefix_loc.num_subpatterns
  * 
  *         if suffix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -39211,7 +41284,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_suffix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":778
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":778
  * 
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)             # <<<<<<<<<<<<<<
@@ -39226,7 +41299,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":779
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":779
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr             # <<<<<<<<<<<<<<
@@ -39236,7 +41309,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_suffix_loc->arr));
   __pyx_v_arr2 = __pyx_v_suffix_loc->arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":780
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":780
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -39245,7 +41318,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low2 = __pyx_v_suffix_loc->arr_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":781
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":781
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -39254,7 +41327,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high2 = __pyx_v_suffix_loc->arr_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":782
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":782
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high
  *         step2 = suffix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -39263,7 +41336,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step2 = __pyx_v_suffix_loc->num_subpatterns;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":784
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":784
  *         step2 = suffix_loc.num_subpatterns
  * 
  *         num_subpatterns = prefix.arity()+1             # <<<<<<<<<<<<<<
@@ -39282,7 +41355,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_num_subpatterns = __pyx_t_3;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":786
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":786
  *         num_subpatterns = prefix.arity()+1
  * 
  *         if algorithm == MERGE:             # <<<<<<<<<<<<<<
@@ -39292,7 +41365,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_algorithm == __pyx_v_3_sa_MERGE);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":789
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":789
  *             result_ptr = self.merge_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -39304,7 +41377,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":793
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":793
  *             result_ptr = self.baeza_yates_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -39315,7 +41388,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":795
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":795
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)
  * 
  *         if result_len == 0:             # <<<<<<<<<<<<<<
@@ -39325,7 +41398,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_result_len == 0);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":796
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":796
  * 
  *         if result_len == 0:
  *             free(result_ptr)             # <<<<<<<<<<<<<<
@@ -39334,7 +41407,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result_ptr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":797
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":797
  *         if result_len == 0:
  *             free(result_ptr)
  *             return None             # <<<<<<<<<<<<<<
@@ -39349,7 +41422,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":799
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":799
  *             return None
  *         else:
  *             result = IntList()             # <<<<<<<<<<<<<<
@@ -39361,7 +41434,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
     __pyx_v_result = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":800
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":800
  *         else:
  *             result = IntList()
  *             free(result.arr)             # <<<<<<<<<<<<<<
@@ -39370,7 +41443,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":801
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":801
  *             result = IntList()
  *             free(result.arr)
  *             result.arr = result_ptr             # <<<<<<<<<<<<<<
@@ -39379,7 +41452,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->arr = __pyx_v_result_ptr;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":802
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":802
  *             free(result.arr)
  *             result.arr = result_ptr
  *             result.len = result_len             # <<<<<<<<<<<<<<
@@ -39388,7 +41461,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->len = __pyx_v_result_len;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":803
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":803
  *             result.arr = result_ptr
  *             result.len = result_len
  *             result.size = result_len             # <<<<<<<<<<<<<<
@@ -39397,7 +41470,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->size = __pyx_v_result_len;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":804
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":804
  *             result.len = result_len
  *             result.size = result_len
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)             # <<<<<<<<<<<<<<
@@ -39417,7 +41490,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
     __Pyx_GOTREF(__pyx_t_4);
     if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_r = __pyx_t_4;
@@ -39443,7 +41516,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":806
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":806
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)
  * 
  *     cdef loc2str(self, PhraseLocation loc):             # <<<<<<<<<<<<<<
@@ -39451,7 +41524,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  *         result = "{"
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_loc) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_loc) {
   int __pyx_v_i;
   int __pyx_v_j;
   PyObject *__pyx_v_result = NULL;
@@ -39464,19 +41537,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("loc2str");
+  __Pyx_RefNannySetupContext("loc2str", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":808
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":808
  *     cdef loc2str(self, PhraseLocation loc):
  *         cdef int i, j
  *         result = "{"             # <<<<<<<<<<<<<<
  *         i = 0
  *         while i < loc.arr_high:
  */
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_116));
-  __pyx_v_result = ((PyObject *)__pyx_kp_s_116);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_117));
+  __pyx_v_result = ((PyObject *)__pyx_kp_s_117);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":809
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":809
  *         cdef int i, j
  *         result = "{"
  *         i = 0             # <<<<<<<<<<<<<<
@@ -39485,7 +41558,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":810
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":810
  *         result = "{"
  *         i = 0
  *         while i < loc.arr_high:             # <<<<<<<<<<<<<<
@@ -39496,20 +41569,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_t_1 = (__pyx_v_i < __pyx_v_loc->arr_high);
     if (!__pyx_t_1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":811
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":811
  *         i = 0
  *         while i < loc.arr_high:
  *             result = result + "("             # <<<<<<<<<<<<<<
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  */
-    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_117)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_118)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_v_result);
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":812
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":812
  *         while i < loc.arr_high:
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -39519,7 +41592,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_t_3 = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
     for (__pyx_v_j = __pyx_v_i; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":813
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":813
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])             # <<<<<<<<<<<<<<
@@ -39539,7 +41612,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
       __pyx_t_2 = 0;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":814
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":814
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"             # <<<<<<<<<<<<<<
@@ -39552,7 +41625,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":815
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":815
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"
  *             i = i + loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -39562,20 +41635,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":816
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":816
  *             result = result + ")"
  *             i = i + loc.num_subpatterns
  *         result = result + "}"             # <<<<<<<<<<<<<<
  *         return result
  * 
  */
-  __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_118)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_119)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_v_result);
   __pyx_v_result = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":817
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":817
  *             i = i + loc.num_subpatterns
  *         result = result + "}"
  *         return result             # <<<<<<<<<<<<<<
@@ -39601,7 +41674,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":819
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":819
  *         return result
  * 
  *     cdef PhraseLocation intersect(self, prefix_node, suffix_node, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -39615,7 +41688,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_prefix_loc = 0;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_suffix_loc = 0;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_result = 0;
-  PyObject *__pyx_v_intersect_method = NULL;
+  CYTHON_UNUSED PyObject *__pyx_v_intersect_method = NULL;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -39625,9 +41698,9 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("intersect");
+  __Pyx_RefNannySetupContext("intersect", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":823
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":823
  *         cdef PhraseLocation prefix_loc, suffix_loc, result
  * 
  *         prefix = prefix_node.phrase             # <<<<<<<<<<<<<<
@@ -39640,7 +41713,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_prefix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":824
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":824
  * 
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase             # <<<<<<<<<<<<<<
@@ -39653,7 +41726,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_suffix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":825
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":825
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location             # <<<<<<<<<<<<<<
@@ -39666,7 +41739,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_prefix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":826
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":826
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location
  *         suffix_loc = suffix_node.phrase_location             # <<<<<<<<<<<<<<
@@ -39679,17 +41752,17 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_suffix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":828
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":828
  *         suffix_loc = suffix_node.phrase_location
  * 
  *         result = self.get_precomputed_collocation(phrase)             # <<<<<<<<<<<<<<
  *         if result is not None:
  *             intersect_method = "precomputed"
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_119); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_120); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)__pyx_v_phrase));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_phrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_phrase));
@@ -39701,7 +41774,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":829
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":829
  * 
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:             # <<<<<<<<<<<<<<
@@ -39711,7 +41784,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) != Py_None);
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":830
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":830
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:
  *             intersect_method = "precomputed"             # <<<<<<<<<<<<<<
@@ -39724,7 +41797,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":832
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":832
  *             intersect_method = "precomputed"
  * 
  *         if result is None:             # <<<<<<<<<<<<<<
@@ -39734,7 +41807,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) == Py_None);
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":833
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":833
  * 
  *         if result is None:
  *             if self.use_baeza_yates:             # <<<<<<<<<<<<<<
@@ -39743,7 +41816,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
  */
     if (__pyx_v_self->use_baeza_yates) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":834
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":834
  *         if result is None:
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)             # <<<<<<<<<<<<<<
@@ -39757,21 +41830,21 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":835
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":835
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)
  *                 intersect_method="double binary"             # <<<<<<<<<<<<<<
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  */
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_120));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_121));
       __Pyx_XDECREF(__pyx_v_intersect_method);
-      __pyx_v_intersect_method = ((PyObject *)__pyx_kp_s_120);
+      __pyx_v_intersect_method = ((PyObject *)__pyx_kp_s_121);
       goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":837
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":837
  *                 intersect_method="double binary"
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)             # <<<<<<<<<<<<<<
@@ -39785,7 +41858,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":838
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":838
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"             # <<<<<<<<<<<<<<
@@ -39801,7 +41874,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":839
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":839
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"
  *         return result             # <<<<<<<<<<<<<<
@@ -39833,56 +41906,22 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":841
- *         return result
- * 
- *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
- *         cdef unsigned na
- *         nf = []
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_frontier = 0;
   PyObject *__pyx_v_res = 0;
   PyObject *__pyx_v_fwords = 0;
-  unsigned int __pyx_v_na;
-  PyObject *__pyx_v_nf = NULL;
-  PyObject *__pyx_v_toskip = NULL;
-  PyObject *__pyx_v_i = NULL;
-  PyObject *__pyx_v_alt = NULL;
-  PyObject *__pyx_v_pathlen = NULL;
-  PyObject *__pyx_v_spanlen = NULL;
-  PyObject *__pyx_v_ni = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *(*__pyx_t_3)(PyObject *);
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  int __pyx_t_12;
-  Py_ssize_t __pyx_t_13;
-  int __pyx_t_14;
-  int __pyx_t_15;
-  unsigned int __pyx_t_16;
-  int __pyx_t_17;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
-  __Pyx_RefNannySetupContext("advance");
+  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -39890,26 +41929,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__frontier);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__frontier)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -39930,8 +41966,53 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_frontier, __pyx_v_res, __pyx_v_fwords);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":843
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":841
+ *         return result
+ * 
+ *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
+ *         cdef unsigned na
+ *         nf = []
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_frontier, PyObject *__pyx_v_res, PyObject *__pyx_v_fwords) {
+  unsigned int __pyx_v_na;
+  PyObject *__pyx_v_nf = NULL;
+  PyObject *__pyx_v_toskip = NULL;
+  PyObject *__pyx_v_i = NULL;
+  PyObject *__pyx_v_alt = NULL;
+  PyObject *__pyx_v_pathlen = NULL;
+  PyObject *__pyx_v_spanlen = NULL;
+  PyObject *__pyx_v_ni = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  Py_ssize_t __pyx_t_13;
+  int __pyx_t_14;
+  int __pyx_t_15;
+  unsigned int __pyx_t_16;
+  int __pyx_t_17;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("advance", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":843
  *     def advance(self, frontier, res, fwords):
  *         cdef unsigned na
  *         nf = []             # <<<<<<<<<<<<<<
@@ -39939,11 +42020,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
  *             spanlen = fwords[i][alt][2]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_nf = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":844
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":844
  *         cdef unsigned na
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:             # <<<<<<<<<<<<<<
@@ -39959,12 +42040,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -39978,66 +42067,74 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
       PyObject* sequence = __pyx_t_4;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 2)) {
+        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
+      #else
+      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
       __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
-      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L8_unpacking_failed;
+      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_5);
-      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
+      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L9_unpacking_done;
-      __pyx_L8_unpacking_failed:;
+      goto __pyx_L6_unpacking_done;
+      __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      __pyx_t_8 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L9_unpacking_done:;
+      __pyx_L6_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_toskip);
     __pyx_v_toskip = __pyx_t_5;
     __pyx_t_5 = 0;
     if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) {
       PyObject* sequence = __pyx_t_6;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 3)) {
+        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-          if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_7 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_9 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-          if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_7 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_9 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
@@ -40045,28 +42142,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_t_10);
+      #else
+      __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
       __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_11)->tp_iternext;
-      index = 0; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L10_unpacking_failed;
+      index = 0; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      index = 1; __pyx_t_9 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_9)) goto __pyx_L10_unpacking_failed;
+      index = 1; __pyx_t_9 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_9)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_9);
-      index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L10_unpacking_failed;
+      index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_10);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      goto __pyx_L11_unpacking_done;
-      __pyx_L10_unpacking_failed:;
+      goto __pyx_L8_unpacking_done;
+      __pyx_L7_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      __pyx_t_8 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L11_unpacking_done:;
+      __pyx_L8_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_7;
@@ -40078,7 +42182,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_v_pathlen = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":845
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":845
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
@@ -40097,20 +42201,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_v_spanlen = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":846
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":846
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):             # <<<<<<<<<<<<<<
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":847
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":847
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))             # <<<<<<<<<<<<<<
@@ -40118,7 +42221,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  */
       __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_v_i);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
       __Pyx_GIVEREF(__pyx_v_i);
@@ -40132,11 +42235,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L12;
+      goto __pyx_L9;
     }
-    __pyx_L12:;
+    __pyx_L9:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":848
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":848
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen             # <<<<<<<<<<<<<<
@@ -40149,7 +42252,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_v_ni = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":849
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":849
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):             # <<<<<<<<<<<<<<
@@ -40159,18 +42262,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_t_13 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
       __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_6 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -40181,7 +42282,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     }
     if (__pyx_t_15) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":850
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":850
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):             # <<<<<<<<<<<<<<
@@ -40195,16 +42296,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
       for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_13; __pyx_t_16+=1) {
         __pyx_v_na = __pyx_t_16;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":851
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":851
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))             # <<<<<<<<<<<<<<
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)
  */
-        if (unlikely(((PyObject *)__pyx_v_nf) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_5 = PyNumber_Subtract(__pyx_v_toskip, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_na); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -40212,7 +42310,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
         __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+        __Pyx_GOTREF(__pyx_t_10);
         __Pyx_INCREF(__pyx_v_ni);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_ni);
         __Pyx_GIVEREF(__pyx_v_ni);
@@ -40223,7 +42321,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
         __pyx_t_6 = 0;
         __pyx_t_4 = 0;
         __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+        __Pyx_GOTREF(__pyx_t_4);
         PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_t_10));
@@ -40233,27 +42331,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
         __pyx_t_17 = PyList_Append(__pyx_v_nf, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       }
-      goto __pyx_L13;
+      goto __pyx_L10;
     }
-    __pyx_L13:;
+    __pyx_L10:;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":852
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":852
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):             # <<<<<<<<<<<<<<
  *             return self.advance(nf, res, fwords)
  *         else:
  */
-  if (unlikely(((PyObject *)__pyx_v_nf) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); 
+  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_15 = (__pyx_t_2 > 0);
   if (__pyx_t_15) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":853
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":853
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)             # <<<<<<<<<<<<<<
@@ -40261,10 +42356,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
  *             return res
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_v_nf));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_nf));
     __Pyx_GIVEREF(((PyObject *)__pyx_v_nf));
@@ -40281,11 +42376,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_r = __pyx_t_10;
     __pyx_t_10 = 0;
     goto __pyx_L0;
-    goto __pyx_L16;
+    goto __pyx_L13;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":855
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":855
  *             return self.advance(nf, res, fwords)
  *         else:
  *             return res             # <<<<<<<<<<<<<<
@@ -40297,7 +42392,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_r = __pyx_v_res;
     goto __pyx_L0;
   }
-  __pyx_L16:;
+  __pyx_L13:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -40325,16 +42420,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":857
- *             return res
- * 
- *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
- *         cdef unsigned alt_it
- *         frontier = []
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_skip = 0;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_spanlen = 0;
@@ -40342,39 +42430,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_next_states = 0;
   PyObject *__pyx_v_reachable_buffer = 0;
-  PyObject *__pyx_v_frontier = NULL;
-  PyObject *__pyx_v_key = NULL;
-  PyObject *__pyx_v_reachable = NULL;
-  PyObject *__pyx_v_nextreachable = NULL;
-  PyObject *__pyx_v_next_id = NULL;
-  PyObject *__pyx_v_jump = NULL;
-  Py_ssize_t __pyx_v_alt_id;
-  PyObject *__pyx_v_newel = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  PyObject *(*__pyx_t_6)(PyObject *);
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  Py_ssize_t __pyx_t_11;
-  Py_ssize_t __pyx_t_12;
-  int __pyx_t_13;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__skip,&__pyx_n_s__i,&__pyx_n_s__spanlen,&__pyx_n_s__pathlen,&__pyx_n_s__fwords,&__pyx_n_s__next_states,&__pyx_n_s__reachable_buffer,0};
-  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away");
+  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__skip,&__pyx_n_s__i,&__pyx_n_s__spanlen,&__pyx_n_s__pathlen,&__pyx_n_s__fwords,&__pyx_n_s__next_states,&__pyx_n_s__reachable_buffer,0};
     PyObject* values[7] = {0,0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
@@ -40386,50 +42451,43 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__skip);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__skip)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
-        values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[4])) kw_args--;
+        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
-        values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states);
-        if (likely(values[5])) kw_args--;
+        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  6:
-        values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer);
-        if (likely(values[6])) kw_args--;
+        if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 7) {
       goto __pyx_L5_argtuple_error;
@@ -40458,8 +42516,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_skip, __pyx_v_i, __pyx_v_spanlen, __pyx_v_pathlen, __pyx_v_fwords, __pyx_v_next_states, __pyx_v_reachable_buffer);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":857
+ *             return res
+ * 
+ *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
+ *         cdef unsigned alt_it
+ *         frontier = []
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":859
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_skip, PyObject *__pyx_v_i, PyObject *__pyx_v_spanlen, PyObject *__pyx_v_pathlen, PyObject *__pyx_v_fwords, PyObject *__pyx_v_next_states, PyObject *__pyx_v_reachable_buffer) {
+  PyObject *__pyx_v_frontier = NULL;
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_v_reachable = NULL;
+  PyObject *__pyx_v_nextreachable = NULL;
+  PyObject *__pyx_v_next_id = NULL;
+  PyObject *__pyx_v_jump = NULL;
+  PyObject *__pyx_v_alt_id = NULL;
+  PyObject *__pyx_v_newel = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  Py_ssize_t __pyx_t_11;
+  PyObject *(*__pyx_t_12)(PyObject *);
+  PyObject *__pyx_t_13 = NULL;
+  int __pyx_t_14;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":859
  *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):
  *         cdef unsigned alt_it
  *         frontier = []             # <<<<<<<<<<<<<<
@@ -40467,11 +42567,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  *             return frontier
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_frontier = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":860
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":860
  *         cdef unsigned alt_it
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):             # <<<<<<<<<<<<<<
@@ -40486,15 +42586,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __pyx_t_3 = PyObject_Length(__pyx_v_next_states); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":861
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":861
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier             # <<<<<<<<<<<<<<
@@ -40505,11 +42604,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __Pyx_INCREF(((PyObject *)__pyx_v_frontier));
     __pyx_r = ((PyObject *)__pyx_v_frontier);
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":862
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":862
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier
  *         key = tuple([i,spanlen])             # <<<<<<<<<<<<<<
@@ -40517,7 +42616,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  *         if (key in reachable_buffer):
  */
   __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(__pyx_v_i);
   PyList_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -40530,7 +42629,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __pyx_v_key = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":863
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":863
  *             return frontier
  *         key = tuple([i,spanlen])
  *         reachable = []             # <<<<<<<<<<<<<<
@@ -40538,21 +42637,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  *             reachable = reachable_buffer[key]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_reachable = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":864
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":864
  *         key = tuple([i,spanlen])
  *         reachable = []
  *         if (key in reachable_buffer):             # <<<<<<<<<<<<<<
  *             reachable = reachable_buffer[key]
  *         else:
  */
-  __pyx_t_5 = ((PySequence_Contains(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_key), __pyx_v_reachable_buffer, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":865
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":865
  *         reachable = []
  *         if (key in reachable_buffer):
  *             reachable = reachable_buffer[key]             # <<<<<<<<<<<<<<
@@ -40564,21 +42663,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __Pyx_DECREF(__pyx_v_reachable);
     __pyx_v_reachable = __pyx_t_1;
     __pyx_t_1 = 0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":867
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":867
  *             reachable = reachable_buffer[key]
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)             # <<<<<<<<<<<<<<
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
@@ -40596,7 +42695,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __pyx_v_reachable = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":868
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":868
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable             # <<<<<<<<<<<<<<
@@ -40605,9 +42704,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  */
     if (PyObject_SetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key), __pyx_v_reachable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":869
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":869
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:             # <<<<<<<<<<<<<<
@@ -40623,12 +42722,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_6 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_6 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_6(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
@@ -40644,7 +42751,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __pyx_v_nextreachable = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":870
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":870
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:             # <<<<<<<<<<<<<<
@@ -40663,12 +42770,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     }
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_1)) {
+      if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
-      } else if (PyTuple_CheckExact(__pyx_t_1)) {
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
         __pyx_t_4 = __pyx_t_8(__pyx_t_1);
         if (unlikely(!__pyx_t_4)) {
@@ -40684,17 +42799,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
       __pyx_v_next_id = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":871
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":871
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)             # <<<<<<<<<<<<<<
  *                 if jump < skip:
  *                     continue
  */
-      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+      __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_fwords);
       __Pyx_GIVEREF(__pyx_v_fwords);
@@ -40712,32 +42827,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
       __pyx_v_jump = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":872
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":872
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:             # <<<<<<<<<<<<<<
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  */
-      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_10);
+      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":873
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":873
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:
  *                     continue             # <<<<<<<<<<<<<<
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  */
-        goto __pyx_L10_continue;
-        goto __pyx_L12;
+        goto __pyx_L7_continue;
+        goto __pyx_L9;
       }
-      __pyx_L12:;
+      __pyx_L9:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":874
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":874
  *                 if jump < skip:
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:             # <<<<<<<<<<<<<<
@@ -40746,17 +42860,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  */
       __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_9 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":875
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":875
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):             # <<<<<<<<<<<<<<
@@ -40767,10 +42880,56 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
         __Pyx_GOTREF(__pyx_t_4);
         __pyx_t_11 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
-          __pyx_v_alt_id = __pyx_t_12;
+        __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_9);
+        PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4);
+        __Pyx_GIVEREF(__pyx_t_4);
+        __pyx_t_4 = 0;
+        __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+        if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
+          __pyx_t_9 = __pyx_t_4; __Pyx_INCREF(__pyx_t_9); __pyx_t_11 = 0;
+          __pyx_t_12 = NULL;
+        } else {
+          __pyx_t_11 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_12 = Py_TYPE(__pyx_t_9)->tp_iternext;
+        }
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        for (;;) {
+          if (!__pyx_t_12 && PyList_CheckExact(__pyx_t_9)) {
+            if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_9)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else if (!__pyx_t_12 && PyTuple_CheckExact(__pyx_t_9)) {
+            if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else {
+            __pyx_t_4 = __pyx_t_12(__pyx_t_9);
+            if (unlikely(!__pyx_t_4)) {
+              if (PyErr_Occurred()) {
+                if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              break;
+            }
+            __Pyx_GOTREF(__pyx_t_4);
+          }
+          __Pyx_XDECREF(__pyx_v_alt_id);
+          __pyx_v_alt_id = __pyx_t_4;
+          __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":876
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":876
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
@@ -40779,102 +42938,95 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  */
           __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_10 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt_id); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_9, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyObject_RichCompare(__pyx_t_4, __pyx_t_9, Py_NE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_13 = PyObject_RichCompare(__pyx_t_4, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
           if (__pyx_t_5) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":877
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":877
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)             # <<<<<<<<<<<<<<
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  */
-            __pyx_t_10 = PyInt_FromSsize_t(__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
+            __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_4));
             __Pyx_INCREF(__pyx_v_next_id);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_next_id);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
             __Pyx_GIVEREF(__pyx_v_next_id);
-            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_9);
-            __Pyx_GIVEREF(__pyx_t_9);
-            __pyx_t_10 = 0;
-            __pyx_t_9 = 0;
+            __Pyx_INCREF(__pyx_v_alt_id);
+            PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_v_alt_id);
+            __Pyx_GIVEREF(__pyx_v_alt_id);
+            PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_13);
+            __Pyx_GIVEREF(__pyx_t_13);
+            __pyx_t_13 = 0;
             __Pyx_XDECREF(((PyObject *)__pyx_v_newel));
-            __pyx_v_newel = __pyx_t_4;
-            __pyx_t_4 = 0;
+            __pyx_v_newel = __pyx_t_10;
+            __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":878
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":878
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:             # <<<<<<<<<<<<<<
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier
  */
-            __pyx_t_5 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_frontier), ((PyObject *)__pyx_v_newel)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_newel), ((PyObject *)__pyx_v_frontier), Py_NE)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (__pyx_t_5) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":879
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":879
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))             # <<<<<<<<<<<<<<
  *         return frontier
  * 
  */
-              if (unlikely(((PyObject *)__pyx_v_frontier) == Py_None)) {
-                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-              }
-              __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_alt_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_4);
-              __pyx_t_9 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_9);
-              __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+              __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_10);
+              __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_13);
               __Pyx_INCREF(__pyx_v_next_id);
-              PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
+              PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_v_next_id);
               __Pyx_GIVEREF(__pyx_v_next_id);
-              PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_4);
-              __Pyx_GIVEREF(__pyx_t_4);
-              PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_9);
-              __Pyx_GIVEREF(__pyx_t_9);
-              __pyx_t_4 = 0;
-              __pyx_t_9 = 0;
-              __pyx_t_13 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_10)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-              goto __pyx_L17;
+              __Pyx_INCREF(__pyx_v_alt_id);
+              PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_v_alt_id);
+              __Pyx_GIVEREF(__pyx_v_alt_id);
+              PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
+              __Pyx_GIVEREF(__pyx_t_10);
+              __pyx_t_10 = 0;
+              __pyx_t_14 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+              goto __pyx_L14;
             }
-            __pyx_L17:;
-            goto __pyx_L16;
+            __pyx_L14:;
+            goto __pyx_L13;
           }
-          __pyx_L16:;
+          __pyx_L13:;
         }
-        goto __pyx_L13;
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        goto __pyx_L10;
       }
-      __pyx_L13:;
-      __pyx_L10_continue:;
+      __pyx_L10:;
+      __pyx_L7_continue:;
     }
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":880
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":880
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier             # <<<<<<<<<<<<<<
@@ -40894,6 +43046,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_13);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_all_nodes_isteps_away", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -40903,50 +43056,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __Pyx_XDECREF(__pyx_v_nextreachable);
   __Pyx_XDECREF(__pyx_v_next_id);
   __Pyx_XDECREF(__pyx_v_jump);
+  __Pyx_XDECREF(__pyx_v_alt_id);
   __Pyx_XDECREF(__pyx_v_newel);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":882
- *         return frontier
- * 
- *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
- *         ret = []
- *         if (ifrom >= len(fwords)):
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_dist = 0;
-  PyObject *__pyx_v_ret = NULL;
-  Py_ssize_t __pyx_v_alt_id;
-  PyObject *__pyx_v_ifromchild = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  Py_ssize_t __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  int __pyx_t_8;
-  Py_ssize_t __pyx_t_9;
-  PyObject *(*__pyx_t_10)(PyObject *);
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
-  __Pyx_RefNannySetupContext("reachable");
+  __Pyx_RefNannySetupContext("reachable (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -40954,26 +43086,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -40994,8 +43123,42 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_ifrom, __pyx_v_dist);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":883
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":882
+ *         return frontier
+ * 
+ *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
+ *         ret = []
+ *         if (ifrom >= len(fwords)):
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_dist) {
+  PyObject *__pyx_v_ret = NULL;
+  PyObject *__pyx_v_alt_id = NULL;
+  PyObject *__pyx_v_ifromchild = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  PyObject *(*__pyx_t_5)(PyObject *);
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  Py_ssize_t __pyx_t_10;
+  PyObject *(*__pyx_t_11)(PyObject *);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("reachable", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":883
  * 
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []             # <<<<<<<<<<<<<<
@@ -41003,11 +43166,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
  *             return ret
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":884
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":884
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []
  *         if (ifrom >= len(fwords)):             # <<<<<<<<<<<<<<
@@ -41017,14 +43180,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
   __pyx_t_2 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":885
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":885
  *         ret = []
  *         if (ifrom >= len(fwords)):
  *             return ret             # <<<<<<<<<<<<<<
@@ -41035,11 +43197,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
     __Pyx_INCREF(((PyObject *)__pyx_v_ret));
     __pyx_r = ((PyObject *)__pyx_v_ret);
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":886
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":886
  *         if (ifrom >= len(fwords)):
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
@@ -41050,10 +43212,56 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_2; __pyx_t_5+=1) {
-    __pyx_v_alt_id = __pyx_t_5;
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+    __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+    __pyx_t_5 = NULL;
+  } else {
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  for (;;) {
+    if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else {
+      __pyx_t_3 = __pyx_t_5(__pyx_t_1);
+      if (unlikely(!__pyx_t_3)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    __Pyx_XDECREF(__pyx_v_alt_id);
+    __pyx_v_alt_id = __pyx_t_3;
+    __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":887
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":887
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):             # <<<<<<<<<<<<<<
@@ -41062,169 +43270,172 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
  */
     __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_6 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, __pyx_t_1, Py_EQ); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_6 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":888
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":888
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))             # <<<<<<<<<<<<<<
  *             else:
  *                 if (dist==0):
  */
-      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_8 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_8, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fwords);
       __Pyx_GIVEREF(__pyx_v_fwords);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7);
-      __Pyx_GIVEREF(__pyx_t_7);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_8);
+      __Pyx_GIVEREF(__pyx_t_8);
       __Pyx_INCREF(__pyx_v_dist);
       PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_dist);
       __Pyx_GIVEREF(__pyx_v_dist);
-      __pyx_t_7 = 0;
-      __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7);
-      __Pyx_GIVEREF(__pyx_t_7);
-      __pyx_t_7 = 0;
-      __pyx_t_7 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_8 = 0;
+      __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_8);
+      __Pyx_GIVEREF(__pyx_t_8);
+      __pyx_t_8 = 0;
+      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L9;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L6;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":890
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":890
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  *             else:
  *                 if (dist==0):             # <<<<<<<<<<<<<<
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)
  */
-      __pyx_t_7 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_8 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":891
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":891
  *             else:
  *                 if (dist==0):
  *                     if (ifrom not in ret):             # <<<<<<<<<<<<<<
  *                         ret.append(ifrom)
  *                 else:
  */
-        __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_ret), __pyx_v_ifrom))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifrom, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":892
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":892
  *                 if (dist==0):
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)             # <<<<<<<<<<<<<<
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  */
-          if (unlikely(((PyObject *)__pyx_v_ret) == Py_None)) {
-            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_8 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          goto __pyx_L11;
+          __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          goto __pyx_L8;
         }
-        __pyx_L11:;
-        goto __pyx_L10;
+        __pyx_L8:;
+        goto __pyx_L7;
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":894
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":894
  *                         ret.append(ifrom)
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):             # <<<<<<<<<<<<<<
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)
  */
-        __pyx_t_7 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
         __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_7 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __pyx_t_3 = PyNumber_Subtract(__pyx_v_dist, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+        __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
         __Pyx_INCREF(__pyx_v_fwords);
-        PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fwords);
+        PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_fwords);
         __Pyx_GIVEREF(__pyx_v_fwords);
-        PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_6);
-        __Pyx_GIVEREF(__pyx_t_6);
-        PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_3);
+        PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7);
+        __Pyx_GIVEREF(__pyx_t_7);
+        PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
-        __pyx_t_6 = 0;
+        __pyx_t_7 = 0;
         __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
         if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-          __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_9 = 0;
-          __pyx_t_10 = NULL;
+          __pyx_t_6 = __pyx_t_3; __Pyx_INCREF(__pyx_t_6); __pyx_t_10 = 0;
+          __pyx_t_11 = NULL;
         } else {
-          __pyx_t_9 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_10 = Py_TYPE(__pyx_t_1)->tp_iternext;
+          __pyx_t_10 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext;
         }
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         for (;;) {
-          if (PyList_CheckExact(__pyx_t_1)) {
-            if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_1)) break;
-            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++;
-          } else if (PyTuple_CheckExact(__pyx_t_1)) {
-            if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++;
+          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_6)) {
+            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_6)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_6)) {
+            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
           } else {
-            __pyx_t_3 = __pyx_t_10(__pyx_t_1);
+            __pyx_t_3 = __pyx_t_11(__pyx_t_6);
             if (unlikely(!__pyx_t_3)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
@@ -41238,39 +43449,37 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
           __pyx_v_ifromchild = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":895
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":895
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):             # <<<<<<<<<<<<<<
  *                             ret.append(ifromchild)
  * 
  */
-          __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_ret), __pyx_v_ifromchild))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifromchild, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_4) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":896
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":896
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)             # <<<<<<<<<<<<<<
  * 
  *         return ret
  */
-            if (unlikely(((PyObject *)__pyx_v_ret) == Py_None)) {
-              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-            }
-            __pyx_t_8 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            goto __pyx_L14;
+            __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            goto __pyx_L11;
           }
-          __pyx_L14:;
+          __pyx_L11:;
         }
-        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       }
-      __pyx_L10:;
+      __pyx_L7:;
     }
-    __pyx_L9:;
+    __pyx_L6:;
   }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":898
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":898
  *                             ret.append(ifromchild)
  * 
  *         return ret             # <<<<<<<<<<<<<<
@@ -41289,50 +43498,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_6);
   __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.reachable", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_v_ret);
+  __Pyx_XDECREF(__pyx_v_alt_id);
   __Pyx_XDECREF(__pyx_v_ifromchild);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":900
- *         return ret
- * 
- *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
- *         cdef unsigned alt_id
- *         min = 1000
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_ito = 0;
-  unsigned int __pyx_v_alt_id;
-  PyObject *__pyx_v_min = NULL;
-  PyObject *__pyx_v_currmin = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  Py_ssize_t __pyx_t_3;
-  unsigned int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
-  __Pyx_RefNannySetupContext("shortest");
+  __Pyx_RefNannySetupContext("shortest (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -41340,26 +43533,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -41380,8 +43570,37 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_ifrom, __pyx_v_ito);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":902
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":900
+ *         return ret
+ * 
+ *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
+ *         cdef unsigned alt_id
+ *         min = 1000
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_ito) {
+  unsigned int __pyx_v_alt_id;
+  PyObject *__pyx_v_min = NULL;
+  PyObject *__pyx_v_currmin = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  Py_ssize_t __pyx_t_3;
+  unsigned int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("shortest", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":902
  *     def shortest(self, fwords, ifrom, ito):
  *         cdef unsigned alt_id
  *         min = 1000             # <<<<<<<<<<<<<<
@@ -41391,20 +43610,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   __Pyx_INCREF(__pyx_int_1000);
   __pyx_v_min = __pyx_int_1000;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":903
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":903
  *         cdef unsigned alt_id
  *         min = 1000
  *         if (ifrom > ito):             # <<<<<<<<<<<<<<
  *             return min
  *         if (ifrom == ito):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":904
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":904
  *         min = 1000
  *         if (ifrom > ito):
  *             return min             # <<<<<<<<<<<<<<
@@ -41415,24 +43633,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __Pyx_INCREF(__pyx_v_min);
     __pyx_r = __pyx_v_min;
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":905
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":905
  *         if (ifrom > ito):
  *             return min
  *         if (ifrom == ito):             # <<<<<<<<<<<<<<
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":906
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":906
  *             return min
  *         if (ifrom == ito):
  *             return 0             # <<<<<<<<<<<<<<
@@ -41443,11 +43660,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __Pyx_INCREF(__pyx_int_0);
     __pyx_r = __pyx_int_0;
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":907
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":907
  *         if (ifrom == ito):
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
@@ -41461,14 +43678,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_alt_id = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":908
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":908
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)             # <<<<<<<<<<<<<<
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
@@ -41482,7 +43699,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
@@ -41500,7 +43717,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __pyx_v_currmin = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":909
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":909
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
@@ -41517,15 +43734,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_5 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":910
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":910
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1             # <<<<<<<<<<<<<<
@@ -41537,24 +43753,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
       __Pyx_DECREF(__pyx_v_currmin);
       __pyx_v_currmin = __pyx_t_1;
       __pyx_t_1 = 0;
-      goto __pyx_L10;
+      goto __pyx_L7;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":911
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":911
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  *             if (currmin<min):             # <<<<<<<<<<<<<<
  *                 min = currmin
  *         return min
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":912
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":912
  *                 currmin += 1
  *             if (currmin<min):
  *                 min = currmin             # <<<<<<<<<<<<<<
@@ -41564,12 +43779,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
       __Pyx_INCREF(__pyx_v_currmin);
       __Pyx_DECREF(__pyx_v_min);
       __pyx_v_min = __pyx_v_currmin;
-      goto __pyx_L11;
+      goto __pyx_L8;
     }
-    __pyx_L11:;
+    __pyx_L8:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":913
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":913
  *             if (currmin<min):
  *                 min = currmin
  *         return min             # <<<<<<<<<<<<<<
@@ -41597,49 +43812,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":915
- *         return min
- * 
- *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
- *         result = []
- *         candidate = [[curr_idx,0]]
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v__columns = 0;
   PyObject *__pyx_v_curr_idx = 0;
   PyObject *__pyx_v_min_dist = 0;
-  PyObject *__pyx_v_result = NULL;
-  PyObject *__pyx_v_candidate = NULL;
-  PyObject *__pyx_v_curr = NULL;
-  PyObject *__pyx_v_curr_col = NULL;
-  PyObject *__pyx_v_alt = NULL;
-  PyObject *__pyx_v_next_id = NULL;
-  PyObject *__pyx_v_jump = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
-  PyObject *__pyx_t_10 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__min_dist,0};
-  __Pyx_RefNannySetupContext("get_next_states");
+  __Pyx_RefNannySetupContext("get_next_states (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__min_dist,0};
     PyObject* values[3] = {0,0,0};
     values[2] = ((PyObject *)__pyx_int_2);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -41647,14 +43836,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s___columns);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s___columns)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -41665,7 +43852,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -41688,8 +43875,45 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v__columns, __pyx_v_curr_idx, __pyx_v_min_dist);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":915
+ *         return min
+ * 
+ *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
+ *         result = []
+ *         candidate = [[curr_idx,0]]
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":916
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v__columns, PyObject *__pyx_v_curr_idx, PyObject *__pyx_v_min_dist) {
+  PyObject *__pyx_v_result = NULL;
+  PyObject *__pyx_v_candidate = NULL;
+  PyObject *__pyx_v_curr = NULL;
+  PyObject *__pyx_v_curr_col = NULL;
+  PyObject *__pyx_v_alt = NULL;
+  PyObject *__pyx_v_next_id = NULL;
+  PyObject *__pyx_v_jump = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_next_states", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":916
  * 
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []             # <<<<<<<<<<<<<<
@@ -41697,11 +43921,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 916; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":917
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":917
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []
  *         candidate = [[curr_idx,0]]             # <<<<<<<<<<<<<<
@@ -41709,7 +43933,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  *         while len(candidate) > 0:
  */
   __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_v_curr_idx);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_curr_idx);
   __Pyx_GIVEREF(__pyx_v_curr_idx);
@@ -41717,14 +43941,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
   PyList_SET_ITEM(__pyx_t_1, 1, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
   __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_t_1 = 0;
   __pyx_v_candidate = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":919
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":919
  *         candidate = [[curr_idx,0]]
  * 
  *         while len(candidate) > 0:             # <<<<<<<<<<<<<<
@@ -41732,14 +43956,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  *             if curr[0] >= len(_columns):
  */
   while (1) {
-    if (unlikely(((PyObject *)__pyx_v_candidate) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); 
+    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_4 = (__pyx_t_3 > 0);
     if (!__pyx_t_4) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":920
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":920
  * 
  *         while len(candidate) > 0:
  *             curr = candidate.pop()             # <<<<<<<<<<<<<<
@@ -41752,7 +43973,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
     __pyx_v_curr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":921
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":921
  *         while len(candidate) > 0:
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):             # <<<<<<<<<<<<<<
@@ -41764,27 +43985,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
     __pyx_t_3 = PyObject_Length(__pyx_v__columns); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":922
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":922
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):
  *                 continue             # <<<<<<<<<<<<<<
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  */
-      goto __pyx_L6_continue;
-      goto __pyx_L8;
+      goto __pyx_L3_continue;
+      goto __pyx_L5;
     }
-    __pyx_L8:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":923
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":923
  *             if curr[0] >= len(_columns):
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:             # <<<<<<<<<<<<<<
@@ -41793,19 +44013,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  */
     __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_result), __pyx_t_5))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_t_5, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
       __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
         __Pyx_DECREF(__pyx_t_1);
-        __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -41817,25 +44035,22 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":924
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":924
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);             # <<<<<<<<<<<<<<
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  */
-      if (unlikely(((PyObject *)__pyx_v_result) == Py_None)) {
-        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-      }
       __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_8 = PyList_Append(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L9;
+      goto __pyx_L6;
     }
-    __pyx_L9:;
+    __pyx_L6:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":925
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":925
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]             # <<<<<<<<<<<<<<
@@ -41851,7 +44066,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
     __pyx_v_curr_col = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":926
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":926
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:             # <<<<<<<<<<<<<<
@@ -41867,12 +44082,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __pyx_t_9 = Py_TYPE(__pyx_t_5)->tp_iternext;
     }
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_5)) {
+      if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_5)) break;
-        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
-      } else if (PyTuple_CheckExact(__pyx_t_5)) {
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
         __pyx_t_1 = __pyx_t_9(__pyx_t_5);
         if (unlikely(!__pyx_t_1)) {
@@ -41888,7 +44111,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __pyx_v_alt = __pyx_t_1;
       __pyx_t_1 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":927
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":927
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]             # <<<<<<<<<<<<<<
@@ -41907,7 +44130,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __pyx_v_next_id = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":928
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":928
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1             # <<<<<<<<<<<<<<
@@ -41918,7 +44141,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __Pyx_XDECREF(__pyx_v_jump);
       __pyx_v_jump = __pyx_int_1;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":929
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":929
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1
  *                 if (alt[0] == EPSILON):             # <<<<<<<<<<<<<<
@@ -41929,15 +44152,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __Pyx_GOTREF(__pyx_t_10);
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":930
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":930
  *                 jump = 1
  *                 if (alt[0] == EPSILON):
  *                     jump = 0             # <<<<<<<<<<<<<<
@@ -41947,32 +44169,30 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
         __Pyx_INCREF(__pyx_int_0);
         __Pyx_DECREF(__pyx_v_jump);
         __pyx_v_jump = __pyx_int_0;
-        goto __pyx_L12;
+        goto __pyx_L9;
       }
-      __pyx_L12:;
+      __pyx_L9:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":931
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":931
  *                 if (alt[0] == EPSILON):
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:             # <<<<<<<<<<<<<<
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);
  */
-      __pyx_t_7 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_result), __pyx_v_next_id))); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = (__Pyx_PySequence_Contains(__pyx_v_next_id, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_7) {
         __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
           __Pyx_DECREF(__pyx_t_1);
-          __pyx_t_10 = PyInt_FromLong((((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_v_self->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -41984,23 +44204,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       }
       if (__pyx_t_6) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":932
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":932
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])             # <<<<<<<<<<<<<<
  *         return sorted(result);
  * 
  */
-        if (unlikely(((PyObject *)__pyx_v_candidate) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+        __Pyx_GOTREF(__pyx_t_1);
         __Pyx_INCREF(__pyx_v_next_id);
         PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_next_id);
         __Pyx_GIVEREF(__pyx_v_next_id);
@@ -42009,15 +44226,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
         __pyx_t_2 = 0;
         __pyx_t_8 = PyList_Append(__pyx_v_candidate, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-        goto __pyx_L13;
+        goto __pyx_L10;
       }
-      __pyx_L13:;
+      __pyx_L10:;
     }
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_L6_continue:;
+    __pyx_L3_continue:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":933
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":933
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);             # <<<<<<<<<<<<<<
@@ -42026,7 +44243,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+  __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
@@ -42058,9 +44275,45 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
+static char __pyx_doc_3_sa_23HieroCachingRuleFactory_22input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("input (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_22input(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_fwords));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1 = {__Pyx_NAMESTR("lambda1"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1, METH_NOARGS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("lambda1 (wrapper)", 0);
+  __pyx_r = __pyx_lambda_funcdef_lambda1(__pyx_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2 = {__Pyx_NAMESTR("lambda2"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, METH_NOARGS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("lambda2 (wrapper)", 0);
+  __pyx_r = __pyx_lambda_funcdef_lambda2(__pyx_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1095
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1095
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
@@ -42068,9 +44321,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                                 fcount[f] += count
  */
 
-static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_lambda_methdef_lambda2 = {__Pyx_NAMESTR("lambda2"), (PyCFunction)__pyx_lambda_funcdef_lambda2, METH_NOARGS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -42079,13 +44330,12 @@ static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSE
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda2");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("lambda2", 0);
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyList_Type))));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)(&PyList_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyList_Type))));
@@ -42103,7 +44353,7 @@ static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSE
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.input.lambda1.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda1.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -42111,9 +44361,7 @@ static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_lambda_methdef_lambda1 = {__Pyx_NAMESTR("lambda1"), (PyCFunction)__pyx_lambda_funcdef_lambda1, METH_NOARGS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -42122,15 +44370,14 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda1");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("lambda1", 0);
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda2, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -42148,7 +44395,7 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.input.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -42156,17 +44403,27 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1101
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3 = {__Pyx_NAMESTR("lambda3"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("lambda3 (wrapper)", 0);
+  __pyx_r = __pyx_lambda_funcdef_lambda3(__pyx_self, ((PyObject *)__pyx_v_x));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1101
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
- *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]             # <<<<<<<<<<<<<<
+ *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
- *                                     count = len(locs)
+ *                                     # count = len(locs) # Should be?
  */
 
-static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x); /*proto*/
-static PyMethodDef __pyx_lambda_methdef_lambda3 = {__Pyx_NAMESTR("lambda3"), (PyCFunction)__pyx_lambda_funcdef_lambda3, METH_O, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x) {
+static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -42174,8 +44431,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda3");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("lambda3", 0);
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
@@ -42191,7 +44447,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_sa.input.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -42199,7 +44455,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":935
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":935
  *         return sorted(result);
  * 
  *     def input(self, fwords):             # <<<<<<<<<<<<<<
@@ -42207,40 +44463,48 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
  *         it looks up all of the rules that can be used to translate
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_11input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
-static char __pyx_doc_3_sa_23HieroCachingRuleFactory_11input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_11input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("input");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("input", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)__pyx_ptype_3_sa___pyx_scope_struct_8_input->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_8_input, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF(__pyx_v_fwords);
-  __pyx_cur_scope->__pyx_v_fwords = __pyx_v_fwords;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_fwords = __pyx_v_fwords;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
@@ -42264,15 +44528,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   PyObject *(*__pyx_t_20)(PyObject *);
   float __pyx_t_21;
   Py_ssize_t __pyx_t_22;
-  PyObject *(*__pyx_t_23)(PyObject *);
+  Py_ssize_t __pyx_t_23;
   Py_ssize_t __pyx_t_24;
-  int __pyx_t_25;
+  Py_ssize_t __pyx_t_25;
   int __pyx_t_26;
+  int __pyx_t_27;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
-    case 1: goto __pyx_L62_resume_from_yield;
+    case 1: goto __pyx_L60_resume_from_yield;
     default: /* CPython raises the right error here */
     __Pyx_RefNannyFinishContext();
     return NULL;
@@ -42280,7 +44545,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":946
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":946
  *         cdef Phrase hiero_phrase
  * 
  *         flen = len(fwords)             # <<<<<<<<<<<<<<
@@ -42290,7 +44555,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_cur_scope->__pyx_v_flen = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":947
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":947
  * 
  *         flen = len(fwords)
  *         start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -42299,16 +44564,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
   __pyx_cur_scope->__pyx_v_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":948
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":948
  *         flen = len(fwords)
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0             # <<<<<<<<<<<<<<
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time = 0.0;
+  __pyx_cur_scope->__pyx_v_self->extract_time = 0.0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":949
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":949
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}             # <<<<<<<<<<<<<<
@@ -42321,7 +44586,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":950
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":950
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}
  *         hit = 0             # <<<<<<<<<<<<<<
@@ -42330,7 +44595,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
   __pyx_cur_scope->__pyx_v_hit = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":951
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":951
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  *         reachable_buffer = {}             # <<<<<<<<<<<<<<
@@ -42343,7 +44608,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __pyx_cur_scope->__pyx_v_reachable_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":954
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":954
  * 
  *         # Do not cache between sentences
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
@@ -42356,16 +44621,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root = __pyx_t_3;
+  __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+  __Pyx_DECREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+  __pyx_cur_scope->__pyx_v_self->rules->root = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":956
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":956
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  * 
  *         frontier = []             # <<<<<<<<<<<<<<
@@ -42373,12 +44638,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             for alt in range(0, len(fwords[i])):
  */
   __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
   __pyx_cur_scope->__pyx_v_frontier = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":957
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":957
  * 
  *         frontier = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
@@ -42389,7 +44654,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":958
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":958
  *         frontier = []
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
@@ -42403,7 +44668,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":959
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":959
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
@@ -42420,24 +44685,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":960
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":960
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))             # <<<<<<<<<<<<<<
  * 
  *         xroot = None
  */
-        if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -42447,7 +44708,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_9 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __pyx_t_10 = PyTuple_New(7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+        __Pyx_GOTREF(__pyx_t_10);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
@@ -42457,9 +44718,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_INCREF(__pyx_int_0);
         PyTuple_SET_ITEM(__pyx_t_10, 3, __pyx_int_0);
         __Pyx_GIVEREF(__pyx_int_0);
-        __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-        PyTuple_SET_ITEM(__pyx_t_10, 4, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-        __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+        __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+        PyTuple_SET_ITEM(__pyx_t_10, 4, __pyx_cur_scope->__pyx_v_self->rules->root);
+        __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
         __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
         PyTuple_SET_ITEM(__pyx_t_10, 5, ((PyObject *)__pyx_empty_tuple));
         __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
@@ -42477,7 +44738,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":962
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":962
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
  * 
  *         xroot = None             # <<<<<<<<<<<<<<
@@ -42488,16 +44749,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_GIVEREF(Py_None);
   __pyx_cur_scope->__pyx_v_xroot = Py_None;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":963
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":963
  * 
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)             # <<<<<<<<<<<<<<
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]
  */
-  __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, 1);
+  __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":964
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":964
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:             # <<<<<<<<<<<<<<
@@ -42506,21 +44767,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
   __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_8 = ((PySequence_Contains(__pyx_t_9, __pyx_t_10))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_t_10, __pyx_t_9, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   if (__pyx_t_8) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":965
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":965
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]             # <<<<<<<<<<<<<<
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  */
-    __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
@@ -42534,7 +44795,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":967
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":967
  *             xroot = self.rules.root.children[x1]
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
@@ -42543,12 +44804,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
     __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-    __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
@@ -42557,21 +44818,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     __pyx_cur_scope->__pyx_v_xroot = __pyx_t_9;
     __pyx_t_9 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":968
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":968
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  *             self.rules.root.children[x1] = xroot             # <<<<<<<<<<<<<<
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  */
-    __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     if (__Pyx_SetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   }
   __pyx_L9:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":970
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":970
  *             self.rules.root.children[x1] = xroot
  * 
  *         for i in range(self.min_gap_size, len(fwords)):             # <<<<<<<<<<<<<<
@@ -42579,10 +44840,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                 if fwords[i][alt][0] != EPSILON:
  */
   __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  for (__pyx_t_4 = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
+  for (__pyx_t_4 = __pyx_cur_scope->__pyx_v_self->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":971
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":971
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
@@ -42596,7 +44857,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":972
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":972
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
@@ -42613,43 +44874,39 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":973
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":973
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))             # <<<<<<<<<<<<<<
  * 
  *         next_states = []
  */
-        if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
-        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+        __Pyx_GOTREF(__pyx_t_12);
         PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         __pyx_t_7 = 0;
         __pyx_t_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+        __Pyx_GOTREF(__pyx_t_13);
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
         PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_10);
@@ -42679,7 +44936,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":975
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":975
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
  * 
  *         next_states = []             # <<<<<<<<<<<<<<
@@ -42687,12 +44944,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  */
   __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
   __pyx_cur_scope->__pyx_v_next_states = __pyx_t_13;
   __pyx_t_13 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":976
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":976
  * 
  *         next_states = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
@@ -42703,24 +44960,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":977
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":977
  *         next_states = []
  *         for i in range(len(fwords)):
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))             # <<<<<<<<<<<<<<
  * 
  *         while len(frontier) > 0:
  */
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_next_states) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self, __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
     __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_12 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
     __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
@@ -42738,7 +44992,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":979
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":979
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  * 
  *         while len(frontier) > 0:             # <<<<<<<<<<<<<<
@@ -42746,14 +45000,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  */
   while (1) {
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); 
+    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_8 = (__pyx_t_1 > 0);
     if (!__pyx_t_8) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":980
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":980
  * 
  *         while len(frontier) > 0:
  *             new_frontier = []             # <<<<<<<<<<<<<<
@@ -42761,35 +45012,42 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                 word_id = fwords[i][alt][0]
  */
     __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+    __Pyx_GOTREF(__pyx_t_12);
     __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
     __pyx_cur_scope->__pyx_v_new_frontier = __pyx_t_12;
     __pyx_t_12 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":981
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":981
  *         while len(frontier) > 0:
  *             new_frontier = []
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:             # <<<<<<<<<<<<<<
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]
  */
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_12 = ((PyObject *)__pyx_cur_scope->__pyx_v_frontier); __Pyx_INCREF(__pyx_t_12); __pyx_t_1 = 0;
     for (;;) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_12)) break;
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_12, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
         PyObject* sequence = __pyx_t_2;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        Py_ssize_t size = Py_SIZE(sequence);
+        #else
+        Py_ssize_t size = PySequence_Size(sequence);
+        #endif
+        if (unlikely(size != 7)) {
+          if (size > 7) __Pyx_RaiseTooManyValuesError(7);
+          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        #if CYTHON_COMPILING_IN_CPYTHON
         if (likely(PyTuple_CheckExact(sequence))) {
-          if (unlikely(PyTuple_GET_SIZE(sequence) != 7)) {
-            if (PyTuple_GET_SIZE(sequence) > 7) __Pyx_RaiseTooManyValuesError(7);
-            else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          }
           __pyx_t_13 = PyTuple_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
           __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
@@ -42798,11 +45056,6 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_14 = PyTuple_GET_ITEM(sequence, 5); 
           __pyx_t_15 = PyTuple_GET_ITEM(sequence, 6); 
         } else {
-          if (unlikely(PyList_GET_SIZE(sequence) != 7)) {
-            if (PyList_GET_SIZE(sequence) > 7) __Pyx_RaiseTooManyValuesError(7);
-            else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          }
           __pyx_t_13 = PyList_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
           __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
@@ -42818,34 +45071,36 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_INCREF(__pyx_t_3);
         __Pyx_INCREF(__pyx_t_14);
         __Pyx_INCREF(__pyx_t_15);
+        #else
+        Py_ssize_t i;
+        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
+        for (i=0; i < 7; i++) {
+          PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          *(temps[i]) = item;
+        }
+        #endif
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      } else {
+      } else
+      {
         Py_ssize_t index = -1;
+        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
         __pyx_t_16 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_16);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-        index = 0; __pyx_t_13 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_13)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_13);
-        index = 1; __pyx_t_7 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_7)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_7);
-        index = 2; __pyx_t_9 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_9)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_9);
-        index = 3; __pyx_t_10 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_10);
-        index = 4; __pyx_t_3 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_3)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_3);
-        index = 5; __pyx_t_14 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_14)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_14);
-        index = 6; __pyx_t_15 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_15);
+        for (index=0; index < 7; index++) {
+          PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L21_unpacking_failed;
+          __Pyx_GOTREF(item);
+          *(temps[index]) = item;
+        }
         if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 7) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = NULL;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         goto __pyx_L22_unpacking_done;
         __pyx_L21_unpacking_failed:;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-        if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-        if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+        __pyx_t_17 = NULL;
+        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_L22_unpacking_done:;
       }
@@ -42879,7 +45134,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_is_shadow_path = __pyx_t_15;
       __pyx_t_15 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":982
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":982
  *             new_frontier = []
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]             # <<<<<<<<<<<<<<
@@ -42900,7 +45155,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_word_id = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":983
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":983
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
@@ -42921,7 +45176,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":985
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":985
  *                 spanlen = fwords[i][alt][2]
  *                 # TODO get rid of k -- pathlen is replacing it
  *                 if word_id == EPSILON:             # <<<<<<<<<<<<<<
@@ -42930,14 +45185,13 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
+      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":987
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":987
  *                 if word_id == EPSILON:
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):             # <<<<<<<<<<<<<<
@@ -42952,15 +45206,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_15 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_14);
+        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":988
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":988
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):
  *                         continue             # <<<<<<<<<<<<<<
@@ -42972,7 +45225,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         __pyx_L24:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":989
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":989
  *                     if i+spanlen >= len(fwords):
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
@@ -42992,16 +45245,13 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_nualt = __pyx_t_18;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":990
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":990
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     continue
  * 
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
           __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -43012,7 +45262,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_14);
           __Pyx_GIVEREF(__pyx_t_14);
           PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -43038,7 +45288,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":991
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":991
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue             # <<<<<<<<<<<<<<
@@ -43050,7 +45300,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       __pyx_L23:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":993
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":993
  *                     continue
  * 
  *                 phrase = prefix + (word_id,)             # <<<<<<<<<<<<<<
@@ -43058,7 +45308,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                 arity = hiero_phrase.arity()
  */
       __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_word_id);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_word_id);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_word_id);
@@ -43071,7 +45321,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_phrase = __pyx_t_15;
       __pyx_t_15 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":994
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":994
  * 
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)             # <<<<<<<<<<<<<<
@@ -43079,7 +45329,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  * 
  */
       __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+      __Pyx_GOTREF(__pyx_t_15);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
@@ -43092,7 +45342,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_hiero_phrase = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":995
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":995
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()             # <<<<<<<<<<<<<<
@@ -43108,7 +45358,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       __pyx_cur_scope->__pyx_v_arity = __pyx_t_18;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":997
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":997
  *                 arity = hiero_phrase.arity()
  * 
  *                 lookup_required = False             # <<<<<<<<<<<<<<
@@ -43117,7 +45367,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
       __pyx_cur_scope->__pyx_v_lookup_required = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":998
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":998
  * 
  *                 lookup_required = False
  *                 if word_id in node.children:             # <<<<<<<<<<<<<<
@@ -43126,11 +45376,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
       __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_8 = ((PySequence_Contains(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_15, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":999
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":999
  *                 lookup_required = False
  *                 if word_id in node.children:
  *                     if node.children[word_id] is None:             # <<<<<<<<<<<<<<
@@ -43146,7 +45396,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1001
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1001
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  *                         continue             # <<<<<<<<<<<<<<
@@ -43158,7 +45408,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1004
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1004
  *                     else:
  *                         # Path continues at this node
  *                         node = node.children[word_id]             # <<<<<<<<<<<<<<
@@ -43181,7 +45431,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1006
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1006
  *                         node = node.children[word_id]
  *                 else:
  *                     if node.suffix_link is None:             # <<<<<<<<<<<<<<
@@ -43194,7 +45444,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1008
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1008
  *                     if node.suffix_link is None:
  *                         # Current node is root; lookup required
  *                         lookup_required = True             # <<<<<<<<<<<<<<
@@ -43206,7 +45456,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1010
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1010
  *                         lookup_required = True
  *                     else:
  *                         if word_id in node.suffix_link.children:             # <<<<<<<<<<<<<<
@@ -43218,11 +45468,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_3 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_8 = ((PySequence_Contains(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1011
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1011
  *                     else:
  *                         if word_id in node.suffix_link.children:
  *                             if node.suffix_link.children[word_id] is None:             # <<<<<<<<<<<<<<
@@ -43241,7 +45491,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             if (__pyx_t_8) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1013
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1013
  *                             if node.suffix_link.children[word_id] is None:
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None             # <<<<<<<<<<<<<<
@@ -43253,7 +45503,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               if (PyObject_SetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1014
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1014
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None
  *                                 continue             # <<<<<<<<<<<<<<
@@ -43265,7 +45515,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             /*else*/ {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1017
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1017
  *                             else:
  *                                 # Suffix link indicates lookup is reqired
  *                                 lookup_required = True             # <<<<<<<<<<<<<<
@@ -43279,14 +45529,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1020
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1020
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-            __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_122), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_123), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_Raise(__pyx_t_3, 0, 0, 0);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -43298,7 +45548,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       __pyx_L27:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1022
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1022
  *                             raise Exception("Keyword trie error")
  *                 # checking whether lookup_required
  *                 if lookup_required:             # <<<<<<<<<<<<<<
@@ -43307,7 +45557,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
       if (__pyx_cur_scope->__pyx_v_lookup_required) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1023
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1023
  *                 # checking whether lookup_required
  *                 if lookup_required:
  *                     new_node = None             # <<<<<<<<<<<<<<
@@ -43320,7 +45570,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_GIVEREF(Py_None);
         __pyx_cur_scope->__pyx_v_new_node = Py_None;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1024
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1024
  *                 if lookup_required:
  *                     new_node = None
  *                     if is_shadow_path:             # <<<<<<<<<<<<<<
@@ -43330,7 +45580,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1027
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1027
  *                         # Extending shadow path
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,             # <<<<<<<<<<<<<<
@@ -43353,7 +45603,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1028
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1028
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],             # <<<<<<<<<<<<<<
@@ -43371,7 +45621,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1029
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1029
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
@@ -43379,7 +45629,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         if arity > 0:
  */
           if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -43391,7 +45641,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1031
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1031
  *                                 phrase=hiero_phrase)
  *                     else:
  *                         if arity > 0:             # <<<<<<<<<<<<<<
@@ -43401,7 +45651,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity > 0);
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1033
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1033
  *                         if arity > 0:
  *                             # Intersecting because of arity > 0
  *                             phrase_location = self.intersect(node, node.suffix_link.children[word_id], hiero_phrase)             # <<<<<<<<<<<<<<
@@ -43416,7 +45666,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_2 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->__pyx_vtab)->intersect(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->intersect(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -43428,7 +45678,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1036
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1036
  *                         else:
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location             # <<<<<<<<<<<<<<
@@ -43444,14 +45694,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_phrase_location = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1037
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1037
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)             # <<<<<<<<<<<<<<
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
@@ -43467,7 +45717,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+            __Pyx_GOTREF(__pyx_t_9);
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_2));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
             PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_15);
@@ -43490,7 +45740,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_sa_range = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1038
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1038
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:             # <<<<<<<<<<<<<<
@@ -43500,7 +45750,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_8 = (__pyx_cur_scope->__pyx_v_sa_range != Py_None);
             if (__pyx_t_8) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1039
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1039
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])             # <<<<<<<<<<<<<<
@@ -43517,7 +45767,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __Pyx_GOTREF(__pyx_t_9);
               if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
               __Pyx_GOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -43529,7 +45779,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             /*else*/ {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1041
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1041
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  *                             else:
  *                                 phrase_location = None             # <<<<<<<<<<<<<<
@@ -43546,7 +45796,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L34:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1043
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1043
  *                                 phrase_location = None
  * 
  *                         if phrase_location is None:             # <<<<<<<<<<<<<<
@@ -43556,7 +45806,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_8 = (((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location) == Py_None);
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1044
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1044
  * 
  *                         if phrase_location is None:
  *                             node.children[word_id] = None             # <<<<<<<<<<<<<<
@@ -43568,7 +45818,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             if (PyObject_SetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1046
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1046
  *                             node.children[word_id] = None
  *                             # Search failed
  *                             continue             # <<<<<<<<<<<<<<
@@ -43580,20 +45830,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L36:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1048
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1048
  *                             continue
  *                         # Search succeeded
  *                         suffix_link = self.rules.root             # <<<<<<<<<<<<<<
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  */
-          __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+          __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_suffix_link);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_suffix_link);
-          __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-          __pyx_cur_scope->__pyx_v_suffix_link = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root;
+          __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+          __pyx_cur_scope->__pyx_v_suffix_link = __pyx_cur_scope->__pyx_v_self->rules->root;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1049
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1049
  *                         # Search succeeded
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:             # <<<<<<<<<<<<<<
@@ -43606,7 +45856,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1050
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1050
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]             # <<<<<<<<<<<<<<
@@ -43630,7 +45880,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L37:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1051
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1051
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,             # <<<<<<<<<<<<<<
@@ -43641,7 +45891,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GOTREF(((PyObject *)__pyx_t_9));
           if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1052
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1052
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,             # <<<<<<<<<<<<<<
@@ -43650,7 +45900,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
           if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1053
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1053
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
@@ -43658,7 +45908,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                     node = new_node
  */
           if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_10 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -43669,7 +45919,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         __pyx_L33:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1054
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1054
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node             # <<<<<<<<<<<<<<
@@ -43681,7 +45931,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         if (PyObject_SetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1055
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1055
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node
  *                     node = new_node             # <<<<<<<<<<<<<<
@@ -43694,17 +45944,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_new_node);
         __pyx_cur_scope->__pyx_v_node = __pyx_cur_scope->__pyx_v_new_node;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1060
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1060
  *                     This should happen before we get to extraction (so that
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:             # <<<<<<<<<<<<<<
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  */
-        __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_nonterminals);
+        __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1061
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1061
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1             # <<<<<<<<<<<<<<
@@ -43719,7 +45969,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_xcat_index = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1062
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1062
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)             # <<<<<<<<<<<<<<
@@ -43727,9 +45977,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         if is_shadow_path:
  */
           __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1062; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, __pyx_t_18);
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1063
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1063
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index             # <<<<<<<<<<<<<<
@@ -43742,7 +45992,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xcat_index);
           __pyx_cur_scope->__pyx_v_suffix_link_xcat_index = __pyx_cur_scope->__pyx_v_xcat_index;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1064
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1064
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:             # <<<<<<<<<<<<<<
@@ -43752,7 +46002,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1065
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1065
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1             # <<<<<<<<<<<<<<
@@ -43770,7 +46020,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L39:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1066
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1066
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)             # <<<<<<<<<<<<<<
@@ -43778,9 +46028,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  */
           __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, __pyx_t_18);
+          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1067
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1067
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
@@ -43794,7 +46044,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1068
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1068
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],             # <<<<<<<<<<<<<<
@@ -43812,7 +46062,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1069
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1069
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))             # <<<<<<<<<<<<<<
@@ -43822,7 +46072,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
@@ -43830,7 +46080,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
@@ -43839,11 +46089,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1067
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1067
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
@@ -43859,7 +46109,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         __pyx_L38:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1072
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1072
  * 
  *                     # sample from range
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
@@ -43870,19 +46120,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1073
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1073
  *                     # sample from range
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)             # <<<<<<<<<<<<<<
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  */
-          __pyx_t_9 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_t_10 = 0;
@@ -43897,7 +46147,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_10);
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1074
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1074
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns             # <<<<<<<<<<<<<<
@@ -43909,7 +46159,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_num_subpatterns = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_10)->num_subpatterns;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1075
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1075
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)             # <<<<<<<<<<<<<<
@@ -43922,7 +46172,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GOTREF(__pyx_t_3);
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_chunklen));
@@ -43931,7 +46181,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_chunklen = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1076
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1076
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:             # <<<<<<<<<<<<<<
@@ -43941,7 +46191,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_18 = __pyx_cur_scope->__pyx_v_num_subpatterns;
           for (__pyx_cur_scope->__pyx_v_j = 0; __pyx_cur_scope->__pyx_v_j < __pyx_t_18; __pyx_cur_scope->__pyx_v_j++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1077
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1077
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)             # <<<<<<<<<<<<<<
@@ -43951,7 +46201,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             (__pyx_cur_scope->__pyx_v_chunklen->arr[__pyx_cur_scope->__pyx_v_j]) = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_hiero_phrase->__pyx_vtab)->chunklen(__pyx_cur_scope->__pyx_v_hiero_phrase, __pyx_cur_scope->__pyx_v_j);
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1078
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1078
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []             # <<<<<<<<<<<<<<
@@ -43959,14 +46209,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         extract_start = monitor_cpu()
  */
           __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
           __pyx_cur_scope->__pyx_v_extracts = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1079
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1079
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []
  *                         j = 0             # <<<<<<<<<<<<<<
@@ -43975,7 +46225,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
           __pyx_cur_scope->__pyx_v_j = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1080
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1080
  *                         extracts = []
  *                         j = 0
  *                         extract_start = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -43990,7 +46240,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_extract_start = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1081
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1081
  *                         j = 0
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:             # <<<<<<<<<<<<<<
@@ -44001,7 +46251,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_19 = (__pyx_cur_scope->__pyx_v_j < __pyx_cur_scope->__pyx_v_sample->len);
             if (!__pyx_t_19) break;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1082
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1082
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:
  *                             extract = []             # <<<<<<<<<<<<<<
@@ -44009,23 +46259,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  */
             __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
             __pyx_cur_scope->__pyx_v_extract = ((PyObject *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1084
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1084
  *                             extract = []
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  */
-            __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda->sent_id->arr);
+            __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, __pyx_cur_scope->__pyx_v_self->fda->sent_id->arr);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1085
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1085
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])             # <<<<<<<<<<<<<<
@@ -44035,7 +46285,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_3 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1085; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1085; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            __Pyx_GOTREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_t_3 = 0;
@@ -44048,14 +46298,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_loc = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1086
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1086
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)             # <<<<<<<<<<<<<<
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns
  */
-            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->__pyx_vtab)->extract(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->extract(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -44063,7 +46313,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_extract = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1087
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1087
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])             # <<<<<<<<<<<<<<
@@ -44073,7 +46323,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_10 = PyList_New(0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            __Pyx_GOTREF(__pyx_t_10);
             if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_extract) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_extract)) {
               __pyx_t_9 = __pyx_cur_scope->__pyx_v_extract; __Pyx_INCREF(__pyx_t_9); __pyx_t_5 = 0;
               __pyx_t_20 = NULL;
@@ -44083,12 +46333,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __pyx_t_20 = Py_TYPE(__pyx_t_9)->tp_iternext;
             }
             for (;;) {
-              if (PyList_CheckExact(__pyx_t_9)) {
+              if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_9)) break;
-                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++;
-              } else if (PyTuple_CheckExact(__pyx_t_9)) {
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #else
+                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #endif
+              } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #else
+                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #endif
               } else {
                 __pyx_t_14 = __pyx_t_20(__pyx_t_9);
                 if (unlikely(!__pyx_t_14)) {
@@ -44106,19 +46364,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __pyx_cur_scope->__pyx_v_e = __pyx_t_14;
               __pyx_t_14 = 0;
               __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+              __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
               PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_cur_scope->__pyx_v_e);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loc);
               PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_cur_scope->__pyx_v_loc);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loc);
-              if (unlikely(PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (unlikely(__Pyx_PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
             }
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+            __Pyx_GOTREF(__pyx_t_9);
             __Pyx_INCREF(((PyObject *)__pyx_t_10));
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
@@ -44129,7 +46387,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1088
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1088
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns             # <<<<<<<<<<<<<<
@@ -44139,7 +46397,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns);
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1090
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1090
  *                             j = j + num_subpatterns
  * 
  *                         num_samples = sample.len/num_subpatterns             # <<<<<<<<<<<<<<
@@ -44156,7 +46414,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_cur_scope->__pyx_v_num_samples = __Pyx_div_int(__pyx_cur_scope->__pyx_v_sample->len, __pyx_cur_scope->__pyx_v_num_subpatterns);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1091
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1091
  * 
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -44171,14 +46429,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_extract_stop = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1092
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1092
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start             # <<<<<<<<<<<<<<
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  */
-          __pyx_t_10 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
@@ -44186,25 +46444,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_10 = PyNumber_Subtract(__pyx_t_9, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_21 = __pyx_PyFloat_AsDouble(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_21 = __pyx_PyFloat_AsFloat(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time = __pyx_t_21;
+          __pyx_cur_scope->__pyx_v_self->extract_time = __pyx_t_21;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1093
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1093
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:             # <<<<<<<<<<<<<<
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_extracts) == Py_None)) {
-            PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); 
+          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_19 = (__pyx_t_5 > 0);
           if (__pyx_t_19) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1094
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1094
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:
  *                             fcount = Counter()             # <<<<<<<<<<<<<<
@@ -44222,7 +46477,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_fcount = __pyx_t_9;
             __pyx_t_9 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1095
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1095
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
@@ -44231,10 +46486,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
             __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda1, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __Pyx_GOTREF(__pyx_t_3);
             PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __pyx_t_10 = 0;
@@ -44248,43 +46503,50 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_fphrases = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1096
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1096
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:             # <<<<<<<<<<<<<<
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  */
-            if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_extracts) == Py_None)) {
-              PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-            }
             __pyx_t_10 = ((PyObject *)__pyx_cur_scope->__pyx_v_extracts); __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
             for (;;) {
               if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_3 = PySequence_ITEM(__pyx_t_10, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
               if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
                 PyObject* sequence = __pyx_t_3;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                Py_ssize_t size = Py_SIZE(sequence);
+                #else
+                Py_ssize_t size = PySequence_Size(sequence);
+                #endif
+                if (unlikely(size != 2)) {
+                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
+                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
                 }
                 __Pyx_INCREF(__pyx_t_9);
                 __Pyx_INCREF(__pyx_t_14);
+                #else
+                __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #endif
                 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              } else {
+              } else
+              {
                 Py_ssize_t index = -1;
                 __pyx_t_15 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
@@ -44295,33 +46557,35 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_15); if (unlikely(!__pyx_t_14)) goto __pyx_L50_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_14);
                 if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_15), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 goto __pyx_L51_unpacking_done;
                 __pyx_L50_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                __pyx_t_17 = NULL;
+                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
                 {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L51_unpacking_done:;
               }
               if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
                 PyObject* sequence = __pyx_t_9;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                Py_ssize_t size = Py_SIZE(sequence);
+                #else
+                Py_ssize_t size = PySequence_Size(sequence);
+                #endif
+                if (unlikely(size != 4)) {
+                  if (size > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
+                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
-                    if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   __pyx_t_7 = PyTuple_GET_ITEM(sequence, 2); 
                   __pyx_t_13 = PyTuple_GET_ITEM(sequence, 3); 
                 } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
-                    if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   __pyx_t_7 = PyList_GET_ITEM(sequence, 2); 
@@ -44331,28 +46595,36 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_INCREF(__pyx_t_2);
                 __Pyx_INCREF(__pyx_t_7);
                 __Pyx_INCREF(__pyx_t_13);
+                #else
+                Py_ssize_t i;
+                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
+                for (i=0; i < 4; i++) {
+                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  *(temps[i]) = item;
+                }
+                #endif
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              } else {
+              } else
+              {
                 Py_ssize_t index = -1;
+                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
                 __pyx_t_16 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
                 __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-                index = 0; __pyx_t_15 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_15);
-                index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_2)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_2);
-                index = 2; __pyx_t_7 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_7)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_7);
-                index = 3; __pyx_t_13 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_13)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_13);
+                for (index=0; index < 4; index++) {
+                  PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L52_unpacking_failed;
+                  __Pyx_GOTREF(item);
+                  *(temps[index]) = item;
+                }
                 if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
                 goto __pyx_L53_unpacking_done;
                 __pyx_L52_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                __pyx_t_17 = NULL;
+                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
                 {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L53_unpacking_done:;
               }
@@ -44382,7 +46654,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __pyx_cur_scope->__pyx_v_loc = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1097
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1097
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count             # <<<<<<<<<<<<<<
@@ -44400,7 +46672,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1098
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1098
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)             # <<<<<<<<<<<<<<
@@ -44422,320 +46694,252 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1099
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1099
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():             # <<<<<<<<<<<<<<
  *                                 for e, alslist in elist.iteritems():
- *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
+ *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_fphrases, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            if (PyList_CheckExact(__pyx_t_9) || PyTuple_CheckExact(__pyx_t_9)) {
-              __pyx_t_10 = __pyx_t_9; __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
-              __pyx_t_20 = NULL;
-            } else {
-              __pyx_t_5 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_20 = Py_TYPE(__pyx_t_10)->tp_iternext;
+            __pyx_t_5 = 0;
+            if (unlikely(__pyx_cur_scope->__pyx_v_fphrases == Py_None)) {
+              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            for (;;) {
-              if (PyList_CheckExact(__pyx_t_10)) {
-                if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
-                __pyx_t_9 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_9); __pyx_t_5++;
-              } else if (PyTuple_CheckExact(__pyx_t_10)) {
-                if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_10)) break;
-                __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_9); __pyx_t_5++;
-              } else {
-                __pyx_t_9 = __pyx_t_20(__pyx_t_10);
-                if (unlikely(!__pyx_t_9)) {
-                  if (PyErr_Occurred()) {
-                    if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  break;
-                }
-                __Pyx_GOTREF(__pyx_t_9);
-              }
-              if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
-                PyObject* sequence = __pyx_t_9;
-                if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
-                  __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
-                } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
-                  __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
-                }
-                __Pyx_INCREF(__pyx_t_3);
-                __Pyx_INCREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              } else {
-                Py_ssize_t index = -1;
-                __pyx_t_13 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-                __pyx_t_17 = Py_TYPE(__pyx_t_13)->tp_iternext;
-                index = 0; __pyx_t_3 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L56_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_3);
-                index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_14)) goto __pyx_L56_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_14);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                goto __pyx_L57_unpacking_done;
-                __pyx_L56_unpacking_failed:;
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_L57_unpacking_done:;
-              }
+            __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_fphrases, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_22), (&__pyx_t_18)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_XDECREF(__pyx_t_10);
+            __pyx_t_10 = __pyx_t_9;
+            __pyx_t_9 = 0;
+            while (1) {
+              __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_10, __pyx_t_22, &__pyx_t_5, &__pyx_t_9, &__pyx_t_3, NULL, __pyx_t_18);
+              if (unlikely(__pyx_t_6 == 0)) break;
+              if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_9);
+              __Pyx_GOTREF(__pyx_t_3);
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_f);
-              __Pyx_GIVEREF(__pyx_t_3);
-              __pyx_cur_scope->__pyx_v_f = __pyx_t_3;
-              __pyx_t_3 = 0;
+              __Pyx_GIVEREF(__pyx_t_9);
+              __pyx_cur_scope->__pyx_v_f = __pyx_t_9;
+              __pyx_t_9 = 0;
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_elist);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_elist);
-              __Pyx_GIVEREF(__pyx_t_14);
-              __pyx_cur_scope->__pyx_v_elist = __pyx_t_14;
-              __pyx_t_14 = 0;
+              __Pyx_GIVEREF(__pyx_t_3);
+              __pyx_cur_scope->__pyx_v_elist = __pyx_t_3;
+              __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1100
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1100
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():             # <<<<<<<<<<<<<<
- *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
+ *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  */
-              __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_elist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_23 = 0;
+              if (unlikely(__pyx_cur_scope->__pyx_v_elist == Py_None)) {
+                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_elist, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_24), (&__pyx_t_6)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              __pyx_t_14 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              if (PyList_CheckExact(__pyx_t_14) || PyTuple_CheckExact(__pyx_t_14)) {
-                __pyx_t_9 = __pyx_t_14; __Pyx_INCREF(__pyx_t_9); __pyx_t_22 = 0;
-                __pyx_t_23 = NULL;
-              } else {
-                __pyx_t_22 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_XDECREF(__pyx_t_3);
+              __pyx_t_3 = __pyx_t_9;
+              __pyx_t_9 = 0;
+              while (1) {
+                __pyx_t_4 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_24, &__pyx_t_23, &__pyx_t_9, &__pyx_t_14, NULL, __pyx_t_6);
+                if (unlikely(__pyx_t_4 == 0)) break;
+                if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __pyx_t_23 = Py_TYPE(__pyx_t_9)->tp_iternext;
-              }
-              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-              for (;;) {
-                if (PyList_CheckExact(__pyx_t_9)) {
-                  if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_9)) break;
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_22); __Pyx_INCREF(__pyx_t_14); __pyx_t_22++;
-                } else if (PyTuple_CheckExact(__pyx_t_9)) {
-                  if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_22); __Pyx_INCREF(__pyx_t_14); __pyx_t_22++;
-                } else {
-                  __pyx_t_14 = __pyx_t_23(__pyx_t_9);
-                  if (unlikely(!__pyx_t_14)) {
-                    if (PyErr_Occurred()) {
-                      if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    break;
-                  }
-                  __Pyx_GOTREF(__pyx_t_14);
-                }
-                if ((likely(PyTuple_CheckExact(__pyx_t_14))) || (PyList_CheckExact(__pyx_t_14))) {
-                  PyObject* sequence = __pyx_t_14;
-                  if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
-                    __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
-                  } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
-                    __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
-                  }
-                  __Pyx_INCREF(__pyx_t_3);
-                  __Pyx_INCREF(__pyx_t_13);
-                  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                } else {
-                  Py_ssize_t index = -1;
-                  __pyx_t_7 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __Pyx_GOTREF(__pyx_t_7);
-                  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                  __pyx_t_17 = Py_TYPE(__pyx_t_7)->tp_iternext;
-                  index = 0; __pyx_t_3 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L60_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_3);
-                  index = 1; __pyx_t_13 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_13)) goto __pyx_L60_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_13);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  goto __pyx_L61_unpacking_done;
-                  __pyx_L60_unpacking_failed:;
-                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_L61_unpacking_done:;
-                }
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
-                __Pyx_GIVEREF(__pyx_t_3);
-                __pyx_cur_scope->__pyx_v_e = __pyx_t_3;
-                __pyx_t_3 = 0;
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_v_e = __pyx_t_9;
+                __pyx_t_9 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alslist);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alslist);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_13;
-                __pyx_t_13 = 0;
+                __Pyx_GIVEREF(__pyx_t_14);
+                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_14;
+                __pyx_t_14 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1101
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1101
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
- *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]             # <<<<<<<<<<<<<<
+ *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
- *                                     count = len(locs)
+ *                                     # count = len(locs) # Should be?
  */
                 __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_13 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
+                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
-                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_t_13 = 0;
-                __pyx_t_13 = PyDict_New(); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-                __pyx_t_3 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda3, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
-                if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__key), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                __pyx_t_3 = PyEval_CallObjectWithKeywords(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
-                __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-                __pyx_t_13 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
+                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_t_9 = 0;
+                __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+                __pyx_t_13 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__key), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __pyx_t_13 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
+                __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+                if ((likely(PyTuple_CheckExact(__pyx_t_13))) || (PyList_CheckExact(__pyx_t_13))) {
+                  PyObject* sequence = __pyx_t_13;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  if (likely(PyTuple_CheckExact(sequence))) {
+                    __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
+                    __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
+                  } else {
+                    __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
+                    __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
+                  }
+                  __Pyx_INCREF(__pyx_t_9);
+                  __Pyx_INCREF(__pyx_t_14);
+                  #else
+                  __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                } else
+                {
+                  Py_ssize_t index = -1;
+                  __pyx_t_7 = PyObject_GetIter(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __Pyx_GOTREF(__pyx_t_7);
+                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                  __pyx_t_17 = Py_TYPE(__pyx_t_7)->tp_iternext;
+                  index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_9)) goto __pyx_L58_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_9);
+                  index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_14)) goto __pyx_L58_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_14);
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
+                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+                  goto __pyx_L59_unpacking_done;
+                  __pyx_L58_unpacking_failed:;
+                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_L59_unpacking_done:;
+                }
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alignment);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_13;
-                __pyx_t_13 = 0;
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_9;
+                __pyx_t_9 = 0;
+                __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_max_locs);
+                __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_max_locs);
+                __Pyx_GIVEREF(__pyx_t_14);
+                __pyx_cur_scope->__pyx_v_max_locs = __pyx_t_14;
+                __pyx_t_14 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1102
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1102
  *                                 for e, alslist in elist.iteritems():
- *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
+ *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))             # <<<<<<<<<<<<<<
- *                                     count = len(locs)
- *                                     scores = self.scorer.score(FeatureContext(
+ *                                     # count = len(locs) # Should be?
+ *                                     count = len(max_locs) # Was
  */
                 __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_3 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__chain); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_14 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__chain); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
                 __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_14 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
+                __pyx_t_9 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
                 __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_14);
-                __Pyx_GIVEREF(__pyx_t_14);
-                __pyx_t_14 = 0;
-                __pyx_t_14 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __Pyx_GOTREF(__pyx_t_13);
+                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_t_9 = 0;
+                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
+                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
                 __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_14);
-                __Pyx_GIVEREF(__pyx_t_14);
-                __pyx_t_14 = 0;
-                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
+                __Pyx_GOTREF(__pyx_t_13);
+                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_t_9 = 0;
+                __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
-                __Pyx_GIVEREF(__pyx_t_14);
-                __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_14);
-                __pyx_t_14 = 0;
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_9);
+                __pyx_t_9 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1103
- *                                     alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1104
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
- *                                     count = len(locs)             # <<<<<<<<<<<<<<
+ *                                     # count = len(locs) # Should be?
+ *                                     count = len(max_locs) # Was             # <<<<<<<<<<<<<<
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  */
-                if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_locs) == Py_None)) {
-                  PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-                }
-                __pyx_t_24 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); 
-                __pyx_t_14 = PyInt_FromSsize_t(__pyx_t_24); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
+                __pyx_t_25 = PyObject_Length(__pyx_cur_scope->__pyx_v_max_locs); if (unlikely(__pyx_t_25 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
-                __Pyx_GIVEREF(__pyx_t_14);
-                __pyx_cur_scope->__pyx_v_count = __pyx_t_14;
-                __pyx_t_14 = 0;
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_v_count = __pyx_t_9;
+                __pyx_t_9 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1104
- *                                     locs = tuple(itertools.chain(alslist.itervalues()))
- *                                     count = len(locs)
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1105
+ *                                     # count = len(locs) # Should be?
+ *                                     count = len(max_locs) # Was
  *                                     scores = self.scorer.score(FeatureContext(             # <<<<<<<<<<<<<<
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i), locs, fwords
+ *                                                (k, i), locs, fwords
  */
-                __pyx_t_14 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
+                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1105
- *                                     count = len(locs)
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1106
+ *                                     count = len(max_locs) # Was
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,             # <<<<<<<<<<<<<<
- *                                                (k,i), locs, fwords
+ *                                                (k, i), locs, fwords
  *                                                ))
  */
-                __pyx_t_13 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1106
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1107
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i), locs, fwords             # <<<<<<<<<<<<<<
+ *                                                (k, i), locs, fwords             # <<<<<<<<<<<<<<
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)
  */
-                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_7);
-                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+                __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
                 PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_7);
                 __Pyx_GIVEREF(__pyx_t_7);
                 PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
@@ -44743,15 +46947,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __pyx_t_7 = 0;
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1107
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1108
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i), locs, fwords
+ *                                                (k, i), locs, fwords
  *                                                ))             # <<<<<<<<<<<<<<
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  */
-                __pyx_t_2 = PyTuple_New(8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+                __pyx_t_2 = PyTuple_New(8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_f);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f);
@@ -44763,8 +46967,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_count);
                 PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_13);
                 __Pyx_GIVEREF(__pyx_t_13);
-                PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_t_3);
-                __Pyx_GIVEREF(__pyx_t_3);
+                PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_t_14);
+                __Pyx_GIVEREF(__pyx_t_14);
                 PyTuple_SET_ITEM(__pyx_t_2, 5, ((PyObject *)__pyx_t_15));
                 __Pyx_GIVEREF(((PyObject *)__pyx_t_15));
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
@@ -44774,13 +46978,13 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 PyTuple_SET_ITEM(__pyx_t_2, 7, __pyx_cur_scope->__pyx_v_fwords);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
                 __pyx_t_13 = 0;
-                __pyx_t_3 = 0;
+                __pyx_t_14 = 0;
                 __pyx_t_15 = 0;
-                __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer->__pyx_vtab)->score(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer, __pyx_t_15)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_15)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
@@ -44789,17 +46993,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1108
- *                                                (k,i), locs, fwords
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1109
+ *                                                (k, i), locs, fwords
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)             # <<<<<<<<<<<<<<
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  */
-                __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyTuple_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+                __pyx_t_15 = PyTuple_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
                 PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_2);
                 __Pyx_GIVEREF(__pyx_t_2);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
@@ -44815,45 +47019,49 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_alignment);
                 __pyx_t_2 = 0;
-                __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __pyx_r = __pyx_t_2;
                 __pyx_t_2 = 0;
                 __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
-                __pyx_cur_scope->__pyx_t_1 = __pyx_t_5;
-                __Pyx_XGIVEREF(__pyx_t_9);
-                __pyx_cur_scope->__pyx_t_2 = __pyx_t_9;
+                __Pyx_XGIVEREF(__pyx_t_3);
+                __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
+                __pyx_cur_scope->__pyx_t_2 = __pyx_t_5;
+                __pyx_cur_scope->__pyx_t_3 = __pyx_t_6;
                 __Pyx_XGIVEREF(__pyx_t_10);
-                __pyx_cur_scope->__pyx_t_3 = __pyx_t_10;
+                __pyx_cur_scope->__pyx_t_4 = __pyx_t_10;
                 __Pyx_XGIVEREF(__pyx_t_12);
-                __pyx_cur_scope->__pyx_t_4 = __pyx_t_12;
-                __pyx_cur_scope->__pyx_t_5 = __pyx_t_20;
-                __pyx_cur_scope->__pyx_t_6 = __pyx_t_22;
-                __pyx_cur_scope->__pyx_t_7 = __pyx_t_23;
+                __pyx_cur_scope->__pyx_t_5 = __pyx_t_12;
+                __pyx_cur_scope->__pyx_t_6 = __pyx_t_18;
+                __pyx_cur_scope->__pyx_t_7 = __pyx_t_22;
+                __pyx_cur_scope->__pyx_t_8 = __pyx_t_23;
+                __pyx_cur_scope->__pyx_t_9 = __pyx_t_24;
                 __Pyx_XGIVEREF(__pyx_r);
                 __Pyx_RefNannyFinishContext();
                 /* return from generator, yielding value */
-                __pyx_cur_scope->__pyx_base.resume_label = 1;
+                __pyx_generator->resume_label = 1;
                 return __pyx_r;
-                __pyx_L62_resume_from_yield:;
+                __pyx_L60_resume_from_yield:;
                 __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
-                __pyx_t_5 = __pyx_cur_scope->__pyx_t_1;
-                __pyx_t_9 = __pyx_cur_scope->__pyx_t_2;
-                __pyx_cur_scope->__pyx_t_2 = 0;
-                __Pyx_XGOTREF(__pyx_t_9);
-                __pyx_t_10 = __pyx_cur_scope->__pyx_t_3;
-                __pyx_cur_scope->__pyx_t_3 = 0;
-                __Pyx_XGOTREF(__pyx_t_10);
-                __pyx_t_12 = __pyx_cur_scope->__pyx_t_4;
+                __pyx_t_3 = __pyx_cur_scope->__pyx_t_1;
+                __pyx_cur_scope->__pyx_t_1 = 0;
+                __Pyx_XGOTREF(__pyx_t_3);
+                __pyx_t_5 = __pyx_cur_scope->__pyx_t_2;
+                __pyx_t_6 = __pyx_cur_scope->__pyx_t_3;
+                __pyx_t_10 = __pyx_cur_scope->__pyx_t_4;
                 __pyx_cur_scope->__pyx_t_4 = 0;
+                __Pyx_XGOTREF(__pyx_t_10);
+                __pyx_t_12 = __pyx_cur_scope->__pyx_t_5;
+                __pyx_cur_scope->__pyx_t_5 = 0;
                 __Pyx_XGOTREF(__pyx_t_12);
-                __pyx_t_20 = __pyx_cur_scope->__pyx_t_5;
-                __pyx_t_22 = __pyx_cur_scope->__pyx_t_6;
-                __pyx_t_23 = __pyx_cur_scope->__pyx_t_7;
-                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_18 = __pyx_cur_scope->__pyx_t_6;
+                __pyx_t_22 = __pyx_cur_scope->__pyx_t_7;
+                __pyx_t_23 = __pyx_cur_scope->__pyx_t_8;
+                __pyx_t_24 = __pyx_cur_scope->__pyx_t_9;
+                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             goto __pyx_L47;
@@ -44866,120 +47074,115 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       __pyx_L32:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1110
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1111
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  */
-      __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (__pyx_t_5 < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_length);
+      __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = (__pyx_t_22 < __pyx_cur_scope->__pyx_v_self->max_length);
       if (__pyx_t_19) {
-        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_3 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_22); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_2 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __pyx_t_2 = PyObject_RichCompare(__pyx_t_3, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         if (__pyx_t_8) {
-          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_9 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_3 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_25 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_25 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_26 = __pyx_t_25;
+          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __pyx_t_27 = __pyx_t_26;
         } else {
-          __pyx_t_26 = __pyx_t_8;
+          __pyx_t_27 = __pyx_t_8;
         }
-        __pyx_t_8 = __pyx_t_26;
+        __pyx_t_8 = __pyx_t_27;
       } else {
         __pyx_t_8 = __pyx_t_19;
       }
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1111
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1112
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  */
-        __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_10 = PyNumber_Add(__pyx_t_9, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_10 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        __pyx_t_9 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
+        __pyx_t_22 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_22; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_alt_id = __pyx_t_18;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1112
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1113
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
-            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_14 = PyTuple_New(7); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_14));
-          PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
-          __Pyx_GIVEREF(__pyx_t_9);
-          PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_2);
+          __pyx_t_9 = PyTuple_New(7); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
+          __Pyx_GIVEREF(__pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_14, 3, __pyx_t_15);
+          PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_15);
           __Pyx_GIVEREF(__pyx_t_15);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_node);
-          PyTuple_SET_ITEM(__pyx_t_14, 4, __pyx_cur_scope->__pyx_v_node);
+          PyTuple_SET_ITEM(__pyx_t_9, 4, __pyx_cur_scope->__pyx_v_node);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_node);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
-          PyTuple_SET_ITEM(__pyx_t_14, 5, __pyx_cur_scope->__pyx_v_phrase);
+          PyTuple_SET_ITEM(__pyx_t_9, 5, __pyx_cur_scope->__pyx_v_phrase);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          PyTuple_SET_ITEM(__pyx_t_14, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
+          PyTuple_SET_ITEM(__pyx_t_9, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          __pyx_t_9 = 0;
+          __pyx_t_3 = 0;
           __pyx_t_2 = 0;
           __pyx_t_10 = 0;
           __pyx_t_15 = 0;
-          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_14)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
+          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_9)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1113
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1114
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity             # <<<<<<<<<<<<<<
@@ -44988,18 +47191,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
         __pyx_cur_scope->__pyx_v_num_subpatterns = __pyx_cur_scope->__pyx_v_arity;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1114
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1115
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1115
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1116
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1             # <<<<<<<<<<<<<<
@@ -45007,77 +47210,77 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         xcat = sym_setindex(self.category, arity+1)
  */
           __pyx_cur_scope->__pyx_v_num_subpatterns = (__pyx_cur_scope->__pyx_v_num_subpatterns + 1);
-          goto __pyx_L66;
+          goto __pyx_L64;
         }
-        __pyx_L66:;
+        __pyx_L64:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1116
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1117
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:             # <<<<<<<<<<<<<<
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]
  */
-        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = ((__pyx_t_5 + 1) < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_length);
+        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = ((__pyx_t_22 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
         if (__pyx_t_19) {
-          __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_nonterminals);
+          __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
           if (__pyx_t_8) {
-            __pyx_t_26 = (__pyx_cur_scope->__pyx_v_num_subpatterns < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_chunks);
-            __pyx_t_25 = __pyx_t_26;
+            __pyx_t_27 = (__pyx_cur_scope->__pyx_v_num_subpatterns < __pyx_cur_scope->__pyx_v_self->max_chunks);
+            __pyx_t_26 = __pyx_t_27;
           } else {
-            __pyx_t_25 = __pyx_t_8;
+            __pyx_t_26 = __pyx_t_8;
           }
-          __pyx_t_8 = __pyx_t_25;
+          __pyx_t_8 = __pyx_t_26;
         } else {
           __pyx_t_8 = __pyx_t_19;
         }
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1117
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1118
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)             # <<<<<<<<<<<<<<
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  */
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, (__pyx_cur_scope->__pyx_v_arity + 1));
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, (__pyx_cur_scope->__pyx_v_arity + 1));
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1118
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1119
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]             # <<<<<<<<<<<<<<
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  */
-          __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_14);
-          __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_14, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xnode);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_xnode);
           __Pyx_GIVEREF(__pyx_t_15);
           __pyx_cur_scope->__pyx_v_xnode = __pyx_t_15;
           __pyx_t_15 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1120
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1121
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])             # <<<<<<<<<<<<<<
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  */
-          __pyx_t_15 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_14);
-          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_10);
           PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_15);
           __Pyx_GIVEREF(__pyx_t_15);
-          PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_14);
-          __Pyx_GIVEREF(__pyx_t_14);
+          PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_9);
+          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_int_1);
           PyList_SET_ITEM(__pyx_t_10, 2, __pyx_int_1);
           __Pyx_GIVEREF(__pyx_int_1);
@@ -45085,77 +47288,74 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           PyList_SET_ITEM(__pyx_t_10, 3, __pyx_cur_scope->__pyx_v_pathlen);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
           __pyx_t_15 = 0;
-          __pyx_t_14 = 0;
-          __pyx_t_14 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+          __pyx_t_9 = 0;
+          __pyx_t_9 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_9));
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
-          __Pyx_GIVEREF(((PyObject *)__pyx_t_14));
-          __pyx_cur_scope->__pyx_v_key = __pyx_t_14;
-          __pyx_t_14 = 0;
+          __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
+          __pyx_cur_scope->__pyx_v_key = __pyx_t_9;
+          __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1121
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1122
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []             # <<<<<<<<<<<<<<
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  */
-          __pyx_t_14 = PyList_New(0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+          __pyx_t_9 = PyList_New(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
-          __Pyx_GIVEREF(((PyObject *)__pyx_t_14));
-          __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_14);
-          __pyx_t_14 = 0;
+          __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
+          __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_9);
+          __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1122
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1123
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):             # <<<<<<<<<<<<<<
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer) == Py_None)) {
-            PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_8 = ((PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1123
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1124
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]             # <<<<<<<<<<<<<<
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  */
-            __pyx_t_14 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_14);
+            __pyx_t_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
-            __Pyx_GIVEREF(__pyx_t_14);
-            __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_14;
-            __pyx_t_14 = 0;
-            goto __pyx_L68;
+            __Pyx_GIVEREF(__pyx_t_9);
+            __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_9;
+            __pyx_t_9 = 0;
+            goto __pyx_L66;
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1125
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1126
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)             # <<<<<<<<<<<<<<
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  */
-            __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self, __pyx_n_s_123); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_124); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_15);
@@ -45177,9 +47377,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
             __pyx_t_10 = 0;
             __pyx_t_15 = 0;
-            __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
@@ -45187,18 +47387,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_15;
             __pyx_t_15 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1126
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1127
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  *                             nodes_isteps_away_buffer[key] = frontier_nodes             # <<<<<<<<<<<<<<
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  */
-            if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
-          __pyx_L68:;
+          __pyx_L66:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1128
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1129
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:             # <<<<<<<<<<<<<<
@@ -45206,26 +47406,34 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             frontier = new_frontier
  */
           if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes)) {
-            __pyx_t_15 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_15); __pyx_t_5 = 0;
+            __pyx_t_15 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_15); __pyx_t_22 = 0;
             __pyx_t_20 = NULL;
           } else {
-            __pyx_t_5 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_22 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __pyx_t_20 = Py_TYPE(__pyx_t_15)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_15)) {
-              if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_15)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++;
-            } else if (PyTuple_CheckExact(__pyx_t_15)) {
-              if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++;
+            if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_15)) {
+              if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_15)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_22); __Pyx_INCREF(__pyx_t_2); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_15, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
+            } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_15)) {
+              if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_22); __Pyx_INCREF(__pyx_t_2); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_15, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
             } else {
               __pyx_t_2 = __pyx_t_20(__pyx_t_15);
               if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -45233,127 +47441,132 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
               PyObject* sequence = __pyx_t_2;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 3)) {
+                if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
-                __pyx_t_14 = PyTuple_GET_ITEM(sequence, 0); 
+                __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
-                __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
+                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-                  if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
-                __pyx_t_14 = PyList_GET_ITEM(sequence, 0); 
+                __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
-                __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
+                __pyx_t_3 = PyList_GET_ITEM(sequence, 2); 
               }
-              __Pyx_INCREF(__pyx_t_14);
-              __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_9);
+              __Pyx_INCREF(__pyx_t_10);
+              __Pyx_INCREF(__pyx_t_3);
+              #else
+              __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
               __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            } else {
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_3 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_3);
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-              __pyx_t_17 = Py_TYPE(__pyx_t_3)->tp_iternext;
-              index = 0; __pyx_t_14 = __pyx_t_17(__pyx_t_3); if (unlikely(!__pyx_t_14)) goto __pyx_L71_unpacking_failed;
+              __pyx_t_14 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_3); if (unlikely(!__pyx_t_10)) goto __pyx_L71_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_9 = __pyx_t_17(__pyx_t_3); if (unlikely(!__pyx_t_9)) goto __pyx_L71_unpacking_failed;
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __pyx_t_17 = Py_TYPE(__pyx_t_14)->tp_iternext;
+              index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_9)) goto __pyx_L69_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_9);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_3), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              goto __pyx_L72_unpacking_done;
-              __pyx_L71_unpacking_failed:;
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_L72_unpacking_done:;
+              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_10)) goto __pyx_L69_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_10);
+              index = 2; __pyx_t_3 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_3)) goto __pyx_L69_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_3);
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_14), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_17 = NULL;
+              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+              goto __pyx_L70_unpacking_done;
+              __pyx_L69_unpacking_failed:;
+              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+              __pyx_t_17 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_L70_unpacking_done:;
             }
-            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_14); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-            __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __pyx_cur_scope->__pyx_v_i = __pyx_t_18;
             __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_pathlen);
-            __Pyx_GIVEREF(__pyx_t_9);
-            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_9;
-            __pyx_t_9 = 0;
+            __Pyx_GIVEREF(__pyx_t_3);
+            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1129
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1130
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))             # <<<<<<<<<<<<<<
  *             frontier = new_frontier
  * 
  */
-            if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
-              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-            }
-            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_14);
-            __Pyx_GIVEREF(__pyx_t_14);
-            __pyx_t_14 = 0;
-            __pyx_t_14 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
+            __Pyx_GIVEREF(__pyx_t_9);
+            __pyx_t_9 = 0;
+            __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
+            __pyx_t_14 = PyTuple_New(7); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-            __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+            PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_2);
-            PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_9);
-            __Pyx_GIVEREF(__pyx_t_9);
-            PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_3);
+            PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
-            PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_cur_scope->__pyx_v_pathlen);
+            PyTuple_SET_ITEM(__pyx_t_14, 3, __pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_cur_scope->__pyx_v_xnode);
+            PyTuple_SET_ITEM(__pyx_t_14, 4, __pyx_cur_scope->__pyx_v_xnode);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_t_14);
-            __Pyx_GIVEREF(__pyx_t_14);
+            PyTuple_SET_ITEM(__pyx_t_14, 5, __pyx_t_9);
+            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-            PyTuple_SET_ITEM(__pyx_t_3, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
+            PyTuple_SET_ITEM(__pyx_t_14, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
             __pyx_t_2 = 0;
-            __pyx_t_9 = 0;
+            __pyx_t_3 = 0;
             __pyx_t_10 = 0;
-            __pyx_t_14 = 0;
-            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __pyx_t_9 = 0;
+            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_14)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
           }
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          goto __pyx_L67;
+          goto __pyx_L65;
         }
-        __pyx_L67:;
-        goto __pyx_L63;
+        __pyx_L65:;
+        goto __pyx_L61;
       }
-      __pyx_L63:;
+      __pyx_L61:;
       __pyx_L19_continue:;
     }
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1130
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1131
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
  *             frontier = new_frontier             # <<<<<<<<<<<<<<
@@ -45367,95 +47580,95 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     __pyx_cur_scope->__pyx_v_frontier = __pyx_cur_scope->__pyx_v_new_frontier;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1133
  *             frontier = new_frontier
  * 
  *         stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  */
-  __pyx_t_12 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_GIVEREF(__pyx_t_12);
   __pyx_cur_scope->__pyx_v_stop_time = __pyx_t_12;
   __pyx_t_12 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1133
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1134
  * 
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  */
-  __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_15 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_15 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_15);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_3 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_14 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_14);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_124));
-  PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_124));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_124));
-  PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_3);
-  __Pyx_GIVEREF(__pyx_t_3);
-  __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_12);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
+  PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_125));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
+  PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_14);
+  __Pyx_GIVEREF(__pyx_t_14);
+  __pyx_t_14 = 0;
+  __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_14);
   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1134
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1135
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()             # <<<<<<<<<<<<<<
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  * 
  */
-  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_14 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_14);
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+  __pyx_t_14 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_14);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1135
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1136
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_14 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_14);
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_15));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_kp_s_125));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_3);
-  __Pyx_GIVEREF(__pyx_t_3);
-  __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+  __pyx_t_14 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_14);
+  __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_15);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_126));
+  PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_kp_s_126));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_126));
+  PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_14);
+  __Pyx_GIVEREF(__pyx_t_14);
+  __pyx_t_14 = 0;
+  __pyx_t_14 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_14);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
@@ -45471,12 +47684,13 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_AddTraceback("input", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1138
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1139
  * 
  * 
  *     cdef int find_fixpoint(self,             # <<<<<<<<<<<<<<
@@ -45484,7 +47698,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         int* f_links_low, int* f_links_high,
  */
 
-static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_f_low, PyObject *__pyx_v_f_high, int *__pyx_v_f_links_low, int *__pyx_v_f_links_high, int *__pyx_v_e_links_low, int *__pyx_v_e_links_high, int __pyx_v_e_in_low, int __pyx_v_e_in_high, int *__pyx_v_e_low, int *__pyx_v_e_high, int *__pyx_v_f_back_low, int *__pyx_v_f_back_high, int __pyx_v_f_sent_len, int __pyx_v_e_sent_len, int __pyx_v_max_f_len, int __pyx_v_max_e_len, int __pyx_v_min_fx_size, int __pyx_v_min_ex_size, int __pyx_v_max_new_x, int __pyx_v_allow_low_x, int __pyx_v_allow_high_x, int __pyx_v_allow_arbitrary_x, int __pyx_v_write_log) {
+static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_f_low, PyObject *__pyx_v_f_high, int *__pyx_v_f_links_low, int *__pyx_v_f_links_high, int *__pyx_v_e_links_low, int *__pyx_v_e_links_high, int __pyx_v_e_in_low, int __pyx_v_e_in_high, int *__pyx_v_e_low, int *__pyx_v_e_high, int *__pyx_v_f_back_low, int *__pyx_v_f_back_high, int __pyx_v_f_sent_len, int __pyx_v_e_sent_len, int __pyx_v_max_f_len, int __pyx_v_max_e_len, int __pyx_v_min_fx_size, int __pyx_v_min_ex_size, int __pyx_v_max_new_x, int __pyx_v_allow_low_x, int __pyx_v_allow_high_x, int __pyx_v_allow_arbitrary_x, CYTHON_UNUSED int __pyx_v_write_log) {
   int __pyx_v_e_low_prev;
   int __pyx_v_e_high_prev;
   int __pyx_v_f_low_prev;
@@ -45504,9 +47718,9 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("find_fixpoint");
+  __Pyx_RefNannySetupContext("find_fixpoint", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1153
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1154
  *         cdef int e_low_prev, e_high_prev, f_low_prev, f_high_prev, new_x, new_low_x, new_high_x
  * 
  *         e_low[0] = e_in_low             # <<<<<<<<<<<<<<
@@ -45515,7 +47729,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_low[0]) = __pyx_v_e_in_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1154
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1155
  * 
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high             # <<<<<<<<<<<<<<
@@ -45524,19 +47738,19 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_high[0]) = __pyx_v_e_in_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1156
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *         if e_low[0] == -1:
  *             # low-priority corner case: if phrase w is unaligned,
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1156
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1157
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)
  *         if e_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -45546,7 +47760,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_3 = ((__pyx_v_e_low[0]) == -1);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1162
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1163
  *             # rule X -> X_1 w X_2 / X_1 X_2.    This is probably
  *             # not worth the bother, though.
  *             return 0             # <<<<<<<<<<<<<<
@@ -45558,7 +47772,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1163
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1164
  *             # not worth the bother, though.
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:             # <<<<<<<<<<<<<<
@@ -45574,7 +47788,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1164
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1165
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:             # <<<<<<<<<<<<<<
@@ -45584,7 +47798,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = ((__pyx_v_e_in_low - (__pyx_v_e_low[0])) < __pyx_v_min_ex_size);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1165
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1166
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size             # <<<<<<<<<<<<<<
@@ -45593,7 +47807,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_low[0]) = (__pyx_v_e_in_low - __pyx_v_min_ex_size);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1166
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1167
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -45603,7 +47817,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_5 = ((__pyx_v_e_low[0]) < 0);
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1167
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1168
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -45622,7 +47836,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1170
  *                     return 0
  * 
  *         if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -45632,7 +47846,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_5 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1170
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1171
  * 
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0             # <<<<<<<<<<<<<<
@@ -45644,7 +47858,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L6;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1172
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:             # <<<<<<<<<<<<<<
@@ -45660,7 +47874,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1172
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1173
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:             # <<<<<<<<<<<<<<
@@ -45670,7 +47884,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (((__pyx_v_e_high[0]) - __pyx_v_e_in_high) < __pyx_v_min_ex_size);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1173
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1174
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size             # <<<<<<<<<<<<<<
@@ -45679,7 +47893,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_high[0]) = (__pyx_v_e_in_high + __pyx_v_min_ex_size);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1174
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1175
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:             # <<<<<<<<<<<<<<
@@ -45689,7 +47903,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_e_high[0]) > __pyx_v_e_sent_len);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1175
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1176
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -45708,7 +47922,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1177
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1178
  *                     return 0
  * 
  *         f_back_low[0] = -1             # <<<<<<<<<<<<<<
@@ -45717,7 +47931,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_low[0]) = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1178
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1179
  * 
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1             # <<<<<<<<<<<<<<
@@ -45726,7 +47940,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_high[0]) = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1179
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1180
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1
  *         f_low_prev = f_low             # <<<<<<<<<<<<<<
@@ -45735,17 +47949,17 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_f_low_prev = __pyx_v_f_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1180
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1181
  *         f_back_high[0] = -1
  *         f_low_prev = f_low
  *         f_high_prev = f_high             # <<<<<<<<<<<<<<
  *         new_x = 0
  *         new_low_x = 0
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_f_high_prev = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1182
  *         f_low_prev = f_low
  *         f_high_prev = f_high
  *         new_x = 0             # <<<<<<<<<<<<<<
@@ -45754,7 +47968,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_x = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1182
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1183
  *         f_high_prev = f_high
  *         new_x = 0
  *         new_low_x = 0             # <<<<<<<<<<<<<<
@@ -45763,7 +47977,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_low_x = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1184
  *         new_x = 0
  *         new_low_x = 0
  *         new_high_x = 0             # <<<<<<<<<<<<<<
@@ -45772,7 +47986,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_high_x = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1186
  *         new_high_x = 0
  * 
  *         while True:             # <<<<<<<<<<<<<<
@@ -45782,7 +47996,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   while (1) {
     if (!1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1187
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1188
  *         while True:
  * 
  *             if f_back_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -45792,45 +48006,45 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) == -1);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1188
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1189
  * 
  *             if f_back_low[0] == -1:
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       goto __pyx_L11;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1190
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1191
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), __pyx_v_e_low_prev, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), __pyx_v_e_low_prev, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1191
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1192
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  * 
  *             if f_back_low[0] > f_low:
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_e_high_prev, (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_e_high_prev, (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     }
     __pyx_L11:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1193
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1194
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  *             if f_back_low[0] > f_low:             # <<<<<<<<<<<<<<
@@ -45840,7 +48054,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) > __pyx_v_f_low);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1194
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1195
  * 
  *             if f_back_low[0] > f_low:
  *                 f_back_low[0] = f_low             # <<<<<<<<<<<<<<
@@ -45852,36 +48066,35 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L12:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1196
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1197
  *                 f_back_low[0] = f_low
  * 
  *             if f_back_high[0] < f_high:             # <<<<<<<<<<<<<<
  *                 f_back_high[0] = f_high
  * 
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1197
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1198
  * 
  *             if f_back_high[0] < f_high:
  *                 f_back_high[0] = f_high             # <<<<<<<<<<<<<<
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  */
-      __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       (__pyx_v_f_back_high[0]) = __pyx_t_1;
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1199
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1200
  *                 f_back_high[0] = f_high
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:             # <<<<<<<<<<<<<<
@@ -45897,7 +48110,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1200
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1201
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -45910,7 +48123,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1202
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1203
  *                 return 1
  * 
  *             if allow_low_x == 0 and f_back_low[0] < f_low:             # <<<<<<<<<<<<<<
@@ -45926,7 +48139,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1204
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1205
  *             if allow_low_x == 0 and f_back_low[0] < f_low:
  *                 # FAIL: f phrase is not tight
  *                 return 0             # <<<<<<<<<<<<<<
@@ -45939,7 +48152,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1206
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1207
  *                 return 0
  * 
  *             if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -45949,7 +48162,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1208
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1209
  *             if f_back_high[0] - f_back_low[0] > max_f_len:
  *                 # FAIL: f back projection is too wide
  *                 return 0             # <<<<<<<<<<<<<<
@@ -45962,7 +48175,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1210
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1211
  *                 return 0
  * 
  *             if allow_high_x == 0 and f_back_high[0] > f_high:             # <<<<<<<<<<<<<<
@@ -45971,12 +48184,11 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_5 = (__pyx_v_allow_high_x == 0);
     if (__pyx_t_5) {
-      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_4 = __pyx_t_3;
     } else {
@@ -45984,7 +48196,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1212
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1213
  *             if allow_high_x == 0 and f_back_high[0] > f_high:
  *                 # FAIL: extension on high side not allowed
  *                 return 0             # <<<<<<<<<<<<<<
@@ -45997,7 +48209,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1214
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1215
  *                 return 0
  * 
  *             if f_low != f_back_low[0]:             # <<<<<<<<<<<<<<
@@ -46007,7 +48219,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (__pyx_v_f_low != (__pyx_v_f_back_low[0]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1215
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1216
  * 
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:             # <<<<<<<<<<<<<<
@@ -46017,7 +48229,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_low_x == 0);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1216
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1217
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -46027,7 +48239,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1218
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1219
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on low side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46040,7 +48252,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1220
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1221
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -46049,7 +48261,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1221
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1222
  *                     else:
  *                         new_x = new_x + 1
  *                         new_low_x = 1             # <<<<<<<<<<<<<<
@@ -46063,7 +48275,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L19:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1222
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1223
  *                         new_x = new_x + 1
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:             # <<<<<<<<<<<<<<
@@ -46073,7 +48285,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_f_low - (__pyx_v_f_back_low[0])) < __pyx_v_min_fx_size);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1223
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1224
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size             # <<<<<<<<<<<<<<
@@ -46082,7 +48294,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
         (__pyx_v_f_back_low[0]) = (__pyx_v_f_low - __pyx_v_min_fx_size);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1224
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1225
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -46092,7 +48304,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1226
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1227
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46105,7 +48317,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L22:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1227
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1228
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0
  *                     if f_back_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -46115,7 +48327,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_low[0]) < 0);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1229
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1230
  *                     if f_back_low[0] < 0:
  *                         # FAIL: extension required on low side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46134,23 +48346,22 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L18:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1231
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1232
  *                         return 0
  * 
  *             if f_high != f_back_high[0]:             # <<<<<<<<<<<<<<
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1232
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1233
  * 
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:             # <<<<<<<<<<<<<<
@@ -46160,7 +48371,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_high_x == 0);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1233
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1234
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -46170,7 +48381,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1235
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1236
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on high side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46183,7 +48394,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1237
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1238
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -46192,7 +48403,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1238
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1239
  *                     else:
  *                         new_x = new_x + 1
  *                         new_high_x = 1             # <<<<<<<<<<<<<<
@@ -46206,45 +48417,44 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L25:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1239
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1240
  *                         new_x = new_x + 1
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:             # <<<<<<<<<<<<<<
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  */
-      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_f_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_f_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1240
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1241
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size             # <<<<<<<<<<<<<<
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  */
-        __pyx_t_7 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_6 = PyNumber_Add(__pyx_v_f_high, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyNumber_Add(__pyx_v_f_high, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         (__pyx_v_f_back_high[0]) = __pyx_t_1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1241
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1242
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -46254,7 +48464,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1243
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1244
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46267,7 +48477,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L28:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1244
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1245
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0
  *                     if f_back_high[0] > f_sent_len:             # <<<<<<<<<<<<<<
@@ -46277,7 +48487,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_high[0]) > __pyx_v_f_sent_len);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1246
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1247
  *                     if f_back_high[0] > f_sent_len:
  *                         # FAIL: extension required on high side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46296,7 +48506,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L24:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1248
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1249
  *                         return 0
  * 
  *             e_low_prev = e_low[0]             # <<<<<<<<<<<<<<
@@ -46305,7 +48515,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_low_prev = (__pyx_v_e_low[0]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1249
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1250
  * 
  *             e_low_prev = e_low[0]
  *             e_high_prev = e_high[0]             # <<<<<<<<<<<<<<
@@ -46314,29 +48524,29 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_high_prev = (__pyx_v_e_high[0]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1251
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1252
  *             e_high_prev = e_high[0]
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  */
-    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_f_back_low[0]), __pyx_v_f_low_prev, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_f_back_low[0]), __pyx_v_f_low_prev, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1252
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1253
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  */
-    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_high_prev, (__pyx_v_f_back_high[0]), __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_high_prev, (__pyx_v_f_back_high[0]), __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1253
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1254
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:             # <<<<<<<<<<<<<<
@@ -46352,7 +48562,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1254
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1255
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -46365,7 +48575,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L30:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1255
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1256
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  *             if allow_arbitrary_x == 0:             # <<<<<<<<<<<<<<
@@ -46375,7 +48585,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (__pyx_v_allow_arbitrary_x == 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1257
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1258
  *             if allow_arbitrary_x == 0:
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0             # <<<<<<<<<<<<<<
@@ -46388,7 +48598,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L31:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1258
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1259
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0
  *             if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -46398,7 +48608,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1260
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1261
  *             if e_high[0] - e_low[0] > max_e_len:
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0             # <<<<<<<<<<<<<<
@@ -46411,7 +48621,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L32:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1261
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1262
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0
  *             f_low_prev = f_back_low[0]             # <<<<<<<<<<<<<<
@@ -46420,7 +48630,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_f_low_prev = (__pyx_v_f_back_low[0]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1262
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1263
  *                 return 0
  *             f_low_prev = f_back_low[0]
  *             f_high_prev = f_back_high[0]             # <<<<<<<<<<<<<<
@@ -46443,7 +48653,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1265
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1266
  * 
  * 
  *     cdef find_projection(self, int in_low, int in_high, int* in_links_low, int* in_links_high,             # <<<<<<<<<<<<<<
@@ -46451,7 +48661,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  *         cdef int i
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_in_low, int __pyx_v_in_high, int *__pyx_v_in_links_low, int *__pyx_v_in_links_high, int *__pyx_v_out_low, int *__pyx_v_out_high) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_in_low, int __pyx_v_in_high, int *__pyx_v_in_links_low, int *__pyx_v_in_links_high, int *__pyx_v_out_low, int *__pyx_v_out_high) {
   int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -46459,9 +48669,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("find_projection");
+  __Pyx_RefNannySetupContext("find_projection", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1268
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1269
  *                         int* out_low, int* out_high):
  *         cdef int i
  *         for i from in_low <= i < in_high:             # <<<<<<<<<<<<<<
@@ -46471,7 +48681,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
   __pyx_t_1 = __pyx_v_in_high;
   for (__pyx_v_i = __pyx_v_in_low; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1269
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1270
  *         cdef int i
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:             # <<<<<<<<<<<<<<
@@ -46481,7 +48691,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
     __pyx_t_2 = ((__pyx_v_in_links_low[__pyx_v_i]) != -1);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1270
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1271
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:             # <<<<<<<<<<<<<<
@@ -46497,7 +48707,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
       }
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1271
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1272
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]             # <<<<<<<<<<<<<<
@@ -46509,7 +48719,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
       }
       __pyx_L6:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1272
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1273
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:             # <<<<<<<<<<<<<<
@@ -46525,7 +48735,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
       }
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1273
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1274
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:
  *                     out_high[0] = in_links_high[i]             # <<<<<<<<<<<<<<
@@ -46547,7 +48757,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1276
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1277
  * 
  * 
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):             # <<<<<<<<<<<<<<
@@ -46555,13 +48765,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
  *         new_len = arr_len[0] + data_len
  */
 
-static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_arr, int *__pyx_v_arr_len, int *__pyx_v_data, int __pyx_v_data_len) {
+static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_arr, int *__pyx_v_arr_len, int *__pyx_v_data, int __pyx_v_data_len) {
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("int_arr_extend");
+  __Pyx_RefNannySetupContext("int_arr_extend", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1278
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1279
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len             # <<<<<<<<<<<<<<
@@ -46570,7 +48780,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_data_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1279
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1280
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -46579,7 +48789,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1280
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1281
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -46588,7 +48798,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_data, (__pyx_v_data_len * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1281
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1282
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -46597,7 +48807,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1282
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1283
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len
  *         return arr             # <<<<<<<<<<<<<<
@@ -46613,7 +48823,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1285
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1286
  * 
  * 
  *     cdef extract_phrases(self, int e_low, int e_high, int* e_gap_low, int* e_gap_high, int* e_links_low, int num_gaps,             # <<<<<<<<<<<<<<
@@ -46621,7 +48831,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  *                         int sent_id, int e_sent_len, int e_sent_start):
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_e_low, int __pyx_v_e_high, int *__pyx_v_e_gap_low, int *__pyx_v_e_gap_high, int *__pyx_v_e_links_low, int __pyx_v_num_gaps, int __pyx_v_f_low, int __pyx_v_f_high, int *__pyx_v_f_gap_low, int *__pyx_v_f_gap_high, int *__pyx_v_f_links_low, int __pyx_v_sent_id, int __pyx_v_e_sent_len, int __pyx_v_e_sent_start) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_e_low, int __pyx_v_e_high, int *__pyx_v_e_gap_low, int *__pyx_v_e_gap_high, int *__pyx_v_e_links_low, int __pyx_v_num_gaps, CYTHON_UNUSED int __pyx_v_f_low, CYTHON_UNUSED int __pyx_v_f_high, CYTHON_UNUSED int *__pyx_v_f_gap_low, CYTHON_UNUSED int *__pyx_v_f_gap_high, CYTHON_UNUSED int *__pyx_v_f_links_low, CYTHON_UNUSED int __pyx_v_sent_id, int __pyx_v_e_sent_len, int __pyx_v_e_sent_start) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -46657,21 +48867,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extract_phrases");
+  __Pyx_RefNannySetupContext("extract_phrases", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1293
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1294
  *         cdef result
  * 
  *         result = []             # <<<<<<<<<<<<<<
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1294
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1295
  * 
  *         result = []
  *         len1 = 0             # <<<<<<<<<<<<<<
@@ -46680,7 +48890,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1295
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1296
  *         result = []
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -46689,19 +48899,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = ((int *)malloc(0));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1296
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1297
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  *         ephr_arr = IntList()             # <<<<<<<<<<<<<<
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ephr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1298
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1299
  *         ephr_arr = IntList()
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))             # <<<<<<<<<<<<<<
@@ -46710,7 +48920,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gap_order = ((int *)malloc((__pyx_v_num_gaps * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1299
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1300
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:             # <<<<<<<<<<<<<<
@@ -46720,7 +48930,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_num_gaps > 0);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1300
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1301
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0             # <<<<<<<<<<<<<<
@@ -46729,7 +48939,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     (__pyx_v_e_gap_order[0]) = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1301
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1302
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -46739,7 +48949,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_3 = __pyx_v_num_gaps;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1302
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1303
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:             # <<<<<<<<<<<<<<
@@ -46749,7 +48959,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = __pyx_v_i;
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1303
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1304
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -46759,7 +48969,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_2 = ((__pyx_v_e_gap_low[__pyx_v_i]) < (__pyx_v_e_gap_low[__pyx_v_j]));
         if (__pyx_t_2) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1304
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1305
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:             # <<<<<<<<<<<<<<
@@ -46769,7 +48979,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_i;
           for (__pyx_v_k = __pyx_v_j; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1305
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1306
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]             # <<<<<<<<<<<<<<
@@ -46779,7 +48989,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             (__pyx_v_e_gap_order[(__pyx_v_k + 1)]) = (__pyx_v_e_gap_order[__pyx_v_k]);
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1306
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1307
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i             # <<<<<<<<<<<<<<
@@ -46788,7 +48998,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
           (__pyx_v_e_gap_order[__pyx_v_j]) = __pyx_v_i;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1307
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1308
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i
  *                         break             # <<<<<<<<<<<<<<
@@ -46802,7 +49012,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1309
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1310
  *                         break
  *                 else:
  *                     e_gap_order[i] = i             # <<<<<<<<<<<<<<
@@ -46817,7 +49027,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1311
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1312
  *                     e_gap_order[i] = i
  * 
  *         e_x_low = e_low             # <<<<<<<<<<<<<<
@@ -46826,7 +49036,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_low = __pyx_v_e_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1312
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1313
  * 
  *         e_x_low = e_low
  *         e_x_high = e_high             # <<<<<<<<<<<<<<
@@ -46835,7 +49045,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_high = __pyx_v_e_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1313
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1314
  *         e_x_low = e_low
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -46845,7 +49055,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1314
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1315
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -46868,7 +49078,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_6) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1315
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1316
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1             # <<<<<<<<<<<<<<
@@ -46878,7 +49088,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_e_x_low = (__pyx_v_e_x_low - 1);
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1316
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1317
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:             # <<<<<<<<<<<<<<
@@ -46901,7 +49111,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_2) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1317
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1318
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:
  *                 e_x_high = e_x_high + 1             # <<<<<<<<<<<<<<
@@ -46914,7 +49124,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L11:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1319
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1320
  *                 e_x_high = e_x_high + 1
  * 
  *         for i from e_x_low <= i <= e_low:             # <<<<<<<<<<<<<<
@@ -46924,7 +49134,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_low;
   for (__pyx_v_i = __pyx_v_e_x_low; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1320
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1321
  * 
  *         for i from e_x_low <= i <= e_low:
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)             # <<<<<<<<<<<<<<
@@ -46934,7 +49144,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_e_gaps1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps1, (&__pyx_v_len1), (&__pyx_v_i), 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1322
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1323
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)
  * 
  *         for i from 0 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -46944,7 +49154,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_num_gaps;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1323
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1324
  * 
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -46953,7 +49163,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1324
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1325
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)
  *             len2 = 0             # <<<<<<<<<<<<<<
@@ -46962,7 +49172,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_len2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1326
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1327
  *             len2 = 0
  * 
  *             j = e_gap_order[i]             # <<<<<<<<<<<<<<
@@ -46971,7 +49181,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = (__pyx_v_e_gap_order[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1327
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1328
  * 
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]             # <<<<<<<<<<<<<<
@@ -46980,7 +49190,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_low = (__pyx_v_e_gap_low[__pyx_v_j]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1328
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1329
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]             # <<<<<<<<<<<<<<
@@ -46989,7 +49199,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_high = (__pyx_v_e_gap_high[__pyx_v_j]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1329
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1330
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -46999,7 +49209,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1330
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1331
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -47016,7 +49226,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_7) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1331
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1332
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1             # <<<<<<<<<<<<<<
@@ -47026,7 +49236,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_v_e_x_gap_low = (__pyx_v_e_x_gap_low - 1);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1332
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1333
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:             # <<<<<<<<<<<<<<
@@ -47043,7 +49253,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_6) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1333
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1334
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:
  *                     e_x_gap_high = e_x_gap_high + 1             # <<<<<<<<<<<<<<
@@ -47056,7 +49266,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     __pyx_L20:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1335
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1336
  *                     e_x_gap_high = e_x_gap_high + 1
  * 
  *             k = 0             # <<<<<<<<<<<<<<
@@ -47065,7 +49275,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_k = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1336
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1337
  * 
  *             k = 0
  *             step = 1+(i*2)             # <<<<<<<<<<<<<<
@@ -47074,7 +49284,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_step = (1 + (__pyx_v_i * 2));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1337
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1338
  *             k = 0
  *             step = 1+(i*2)
  *             while k < len1:             # <<<<<<<<<<<<<<
@@ -47085,7 +49295,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_k < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1338
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1339
  *             step = 1+(i*2)
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -47095,7 +49305,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = (__pyx_v_e_gap_low[__pyx_v_j]);
       for (__pyx_v_m = __pyx_v_e_x_gap_low; __pyx_v_m <= __pyx_t_4; __pyx_v_m++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1339
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1340
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:             # <<<<<<<<<<<<<<
@@ -47105,7 +49315,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_6 = (__pyx_v_m >= (__pyx_v_e_gaps1[((__pyx_v_k + __pyx_v_step) - 1)]));
         if (__pyx_t_6) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1340
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1341
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:             # <<<<<<<<<<<<<<
@@ -47115,7 +49325,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_e_x_gap_high;
           for (__pyx_v_n = (__pyx_v_e_gap_high[__pyx_v_j]); __pyx_v_n <= __pyx_t_5; __pyx_v_n++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1341
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1342
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length             # <<<<<<<<<<<<<<
@@ -47125,7 +49335,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             __pyx_t_6 = ((__pyx_v_n - __pyx_v_m) >= 1);
             if (__pyx_t_6) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1342
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1343
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)             # <<<<<<<<<<<<<<
@@ -47134,7 +49344,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_k), __pyx_v_step);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1343
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1344
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)             # <<<<<<<<<<<<<<
@@ -47143,7 +49353,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (&__pyx_v_m), 1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1344
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1345
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)             # <<<<<<<<<<<<<<
@@ -47160,7 +49370,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_L29:;
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1345
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1346
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step             # <<<<<<<<<<<<<<
@@ -47170,7 +49380,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_k = (__pyx_v_k + __pyx_v_step);
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1346
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1347
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step
  *             free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -47179,7 +49389,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     free(__pyx_v_e_gaps1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1347
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1348
  *                 k = k + step
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -47188,7 +49398,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1348
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1349
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2
  *             len1 = len2             # <<<<<<<<<<<<<<
@@ -47198,7 +49408,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_len1 = __pyx_v_len2;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1350
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1351
  *             len1 = len2
  * 
  *         step = 1+(num_gaps*2)             # <<<<<<<<<<<<<<
@@ -47207,7 +49417,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = (1 + (__pyx_v_num_gaps * 2));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1351
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1352
  * 
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -47216,7 +49426,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1352
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1353
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0             # <<<<<<<<<<<<<<
@@ -47225,7 +49435,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1353
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1354
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:             # <<<<<<<<<<<<<<
@@ -47235,7 +49445,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_x_high;
   for (__pyx_v_i = __pyx_v_e_high; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1354
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1355
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:
  *             j = 0             # <<<<<<<<<<<<<<
@@ -47244,7 +49454,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1355
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1356
  *         for i from e_high <= i <= e_x_high:
  *             j = 0
  *             while j < len1:             # <<<<<<<<<<<<<<
@@ -47255,7 +49465,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_j < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1356
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1357
  *             j = 0
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:             # <<<<<<<<<<<<<<
@@ -47271,7 +49481,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (__pyx_t_2) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1357
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1358
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)             # <<<<<<<<<<<<<<
@@ -47280,7 +49490,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
         __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_j), __pyx_v_step);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1358
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1359
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)             # <<<<<<<<<<<<<<
@@ -47292,7 +49502,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L37:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1359
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1360
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step             # <<<<<<<<<<<<<<
@@ -47303,7 +49513,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1360
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1361
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -47312,7 +49522,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1361
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1362
  *                 j = j + step
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -47321,7 +49531,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1362
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1363
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2
  *         len1 = len2             # <<<<<<<<<<<<<<
@@ -47330,7 +49540,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = __pyx_v_len2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1364
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1365
  *         len1 = len2
  * 
  *         step = (num_gaps+1)*2             # <<<<<<<<<<<<<<
@@ -47339,7 +49549,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = ((__pyx_v_num_gaps + 1) * 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1365
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1366
  * 
  *         step = (num_gaps+1)*2
  *         i = 0             # <<<<<<<<<<<<<<
@@ -47348,7 +49558,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_i = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1367
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1368
  *         i = 0
  * 
  *         while i < len1:             # <<<<<<<<<<<<<<
@@ -47359,7 +49569,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_i < __pyx_v_len1);
     if (!__pyx_t_2) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1368
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1369
  * 
  *         while i < len1:
  *             ephr_arr._clear()             # <<<<<<<<<<<<<<
@@ -47368,7 +49578,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_clear(__pyx_v_ephr_arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1369
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1370
  *         while i < len1:
  *             ephr_arr._clear()
  *             num_chunks = 0             # <<<<<<<<<<<<<<
@@ -47377,20 +49587,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_num_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1370
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1371
  *             ephr_arr._clear()
  *             num_chunks = 0
  *             indexes = []             # <<<<<<<<<<<<<<
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  */
-    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1370; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(((PyObject *)__pyx_v_indexes));
     __pyx_v_indexes = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1371
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1372
  *             num_chunks = 0
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:             # <<<<<<<<<<<<<<
@@ -47400,7 +49610,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_9 = (__pyx_v_num_gaps + 1);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_9; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1372
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1373
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -47410,7 +49620,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = ((__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]) < (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]));
       if (__pyx_t_2) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1373
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1374
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1             # <<<<<<<<<<<<<<
@@ -47422,7 +49632,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L42:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1374
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1375
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -47432,22 +49642,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_3 = (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]);
       for (__pyx_v_k = (__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1375
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1376
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  */
-        if (unlikely(((PyObject *)__pyx_v_indexes) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
-        __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1376
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1377
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])             # <<<<<<<<<<<<<<
@@ -47455,14 +49662,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  */
         __pyx_t_4 = (__pyx_v_self->eda->data->arr[(__pyx_v_e_sent_start + __pyx_v_k)]);
-        __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->eid2symid), __pyx_t_4, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->eid2symid), __pyx_t_4, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_append(__pyx_v_ephr_arr, __pyx_t_4);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1377
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1378
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:             # <<<<<<<<<<<<<<
@@ -47472,22 +49679,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = (__pyx_v_j < __pyx_v_num_gaps);
       if (__pyx_t_2) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1378
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1379
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  */
-        if (unlikely(((PyObject *)__pyx_v_indexes) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
-        __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1379
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1380
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
@@ -47500,7 +49704,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_L45:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1380
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1381
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step             # <<<<<<<<<<<<<<
@@ -47509,7 +49713,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_i = (__pyx_v_i + __pyx_v_step);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1381
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1382
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:             # <<<<<<<<<<<<<<
@@ -47525,30 +49729,30 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1382
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1383
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:
  *                 result.append((Phrase(ephr_arr),indexes))             # <<<<<<<<<<<<<<
  * 
  *         free(e_gaps1)
  */
-      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(((PyObject *)__pyx_v_ephr_arr));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_ephr_arr));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_ephr_arr));
-      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
       __Pyx_GIVEREF(__pyx_t_11);
       __Pyx_INCREF(((PyObject *)__pyx_v_indexes));
       PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_indexes));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_indexes));
       __pyx_t_11 = 0;
-      __pyx_t_11 = __Pyx_PyObject_Append(__pyx_v_result, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = __Pyx_PyObject_Append(__pyx_v_result, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
@@ -47557,7 +49761,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_L46:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1384
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1385
  *                 result.append((Phrase(ephr_arr),indexes))
  * 
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -47566,7 +49770,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1385
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1386
  * 
  *         free(e_gaps1)
  *         free(e_gap_order)             # <<<<<<<<<<<<<<
@@ -47575,7 +49779,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gap_order);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1386
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1387
  *         free(e_gaps1)
  *         free(e_gap_order)
  *         return result             # <<<<<<<<<<<<<<
@@ -47603,7 +49807,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1388
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1389
  *         return result
  * 
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):             # <<<<<<<<<<<<<<
@@ -47611,7 +49815,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         cdef IntList ret = IntList()
  */
 
-static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_sent_links, int __pyx_v_num_links, PyObject *__pyx_v_findexes, PyObject *__pyx_v_eindexes) {
+static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_sent_links, int __pyx_v_num_links, PyObject *__pyx_v_findexes, PyObject *__pyx_v_eindexes) {
   unsigned int __pyx_v_i;
   struct __pyx_obj_3_sa_IntList *__pyx_v_ret = 0;
   PyObject *__pyx_v_s = NULL;
@@ -47629,58 +49833,57 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("create_alignments");
+  __Pyx_RefNannySetupContext("create_alignments", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1390
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1391
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):
  *         cdef unsigned i
  *         cdef IntList ret = IntList()             # <<<<<<<<<<<<<<
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1391
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1392
  *         cdef unsigned i
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):             # <<<<<<<<<<<<<<
  *             s = findexes[i]
  *             if (s<0):
  */
-  __pyx_t_2 = PyObject_Length(__pyx_v_findexes); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_v_findexes); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
     __pyx_v_i = __pyx_t_3;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1392
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1393
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):
  *             s = findexes[i]             # <<<<<<<<<<<<<<
  *             if (s<0):
  *                 continue
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_findexes, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_findexes, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_s);
     __pyx_v_s = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1393
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1394
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  *             if (s<0):             # <<<<<<<<<<<<<<
  *                 continue
  *             idx = 0
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1394
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1395
  *             s = findexes[i]
  *             if (s<0):
  *                 continue             # <<<<<<<<<<<<<<
@@ -47692,7 +49895,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1395
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1396
  *             if (s<0):
  *                 continue
  *             idx = 0             # <<<<<<<<<<<<<<
@@ -47703,7 +49906,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __Pyx_XDECREF(__pyx_v_idx);
     __pyx_v_idx = __pyx_int_0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1396
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1397
  *                 continue
  *             idx = 0
  *             while (idx < num_links*2):             # <<<<<<<<<<<<<<
@@ -47711,53 +49914,51 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
  *                     j = eindexes.index(sent_links[idx+1])
  */
     while (1) {
-      __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (!__pyx_t_4) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1397
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1398
  *             idx = 0
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):             # <<<<<<<<<<<<<<
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  */
-      __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1398
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1399
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])             # <<<<<<<<<<<<<<
  *                     ret.append(i*65536+j)
  *                 idx += 2
  */
-        __pyx_t_1 = PyObject_GetAttr(__pyx_v_eindexes, __pyx_n_s__index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(__pyx_v_eindexes, __pyx_n_s__index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_5 = PyNumber_Add(__pyx_v_idx, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyNumber_Add(__pyx_v_idx, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_7));
+        __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         __pyx_t_5 = 0;
-        __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
@@ -47765,19 +49966,19 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
         __pyx_v_j = __pyx_t_5;
         __pyx_t_5 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1399
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1400
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)             # <<<<<<<<<<<<<<
  *                 idx += 2
  *         return ret
  */
-        __pyx_t_5 = PyInt_FromLong((__pyx_v_i * 65536)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyInt_FromLong((__pyx_v_i * 65536)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_v_j); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_v_j); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_t_5 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_ret), __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_ret), __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -47785,14 +49986,14 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       }
       __pyx_L8:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1400
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1401
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  *                 idx += 2             # <<<<<<<<<<<<<<
  *         return ret
  * 
  */
-      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_idx, __pyx_int_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_idx, __pyx_int_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_v_idx);
       __pyx_v_idx = __pyx_t_5;
@@ -47801,7 +50002,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __pyx_L3_continue:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1401
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1402
  *                     ret.append(i*65536+j)
  *                 idx += 2
  *         return ret             # <<<<<<<<<<<<<<
@@ -47831,7 +50032,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1403
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1404
  *         return ret
  * 
  *     cdef extract(self, Phrase phrase, Matching* matching, int* chunklen, int num_chunks):             # <<<<<<<<<<<<<<
@@ -47871,7 +50072,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_v_f_sent_end;
   int __pyx_v_e_sent_len;
   int __pyx_v_f_sent_len;
-  int __pyx_v_e_word_count;
+  CYTHON_UNUSED int __pyx_v_e_word_count;
   int __pyx_v_f_x_low;
   int __pyx_v_f_x_high;
   int __pyx_v_e_x_low;
@@ -47882,7 +50083,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   PyObject *__pyx_v_phrase_list = 0;
   struct __pyx_obj_3_sa_IntList *__pyx_v_fphr_arr = 0;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_fphr = 0;
-  PyObject *__pyx_v_reason_for_failure = 0;
+  CYTHON_UNUSED PyObject *__pyx_v_reason_for_failure = 0;
   PyObject *__pyx_v_sofar = NULL;
   PyObject *__pyx_v_als = NULL;
   PyObject *__pyx_v_al = NULL;
@@ -47923,21 +50124,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extract");
+  __Pyx_RefNannySetupContext("extract", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1416
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1417
  *         cdef reason_for_failure
  * 
  *         fphr_arr = IntList()             # <<<<<<<<<<<<<<
  *         phrase_len = phrase.n
  *         extracts = []
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_fphr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1417
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1418
  * 
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n             # <<<<<<<<<<<<<<
@@ -47946,19 +50147,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_phrase_len = __pyx_v_phrase->n;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1418
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1419
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n
  *         extracts = []             # <<<<<<<<<<<<<<
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_extracts = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1419
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1420
  *         phrase_len = phrase.n
  *         extracts = []
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -47967,7 +50168,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_sent_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->alignment->__pyx_vtab)->_get_sent_links(__pyx_v_self->alignment, __pyx_v_matching->sent_id, (&__pyx_v_num_links));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1421
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1422
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -47976,7 +50177,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_start = (__pyx_v_self->eda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1422
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1423
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -47985,7 +50186,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_end = (__pyx_v_self->eda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1423
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1424
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1             # <<<<<<<<<<<<<<
@@ -47994,7 +50195,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_len = ((__pyx_v_e_sent_end - __pyx_v_e_sent_start) - 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1424
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1425
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -48003,7 +50204,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_start = (__pyx_v_self->fda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1425
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1426
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -48012,7 +50213,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_end = (__pyx_v_self->fda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1426
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1427
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]
  *         f_sent_len = f_sent_end - f_sent_start - 1             # <<<<<<<<<<<<<<
@@ -48021,21 +50222,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_len = ((__pyx_v_f_sent_end - __pyx_v_f_sent_start) - 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1428
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1429
  *         f_sent_len = f_sent_end - f_sent_start - 1
  * 
  *         self.findexes1.reset()             # <<<<<<<<<<<<<<
  *         sofar = 0
  *         for i in range(num_chunks):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes1), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes1), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1429
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1430
  * 
  *         self.findexes1.reset()
  *         sofar = 0             # <<<<<<<<<<<<<<
@@ -48045,7 +50246,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_sofar = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1430
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1431
  *         self.findexes1.reset()
  *         sofar = 0
  *         for i in range(num_chunks):             # <<<<<<<<<<<<<<
@@ -48056,7 +50257,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1431
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1432
  *         sofar = 0
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):             # <<<<<<<<<<<<<<
@@ -48067,35 +50268,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_v_j = __pyx_t_6;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1432
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1433
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);             # <<<<<<<<<<<<<<
  *                 sofar += 1
  *             if (i+1<num_chunks):
  */
-      __pyx_t_2 = PyInt_FromLong((((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong((((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1433
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1434
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1             # <<<<<<<<<<<<<<
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  */
-      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_1;
       __pyx_t_1 = 0;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1434
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1435
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1
  *             if (i+1<num_chunks):             # <<<<<<<<<<<<<<
@@ -48105,28 +50306,28 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = ((__pyx_v_i + 1) < __pyx_v_num_chunks);
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1435
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1436
  *                 sofar += 1
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])             # <<<<<<<<<<<<<<
  *                 sofar += 1
  * 
  */
-      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_phrase), __pyx_v_sofar); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_phrase), __pyx_v_sofar); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1436
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1437
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  *                 sofar += 1             # <<<<<<<<<<<<<<
  * 
  * 
  */
-      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_2;
@@ -48136,7 +50337,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_L7:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1439
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1440
  * 
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48145,7 +50346,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_low = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1440
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1441
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48154,7 +50355,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_high = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1441
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1442
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48163,7 +50364,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_low = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1442
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1443
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48172,7 +50373,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_high = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1443
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1444
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48181,7 +50382,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1444
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1445
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48190,7 +50391,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1445
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1446
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48199,7 +50400,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1446
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1447
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48208,7 +50409,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1447
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1448
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48217,7 +50418,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1448
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1449
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48226,7 +50427,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1449
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1450
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48235,7 +50436,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1450
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1451
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48244,7 +50445,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1452
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1453
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))
  * 
  *         reason_for_failure = ""             # <<<<<<<<<<<<<<
@@ -48254,7 +50455,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_45);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1454
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1455
  *         reason_for_failure = ""
  * 
  *         for i from 0 <= i < e_sent_len:             # <<<<<<<<<<<<<<
@@ -48264,7 +50465,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_e_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1455
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1456
  * 
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -48273,7 +50474,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_e_links_low[__pyx_v_i]) = -1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1456
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1457
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -48283,7 +50484,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_e_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1457
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1458
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:             # <<<<<<<<<<<<<<
@@ -48293,7 +50494,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_f_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1458
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1459
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -48302,7 +50503,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_f_links_low[__pyx_v_i]) = -1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1459
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1460
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1
  *             f_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -48312,7 +50513,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_f_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1465
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1466
  *         # links that we care about (but then how to look up
  *         # when we want to check something on the e side?)
  *         i = 0             # <<<<<<<<<<<<<<
@@ -48321,7 +50522,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1466
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1467
  *         # when we want to check something on the e side?)
  *         i = 0
  *         while i < num_links*2:             # <<<<<<<<<<<<<<
@@ -48332,7 +50533,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = (__pyx_v_i < (__pyx_v_num_links * 2));
     if (!__pyx_t_7) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1467
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1468
  *         i = 0
  *         while i < num_links*2:
  *             f_i = sent_links[i]             # <<<<<<<<<<<<<<
@@ -48341,7 +50542,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_f_i = (__pyx_v_sent_links[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1468
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1469
  *         while i < num_links*2:
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]             # <<<<<<<<<<<<<<
@@ -48350,7 +50551,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_e_i = (__pyx_v_sent_links[(__pyx_v_i + 1)]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1469
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1470
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:             # <<<<<<<<<<<<<<
@@ -48366,7 +50567,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1470
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1471
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i             # <<<<<<<<<<<<<<
@@ -48378,7 +50579,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1471
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1472
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:             # <<<<<<<<<<<<<<
@@ -48394,7 +50595,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_8) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1472
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1473
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1             # <<<<<<<<<<<<<<
@@ -48406,7 +50607,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1473
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1474
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:             # <<<<<<<<<<<<<<
@@ -48422,7 +50623,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1474
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1475
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i             # <<<<<<<<<<<<<<
@@ -48434,7 +50635,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1475
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1476
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:             # <<<<<<<<<<<<<<
@@ -48450,7 +50651,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1476
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1477
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1             # <<<<<<<<<<<<<<
@@ -48462,7 +50663,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1477
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1478
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1
  *             i = i + 2             # <<<<<<<<<<<<<<
@@ -48472,19 +50673,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + 2);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1479
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1480
  *             i = i + 2
  * 
  *         als = []             # <<<<<<<<<<<<<<
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  */
-  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_als = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1480
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1481
  * 
  *         als = []
  *         for x in range(matching.start,matching.end):             # <<<<<<<<<<<<<<
@@ -48495,19 +50696,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = __pyx_v_matching->start; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_x = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1481
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1482
  *         als = []
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])             # <<<<<<<<<<<<<<
  *             als.append(al)
  *         # check all source-side alignment constraints
  */
-    __pyx_t_2 = PyInt_FromLong(((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_10);
     PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
@@ -48518,20 +50719,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_al = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1482
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1483
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  *             als.append(al)             # <<<<<<<<<<<<<<
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  */
-    if (unlikely(((PyObject *)__pyx_v_als) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1484
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1485
  *             als.append(al)
  *         # check all source-side alignment constraints
  *         met_constraints = 1             # <<<<<<<<<<<<<<
@@ -48540,7 +50738,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_met_constraints = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1485
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1486
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  *         if self.require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -48549,7 +50747,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_self->require_aligned_terminal) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1486
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1487
  *         met_constraints = 1
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -48558,7 +50756,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_num_aligned_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1487
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1488
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:             # <<<<<<<<<<<<<<
@@ -48568,7 +50766,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_3 = __pyx_v_num_chunks;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1488
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1489
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:             # <<<<<<<<<<<<<<
@@ -48578,7 +50776,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_chunklen[__pyx_v_i]);
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1489
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1490
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:             # <<<<<<<<<<<<<<
@@ -48588,7 +50786,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_9 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)]) > -1);
         if (__pyx_t_9) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1490
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1491
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1             # <<<<<<<<<<<<<<
@@ -48597,7 +50795,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_num_aligned_chunks = (__pyx_v_num_aligned_chunks + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1491
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1492
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break             # <<<<<<<<<<<<<<
@@ -48612,7 +50810,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_L24_break:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1492
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1493
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break
  *             if num_aligned_chunks == 0:             # <<<<<<<<<<<<<<
@@ -48622,18 +50820,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_9 = (__pyx_v_num_aligned_chunks == 0);
     if (__pyx_t_9) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1493
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1494
  *                         break
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"             # <<<<<<<<<<<<<<
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  */
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_126));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_127));
       __Pyx_DECREF(__pyx_v_reason_for_failure);
-      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_126);
+      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_127);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1494
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1495
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48645,7 +50843,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L26:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1495
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1496
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:             # <<<<<<<<<<<<<<
@@ -48660,18 +50858,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1496
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1497
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"             # <<<<<<<<<<<<<<
  *                 met_constraints = 0
  * 
  */
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_127));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_128));
       __Pyx_DECREF(__pyx_v_reason_for_failure);
-      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_127);
+      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1497
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1498
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48686,7 +50884,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L20:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1499
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1500
  *                 met_constraints = 0
  * 
  *         if met_constraints and self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -48700,7 +50898,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1501
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1502
  *         if met_constraints and self.tight_phrases:
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:             # <<<<<<<<<<<<<<
@@ -48710,7 +50908,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_12 = (__pyx_v_num_chunks - 1);
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1502
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1503
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -48720,18 +50918,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1503
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1504
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
  *                     met_constraints = 0
  *                     break
  */
-        __Pyx_INCREF(((PyObject *)__pyx_kp_s_128));
+        __Pyx_INCREF(((PyObject *)__pyx_kp_s_129));
         __Pyx_DECREF(__pyx_v_reason_for_failure);
-        __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
+        __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_129);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1504
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1505
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48740,7 +50938,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1505
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1506
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -48752,7 +50950,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L31:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1506
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1507
  *                     met_constraints = 0
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -48762,18 +50960,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - 1) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1507
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1508
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
  *                     met_constraints = 0
  *                     break
  */
-        __Pyx_INCREF(((PyObject *)__pyx_kp_s_128));
+        __Pyx_INCREF(((PyObject *)__pyx_kp_s_129));
         __Pyx_DECREF(__pyx_v_reason_for_failure);
-        __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
+        __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_129);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1508
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1509
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48782,7 +50980,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1509
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1510
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -48799,7 +50997,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L28:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1511
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1512
  *                     break
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start             # <<<<<<<<<<<<<<
@@ -48808,7 +51006,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_low = ((__pyx_v_matching->arr[__pyx_v_matching->start]) - __pyx_v_f_sent_start);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1512
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1513
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -48817,7 +51015,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_high = (((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_matching->size) - 1)]) + (__pyx_v_chunklen[(__pyx_v_num_chunks - 1)])) - __pyx_v_f_sent_start);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1513
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1514
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start
  *         if met_constraints:             # <<<<<<<<<<<<<<
@@ -48826,17 +51024,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_met_constraints) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1515
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1516
  *         if met_constraints:
  * 
  *             if self.find_fixpoint(f_low, f_high, f_links_low, f_links_high, e_links_low, e_links_high,             # <<<<<<<<<<<<<<
  *                                 -1, -1, &e_low, &e_high, &f_back_low, &f_back_high, f_sent_len, e_sent_len,
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  */
-    __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1519
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1520
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):             # <<<<<<<<<<<<<<
@@ -48847,7 +51045,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1520
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1521
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0             # <<<<<<<<<<<<<<
@@ -48856,7 +51054,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_gap_error = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1521
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1522
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0
  *                 num_gaps = 0             # <<<<<<<<<<<<<<
@@ -48865,7 +51063,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_num_gaps = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1523
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1524
  *                 num_gaps = 0
  * 
  *                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -48875,7 +51073,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1524
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1525
  * 
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low             # <<<<<<<<<<<<<<
@@ -48884,7 +51082,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[0]) = __pyx_v_f_back_low;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1525
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1526
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low             # <<<<<<<<<<<<<<
@@ -48893,7 +51091,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[0]) = __pyx_v_f_low;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1526
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1527
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1             # <<<<<<<<<<<<<<
@@ -48902,7 +51100,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1527
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1528
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1
  *                     gap_start = 0             # <<<<<<<<<<<<<<
@@ -48911,7 +51109,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1528
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1529
  *                     num_gaps = 1
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -48920,7 +51118,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1529
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1530
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -48930,7 +51128,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1530
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1531
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -48942,7 +51140,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L36:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1531
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1532
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -48951,7 +51149,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1532
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1533
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -48967,7 +51165,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1533
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1534
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -48976,16 +51174,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1534
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1535
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"             # <<<<<<<<<<<<<<
  *                 else:
  *                     gap_start = 1
  */
-            __Pyx_INCREF(((PyObject *)__pyx_kp_s_129));
+            __Pyx_INCREF(((PyObject *)__pyx_kp_s_130));
             __Pyx_DECREF(__pyx_v_reason_for_failure);
-            __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_129);
+            __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_130);
             goto __pyx_L38;
           }
           __pyx_L38:;
@@ -48996,7 +51194,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1536
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1537
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"
  *                 else:
  *                     gap_start = 1             # <<<<<<<<<<<<<<
@@ -49005,7 +51203,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1537
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1538
  *                 else:
  *                     gap_start = 1
  *                     if self.tight_phrases and f_links_low[f_low] == -1:             # <<<<<<<<<<<<<<
@@ -49020,7 +51218,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1540
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1541
  *                         # this is not a hard error.    we can't extract this phrase
  *                         # but we still might be able to extract a superphrase
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -49034,7 +51232,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L35:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1542
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1543
  *                         met_constraints = 0
  * 
  *                 for i from 0 <= i < matching.size - 1:             # <<<<<<<<<<<<<<
@@ -49044,7 +51242,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_12 = (__pyx_v_matching->size - 1);
       for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1543
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1544
  * 
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start             # <<<<<<<<<<<<<<
@@ -49053,7 +51251,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(1 + __pyx_v_i)]) = (((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1544
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1545
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -49062,7 +51260,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(1 + __pyx_v_i)]) = ((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - __pyx_v_f_sent_start);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1545
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1546
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -49072,7 +51270,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1547
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1548
  *                     num_gaps = num_gaps + 1
  * 
  *                 if f_high < f_back_high:             # <<<<<<<<<<<<<<
@@ -49082,7 +51280,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_high < __pyx_v_f_back_high);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1548
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1549
  * 
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high             # <<<<<<<<<<<<<<
@@ -49091,7 +51289,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_high;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1549
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1550
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high             # <<<<<<<<<<<<<<
@@ -49100,7 +51298,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_back_high;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1550
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1551
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -49109,7 +51307,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1551
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1552
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -49118,7 +51316,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1552
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1553
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -49128,7 +51326,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1553
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1554
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -49140,7 +51338,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L43:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1554
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1555
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -49149,7 +51347,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1555
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1556
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:             # <<<<<<<<<<<<<<
@@ -49165,7 +51363,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1556
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1557
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -49174,16 +51372,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1557
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1558
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"             # <<<<<<<<<<<<<<
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:
  */
-            __Pyx_INCREF(((PyObject *)__pyx_kp_s_130));
+            __Pyx_INCREF(((PyObject *)__pyx_kp_s_131));
             __Pyx_DECREF(__pyx_v_reason_for_failure);
-            __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_130);
+            __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_131);
             goto __pyx_L45;
           }
           __pyx_L45:;
@@ -49194,7 +51392,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1559
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1560
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -49209,7 +51407,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1560
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1561
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -49223,7 +51421,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L42:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1562
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1563
  *                         met_constraints = 0
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -49233,7 +51431,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1563
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1564
  * 
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low             # <<<<<<<<<<<<<<
@@ -49242,7 +51440,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_e_word_count = (__pyx_v_e_high - __pyx_v_e_low);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1564
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1565
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases             # <<<<<<<<<<<<<<
@@ -49252,17 +51450,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_num_gaps;
         for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1565
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1566
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases
  *                         if self.find_fixpoint(f_gap_low[gap_start+i], f_gap_high[gap_start+i],             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low+gap_start+i, e_gap_high+gap_start+i,
  */
-          __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1565; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1566; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1570
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1571
  *                                             f_gap_low+gap_start+i, f_gap_high+gap_start+i,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -49273,7 +51471,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1572
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1573
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -49282,33 +51480,33 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1573
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1574
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])             # <<<<<<<<<<<<<<
  *                             break
  * 
  */
-            __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1574; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1574; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1574; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_10 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_131), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1574; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
             __pyx_v_reason_for_failure = ((PyObject *)__pyx_t_1);
             __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1574
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1575
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])
  *                             break             # <<<<<<<<<<<<<<
@@ -49325,7 +51523,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L47:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1576
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1577
  *                             break
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -49335,7 +51533,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1577
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1578
  * 
  *                 if gap_error == 0:
  *                     i = 1             # <<<<<<<<<<<<<<
@@ -49344,21 +51542,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_i = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1578
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1579
  *                 if gap_error == 0:
  *                     i = 1
  *                     self.findexes.reset()             # <<<<<<<<<<<<<<
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  */
-        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1579; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1579; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1579
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1580
  *                     i = 1
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -49368,7 +51566,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1580
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1581
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49377,7 +51575,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1581
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1582
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1             # <<<<<<<<<<<<<<
@@ -49386,16 +51584,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_i = (__pyx_v_i + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1582
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1583
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1582; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1582; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -49403,27 +51601,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L52:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1583
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1584
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  */
-        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->findexes1));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-        __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1584
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1585
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -49433,7 +51631,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_phrase->n;
         for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1585
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1586
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -49443,7 +51641,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
           if (__pyx_t_4) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1586
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1587
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49452,7 +51650,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1587
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1588
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))
  *                             i = i + 1             # <<<<<<<<<<<<<<
@@ -49464,7 +51662,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1589
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1590
  *                             i = i + 1
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -49476,7 +51674,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_L55:;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1590
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1591
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -49486,7 +51684,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_high > __pyx_v_f_high);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1591
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1592
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49495,16 +51693,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1592
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1593
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  * 
  *                     fphr = Phrase(fphr_arr)
  */
-          __pyx_t_10 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1593; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1593; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -49512,25 +51710,25 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L56:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1594
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1595
  *                         self.findexes.append(sym_setindex(self.category, i))
  * 
  *                     fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                     if met_constraints:
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  */
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_fphr_arr));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-        __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_10);
         __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1595
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1596
  * 
  *                     fphr = Phrase(fphr_arr)
  *                     if met_constraints:             # <<<<<<<<<<<<<<
@@ -49539,47 +51737,47 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_met_constraints) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1598
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1599
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)
  */
-          __pyx_t_10 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_low, __pyx_v_e_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, __pyx_v_num_gaps, __pyx_v_f_back_low, __pyx_v_f_back_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1596; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_low, __pyx_v_e_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, __pyx_v_num_gaps, __pyx_v_f_back_low, __pyx_v_f_back_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_v_phrase_list = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1599
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1600
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  */
-          __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_7 = (__pyx_t_13 > 0);
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1600
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1601
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                         else:
  *                             pair_count = 0
  */
-            __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (unlikely(__pyx_t_13 == 0)) {
               PyErr_Format(PyExc_ZeroDivisionError, "float division");
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             __pyx_v_pair_count = (1.0 / __pyx_t_13);
             goto __pyx_L58;
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1602
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1603
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  *                             pair_count = 0             # <<<<<<<<<<<<<<
@@ -49588,23 +51786,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_pair_count = 0.0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1603
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1604
  *                         else:
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  */
-            __pyx_t_10 = PyInt_FromLong(__pyx_v_f_back_low); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_v_f_back_low); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyInt_FromLong(__pyx_v_e_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromLong(__pyx_v_e_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
@@ -49617,7 +51815,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
             __pyx_t_14 = 0;
-            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_133), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_14));
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
@@ -49626,7 +51824,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L58:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1604
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1605
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:             # <<<<<<<<<<<<<<
@@ -49637,23 +51835,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_14 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_14); __pyx_t_13 = 0;
             __pyx_t_16 = NULL;
           } else {
-            __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
             __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_14)) {
+            if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
-            } else if (PyTuple_CheckExact(__pyx_t_14)) {
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
+            } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
             } else {
               __pyx_t_15 = __pyx_t_16(__pyx_t_14);
               if (unlikely(!__pyx_t_15)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -49661,29 +51867,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
               PyObject* sequence = __pyx_t_15;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 2)) {
+                if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                  if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
                 __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                  if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
                 __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
               }
               __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_2);
+              #else
+              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-            } else {
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -49691,14 +51903,15 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_GOTREF(__pyx_t_1);
               index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L61_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_2);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               goto __pyx_L62_unpacking_done;
               __pyx_L61_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_17 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L62_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_phrase2);
@@ -49708,7 +51921,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_eindexes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1605
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1606
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -49717,32 +51930,32 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_t_15 = ((PyObject *)__pyx_v_self->findexes);
             __Pyx_INCREF(__pyx_t_15);
-            __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             __Pyx_XDECREF(((PyObject *)__pyx_v_als1));
             __pyx_v_als1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
             __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1606
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1607
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))             # <<<<<<<<<<<<<<
  * 
  *                     if (num_gaps < self.max_nonterminals and
  */
-            __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_als1));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als1));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_als1));
-            __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -49755,7 +51968,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -49765,7 +51978,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L57:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1608
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1609
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))
  * 
  *                     if (num_gaps < self.max_nonterminals and             # <<<<<<<<<<<<<<
@@ -49775,7 +51988,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_num_gaps < __pyx_v_self->max_nonterminals);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1609
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1610
  * 
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and             # <<<<<<<<<<<<<<
@@ -49785,7 +51998,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_phrase_len < __pyx_v_self->max_length);
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1610
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1611
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):             # <<<<<<<<<<<<<<
@@ -49803,7 +52016,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_9) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1611
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1612
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -49813,7 +52026,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_low == __pyx_v_f_low);
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1612
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1613
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -49823,7 +52036,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1613
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1614
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):             # <<<<<<<<<<<<<<
@@ -49853,7 +52066,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1614
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1615
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -49862,7 +52075,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1615
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1616
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -49871,7 +52084,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1616
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1617
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -49880,7 +52093,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1617
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1618
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -49897,7 +52110,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1618
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1619
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -49910,7 +52123,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L65:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1619
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1620
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -49926,7 +52139,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1620
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1621
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -49938,7 +52151,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L68:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1622
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1623
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -49947,17 +52160,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1623
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1624
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_back_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1627
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1628
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -49967,7 +52180,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_14, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 1, 0, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1629
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1630
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and             # <<<<<<<<<<<<<<
@@ -49983,17 +52196,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1630
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1631
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and
  *                                 self.find_fixpoint(f_x_low, f_low,    # check integrity of new subphrase             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  */
-                  __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1630; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1631; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_1);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1634
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1635
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -50016,7 +52229,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1636
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1637
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -50025,7 +52238,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1637
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1638
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -50034,35 +52247,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1638
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1639
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_1 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1638; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1639
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1640
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1639; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1640
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1641
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50071,7 +52284,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1641
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1642
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -50080,27 +52293,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1642
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1643
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1643
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1644
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -50110,7 +52323,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1644
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1645
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -50120,7 +52333,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1645
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1646
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50129,7 +52342,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1646
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1647
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -50141,7 +52354,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1648
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1649
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -50153,7 +52366,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L72:;
               }
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1649
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1650
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -50163,7 +52376,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_high > __pyx_v_f_high);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1650
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1651
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50172,16 +52385,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1651
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1652
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  */
-                __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1651; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1651; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -50189,67 +52402,67 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L73:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1652
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1653
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  */
-              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1652; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_15);
               __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1655
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1656
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_15 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_15;
               __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1656
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1657
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1657; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1657
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1658
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1657; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1658; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1657; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1658; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L74;
               }
               /*else*/ {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1659
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1660
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -50260,7 +52473,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L74:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1660
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1661
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -50271,23 +52484,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_15 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_15); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __pyx_t_16 = Py_TYPE(__pyx_t_15)->tp_iternext;
               }
               for (;;) {
-                if (PyList_CheckExact(__pyx_t_15)) {
+                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_15)) break;
-                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
-                } else if (PyTuple_CheckExact(__pyx_t_15)) {
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
-                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                 } else {
                   __pyx_t_1 = __pyx_t_16(__pyx_t_15);
                   if (unlikely(!__pyx_t_1)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -50295,29 +52516,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
                   PyObject* sequence = __pyx_t_1;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_14 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_14 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_14);
                   __Pyx_INCREF(__pyx_t_2);
+                  #else
+                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-                } else {
+                } else
+                {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -50325,14 +52552,15 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_14);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L77_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L78_unpacking_done;
                   __pyx_L77_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L78_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -50342,7 +52570,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1661
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1662
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -50351,32 +52579,32 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_1 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_1);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_1, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_1, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als2));
                 __pyx_v_als2 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1662
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1663
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))             # <<<<<<<<<<<<<<
  * 
  *                         if (f_back_high == f_high and
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+                __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als2));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_als2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als2));
-                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-                __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+                __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -50389,7 +52617,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_t_2 = 0;
                 __pyx_t_14 = 0;
-                __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
@@ -50402,7 +52630,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L64:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1664
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1665
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))
  * 
  *                         if (f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -50412,7 +52640,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_high == __pyx_v_f_high);
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1665
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1666
  * 
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -50422,7 +52650,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_f_sent_len - __pyx_v_f_high) >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1666
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1667
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):             # <<<<<<<<<<<<<<
@@ -50452,7 +52680,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1667
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1668
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -50461,7 +52689,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1668
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1669
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -50470,7 +52698,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1669
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1670
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -50479,7 +52707,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1670
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1671
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -50496,7 +52724,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1671
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1672
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -50509,7 +52737,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L80:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1672
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1673
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -50525,7 +52753,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1673
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1674
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -50537,7 +52765,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L83:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1675
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1676
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -50546,17 +52774,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1676
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1677
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_back_low, f_x_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1677; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1680
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1681
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -50566,7 +52794,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_back_low, __pyx_t_15, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 0, 1, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1682
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1683
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and             # <<<<<<<<<<<<<<
@@ -50582,17 +52810,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1683
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1684
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low+gap_start+num_gaps, e_gap_high+gap_start+num_gaps,
  */
-                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1683; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_14);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1688
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1689
  *                                             f_gap_low+gap_start+num_gaps, f_gap_high+gap_start+num_gaps,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -50615,7 +52843,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1690
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1691
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -50624,7 +52852,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1691
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1692
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -50633,21 +52861,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1692
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1693
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1692; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1693; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1692; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1693; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1693
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1694
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -50657,7 +52885,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_low < __pyx_v_f_low);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1694
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1695
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50666,7 +52894,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1695
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1696
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1             # <<<<<<<<<<<<<<
@@ -50675,16 +52903,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_v_i = (__pyx_v_i + 1);
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1696
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1697
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  */
-                __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1696; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1696; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -50692,27 +52920,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L85:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1697
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1698
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1698; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1698; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1698; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1698
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1699
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -50722,7 +52950,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1699
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1700
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -50732,7 +52960,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1700
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1701
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50741,7 +52969,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1701
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1702
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -50753,7 +52981,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1703
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1704
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -50765,7 +52993,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L88:;
               }
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1704
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1705
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50774,81 +53002,81 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1705
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1706
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1705; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1706; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1705; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1706; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1706
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1707
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  */
-              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1706; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1706; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
               __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1709
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1710
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_1;
               __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1710
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1711
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1711
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1712
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L89;
               }
               /*else*/ {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1713
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1714
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -50859,7 +53087,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L89:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1714
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1715
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -50870,23 +53098,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_1 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_1); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __pyx_t_16 = Py_TYPE(__pyx_t_1)->tp_iternext;
               }
               for (;;) {
-                if (PyList_CheckExact(__pyx_t_1)) {
+                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_1)) break;
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
-                } else if (PyTuple_CheckExact(__pyx_t_1)) {
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                 } else {
                   __pyx_t_14 = __pyx_t_16(__pyx_t_1);
                   if (unlikely(!__pyx_t_14)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -50894,29 +53130,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_14))) || (PyList_CheckExact(__pyx_t_14))) {
                   PyObject* sequence = __pyx_t_14;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_15);
                   __Pyx_INCREF(__pyx_t_2);
+                  #else
+                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                } else {
+                } else
+                {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -50924,14 +53166,15 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_15);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L92_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L93_unpacking_done;
                   __pyx_L92_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L93_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -50941,7 +53184,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1715
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1716
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -50950,32 +53193,32 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_14 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_14);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_14, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_14, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als3));
                 __pyx_v_als3 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1716
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1717
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))             # <<<<<<<<<<<<<<
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als3));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_als3));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als3));
-                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+                __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -50988,7 +53231,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_15);
                 __pyx_t_2 = 0;
                 __pyx_t_15 = 0;
-                __pyx_t_15 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -51001,7 +53244,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L79:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1717
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1718
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and             # <<<<<<<<<<<<<<
@@ -51011,7 +53254,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_num_gaps < (__pyx_v_self->max_nonterminals - 1));
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1718
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1719
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and             # <<<<<<<<<<<<<<
@@ -51021,7 +53264,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_phrase_len + 1) < __pyx_v_self->max_length);
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1719
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1720
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -51031,7 +53274,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_18 = (__pyx_v_f_back_high == __pyx_v_f_high);
               if (__pyx_t_18) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1720
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1721
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -51041,7 +53284,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_8 = (__pyx_v_f_back_low == __pyx_v_f_low);
                 if (__pyx_t_8) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1721
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1722
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
@@ -51051,7 +53294,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_19 = (((__pyx_v_f_back_high - __pyx_v_f_back_low) + (2 * __pyx_v_self->train_min_gap_size)) <= __pyx_v_self->train_max_initial_size);
                   if (__pyx_t_19) {
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1722
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1723
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -51061,7 +53304,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                     __pyx_t_20 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
                     if (__pyx_t_20) {
 
-                      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1723
+                      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1724
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -51071,7 +53314,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                       __pyx_t_21 = (__pyx_v_f_high <= (__pyx_v_f_sent_len - __pyx_v_self->train_min_gap_size));
                       if (__pyx_t_21) {
 
-                        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1724
+                        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1725
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):             # <<<<<<<<<<<<<<
@@ -51121,7 +53364,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1726
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1727
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):
  * 
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -51130,7 +53373,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1727
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1728
  * 
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -51139,7 +53382,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1728
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1729
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -51148,7 +53391,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1729
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1730
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -51165,7 +53408,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1730
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1731
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -51178,7 +53421,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L95:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1731
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1732
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:             # <<<<<<<<<<<<<<
@@ -51188,7 +53431,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_18 = (__pyx_v_f_x_low < 0);
             if (__pyx_t_18) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1732
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1733
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -51200,7 +53443,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L98:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1734
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1735
  *                                 met_constraints = 0
  * 
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -51209,7 +53452,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1735
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1736
  * 
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -51218,7 +53461,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1736
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1737
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -51235,7 +53478,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_9) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1737
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1738
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -51248,7 +53491,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L99:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1738
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1739
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -51264,7 +53507,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1739
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1740
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -51276,7 +53519,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L102:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1741
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1742
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -51285,17 +53528,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1742
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1743
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_x_high,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1746
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1747
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -51305,7 +53548,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 2, 1, 1, 1, 1)) {
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1748
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1749
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and             # <<<<<<<<<<<<<<
@@ -51327,17 +53570,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_9) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1749
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1750
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and
  *                                 self.find_fixpoint(f_x_low, f_low,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  */
-                  __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1749; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1750; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_15);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1753
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1754
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -51348,17 +53591,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   if (__pyx_t_3) {
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1755
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1756
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 -1, -1, e_gap_low+1+num_gaps, e_gap_high+1+num_gaps,
  */
-                    __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1755; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1756; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     __Pyx_GOTREF(__pyx_t_15);
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1760
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1761
  *                                                 f_gap_low+1+num_gaps, f_gap_high+1+num_gaps,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -51386,7 +53629,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_8) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1762
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1763
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -51395,7 +53638,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1763
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1764
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -51404,35 +53647,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1764
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1765
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1764; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1764; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1765
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1766
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  */
-              __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1766
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1767
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51441,7 +53684,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1767
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1768
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -51450,27 +53693,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1768
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1769
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_14 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1769
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1770
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -51480,7 +53723,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1770
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1771
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -51490,7 +53733,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1771
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1772
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51499,7 +53742,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1772
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1773
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -51511,7 +53754,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1774
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1775
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -51523,7 +53766,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L106:;
               }
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1775
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1776
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51532,81 +53775,81 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1776
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1777
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  */
-              __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1776; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1776; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1777
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1778
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  */
-              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_14);
               __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1780
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1781
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_14 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 2), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 2), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1781
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1782
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_8 = (__pyx_t_13 > 0);
               if (__pyx_t_8) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1782
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1783
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L107;
               }
               /*else*/ {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1784
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1785
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -51617,7 +53860,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L107:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1785
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1786
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -51628,23 +53871,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_14 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_14); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
               }
               for (;;) {
-                if (PyList_CheckExact(__pyx_t_14)) {
+                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
-                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
-                } else if (PyTuple_CheckExact(__pyx_t_14)) {
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                 } else {
                   __pyx_t_15 = __pyx_t_16(__pyx_t_14);
                   if (unlikely(!__pyx_t_15)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -51652,29 +53903,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
                   PyObject* sequence = __pyx_t_15;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_1);
                   __Pyx_INCREF(__pyx_t_2);
+                  #else
+                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                } else {
+                } else
+                {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -51682,14 +53939,15 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_1);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L110_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L111_unpacking_done;
                   __pyx_L110_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L111_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -51699,7 +53957,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1786
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1787
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -51708,32 +53966,32 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_15 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_15);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als4));
                 __pyx_v_als4 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1787
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1788
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))             # <<<<<<<<<<<<<<
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als4));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als4));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als4));
-                __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+                __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -51746,7 +54004,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_1);
                 __pyx_t_2 = 0;
                 __pyx_t_1 = 0;
-                __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -51768,23 +54026,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1789
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1790
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"             # <<<<<<<<<<<<<<
  * 
  *         free(sent_links)
  */
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_133));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_134));
       __Pyx_DECREF(__pyx_v_reason_for_failure);
-      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_133);
+      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_134);
     }
     __pyx_L34:;
     goto __pyx_L33;
   }
   __pyx_L33:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1791
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1792
  *                 reason_for_failure = "Unable to extract basic phrase"
  * 
  *         free(sent_links)             # <<<<<<<<<<<<<<
@@ -51793,7 +54051,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_sent_links);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1792
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1793
  * 
  *         free(sent_links)
  *         free(f_links_low)             # <<<<<<<<<<<<<<
@@ -51802,7 +54060,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1793
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1794
  *         free(sent_links)
  *         free(f_links_low)
  *         free(f_links_high)             # <<<<<<<<<<<<<<
@@ -51811,7 +54069,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1794
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1795
  *         free(f_links_low)
  *         free(f_links_high)
  *         free(e_links_low)             # <<<<<<<<<<<<<<
@@ -51820,7 +54078,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1795
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1796
  *         free(f_links_high)
  *         free(e_links_low)
  *         free(e_links_high)             # <<<<<<<<<<<<<<
@@ -51829,7 +54087,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1796
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1797
  *         free(e_links_low)
  *         free(e_links_high)
  *         free(f_gap_low)             # <<<<<<<<<<<<<<
@@ -51838,7 +54096,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1797
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1798
  *         free(e_links_high)
  *         free(f_gap_low)
  *         free(f_gap_high)             # <<<<<<<<<<<<<<
@@ -51847,7 +54105,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1798
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1799
  *         free(f_gap_low)
  *         free(f_gap_high)
  *         free(e_gap_low)             # <<<<<<<<<<<<<<
@@ -51856,7 +54114,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1799
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1800
  *         free(f_gap_high)
  *         free(e_gap_low)
  *         free(e_gap_high)             # <<<<<<<<<<<<<<
@@ -51865,7 +54123,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1801
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1802
  *         free(e_gap_high)
  * 
  *         return extracts             # <<<<<<<<<<<<<<
@@ -51905,7 +54163,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":7
+/* Python wrapper */
+static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector___cinit__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":7
  * 
  * cdef class FeatureVector:
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -51913,8 +54185,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
  */
 
-static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -51923,12 +54194,9 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":8
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":8
  * cdef class FeatureVector:
  *     def __cinit__(self):
  *         self.names = IntList(INITIAL_CAPACITY, INCREMENT)             # <<<<<<<<<<<<<<
@@ -51940,7 +54208,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__INCREMENT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -51951,12 +54219,12 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names));
-  ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->names);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->names));
+  __pyx_v_self->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":9
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":9
  *     def __cinit__(self):
  *         self.names = IntList(INITIAL_CAPACITY, INCREMENT)
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)             # <<<<<<<<<<<<<<
@@ -51968,7 +54236,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__INCREMENT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3);
@@ -51979,9 +54247,9 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values));
-  ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->values);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->values));
+  __pyx_v_self->values = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
   __pyx_r = 0;
@@ -51997,52 +54265,39 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":11
- *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
- * 
- *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
- *         self.names.append(name)
- *         self.values.append(value)
- */
-
-static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   unsigned int __pyx_v_name;
   float __pyx_v_value;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
-  __Pyx_RefNannySetupContext("set");
+  __Pyx_RefNannySetupContext("set (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__name);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__name)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("set", 1, 2, 2, 1); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "set") < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set") < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -52051,7 +54306,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
     __pyx_v_name = __Pyx_PyInt_AsUnsignedInt(values[0]); if (unlikely((__pyx_v_name == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_value = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_value == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_value = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_value == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -52061,8 +54316,30 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector_2set(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self), __pyx_v_name, __pyx_v_value);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":11
+ *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
+ * 
+ *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
+ *         self.names.append(name)
+ *         self.values.append(value)
+ */
+
+static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("set", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":12
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":12
  * 
  *     def set(self, unsigned name, float value):
  *         self.names.append(name)             # <<<<<<<<<<<<<<
@@ -52071,12 +54348,12 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
  */
   __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->names), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":13
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":13
  *     def set(self, unsigned name, float value):
  *         self.names.append(name)
  *         self.values.append(value)             # <<<<<<<<<<<<<<
@@ -52085,7 +54362,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
  */
   __pyx_t_2 = PyFloat_FromDouble(__pyx_v_value); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->values), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -52102,9 +54379,20 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":15
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector_4__iter__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -52112,36 +54400,45 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
  *         for i in range(self.names.len):
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_2__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_13FeatureVector_2__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__iter__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_9___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_9___iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_3generator5;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_6generator5, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.FeatureVector.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   unsigned int __pyx_t_2;
@@ -52150,8 +54447,8 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -52161,34 +54458,34 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":17
  *     def __iter__(self):
  *         cdef unsigned i
  *         for i in range(self.names.len):             # <<<<<<<<<<<<<<
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->names->len;
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->names->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":18
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":18
  *         cdef unsigned i
  *         for i in range(self.names.len):
  *             yield (FD.word(self.names[i]), self.values[i])             # <<<<<<<<<<<<<<
  * 
  *     def __str__(self):
  */
-    __pyx_t_3 = __Pyx_GetItemInt(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->names), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_self->names), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = PyBytes_FromString(((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_3_sa_FD->__pyx_vtab)->word(__pyx_v_3_sa_FD, __pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->values), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_self->values), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -52202,14 +54499,14 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
@@ -52218,13 +54515,25 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
-static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector_7__str__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -52232,45 +54541,53 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
  * cdef class Scorer:
  */
 
-static PyObject *__pyx_pf_3_sa_7__str___2genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7__str___2genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str___genexpr(PyObject *__pyx_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("genexpr");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)__pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *) __pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  __pyx_self = __pyx_self;
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7__str___3generator8;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_7__str___2generator8, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.FeatureVector.__str__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
   PyObject *(*__pyx_t_3)(PyObject *);
   PyObject *__pyx_t_4 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -52279,21 +54596,30 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) {
-    __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (PyList_CheckExact(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) || PyTuple_CheckExact(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self))) {
+    __pyx_t_1 = ((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -52310,7 +54636,7 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_cur_scope->__pyx_v_feat = __pyx_t_4;
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_134), __pyx_cur_scope->__pyx_v_feat); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_135), __pyx_cur_scope->__pyx_v_feat); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __pyx_r = ((PyObject *)__pyx_t_4);
     __pyx_t_4 = 0;
@@ -52321,7 +54647,7 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -52332,7 +54658,7 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -52340,12 +54666,13 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":20
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":20
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -52353,8 +54680,7 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -52364,18 +54690,18 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_10___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_10___str__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -52385,10 +54711,10 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_pf_3_sa_7__str___2genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __pyx_pf_3_sa_13FeatureVector_7__str___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -52415,7 +54741,23 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":25
+/* Python wrapper */
+static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_models = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
+  __Pyx_INCREF(__pyx_args);
+  __pyx_v_models = __pyx_args;
+  __pyx_r = __pyx_pf_3_sa_6Scorer___init__(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self), __pyx_v_models);
+  __Pyx_XDECREF(__pyx_v_models);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":25
  * cdef class Scorer:
  *     cdef models
  *     def __init__(self, *models):             # <<<<<<<<<<<<<<
@@ -52423,9 +54765,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
  *         self.models = zip(names, models)
  */
 
-static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_models = 0;
+static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_self, PyObject *__pyx_v_models) {
   PyObject *__pyx_v_names = NULL;
   PyObject *__pyx_v_model = NULL;
   int __pyx_r;
@@ -52438,12 +54778,9 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__init__");
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
-  __Pyx_INCREF(__pyx_args);
-  __pyx_v_models = __pyx_args;
+  __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":26
  *     cdef models
  *     def __init__(self, *models):
  *         names = [FD.index(<char *>model.__name__) for model in models]             # <<<<<<<<<<<<<<
@@ -52451,14 +54788,15 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (unlikely(((PyObject *)__pyx_v_models) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = ((PyObject *)__pyx_v_models); __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
   for (;;) {
     if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-    __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
+    #if CYTHON_COMPILING_IN_CPYTHON
+    __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #else
+    __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #endif
     __Pyx_XDECREF(__pyx_v_model);
     __pyx_v_model = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -52468,7 +54806,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __pyx_t_4 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_3_sa_FD->__pyx_vtab)->index(__pyx_v_3_sa_FD, ((char *)__pyx_t_5))); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -52476,7 +54814,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_v_names = __pyx_t_1;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":27
  *     def __init__(self, *models):
  *         names = [FD.index(<char *>model.__name__) for model in models]
  *         self.models = zip(names, models)             # <<<<<<<<<<<<<<
@@ -52484,7 +54822,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
  *     cdef FeatureVector score(self, ctx):
  */
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_names));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_names));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_names));
@@ -52495,9 +54833,9 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models);
-  ((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models = __pyx_t_2;
+  __Pyx_GOTREF(__pyx_v_self->models);
+  __Pyx_DECREF(__pyx_v_self->models);
+  __pyx_v_self->models = __pyx_t_2;
   __pyx_t_2 = 0;
 
   __pyx_r = 0;
@@ -52509,14 +54847,13 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   __Pyx_AddTraceback("_sa.Scorer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_models);
   __Pyx_XDECREF(__pyx_v_names);
   __Pyx_XDECREF(__pyx_v_model);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":29
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":29
  *         self.models = zip(names, models)
  * 
  *     cdef FeatureVector score(self, ctx):             # <<<<<<<<<<<<<<
@@ -52541,9 +54878,9 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("score");
+  __Pyx_RefNannySetupContext("score", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":30
  * 
  *     cdef FeatureVector score(self, ctx):
  *         cdef FeatureVector scores = FeatureVector()             # <<<<<<<<<<<<<<
@@ -52555,7 +54892,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   __pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":31
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":31
  *     cdef FeatureVector score(self, ctx):
  *         cdef FeatureVector scores = FeatureVector()
  *         for name, model in self.models:             # <<<<<<<<<<<<<<
@@ -52571,12 +54908,20 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -52590,27 +54935,33 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
       PyObject* sequence = __pyx_t_4;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 2)) {
+        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
+      #else
+      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
       __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
@@ -52621,12 +54972,13 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
       index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L6_unpacking_done;
       __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      __pyx_t_8 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L6_unpacking_done:;
     }
@@ -52637,7 +54989,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_v_model = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":32
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":32
  *         cdef FeatureVector scores = FeatureVector()
  *         for name, model in self.models:
  *             scores.set(name, model(ctx))             # <<<<<<<<<<<<<<
@@ -52646,7 +54998,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_scores), __pyx_n_s__set); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_INCREF(__pyx_v_ctx);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_ctx);
     __Pyx_GIVEREF(__pyx_v_ctx);
@@ -52654,7 +55006,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_INCREF(__pyx_v_name);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_name);
     __Pyx_GIVEREF(__pyx_v_name);
@@ -52669,7 +55021,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":33
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":33
  *         for name, model in self.models:
  *             scores.set(name, model(ctx))
  *         return scores             # <<<<<<<<<<<<<<
@@ -52705,7 +55057,7 @@ static PyObject *__pyx_tp_new_3_sa_FloatList(PyTypeObject *t, PyObject *a, PyObj
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_FloatList *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_FloatList;
-  if (__pyx_pf_3_sa_9FloatList___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_9FloatList_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -52716,7 +55068,7 @@ static void __pyx_tp_dealloc_3_sa_FloatList(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_9FloatList_1__dealloc__(o);
+    __pyx_pw_3_sa_9FloatList_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -52733,7 +55085,7 @@ static PyObject *__pyx_sq_item_3_sa_FloatList(PyObject *o, Py_ssize_t i) {
 
 static int __pyx_mp_ass_subscript_3_sa_FloatList(PyObject *o, PyObject *i, PyObject *v) {
   if (v) {
-    return __pyx_pf_3_sa_9FloatList_3__setitem__(o, i, v);
+    return __pyx_pw_3_sa_9FloatList_7__setitem__(o, i, v);
   }
   else {
     PyErr_Format(PyExc_NotImplementedError,
@@ -52743,9 +55095,9 @@ static int __pyx_mp_ass_subscript_3_sa_FloatList(PyObject *o, PyObject *i, PyObj
 }
 
 static PyMethodDef __pyx_methods_3_sa_FloatList[] = {
-  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pf_3_sa_9FloatList_5append, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pf_3_sa_9FloatList_6write, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pf_3_sa_9FloatList_7read, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pw_3_sa_9FloatList_11append, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pw_3_sa_9FloatList_13write, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pw_3_sa_9FloatList_15read, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -52808,7 +55160,7 @@ static PyNumberMethods __pyx_tp_as_number_FloatList = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
-  __pyx_pf_3_sa_9FloatList_4__len__, /*sq_length*/
+  __pyx_pw_3_sa_9FloatList_9__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_FloatList, /*sq_item*/
@@ -52821,8 +55173,8 @@ static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_FloatList = {
-  __pyx_pf_3_sa_9FloatList_4__len__, /*mp_length*/
-  __pyx_pf_3_sa_9FloatList_2__getitem__, /*mp_subscript*/
+  __pyx_pw_3_sa_9FloatList_9__len__, /*mp_length*/
+  __pyx_pw_3_sa_9FloatList_5__getitem__, /*mp_subscript*/
   __pyx_mp_ass_subscript_3_sa_FloatList, /*mp_ass_subscript*/
 };
 
@@ -52910,7 +55262,7 @@ static PyObject *__pyx_tp_new_3_sa_IntList(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_IntList *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_IntList;
-  if (__pyx_pf_3_sa_7IntList___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_7IntList_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -52921,7 +55273,7 @@ static void __pyx_tp_dealloc_3_sa_IntList(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_7IntList_7__dealloc__(o);
+    __pyx_pw_3_sa_7IntList_15__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -52938,7 +55290,7 @@ static PyObject *__pyx_sq_item_3_sa_IntList(PyObject *o, Py_ssize_t i) {
 
 static int __pyx_mp_ass_subscript_3_sa_IntList(PyObject *o, PyObject *i, PyObject *v) {
   if (v) {
-    return __pyx_pf_3_sa_7IntList_11__setitem__(o, i, v);
+    return __pyx_pw_3_sa_7IntList_22__setitem__(o, i, v);
   }
   else {
     PyErr_Format(PyExc_NotImplementedError,
@@ -52948,16 +55300,16 @@ static int __pyx_mp_ass_subscript_3_sa_IntList(PyObject *o, PyObject *i, PyObjec
 }
 
 static PyMethodDef __pyx_methods_3_sa_IntList[] = {
-  {__Pyx_NAMESTR("index"), (PyCFunction)__pyx_pf_3_sa_7IntList_2index, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("partition"), (PyCFunction)__pyx_pf_3_sa_7IntList_3partition, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("_doquicksort"), (PyCFunction)__pyx_pf_3_sa_7IntList_4_doquicksort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("sort"), (PyCFunction)__pyx_pf_3_sa_7IntList_5sort, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pf_3_sa_7IntList_6reset, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSize"), (PyCFunction)__pyx_pf_3_sa_7IntList_13getSize, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pf_3_sa_7IntList_14append, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("extend"), (PyCFunction)__pyx_pf_3_sa_7IntList_15extend, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pf_3_sa_7IntList_16write, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pf_3_sa_7IntList_17read, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("index"), (PyCFunction)__pyx_pw_3_sa_7IntList_5index, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("partition"), (PyCFunction)__pyx_pw_3_sa_7IntList_7partition, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("_doquicksort"), (PyCFunction)__pyx_pw_3_sa_7IntList_9_doquicksort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("sort"), (PyCFunction)__pyx_pw_3_sa_7IntList_11sort, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pw_3_sa_7IntList_13reset, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_size"), (PyCFunction)__pyx_pw_3_sa_7IntList_26get_size, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pw_3_sa_7IntList_28append, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("extend"), (PyCFunction)__pyx_pw_3_sa_7IntList_30extend, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pw_3_sa_7IntList_32write, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pw_3_sa_7IntList_34read, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -53020,7 +55372,7 @@ static PyNumberMethods __pyx_tp_as_number_IntList = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_IntList = {
-  __pyx_pf_3_sa_7IntList_12__len__, /*sq_length*/
+  __pyx_pw_3_sa_7IntList_24__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_IntList, /*sq_item*/
@@ -53033,8 +55385,8 @@ static PySequenceMethods __pyx_tp_as_sequence_IntList = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_IntList = {
-  __pyx_pf_3_sa_7IntList_12__len__, /*mp_length*/
-  __pyx_pf_3_sa_7IntList_10__getitem__, /*mp_subscript*/
+  __pyx_pw_3_sa_7IntList_24__len__, /*mp_length*/
+  __pyx_pw_3_sa_7IntList_20__getitem__, /*mp_subscript*/
   __pyx_mp_ass_subscript_3_sa_IntList, /*mp_ass_subscript*/
 };
 
@@ -53079,7 +55431,7 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   &__pyx_tp_as_mapping_IntList, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_7IntList_1__str__, /*tp_str*/
+  __pyx_pw_3_sa_7IntList_3__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_IntList, /*tp_as_buffer*/
@@ -53089,7 +55441,7 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_7IntList_8__iter__, /*tp_iter*/
+  __pyx_pw_3_sa_7IntList_17__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_IntList, /*tp_methods*/
   0, /*tp_members*/
@@ -53115,14 +55467,14 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa_FeatureVector *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_FeatureVector *)o);
   p->names = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->values = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_13FeatureVector___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pw_3_sa_13FeatureVector_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -53130,8 +55482,8 @@ static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, PyObject *a, P
 
 static void __pyx_tp_dealloc_3_sa_FeatureVector(PyObject *o) {
   struct __pyx_obj_3_sa_FeatureVector *p = (struct __pyx_obj_3_sa_FeatureVector *)o;
-  Py_XDECREF(((PyObject *)p->names));
-  Py_XDECREF(((PyObject *)p->values));
+  Py_CLEAR(p->names);
+  Py_CLEAR(p->values);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -53160,7 +55512,7 @@ static int __pyx_tp_clear_3_sa_FeatureVector(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_FeatureVector[] = {
-  {__Pyx_NAMESTR("set"), (PyCFunction)__pyx_pf_3_sa_13FeatureVector_1set, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("set"), (PyCFunction)__pyx_pw_3_sa_13FeatureVector_3set, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -53282,7 +55634,7 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   &__pyx_tp_as_mapping_FeatureVector, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_13FeatureVector_4__str__, /*tp_str*/
+  __pyx_pw_3_sa_13FeatureVector_8__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_FeatureVector, /*tp_as_buffer*/
@@ -53292,7 +55644,7 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   __pyx_tp_clear_3_sa_FeatureVector, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_13FeatureVector_2__iter__, /*tp_iter*/
+  __pyx_pw_3_sa_13FeatureVector_5__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_FeatureVector, /*tp_methods*/
   0, /*tp_members*/
@@ -53325,7 +55677,7 @@ static PyObject *__pyx_tp_new_3_sa_Phrase(PyTypeObject *t, PyObject *a, PyObject
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_Phrase *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Phrase;
-  if (__pyx_pf_3_sa_6Phrase___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_6Phrase_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -53336,7 +55688,7 @@ static void __pyx_tp_dealloc_3_sa_Phrase(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_6Phrase_1__dealloc__(o);
+    __pyx_pw_3_sa_6Phrase_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -53351,19 +55703,19 @@ static PyObject *__pyx_sq_item_3_sa_Phrase(PyObject *o, Py_ssize_t i) {
   return r;
 }
 
-static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_6Phrase_5words___get__(o);
+static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_6Phrase_5words_1__get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Phrase[] = {
-  {__Pyx_NAMESTR("handle"), (PyCFunction)__pyx_pf_3_sa_6Phrase_3handle, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_3_sa_6Phrase_3handle)},
-  {__Pyx_NAMESTR("strhandle"), (PyCFunction)__pyx_pf_3_sa_6Phrase_4strhandle, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pf_3_sa_6Phrase_5arity, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getvarpos"), (PyCFunction)__pyx_pf_3_sa_6Phrase_6getvarpos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getvar"), (PyCFunction)__pyx_pf_3_sa_6Phrase_7getvar, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("clen"), (PyCFunction)__pyx_pf_3_sa_6Phrase_8clen, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getchunk"), (PyCFunction)__pyx_pf_3_sa_6Phrase_9getchunk, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("subst"), (PyCFunction)__pyx_pf_3_sa_6Phrase_16subst, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("handle"), (PyCFunction)__pyx_pw_3_sa_6Phrase_7handle, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_3_sa_6Phrase_6handle)},
+  {__Pyx_NAMESTR("strhandle"), (PyCFunction)__pyx_pw_3_sa_6Phrase_9strhandle, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pw_3_sa_6Phrase_11arity, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getvarpos"), (PyCFunction)__pyx_pw_3_sa_6Phrase_13getvarpos, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getvar"), (PyCFunction)__pyx_pw_3_sa_6Phrase_15getvar, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("clen"), (PyCFunction)__pyx_pw_3_sa_6Phrase_17clen, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getchunk"), (PyCFunction)__pyx_pw_3_sa_6Phrase_19getchunk, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("subst"), (PyCFunction)__pyx_pw_3_sa_6Phrase_32subst, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -53431,7 +55783,7 @@ static PyNumberMethods __pyx_tp_as_number_Phrase = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
-  __pyx_pf_3_sa_6Phrase_12__len__, /*sq_length*/
+  __pyx_pw_3_sa_6Phrase_25__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_Phrase, /*sq_item*/
@@ -53444,8 +55796,8 @@ static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_Phrase = {
-  __pyx_pf_3_sa_6Phrase_12__len__, /*mp_length*/
-  __pyx_pf_3_sa_6Phrase_13__getitem__, /*mp_subscript*/
+  __pyx_pw_3_sa_6Phrase_25__len__, /*mp_length*/
+  __pyx_pw_3_sa_6Phrase_27__getitem__, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
@@ -53480,7 +55832,7 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   0, /*tp_getattr*/
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_pf_3_sa_6Phrase_10__cmp__, /*tp_compare*/
+  __pyx_pw_3_sa_6Phrase_21__cmp__, /*tp_compare*/
   #else
   0, /*reserved*/
   #endif
@@ -53488,9 +55840,9 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   &__pyx_tp_as_number_Phrase, /*tp_as_number*/
   &__pyx_tp_as_sequence_Phrase, /*tp_as_sequence*/
   &__pyx_tp_as_mapping_Phrase, /*tp_as_mapping*/
-  __pyx_pf_3_sa_6Phrase_11__hash__, /*tp_hash*/
+  __pyx_pw_3_sa_6Phrase_23__hash__, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_6Phrase_2__str__, /*tp_str*/
+  __pyx_pw_3_sa_6Phrase_5__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Phrase, /*tp_as_buffer*/
@@ -53500,7 +55852,7 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_6Phrase_14__iter__, /*tp_iter*/
+  __pyx_pw_3_sa_6Phrase_29__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_Phrase, /*tp_methods*/
   0, /*tp_members*/
@@ -53535,7 +55887,7 @@ static PyObject *__pyx_tp_new_3_sa_Rule(PyTypeObject *t, PyObject *a, PyObject *
   p->e = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
   p->scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   p->word_alignments = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_4Rule___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_4Rule_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -53543,10 +55895,10 @@ static PyObject *__pyx_tp_new_3_sa_Rule(PyTypeObject *t, PyObject *a, PyObject *
 
 static void __pyx_tp_dealloc_3_sa_Rule(PyObject *o) {
   struct __pyx_obj_3_sa_Rule *p = (struct __pyx_obj_3_sa_Rule *)o;
-  Py_XDECREF(((PyObject *)p->f));
-  Py_XDECREF(((PyObject *)p->e));
-  Py_XDECREF(((PyObject *)p->scores));
-  Py_XDECREF(p->word_alignments);
+  Py_CLEAR(p->f);
+  Py_CLEAR(p->e);
+  Py_CLEAR(p->scores);
+  Py_CLEAR(p->word_alignments);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -53586,18 +55938,18 @@ static int __pyx_tp_clear_3_sa_Rule(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_4Rule_1f___get__(o);
+static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_4Rule_1f_1__get__(o);
 }
 
-static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_4Rule_1e___get__(o);
+static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_4Rule_1e_1__get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Rule[] = {
-  {__Pyx_NAMESTR("fmerge"), (PyCFunction)__pyx_pf_3_sa_4Rule_3fmerge, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pf_3_sa_4Rule_4arity, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("alignments"), (PyCFunction)__pyx_pf_3_sa_4Rule_6alignments, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("fmerge"), (PyCFunction)__pyx_pw_3_sa_4Rule_7fmerge, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pw_3_sa_4Rule_9arity, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("alignments"), (PyCFunction)__pyx_pw_3_sa_4Rule_13alignments, METH_NOARGS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -53715,7 +56067,7 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
   0, /*tp_getattr*/
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_pf_3_sa_4Rule_2__cmp__, /*tp_compare*/
+  __pyx_pw_3_sa_4Rule_5__cmp__, /*tp_compare*/
   #else
   0, /*reserved*/
   #endif
@@ -53723,9 +56075,9 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
   &__pyx_tp_as_number_Rule, /*tp_as_number*/
   &__pyx_tp_as_sequence_Rule, /*tp_as_sequence*/
   &__pyx_tp_as_mapping_Rule, /*tp_as_mapping*/
-  __pyx_pf_3_sa_4Rule_1__hash__, /*tp_hash*/
+  __pyx_pw_3_sa_4Rule_3__hash__, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_4Rule_5__str__, /*tp_str*/
+  __pyx_pw_3_sa_4Rule_11__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Rule, /*tp_as_buffer*/
@@ -53762,13 +56114,13 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
 };
 static struct __pyx_vtabstruct_3_sa_StringMap __pyx_vtable_3_sa_StringMap;
 
-static PyObject *__pyx_tp_new_3_sa_StringMap(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_StringMap(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa_StringMap *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_StringMap *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_StringMap;
-  if (__pyx_pf_3_sa_9StringMap___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pw_3_sa_9StringMap_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -53779,7 +56131,7 @@ static void __pyx_tp_dealloc_3_sa_StringMap(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_9StringMap_1__dealloc__(o);
+    __pyx_pw_3_sa_9StringMap_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -53957,7 +56309,7 @@ static PyObject *__pyx_tp_new_3_sa_DataArray(PyTypeObject *t, PyObject *a, PyObj
   p->data = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_id = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_9DataArray___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_9DataArray_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -53965,11 +56317,11 @@ static PyObject *__pyx_tp_new_3_sa_DataArray(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_DataArray(PyObject *o) {
   struct __pyx_obj_3_sa_DataArray *p = (struct __pyx_obj_3_sa_DataArray *)o;
-  Py_XDECREF(p->word2id);
-  Py_XDECREF(p->id2word);
-  Py_XDECREF(((PyObject *)p->data));
-  Py_XDECREF(((PyObject *)p->sent_id));
-  Py_XDECREF(((PyObject *)p->sent_index));
+  Py_CLEAR(p->word2id);
+  Py_CLEAR(p->id2word);
+  Py_CLEAR(p->data);
+  Py_CLEAR(p->sent_id);
+  Py_CLEAR(p->sent_index);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -54016,19 +56368,19 @@ static int __pyx_tp_clear_3_sa_DataArray(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_DataArray[] = {
-  {__Pyx_NAMESTR("getSentId"), (PyCFunction)__pyx_pf_3_sa_9DataArray_2getSentId, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSent"), (PyCFunction)__pyx_pf_3_sa_9DataArray_3getSent, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSentPos"), (PyCFunction)__pyx_pf_3_sa_9DataArray_4getSentPos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pf_3_sa_9DataArray_5get_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pf_3_sa_9DataArray_6get_word, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_9DataArray_7write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_9DataArray_8read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pf_3_sa_9DataArray_9read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pf_3_sa_9DataArray_10read_text_data, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_9DataArray_11read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_9DataArray_12write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pf_3_sa_9DataArray_13write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_9DataArray_14write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_5get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pw_3_sa_9DataArray_7get_sentence, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pw_3_sa_9DataArray_9get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_11get_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pw_3_sa_9DataArray_13get_word, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_17read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pw_3_sa_9DataArray_19read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pw_3_sa_9DataArray_21read_text_data, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_23read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_25write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pw_3_sa_9DataArray_27write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9DataArray_29write_enhanced, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -54091,7 +56443,7 @@ static PyNumberMethods __pyx_tp_as_number_DataArray = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
-  __pyx_pf_3_sa_9DataArray_1__len__, /*sq_length*/
+  __pyx_pw_3_sa_9DataArray_3__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
@@ -54104,7 +56456,7 @@ static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_DataArray = {
-  __pyx_pf_3_sa_9DataArray_1__len__, /*mp_length*/
+  __pyx_pw_3_sa_9DataArray_3__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -54195,7 +56547,7 @@ static PyObject *__pyx_tp_new_3_sa_Alignment(PyTypeObject *t, PyObject *a, PyObj
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Alignment;
   p->links = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_9Alignment_2__cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_9Alignment_5__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -54203,8 +56555,8 @@ static PyObject *__pyx_tp_new_3_sa_Alignment(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_Alignment(PyObject *o) {
   struct __pyx_obj_3_sa_Alignment *p = (struct __pyx_obj_3_sa_Alignment *)o;
-  Py_XDECREF(((PyObject *)p->links));
-  Py_XDECREF(((PyObject *)p->sent_index));
+  Py_CLEAR(p->links);
+  Py_CLEAR(p->sent_index);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -54233,14 +56585,14 @@ static int __pyx_tp_clear_3_sa_Alignment(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Alignment[] = {
-  {__Pyx_NAMESTR("unlink"), (PyCFunction)__pyx_pf_3_sa_9Alignment_unlink, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_unlink)},
-  {__Pyx_NAMESTR("get_sent_links"), (PyCFunction)__pyx_pf_3_sa_9Alignment_1get_sent_links, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_9Alignment_3read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_9Alignment_4read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_9Alignment_5write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_9Alignment_6write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_9Alignment_7write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("alignment"), (PyCFunction)__pyx_pf_3_sa_9Alignment_8alignment, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_8alignment)},
+  {__Pyx_NAMESTR("unlink"), (PyCFunction)__pyx_pw_3_sa_9Alignment_1unlink, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_unlink)},
+  {__Pyx_NAMESTR("get_sent_links"), (PyCFunction)__pyx_pw_3_sa_9Alignment_3get_sent_links, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9Alignment_7read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9Alignment_9read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9Alignment_11write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9Alignment_13write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9Alignment_15write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("alignment"), (PyCFunction)__pyx_pw_3_sa_9Alignment_17alignment, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_16alignment)},
   {0, 0, 0, 0}
 };
 
@@ -54413,7 +56765,7 @@ static PyObject *__pyx_tp_new_3_sa_BiLex(PyTypeObject *t, PyObject *a, PyObject
   p->id2fword = Py_None; Py_INCREF(Py_None);
   p->eword2id = Py_None; Py_INCREF(Py_None);
   p->fword2id = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_5BiLex___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_5BiLex_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -54421,14 +56773,14 @@ static PyObject *__pyx_tp_new_3_sa_BiLex(PyTypeObject *t, PyObject *a, PyObject
 
 static void __pyx_tp_dealloc_3_sa_BiLex(PyObject *o) {
   struct __pyx_obj_3_sa_BiLex *p = (struct __pyx_obj_3_sa_BiLex *)o;
-  Py_XDECREF(((PyObject *)p->col1));
-  Py_XDECREF(((PyObject *)p->col2));
-  Py_XDECREF(((PyObject *)p->f_index));
-  Py_XDECREF(((PyObject *)p->e_index));
-  Py_XDECREF(p->id2eword);
-  Py_XDECREF(p->id2fword);
-  Py_XDECREF(p->eword2id);
-  Py_XDECREF(p->fword2id);
+  Py_CLEAR(p->col1);
+  Py_CLEAR(p->col2);
+  Py_CLEAR(p->f_index);
+  Py_CLEAR(p->e_index);
+  Py_CLEAR(p->id2eword);
+  Py_CLEAR(p->id2fword);
+  Py_CLEAR(p->eword2id);
+  Py_CLEAR(p->fword2id);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -54493,14 +56845,14 @@ static int __pyx_tp_clear_3_sa_BiLex(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BiLex[] = {
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_5BiLex_1write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_5BiLex_2read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_e_id"), (PyCFunction)__pyx_pf_3_sa_5BiLex_3get_e_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_f_id"), (PyCFunction)__pyx_pf_3_sa_5BiLex_4get_f_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_5BiLex_5read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_5BiLex_6write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_score"), (PyCFunction)__pyx_pf_3_sa_5BiLex_7get_score, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_5BiLex_8write_text, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_5BiLex_8write_text)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_5BiLex_3write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_5BiLex_5read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_e_id"), (PyCFunction)__pyx_pw_3_sa_5BiLex_7get_e_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_f_id"), (PyCFunction)__pyx_pw_3_sa_5BiLex_9get_f_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_5BiLex_11read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_5BiLex_13write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_score"), (PyCFunction)__pyx_pw_3_sa_5BiLex_15get_score, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_5BiLex_17write_text, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_5BiLex_16write_text)},
   {0, 0, 0, 0}
 };
 
@@ -54658,7 +57010,7 @@ static PyTypeObject __pyx_type_3_sa_BiLex = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_BitSetIterator(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_BitSetIterator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   return o;
@@ -54669,7 +57021,7 @@ static void __pyx_tp_dealloc_3_sa_BitSetIterator(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BitSetIterator[] = {
-  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pf_3_sa_14BitSetIterator___next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pw_3_sa_14BitSetIterator_1__next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -54802,7 +57154,7 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  __pyx_pf_3_sa_14BitSetIterator___next__, /*tp_iternext*/
+  __pyx_pw_3_sa_14BitSetIterator_1__next__, /*tp_iternext*/
   __pyx_methods_3_sa_BitSetIterator, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
@@ -54827,10 +57179,10 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_BitSet(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_BitSet(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  if (__pyx_pf_3_sa_6BitSet___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pw_3_sa_6BitSet_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -54841,7 +57193,7 @@ static void __pyx_tp_dealloc_3_sa_BitSet(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_6BitSet_1__dealloc__(o);
+    __pyx_pw_3_sa_6BitSet_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -54850,10 +57202,10 @@ static void __pyx_tp_dealloc_3_sa_BitSet(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BitSet[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_6BitSet_3insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pf_3_sa_6BitSet_4findsucc, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("min"), (PyCFunction)__pyx_pf_3_sa_6BitSet_6min, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("max"), (PyCFunction)__pyx_pf_3_sa_6BitSet_7max, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_6BitSet_7insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pw_3_sa_6BitSet_9findsucc, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("min"), (PyCFunction)__pyx_pw_3_sa_6BitSet_13min, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("max"), (PyCFunction)__pyx_pw_3_sa_6BitSet_15max, METH_NOARGS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -54916,20 +57268,20 @@ static PyNumberMethods __pyx_tp_as_number_BitSet = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_BitSet = {
-  __pyx_pf_3_sa_6BitSet_8__len__, /*sq_length*/
+  __pyx_pw_3_sa_6BitSet_17__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  __pyx_pf_3_sa_6BitSet_9__contains__, /*sq_contains*/
+  __pyx_pw_3_sa_6BitSet_19__contains__, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_BitSet = {
-  __pyx_pf_3_sa_6BitSet_8__len__, /*mp_length*/
+  __pyx_pw_3_sa_6BitSet_17__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -54975,7 +57327,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   &__pyx_tp_as_mapping_BitSet, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_6BitSet_5__str__, /*tp_str*/
+  __pyx_pw_3_sa_6BitSet_11__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_BitSet, /*tp_as_buffer*/
@@ -54985,7 +57337,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_6BitSet_2__iter__, /*tp_iter*/
+  __pyx_pw_3_sa_6BitSet_5__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_BitSet, /*tp_methods*/
   0, /*tp_members*/
@@ -55011,7 +57363,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_VEBIterator(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_VEBIterator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   return o;
@@ -55022,7 +57374,7 @@ static void __pyx_tp_dealloc_3_sa_VEBIterator(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_VEBIterator[] = {
-  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pf_3_sa_11VEBIterator___next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pw_3_sa_11VEBIterator_1__next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55155,7 +57507,7 @@ static PyTypeObject __pyx_type_3_sa_VEBIterator = {
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  __pyx_pf_3_sa_11VEBIterator___next__, /*tp_iternext*/
+  __pyx_pw_3_sa_11VEBIterator_1__next__, /*tp_iternext*/
   __pyx_methods_3_sa_VEBIterator, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
@@ -55187,7 +57539,7 @@ static PyObject *__pyx_tp_new_3_sa_VEB(PyTypeObject *t, PyObject *a, PyObject *k
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_VEB *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_VEB;
-  if (__pyx_pf_3_sa_3VEB___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_3VEB_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55198,7 +57550,7 @@ static void __pyx_tp_dealloc_3_sa_VEB(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_3VEB_1__dealloc__(o);
+    __pyx_pw_3_sa_3VEB_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -55207,8 +57559,8 @@ static void __pyx_tp_dealloc_3_sa_VEB(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_VEB[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_3VEB_3insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pf_3_sa_3VEB_4findsucc, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_3VEB_7insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pw_3_sa_3VEB_9findsucc, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55271,20 +57623,20 @@ static PyNumberMethods __pyx_tp_as_number_VEB = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_VEB = {
-  __pyx_pf_3_sa_3VEB_5__len__, /*sq_length*/
+  __pyx_pw_3_sa_3VEB_11__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  __pyx_pf_3_sa_3VEB_6__contains__, /*sq_contains*/
+  __pyx_pw_3_sa_3VEB_13__contains__, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_VEB = {
-  __pyx_pf_3_sa_3VEB_5__len__, /*mp_length*/
+  __pyx_pw_3_sa_3VEB_11__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -55340,7 +57692,7 @@ static PyTypeObject __pyx_type_3_sa_VEB = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_3VEB_2__iter__, /*tp_iter*/
+  __pyx_pw_3_sa_3VEB_5__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_VEB, /*tp_methods*/
   0, /*tp_members*/
@@ -55373,7 +57725,7 @@ static PyObject *__pyx_tp_new_3_sa_LCP(PyTypeObject *t, PyObject *a, PyObject *k
   p = ((struct __pyx_obj_3_sa_LCP *)o);
   p->sa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
   p->lcp = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_3LCP___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_3LCP_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55381,8 +57733,8 @@ static PyObject *__pyx_tp_new_3_sa_LCP(PyTypeObject *t, PyObject *a, PyObject *k
 
 static void __pyx_tp_dealloc_3_sa_LCP(PyObject *o) {
   struct __pyx_obj_3_sa_LCP *p = (struct __pyx_obj_3_sa_LCP *)o;
-  Py_XDECREF(((PyObject *)p->sa));
-  Py_XDECREF(((PyObject *)p->lcp));
+  Py_CLEAR(p->sa);
+  Py_CLEAR(p->lcp);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -55411,7 +57763,7 @@ static int __pyx_tp_clear_3_sa_LCP(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_LCP[] = {
-  {__Pyx_NAMESTR("compute_stats"), (PyCFunction)__pyx_pf_3_sa_3LCP_1compute_stats, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_3LCP_1compute_stats)},
+  {__Pyx_NAMESTR("compute_stats"), (PyCFunction)__pyx_pw_3_sa_3LCP_3compute_stats, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_3LCP_2compute_stats)},
   {0, 0, 0, 0}
 };
 
@@ -55570,7 +57922,7 @@ static PyTypeObject __pyx_type_3_sa_LCP = {
 };
 static struct __pyx_vtabstruct_3_sa_Alphabet __pyx_vtable_3_sa_Alphabet;
 
-static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa_Alphabet *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -55579,7 +57931,7 @@ static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, PyObject *a, PyObje
   p->terminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
   p->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
   p->id2sym = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_8Alphabet___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pw_3_sa_8Alphabet_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55591,14 +57943,14 @@ static void __pyx_tp_dealloc_3_sa_Alphabet(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_8Alphabet_1__dealloc__(o);
+    __pyx_pw_3_sa_8Alphabet_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
   }
-  Py_XDECREF(((PyObject *)p->terminals));
-  Py_XDECREF(((PyObject *)p->nonterminals));
-  Py_XDECREF(((PyObject *)p->id2sym));
+  Py_CLEAR(p->terminals);
+  Py_CLEAR(p->nonterminals);
+  Py_CLEAR(p->id2sym);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -55632,12 +57984,12 @@ static int __pyx_tp_clear_3_sa_Alphabet(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_8Alphabet_9terminals___get__(o);
+static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_8Alphabet_9terminals_1__get__(o);
 }
 
-static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_8Alphabet_12nonterminals___get__(o);
+static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Alphabet[] = {
@@ -55811,7 +58163,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieMap(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieMap *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_TrieMap;
-  if (__pyx_pf_3_sa_7TrieMap___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_7TrieMap_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55822,7 +58174,7 @@ static void __pyx_tp_dealloc_3_sa_TrieMap(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pf_3_sa_7TrieMap_1__dealloc__(o);
+    __pyx_pw_3_sa_7TrieMap_3__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -55831,9 +58183,9 @@ static void __pyx_tp_dealloc_3_sa_TrieMap(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_TrieMap[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_2insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("contains"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_3contains, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("toMap"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_4toMap, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_5insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("contains"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_7contains, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("toMap"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_9toMap, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -56000,7 +58352,7 @@ static PyObject *__pyx_tp_new_3_sa_Precomputation(PyTypeObject *t, PyObject *a,
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Precomputation;
   p->precomputed_index = Py_None; Py_INCREF(Py_None);
   p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_14Precomputation___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_14Precomputation_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56008,8 +58360,8 @@ static PyObject *__pyx_tp_new_3_sa_Precomputation(PyTypeObject *t, PyObject *a,
 
 static void __pyx_tp_dealloc_3_sa_Precomputation(PyObject *o) {
   struct __pyx_obj_3_sa_Precomputation *p = (struct __pyx_obj_3_sa_Precomputation *)o;
-  Py_XDECREF(p->precomputed_index);
-  Py_XDECREF(p->precomputed_collocations);
+  Py_CLEAR(p->precomputed_index);
+  Py_CLEAR(p->precomputed_collocations);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56038,9 +58390,9 @@ static int __pyx_tp_clear_3_sa_Precomputation(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Precomputation[] = {
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_1read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_2write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_3precompute, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_3read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_5write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_7precompute, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -56208,7 +58560,7 @@ static PyObject *__pyx_tp_new_3_sa_SuffixArray(PyTypeObject *t, PyObject *a, PyO
   p->darray = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
   p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->ha = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_11SuffixArray___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_11SuffixArray_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56216,9 +58568,9 @@ static PyObject *__pyx_tp_new_3_sa_SuffixArray(PyTypeObject *t, PyObject *a, PyO
 
 static void __pyx_tp_dealloc_3_sa_SuffixArray(PyObject *o) {
   struct __pyx_obj_3_sa_SuffixArray *p = (struct __pyx_obj_3_sa_SuffixArray *)o;
-  Py_XDECREF(((PyObject *)p->darray));
-  Py_XDECREF(((PyObject *)p->sa));
-  Py_XDECREF(((PyObject *)p->ha));
+  Py_CLEAR(p->darray);
+  Py_CLEAR(p->sa);
+  Py_CLEAR(p->ha);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56260,16 +58612,16 @@ static PyObject *__pyx_sq_item_3_sa_SuffixArray(PyObject *o, Py_ssize_t i) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_SuffixArray[] = {
-  {__Pyx_NAMESTR("getSentId"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_2getSentId, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSent"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_3getSent, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getSentPos"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_4getSentPos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_5read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_5read_text)},
-  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_6q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_6q3sort)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_7write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_8read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_9write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_10write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_11lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_5get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_7get_sentence, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_9get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_11read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_10read_text)},
+  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_13q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_12q3sort)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_17read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_19write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_21write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_23lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -56346,7 +58698,7 @@ static PySequenceMethods __pyx_tp_as_sequence_SuffixArray = {
 
 static PyMappingMethods __pyx_tp_as_mapping_SuffixArray = {
   0, /*mp_length*/
-  __pyx_pf_3_sa_11SuffixArray_1__getitem__, /*mp_subscript*/
+  __pyx_pw_3_sa_11SuffixArray_3__getitem__, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
@@ -56427,13 +58779,13 @@ static PyTypeObject __pyx_type_3_sa_SuffixArray = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa_TrieNode *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieNode *)o);
   p->children = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_8TrieNode___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pw_3_sa_8TrieNode_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56441,7 +58793,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, PyObject *a, PyObje
 
 static void __pyx_tp_dealloc_3_sa_TrieNode(PyObject *o) {
   struct __pyx_obj_3_sa_TrieNode *p = (struct __pyx_obj_3_sa_TrieNode *)o;
-  Py_XDECREF(p->children);
+  Py_CLEAR(p->children);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56463,16 +58815,16 @@ static int __pyx_tp_clear_3_sa_TrieNode(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_8TrieNode_8children___get__(o);
+static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_8TrieNode_8children_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_8TrieNode_children(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_8TrieNode_children(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_8TrieNode_8children_1__set__(o, v);
+    return __pyx_pw_3_sa_8TrieNode_8children_3__set__(o, v);
   }
   else {
-    return __pyx_pf_3_sa_8TrieNode_8children_2__del__(o);
+    return __pyx_pw_3_sa_8TrieNode_8children_5__del__(o);
   }
 }
 
@@ -56647,7 +58999,7 @@ static PyObject *__pyx_tp_new_3_sa_ExtendedTrieNode(PyTypeObject *t, PyObject *a
   p->phrase = Py_None; Py_INCREF(Py_None);
   p->phrase_location = Py_None; Py_INCREF(Py_None);
   p->suffix_link = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_16ExtendedTrieNode___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56655,9 +59007,9 @@ static PyObject *__pyx_tp_new_3_sa_ExtendedTrieNode(PyTypeObject *t, PyObject *a
 
 static void __pyx_tp_dealloc_3_sa_ExtendedTrieNode(PyObject *o) {
   struct __pyx_obj_3_sa_ExtendedTrieNode *p = (struct __pyx_obj_3_sa_ExtendedTrieNode *)o;
-  Py_XDECREF(p->phrase);
-  Py_XDECREF(p->phrase_location);
-  Py_XDECREF(p->suffix_link);
+  Py_CLEAR(p->phrase);
+  Py_CLEAR(p->phrase_location);
+  Py_CLEAR(p->suffix_link);
   __pyx_tp_dealloc_3_sa_TrieNode(o);
 }
 
@@ -56693,42 +59045,42 @@ static int __pyx_tp_clear_3_sa_ExtendedTrieNode(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(o, v);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(o, v);
   }
   else {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(o);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(o, v);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(o, v);
   }
   else {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(o);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(o, v);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(o, v);
   }
   else {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(o);
+    return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(o);
   }
 }
 
@@ -56903,7 +59255,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieTable(PyTypeObject *t, PyObject *a, PyObj
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieTable *)o);
   p->root = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_9TrieTable___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_9TrieTable_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56911,7 +59263,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieTable(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_TrieTable(PyObject *o) {
   struct __pyx_obj_3_sa_TrieTable *p = (struct __pyx_obj_3_sa_TrieTable *)o;
-  Py_XDECREF(p->root);
+  Py_CLEAR(p->root);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56933,13 +59285,13 @@ static int __pyx_tp_clear_3_sa_TrieTable(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_9TrieTable_8extended___get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9TrieTable_8extended_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_9TrieTable_8extended_1__set__(o, v);
+    return __pyx_pw_3_sa_9TrieTable_8extended_3__set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -56947,13 +59299,13 @@ static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, void
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_9TrieTable_5count___get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9TrieTable_5count_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_9TrieTable_5count_1__set__(o, v);
+    return __pyx_pw_3_sa_9TrieTable_5count_3__set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -56961,16 +59313,16 @@ static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, void *x
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_9TrieTable_4root___get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9TrieTable_4root_1__get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_root(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_root(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
   if (v) {
-    return __pyx_pf_3_sa_9TrieTable_4root_1__set__(o, v);
+    return __pyx_pw_3_sa_9TrieTable_4root_3__set__(o, v);
   }
   else {
-    return __pyx_pf_3_sa_9TrieTable_4root_2__del__(o);
+    return __pyx_pw_3_sa_9TrieTable_4root_5__del__(o);
   }
 }
 
@@ -57147,7 +59499,7 @@ static PyObject *__pyx_tp_new_3_sa_PhraseLocation(PyTypeObject *t, PyObject *a,
   p = ((struct __pyx_obj_3_sa_PhraseLocation *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_PhraseLocation;
   p->arr = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_14PhraseLocation___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_14PhraseLocation_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57155,7 +59507,7 @@ static PyObject *__pyx_tp_new_3_sa_PhraseLocation(PyTypeObject *t, PyObject *a,
 
 static void __pyx_tp_dealloc_3_sa_PhraseLocation(PyObject *o) {
   struct __pyx_obj_3_sa_PhraseLocation *p = (struct __pyx_obj_3_sa_PhraseLocation *)o;
-  Py_XDECREF(((PyObject *)p->arr));
+  Py_CLEAR(p->arr);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -57341,7 +59693,7 @@ static PyObject *__pyx_tp_new_3_sa_Sampler(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_Sampler *)o);
   p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_7Sampler___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_7Sampler_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57349,7 +59701,7 @@ static PyObject *__pyx_tp_new_3_sa_Sampler(PyTypeObject *t, PyObject *a, PyObjec
 
 static void __pyx_tp_dealloc_3_sa_Sampler(PyObject *o) {
   struct __pyx_obj_3_sa_Sampler *p = (struct __pyx_obj_3_sa_Sampler *)o;
-  Py_XDECREF(((PyObject *)p->sa));
+  Py_CLEAR(p->sa);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -57372,7 +59724,7 @@ static int __pyx_tp_clear_3_sa_Sampler(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Sampler[] = {
-  {__Pyx_NAMESTR("sample"), (PyCFunction)__pyx_pf_3_sa_7Sampler_1sample, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_7Sampler_1sample)},
+  {__Pyx_NAMESTR("sample"), (PyCFunction)__pyx_pw_3_sa_7Sampler_3sample, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_7Sampler_2sample)},
   {0, 0, 0, 0}
 };
 
@@ -57553,7 +59905,7 @@ static PyObject *__pyx_tp_new_3_sa_HieroCachingRuleFactory(PyTypeObject *t, PyOb
   p->fid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->findexes = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->findexes1 = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57561,22 +59913,22 @@ static PyObject *__pyx_tp_new_3_sa_HieroCachingRuleFactory(PyTypeObject *t, PyOb
 
 static void __pyx_tp_dealloc_3_sa_HieroCachingRuleFactory(PyObject *o) {
   struct __pyx_obj_3_sa_HieroCachingRuleFactory *p = (struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o;
-  Py_XDECREF(((PyObject *)p->rules));
-  Py_XDECREF(((PyObject *)p->sampler));
-  Py_XDECREF(((PyObject *)p->scorer));
-  Py_XDECREF(p->precomputed_index);
-  Py_XDECREF(p->precomputed_collocations);
-  Py_XDECREF(p->precompute_file);
-  Py_XDECREF(p->max_rank);
-  Py_XDECREF(p->prev_norm_prefix);
-  Py_XDECREF(((PyObject *)p->fsa));
-  Py_XDECREF(((PyObject *)p->fda));
-  Py_XDECREF(((PyObject *)p->eda));
-  Py_XDECREF(((PyObject *)p->alignment));
-  Py_XDECREF(((PyObject *)p->eid2symid));
-  Py_XDECREF(((PyObject *)p->fid2symid));
-  Py_XDECREF(((PyObject *)p->findexes));
-  Py_XDECREF(((PyObject *)p->findexes1));
+  Py_CLEAR(p->rules);
+  Py_CLEAR(p->sampler);
+  Py_CLEAR(p->scorer);
+  Py_CLEAR(p->precomputed_index);
+  Py_CLEAR(p->precomputed_collocations);
+  Py_CLEAR(p->precompute_file);
+  Py_CLEAR(p->max_rank);
+  Py_CLEAR(p->prev_norm_prefix);
+  Py_CLEAR(p->fsa);
+  Py_CLEAR(p->fda);
+  Py_CLEAR(p->eda);
+  Py_CLEAR(p->alignment);
+  Py_CLEAR(p->eid2symid);
+  Py_CLEAR(p->fid2symid);
+  Py_CLEAR(p->findexes);
+  Py_CLEAR(p->findexes1);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -57689,17 +60041,17 @@ static int __pyx_tp_clear_3_sa_HieroCachingRuleFactory(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_HieroCachingRuleFactory[] = {
-  {__Pyx_NAMESTR("configure"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_1configure)},
-  {__Pyx_NAMESTR("pattern2phrase"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("pattern2phrase_plus"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_precomputed_collocation"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("advance"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_all_nodes_isteps_away"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_11input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_11input)},
+  {__Pyx_NAMESTR("configure"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_2configure)},
+  {__Pyx_NAMESTR("pattern2phrase"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("pattern2phrase_plus"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_precomputed_collocation"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("advance"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_all_nodes_isteps_away"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_23input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_22input)},
   {0, 0, 0, 0}
 };
 
@@ -57858,7 +60210,7 @@ static PyTypeObject __pyx_type_3_sa_HieroCachingRuleFactory = {
 };
 static struct __pyx_vtabstruct_3_sa_Scorer __pyx_vtable_3_sa_Scorer;
 
-static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa_Scorer *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -57870,7 +60222,7 @@ static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, PyObject *a, PyObject
 
 static void __pyx_tp_dealloc_3_sa_Scorer(PyObject *o) {
   struct __pyx_obj_3_sa_Scorer *p = (struct __pyx_obj_3_sa_Scorer *)o;
-  Py_XDECREF(p->models);
+  Py_CLEAR(p->models);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -58034,7 +60386,7 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  __pyx_pf_3_sa_6Scorer___init__, /*tp_init*/
+  __pyx_pw_3_sa_6Scorer_1__init__, /*tp_init*/
   0, /*tp_alloc*/
   __pyx_tp_new_3_sa_Scorer, /*tp_new*/
   0, /*tp_free*/
@@ -58050,219 +60402,9 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_Generator(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_Generator_object *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
-  if (!o) return 0;
-  p = ((struct __pyx_Generator_object *)o);
-  p->exc_type = 0;
-  p->exc_value = 0;
-  p->exc_traceback = 0;
-  return o;
-}
-
-static void __pyx_tp_dealloc_3_sa___pyx_Generator(PyObject *o) {
-  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
-  Py_XDECREF(p->exc_type);
-  Py_XDECREF(p->exc_value);
-  Py_XDECREF(p->exc_traceback);
-  (*Py_TYPE(o)->tp_free)(o);
-}
-
-static int __pyx_tp_traverse_3_sa___pyx_Generator(PyObject *o, visitproc v, void *a) {
-  int e;
-  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
-  if (p->exc_type) {
-    e = (*v)(p->exc_type, a); if (e) return e;
-  }
-  if (p->exc_value) {
-    e = (*v)(p->exc_value, a); if (e) return e;
-  }
-  if (p->exc_traceback) {
-    e = (*v)(p->exc_traceback, a); if (e) return e;
-  }
-  return 0;
-}
-
-static int __pyx_tp_clear_3_sa___pyx_Generator(PyObject *o) {
-  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
-  PyObject* tmp;
-  tmp = ((PyObject*)p->exc_type);
-  p->exc_type = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->exc_value);
-  p->exc_value = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->exc_traceback);
-  p->exc_traceback = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  return 0;
-}
-
-static PyMethodDef __pyx_methods_3_sa___pyx_Generator[] = {
-  {__Pyx_NAMESTR("send"), (PyCFunction)__Pyx_Generator_Send, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("close"), (PyCFunction)__Pyx_Generator_Close, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("throw"), (PyCFunction)__Pyx_Generator_Throw, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number___pyx_Generator = {
-  0, /*nb_add*/
-  0, /*nb_subtract*/
-  0, /*nb_multiply*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_divide*/
-  #endif
-  0, /*nb_remainder*/
-  0, /*nb_divmod*/
-  0, /*nb_power*/
-  0, /*nb_negative*/
-  0, /*nb_positive*/
-  0, /*nb_absolute*/
-  0, /*nb_nonzero*/
-  0, /*nb_invert*/
-  0, /*nb_lshift*/
-  0, /*nb_rshift*/
-  0, /*nb_and*/
-  0, /*nb_xor*/
-  0, /*nb_or*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_coerce*/
-  #endif
-  0, /*nb_int*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_long*/
-  #else
-  0, /*reserved*/
-  #endif
-  0, /*nb_float*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_oct*/
-  #endif
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_hex*/
-  #endif
-  0, /*nb_inplace_add*/
-  0, /*nb_inplace_subtract*/
-  0, /*nb_inplace_multiply*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*nb_inplace_divide*/
-  #endif
-  0, /*nb_inplace_remainder*/
-  0, /*nb_inplace_power*/
-  0, /*nb_inplace_lshift*/
-  0, /*nb_inplace_rshift*/
-  0, /*nb_inplace_and*/
-  0, /*nb_inplace_xor*/
-  0, /*nb_inplace_or*/
-  0, /*nb_floor_divide*/
-  0, /*nb_true_divide*/
-  0, /*nb_inplace_floor_divide*/
-  0, /*nb_inplace_true_divide*/
-  #if PY_VERSION_HEX >= 0x02050000
-  0, /*nb_index*/
-  #endif
-};
-
-static PySequenceMethods __pyx_tp_as_sequence___pyx_Generator = {
-  0, /*sq_length*/
-  0, /*sq_concat*/
-  0, /*sq_repeat*/
-  0, /*sq_item*/
-  0, /*sq_slice*/
-  0, /*sq_ass_item*/
-  0, /*sq_ass_slice*/
-  0, /*sq_contains*/
-  0, /*sq_inplace_concat*/
-  0, /*sq_inplace_repeat*/
-};
-
-static PyMappingMethods __pyx_tp_as_mapping___pyx_Generator = {
-  0, /*mp_length*/
-  0, /*mp_subscript*/
-  0, /*mp_ass_subscript*/
-};
-
-static PyBufferProcs __pyx_tp_as_buffer___pyx_Generator = {
-  #if PY_MAJOR_VERSION < 3
-  0, /*bf_getreadbuffer*/
-  #endif
-  #if PY_MAJOR_VERSION < 3
-  0, /*bf_getwritebuffer*/
-  #endif
-  #if PY_MAJOR_VERSION < 3
-  0, /*bf_getsegcount*/
-  #endif
-  #if PY_MAJOR_VERSION < 3
-  0, /*bf_getcharbuffer*/
-  #endif
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*bf_getbuffer*/
-  #endif
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*bf_releasebuffer*/
-  #endif
-};
-
-static PyTypeObject __pyx_Generator_type = {
-  PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_Generator"), /*tp_name*/
-  sizeof(struct __pyx_Generator_object), /*tp_basicsize*/
-  0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_Generator, /*tp_dealloc*/
-  0, /*tp_print*/
-  0, /*tp_getattr*/
-  0, /*tp_setattr*/
-  #if PY_MAJOR_VERSION < 3
-  0, /*tp_compare*/
-  #else
-  0, /*reserved*/
-  #endif
-  0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_Generator, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_Generator, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_Generator, /*tp_as_mapping*/
-  0, /*tp_hash*/
-  0, /*tp_call*/
-  0, /*tp_str*/
-  0, /*tp_getattro*/
-  0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_Generator, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_Generator, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_Generator, /*tp_clear*/
-  0, /*tp_richcompare*/
-  0, /*tp_weaklistoffset*/
-  PyObject_SelfIter, /*tp_iter*/
-  __Pyx_Generator_Next, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_Generator, /*tp_methods*/
-  0, /*tp_members*/
-  0, /*tp_getset*/
-  0, /*tp_base*/
-  0, /*tp_dict*/
-  0, /*tp_descr_get*/
-  0, /*tp_descr_set*/
-  0, /*tp_dictoffset*/
-  0, /*tp_init*/
-  0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_Generator, /*tp_new*/
-  0, /*tp_free*/
-  0, /*tp_is_gc*/
-  0, /*tp_bases*/
-  0, /*tp_mro*/
-  0, /*tp_cache*/
-  0, /*tp_subclasses*/
-  0, /*tp_weaklist*/
-  0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*tp_version_tag*/
-  #endif
-};
-
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o);
   p->__pyx_v_self = 0;
@@ -58271,14 +60413,13 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct____iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_self);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -58288,9 +60429,8 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct____iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -58453,7 +60593,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct____iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -58464,7 +60604,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_1_read_bitext(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o;
-  Py_XDECREF(p->__pyx_v_fp);
+  Py_CLEAR(p->__pyx_v_fp);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -58644,9 +60784,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_1_read_bitext = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -58657,16 +60797,15 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
-  Py_XDECREF(p->__pyx_v_line);
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_line);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -58682,7 +60821,6 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -58853,9 +60991,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_2_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o);
   p->__pyx_v_ngram = 0;
@@ -58869,19 +61007,18 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObje
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_ngram));
-  Py_XDECREF(((PyObject *)p->__pyx_v_ngram_start));
-  Py_XDECREF(((PyObject *)p->__pyx_v_ngram_starts));
-  Py_XDECREF(((PyObject *)p->__pyx_v_run_start));
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  Py_XDECREF(((PyObject *)p->__pyx_v_veb));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_ngram);
+  Py_CLEAR(p->__pyx_v_ngram_start);
+  Py_CLEAR(p->__pyx_v_ngram_starts);
+  Py_CLEAR(p->__pyx_v_run_start);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_veb);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_ngram) {
     e = (*v)(p->__pyx_v_ngram, a); if (e) return e;
   }
@@ -58906,7 +61043,6 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_ngram);
   p->__pyx_v_ngram = ((PyObject*)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -58920,7 +61056,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   p->__pyx_v_run_start = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_LCP *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_veb);
   p->__pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)Py_None); Py_INCREF(Py_None);
@@ -59086,9 +61222,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_3_compute_stats = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o);
   p->__pyx_v_self = 0;
@@ -59097,14 +61233,13 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_4___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_self);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_4___iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -59114,9 +61249,8 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_4___iter__(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_4___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -59279,7 +61413,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_4___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -59290,7 +61424,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_5___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_CLEAR(p->__pyx_v_self);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -59307,7 +61441,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_5___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
   PyObject* tmp;
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Rule *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -59470,9 +61604,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_5___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -59483,16 +61617,15 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
-  Py_XDECREF(p->__pyx_v_a);
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_a);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -59508,7 +61641,6 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -59679,9 +61811,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_6_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o);
   p->__pyx_v_point = 0;
@@ -59692,16 +61824,15 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
-  Py_XDECREF(p->__pyx_v_point);
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_point);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_point) {
     e = (*v)(p->__pyx_v_point, a); if (e) return e;
   }
@@ -59717,12 +61848,11 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments(PyObject *o, v
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_point);
   p->__pyx_v_point = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Rule *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_t_0);
   p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
@@ -59888,9 +62018,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_7_alignments = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o);
   p->__pyx_v_alignment = 0;
@@ -59915,6 +62045,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, P
   p->__pyx_v_key = 0;
   p->__pyx_v_loc = 0;
   p->__pyx_v_locs = 0;
+  p->__pyx_v_max_locs = 0;
   p->__pyx_v_new_frontier = 0;
   p->__pyx_v_new_node = 0;
   p->__pyx_v_next_states = 0;
@@ -59937,68 +62068,68 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, P
   p->__pyx_v_xcat_index = 0;
   p->__pyx_v_xnode = 0;
   p->__pyx_v_xroot = 0;
-  p->__pyx_t_2 = 0;
-  p->__pyx_t_3 = 0;
+  p->__pyx_t_1 = 0;
   p->__pyx_t_4 = 0;
+  p->__pyx_t_5 = 0;
   return o;
 }
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
-  Py_XDECREF(p->__pyx_v_alignment);
-  Py_XDECREF(p->__pyx_v_als);
-  Py_XDECREF(p->__pyx_v_alslist);
-  Py_XDECREF(((PyObject *)p->__pyx_v_chunklen));
-  Py_XDECREF(p->__pyx_v_count);
-  Py_XDECREF(p->__pyx_v_e);
-  Py_XDECREF(p->__pyx_v_elist);
-  Py_XDECREF(p->__pyx_v_extract);
-  Py_XDECREF(p->__pyx_v_extract_start);
-  Py_XDECREF(p->__pyx_v_extract_stop);
-  Py_XDECREF(((PyObject *)p->__pyx_v_extracts));
-  Py_XDECREF(p->__pyx_v_f);
-  Py_XDECREF(p->__pyx_v_fcount);
-  Py_XDECREF(p->__pyx_v_fphrases);
-  Py_XDECREF(((PyObject *)p->__pyx_v_frontier));
-  Py_XDECREF(p->__pyx_v_frontier_nodes);
-  Py_XDECREF(p->__pyx_v_fwords);
-  Py_XDECREF(((PyObject *)p->__pyx_v_hiero_phrase));
-  Py_XDECREF(p->__pyx_v_is_shadow_path);
-  Py_XDECREF(((PyObject *)p->__pyx_v_key));
-  Py_XDECREF(p->__pyx_v_loc);
-  Py_XDECREF(((PyObject *)p->__pyx_v_locs));
-  Py_XDECREF(((PyObject *)p->__pyx_v_new_frontier));
-  Py_XDECREF(p->__pyx_v_new_node);
-  Py_XDECREF(((PyObject *)p->__pyx_v_next_states));
-  Py_XDECREF(p->__pyx_v_node);
-  Py_XDECREF(((PyObject *)p->__pyx_v_nodes_isteps_away_buffer));
-  Py_XDECREF(p->__pyx_v_pathlen);
-  Py_XDECREF(p->__pyx_v_phrase);
-  Py_XDECREF(((PyObject *)p->__pyx_v_phrase_location));
-  Py_XDECREF(p->__pyx_v_prefix);
-  Py_XDECREF(((PyObject *)p->__pyx_v_reachable_buffer));
-  Py_XDECREF(p->__pyx_v_sa_range);
-  Py_XDECREF(((PyObject *)p->__pyx_v_sample));
-  Py_XDECREF(((PyObject *)p->__pyx_v_scores));
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  Py_XDECREF(p->__pyx_v_spanlen);
-  Py_XDECREF(p->__pyx_v_stop_time);
-  Py_XDECREF(p->__pyx_v_suffix_link);
-  Py_XDECREF(p->__pyx_v_suffix_link_xcat_index);
-  Py_XDECREF(p->__pyx_v_word_id);
-  Py_XDECREF(p->__pyx_v_xcat_index);
-  Py_XDECREF(p->__pyx_v_xnode);
-  Py_XDECREF(p->__pyx_v_xroot);
-  Py_XDECREF(p->__pyx_t_2);
-  Py_XDECREF(p->__pyx_t_3);
-  Py_XDECREF(p->__pyx_t_4);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_alignment);
+  Py_CLEAR(p->__pyx_v_als);
+  Py_CLEAR(p->__pyx_v_alslist);
+  Py_CLEAR(p->__pyx_v_chunklen);
+  Py_CLEAR(p->__pyx_v_count);
+  Py_CLEAR(p->__pyx_v_e);
+  Py_CLEAR(p->__pyx_v_elist);
+  Py_CLEAR(p->__pyx_v_extract);
+  Py_CLEAR(p->__pyx_v_extract_start);
+  Py_CLEAR(p->__pyx_v_extract_stop);
+  Py_CLEAR(p->__pyx_v_extracts);
+  Py_CLEAR(p->__pyx_v_f);
+  Py_CLEAR(p->__pyx_v_fcount);
+  Py_CLEAR(p->__pyx_v_fphrases);
+  Py_CLEAR(p->__pyx_v_frontier);
+  Py_CLEAR(p->__pyx_v_frontier_nodes);
+  Py_CLEAR(p->__pyx_v_fwords);
+  Py_CLEAR(p->__pyx_v_hiero_phrase);
+  Py_CLEAR(p->__pyx_v_is_shadow_path);
+  Py_CLEAR(p->__pyx_v_key);
+  Py_CLEAR(p->__pyx_v_loc);
+  Py_CLEAR(p->__pyx_v_locs);
+  Py_CLEAR(p->__pyx_v_max_locs);
+  Py_CLEAR(p->__pyx_v_new_frontier);
+  Py_CLEAR(p->__pyx_v_new_node);
+  Py_CLEAR(p->__pyx_v_next_states);
+  Py_CLEAR(p->__pyx_v_node);
+  Py_CLEAR(p->__pyx_v_nodes_isteps_away_buffer);
+  Py_CLEAR(p->__pyx_v_pathlen);
+  Py_CLEAR(p->__pyx_v_phrase);
+  Py_CLEAR(p->__pyx_v_phrase_location);
+  Py_CLEAR(p->__pyx_v_prefix);
+  Py_CLEAR(p->__pyx_v_reachable_buffer);
+  Py_CLEAR(p->__pyx_v_sa_range);
+  Py_CLEAR(p->__pyx_v_sample);
+  Py_CLEAR(p->__pyx_v_scores);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_spanlen);
+  Py_CLEAR(p->__pyx_v_stop_time);
+  Py_CLEAR(p->__pyx_v_suffix_link);
+  Py_CLEAR(p->__pyx_v_suffix_link_xcat_index);
+  Py_CLEAR(p->__pyx_v_word_id);
+  Py_CLEAR(p->__pyx_v_xcat_index);
+  Py_CLEAR(p->__pyx_v_xnode);
+  Py_CLEAR(p->__pyx_v_xroot);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_4);
+  Py_CLEAR(p->__pyx_t_5);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_alignment) {
     e = (*v)(p->__pyx_v_alignment, a); if (e) return e;
   }
@@ -60065,6 +62196,9 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitp
   if (p->__pyx_v_locs) {
     e = (*v)(p->__pyx_v_locs, a); if (e) return e;
   }
+  if (p->__pyx_v_max_locs) {
+    e = (*v)(p->__pyx_v_max_locs, a); if (e) return e;
+  }
   if (p->__pyx_v_new_frontier) {
     e = (*v)(p->__pyx_v_new_frontier, a); if (e) return e;
   }
@@ -60131,22 +62265,21 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitp
   if (p->__pyx_v_xroot) {
     e = (*v)(p->__pyx_v_xroot, a); if (e) return e;
   }
-  if (p->__pyx_t_2) {
-    e = (*v)(p->__pyx_t_2, a); if (e) return e;
-  }
-  if (p->__pyx_t_3) {
-    e = (*v)(p->__pyx_t_3, a); if (e) return e;
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
   }
   if (p->__pyx_t_4) {
     e = (*v)(p->__pyx_t_4, a); if (e) return e;
   }
+  if (p->__pyx_t_5) {
+    e = (*v)(p->__pyx_t_5, a); if (e) return e;
+  }
   return 0;
 }
 
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_alignment);
   p->__pyx_v_alignment = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -60213,6 +62346,9 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   tmp = ((PyObject*)p->__pyx_v_locs);
   p->__pyx_v_locs = ((PyObject*)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_max_locs);
+  p->__pyx_v_max_locs = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_new_frontier);
   p->__pyx_v_new_frontier = ((PyObject*)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -60253,7 +62389,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   p->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_spanlen);
   p->__pyx_v_spanlen = Py_None; Py_INCREF(Py_None);
@@ -60279,15 +62415,15 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   tmp = ((PyObject*)p->__pyx_v_xroot);
   p->__pyx_v_xroot = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_2);
-  p->__pyx_t_2 = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_3);
-  p->__pyx_t_3 = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_t_1);
+  p->__pyx_t_1 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_t_4);
   p->__pyx_t_4 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_5);
+  p->__pyx_t_5 = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
   return 0;
 }
 
@@ -60449,9 +62585,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_8_input = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o);
   p->__pyx_v_self = 0;
@@ -60460,14 +62596,13 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_9___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_v_self);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_9___iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -60477,9 +62612,8 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_9___iter__(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_9___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -60642,7 +62776,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_9___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -60653,7 +62787,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_10___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_CLEAR(p->__pyx_v_self);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -60670,7 +62804,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_10___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
   PyObject* tmp;
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -60833,9 +62967,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_10___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -60846,16 +62980,15 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
-  Py_XDECREF(p->__pyx_v_feat);
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_feat);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -60871,7 +63004,6 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -61062,12 +63194,11 @@ static struct PyModuleDef __pyx_moduledef = {
 
 static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},
-  {&__pyx_kp_s_100, __pyx_k_100, sizeof(__pyx_k_100), 0, 0, 1, 0},
   {&__pyx_kp_s_101, __pyx_k_101, sizeof(__pyx_k_101), 0, 0, 1, 0},
-  {&__pyx_n_s_103, __pyx_k_103, sizeof(__pyx_k_103), 0, 0, 1, 1},
+  {&__pyx_kp_s_102, __pyx_k_102, sizeof(__pyx_k_102), 0, 0, 1, 0},
   {&__pyx_n_s_104, __pyx_k_104, sizeof(__pyx_k_104), 0, 0, 1, 1},
-  {&__pyx_kp_s_106, __pyx_k_106, sizeof(__pyx_k_106), 0, 0, 1, 0},
-  {&__pyx_kp_s_108, __pyx_k_108, sizeof(__pyx_k_108), 0, 0, 1, 0},
+  {&__pyx_n_s_105, __pyx_k_105, sizeof(__pyx_k_105), 0, 0, 1, 1},
+  {&__pyx_kp_s_107, __pyx_k_107, sizeof(__pyx_k_107), 0, 0, 1, 0},
   {&__pyx_kp_s_109, __pyx_k_109, sizeof(__pyx_k_109), 0, 0, 1, 0},
   {&__pyx_kp_s_110, __pyx_k_110, sizeof(__pyx_k_110), 0, 0, 1, 0},
   {&__pyx_kp_s_111, __pyx_k_111, sizeof(__pyx_k_111), 0, 0, 1, 0},
@@ -61078,11 +63209,11 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_116, __pyx_k_116, sizeof(__pyx_k_116), 0, 0, 1, 0},
   {&__pyx_kp_s_117, __pyx_k_117, sizeof(__pyx_k_117), 0, 0, 1, 0},
   {&__pyx_kp_s_118, __pyx_k_118, sizeof(__pyx_k_118), 0, 0, 1, 0},
-  {&__pyx_n_s_119, __pyx_k_119, sizeof(__pyx_k_119), 0, 0, 1, 1},
-  {&__pyx_kp_s_120, __pyx_k_120, sizeof(__pyx_k_120), 0, 0, 1, 0},
+  {&__pyx_kp_s_119, __pyx_k_119, sizeof(__pyx_k_119), 0, 0, 1, 0},
+  {&__pyx_n_s_120, __pyx_k_120, sizeof(__pyx_k_120), 0, 0, 1, 1},
   {&__pyx_kp_s_121, __pyx_k_121, sizeof(__pyx_k_121), 0, 0, 1, 0},
-  {&__pyx_n_s_123, __pyx_k_123, sizeof(__pyx_k_123), 0, 0, 1, 1},
-  {&__pyx_kp_s_124, __pyx_k_124, sizeof(__pyx_k_124), 0, 0, 1, 0},
+  {&__pyx_kp_s_122, __pyx_k_122, sizeof(__pyx_k_122), 0, 0, 1, 0},
+  {&__pyx_n_s_124, __pyx_k_124, sizeof(__pyx_k_124), 0, 0, 1, 1},
   {&__pyx_kp_s_125, __pyx_k_125, sizeof(__pyx_k_125), 0, 0, 1, 0},
   {&__pyx_kp_s_126, __pyx_k_126, sizeof(__pyx_k_126), 0, 0, 1, 0},
   {&__pyx_kp_s_127, __pyx_k_127, sizeof(__pyx_k_127), 0, 0, 1, 0},
@@ -61095,8 +63226,11 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_133, __pyx_k_133, sizeof(__pyx_k_133), 0, 0, 1, 0},
   {&__pyx_kp_s_134, __pyx_k_134, sizeof(__pyx_k_134), 0, 0, 1, 0},
   {&__pyx_kp_s_135, __pyx_k_135, sizeof(__pyx_k_135), 0, 0, 1, 0},
-  {&__pyx_kp_s_137, __pyx_k_137, sizeof(__pyx_k_137), 0, 0, 1, 0},
+  {&__pyx_kp_s_138, __pyx_k_138, sizeof(__pyx_k_138), 0, 0, 1, 0},
+  {&__pyx_kp_s_139, __pyx_k_139, sizeof(__pyx_k_139), 0, 0, 1, 0},
   {&__pyx_kp_s_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 0, 1, 0},
+  {&__pyx_kp_s_143, __pyx_k_143, sizeof(__pyx_k_143), 0, 0, 1, 0},
+  {&__pyx_kp_s_144, __pyx_k_144, sizeof(__pyx_k_144), 0, 0, 1, 0},
   {&__pyx_kp_s_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 1, 0},
   {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
   {&__pyx_kp_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 0},
@@ -61139,13 +63273,14 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_86, __pyx_k_86, sizeof(__pyx_k_86), 0, 0, 1, 0},
   {&__pyx_kp_s_87, __pyx_k_87, sizeof(__pyx_k_87), 0, 0, 1, 0},
   {&__pyx_kp_s_88, __pyx_k_88, sizeof(__pyx_k_88), 0, 0, 1, 0},
-  {&__pyx_kp_s_89, __pyx_k_89, sizeof(__pyx_k_89), 0, 0, 1, 0},
+  {&__pyx_n_s_89, __pyx_k_89, sizeof(__pyx_k_89), 0, 0, 1, 1},
   {&__pyx_kp_s_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 0, 1, 0},
   {&__pyx_kp_s_90, __pyx_k_90, sizeof(__pyx_k_90), 0, 0, 1, 0},
   {&__pyx_kp_s_91, __pyx_k_91, sizeof(__pyx_k_91), 0, 0, 1, 0},
   {&__pyx_kp_s_92, __pyx_k_92, sizeof(__pyx_k_92), 0, 0, 1, 0},
-  {&__pyx_kp_s_94, __pyx_k_94, sizeof(__pyx_k_94), 0, 0, 1, 0},
+  {&__pyx_kp_s_93, __pyx_k_93, sizeof(__pyx_k_93), 0, 0, 1, 0},
   {&__pyx_kp_s_95, __pyx_k_95, sizeof(__pyx_k_95), 0, 0, 1, 0},
+  {&__pyx_kp_s_96, __pyx_k_96, sizeof(__pyx_k_96), 0, 0, 1, 0},
   {&__pyx_kp_s__0, __pyx_k__0, sizeof(__pyx_k__0), 0, 0, 1, 0},
   {&__pyx_kp_s__1, __pyx_k__1, sizeof(__pyx_k__1), 0, 0, 1, 0},
   {&__pyx_n_s__Counter, __pyx_k__Counter, sizeof(__pyx_k__Counter), 0, 0, 1, 1},
@@ -61213,13 +63348,12 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__fwords, __pyx_k__fwords, sizeof(__pyx_k__fwords), 0, 0, 1, 1},
   {&__pyx_n_s__gc, __pyx_k__gc, sizeof(__pyx_k__gc), 0, 0, 1, 1},
   {&__pyx_n_s__getLogger, __pyx_k__getLogger, sizeof(__pyx_k__getLogger), 0, 0, 1, 1},
-  {&__pyx_n_s__getSent, __pyx_k__getSent, sizeof(__pyx_k__getSent), 0, 0, 1, 1},
-  {&__pyx_n_s__getSentId, __pyx_k__getSentId, sizeof(__pyx_k__getSentId), 0, 0, 1, 1},
-  {&__pyx_n_s__getSentPos, __pyx_k__getSentPos, sizeof(__pyx_k__getSentPos), 0, 0, 1, 1},
   {&__pyx_n_s__get_e_id, __pyx_k__get_e_id, sizeof(__pyx_k__get_e_id), 0, 0, 1, 1},
   {&__pyx_n_s__get_f_id, __pyx_k__get_f_id, sizeof(__pyx_k__get_f_id), 0, 0, 1, 1},
   {&__pyx_n_s__get_id, __pyx_k__get_id, sizeof(__pyx_k__get_id), 0, 0, 1, 1},
   {&__pyx_n_s__get_next_states, __pyx_k__get_next_states, sizeof(__pyx_k__get_next_states), 0, 0, 1, 1},
+  {&__pyx_n_s__get_sentence, __pyx_k__get_sentence, sizeof(__pyx_k__get_sentence), 0, 0, 1, 1},
+  {&__pyx_n_s__get_sentence_id, __pyx_k__get_sentence_id, sizeof(__pyx_k__get_sentence_id), 0, 0, 1, 1},
   {&__pyx_n_s__get_word, __pyx_k__get_word, sizeof(__pyx_k__get_word), 0, 0, 1, 1},
   {&__pyx_n_s__getchunk, __pyx_k__getchunk, sizeof(__pyx_k__getchunk), 0, 0, 1, 1},
   {&__pyx_n_s__getrusage, __pyx_k__getrusage, sizeof(__pyx_k__getrusage), 0, 0, 1, 1},
@@ -61357,9 +63491,9 @@ static int __Pyx_InitCachedBuiltins(void) {
 
 static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants");
+  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":20
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -61367,7 +63501,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.sent_index = IntList(1000,1000)
  */
   __pyx_k_tuple_10 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_10));
+  __Pyx_GOTREF(__pyx_k_tuple_10);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61376,7 +63510,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":21
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -61384,7 +63518,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.use_sent_id = use_sent_id
  */
   __pyx_k_tuple_11 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_11));
+  __Pyx_GOTREF(__pyx_k_tuple_11);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_11, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61393,7 +63527,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_11));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":22
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -61401,7 +63535,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if from_binary:
  */
   __pyx_k_tuple_12 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_12));
+  __Pyx_GOTREF(__pyx_k_tuple_12);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_12, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61410,7 +63544,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":65
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -61418,13 +63552,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def read_text(self, char* filename):
  */
   __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_15));
+  __Pyx_GOTREF(__pyx_k_tuple_15);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -61432,7 +63566,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 if w_id > 1:
  */
   __pyx_k_tuple_16 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_16));
+  __Pyx_GOTREF(__pyx_k_tuple_16);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61444,7 +63578,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -61452,7 +63586,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_17 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_17));
+  __Pyx_GOTREF(__pyx_k_tuple_17);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61464,7 +63598,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -61472,13 +63606,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_19 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_19));
+  __Pyx_GOTREF(__pyx_k_tuple_19);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_18));
   PyTuple_SET_ITEM(__pyx_k_tuple_19, 0, ((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_19));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -61486,7 +63620,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.read_text_data(data)
  */
   __pyx_k_tuple_20 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_20));
+  __Pyx_GOTREF(__pyx_k_tuple_20);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_20, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61498,7 +63632,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_20));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":143
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -61506,13 +63640,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%d " %i)
  */
   __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_22));
+  __Pyx_GOTREF(__pyx_k_tuple_22);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_22, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_22));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -61520,13 +63654,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%d " %i)
  */
   __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_23));
+  __Pyx_GOTREF(__pyx_k_tuple_23);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_23, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_23));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -61534,13 +63668,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%s %d " % (word, self.word2id[word]))
  */
   __pyx_k_tuple_24 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_24));
+  __Pyx_GOTREF(__pyx_k_tuple_24);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_24, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_24));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -61548,20 +63682,20 @@ static int __Pyx_InitCachedConstants(void) {
  *     def write_enhanced(self, char* filename):
  */
   __pyx_k_tuple_26 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_26)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_26));
+  __Pyx_GOTREF(__pyx_k_tuple_26);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_26, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_26));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.write_enhanced_handle(self, f)
  */
   __pyx_k_tuple_28 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_28));
+  __Pyx_GOTREF(__pyx_k_tuple_28);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_28, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61573,7 +63707,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_28));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":46
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -61581,7 +63715,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if from_binary:
  */
   __pyx_k_tuple_29 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_29)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_29));
+  __Pyx_GOTREF(__pyx_k_tuple_29);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_29, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61590,7 +63724,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_29));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":47
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":47
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -61598,7 +63732,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.read_binary(from_binary)
  */
   __pyx_k_tuple_30 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_30)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_30));
+  __Pyx_GOTREF(__pyx_k_tuple_30);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_30, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61607,7 +63741,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_30));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":59
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))             # <<<<<<<<<<<<<<
@@ -61615,13 +63749,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.sent_index.append(len(self.links))
  */
   __pyx_k_tuple_32 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_32)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_32));
+  __Pyx_GOTREF(__pyx_k_tuple_32);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_31));
   PyTuple_SET_ITEM(__pyx_k_tuple_32, 0, ((PyObject *)__pyx_kp_s_31));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_31));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_32));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -61629,7 +63763,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 self.sent_index.append(len(self.links))
  */
   __pyx_k_tuple_33 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_33)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_33));
+  __Pyx_GOTREF(__pyx_k_tuple_33);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_33, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61641,7 +63775,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_33));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":75
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":75
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -61649,13 +63783,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d-%d " % self.unlink(link))
  */
   __pyx_k_tuple_34 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_34)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_34));
+  __Pyx_GOTREF(__pyx_k_tuple_34);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_34, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_34));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":78
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61663,13 +63797,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def write_binary(self, char* filename):
  */
   __pyx_k_tuple_36 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_36)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_36));
+  __Pyx_GOTREF(__pyx_k_tuple_36);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_36, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_36));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -61677,7 +63811,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for i, link in enumerate(self.links):
  */
   __pyx_k_tuple_37 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_37)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_37));
+  __Pyx_GOTREF(__pyx_k_tuple_37);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_37, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61689,7 +63823,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_37));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":92
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
  *                 f.write("%d " % link)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61697,13 +63831,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % i)
  */
   __pyx_k_tuple_38 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_38)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_38));
+  __Pyx_GOTREF(__pyx_k_tuple_38);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_38, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_38));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":95
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61711,13 +63845,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def alignment(self, i):
  */
   __pyx_k_tuple_39 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_39)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_39));
+  __Pyx_GOTREF(__pyx_k_tuple_39);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_39, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_39));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -61725,7 +63859,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for link in self.links:
  */
   __pyx_k_tuple_40 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_40)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_40));
+  __Pyx_GOTREF(__pyx_k_tuple_40);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_40, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61737,7 +63871,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_40));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":297
  * 
  *             # Re-read file, placing words into buckets
  *             f.seek(0)             # <<<<<<<<<<<<<<
@@ -61745,13 +63879,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 (fword, eword, score1, score2) = line.split()
  */
   __pyx_k_tuple_43 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_43)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_43));
+  __Pyx_GOTREF(__pyx_k_tuple_43);
   __Pyx_INCREF(__pyx_int_0);
   PyTuple_SET_ITEM(__pyx_k_tuple_43, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_43));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -61759,7 +63893,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for line in f:
  */
   __pyx_k_tuple_44 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_44)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_44));
+  __Pyx_GOTREF(__pyx_k_tuple_44);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_44, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61771,7 +63905,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_44));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":339
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":339
  * 
  *         if i > j:
  *             raise Exception("Sort error in CLex")             # <<<<<<<<<<<<<<
@@ -61779,13 +63913,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             return
  */
   __pyx_k_tuple_47 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_47)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_47));
+  __Pyx_GOTREF(__pyx_k_tuple_47);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_46));
   PyTuple_SET_ITEM(__pyx_k_tuple_47, 0, ((PyObject *)__pyx_kp_s_46));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_46));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_47));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":362
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61793,13 +63927,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %f %f " % (i, s1, s2))
  */
   __pyx_k_tuple_49 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_49)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_49));
+  __Pyx_GOTREF(__pyx_k_tuple_49);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_49, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_49));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":365
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":365
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61807,13 +63941,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %s " % (i, w))
  */
   __pyx_k_tuple_51 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_51)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_51));
+  __Pyx_GOTREF(__pyx_k_tuple_51);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_51, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_51));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":368
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61821,13 +63955,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %s " % (i, w))
  */
   __pyx_k_tuple_53 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_53)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_53));
+  __Pyx_GOTREF(__pyx_k_tuple_53);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_53, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_53));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":371
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61835,13 +63969,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_54 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_54)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_54));
+  __Pyx_GOTREF(__pyx_k_tuple_54);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_54, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_54));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -61849,7 +63983,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % i)
  */
   __pyx_k_tuple_55 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_55)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_55));
+  __Pyx_GOTREF(__pyx_k_tuple_55);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_55, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61861,7 +63995,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_55));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -61869,7 +64003,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             f_id = 0
  */
   __pyx_k_tuple_57 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_57)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_57));
+  __Pyx_GOTREF(__pyx_k_tuple_57);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_57, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61881,7 +64015,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_57));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":13
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
  * 
  *         logger.info("Constructing LCP array")             # <<<<<<<<<<<<<<
@@ -61889,13 +64023,13 @@ static int __Pyx_InitCachedConstants(void) {
  *         n = self.sa.sa.len
  */
   __pyx_k_tuple_61 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_61)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_61));
+  __Pyx_GOTREF(__pyx_k_tuple_61);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_60));
   PyTuple_SET_ITEM(__pyx_k_tuple_61, 0, ((PyObject *)__pyx_kp_s_60));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_60));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_61));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":34
  *             if h > 0:
  *                 h = h-1
  *         logger.info("LCP array completed")             # <<<<<<<<<<<<<<
@@ -61903,13 +64037,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def compute_stats(self, int max_n):
  */
   __pyx_k_tuple_63 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_63)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_63));
+  __Pyx_GOTREF(__pyx_k_tuple_63);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_62));
   PyTuple_SET_ITEM(__pyx_k_tuple_63, 0, ((PyObject *)__pyx_kp_s_62));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_62));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_63));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":297
  *         pattern_rank = {}
  * 
  *         logger.info("Precomputing frequent intersections")             # <<<<<<<<<<<<<<
@@ -61917,13 +64051,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_73 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_73)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_73));
+  __Pyx_GOTREF(__pyx_k_tuple_73);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_72));
   PyTuple_SET_ITEM(__pyx_k_tuple_73, 0, ((PyObject *)__pyx_kp_s_72));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_72));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_73));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":314
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":314
  *         queue = IntList(increment=1000)
  * 
  *         logger.info("    Computing inverted indexes...")             # <<<<<<<<<<<<<<
@@ -61931,13 +64065,13 @@ static int __Pyx_InitCachedConstants(void) {
  *         for i from 0 <= i < N:
  */
   __pyx_k_tuple_75 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_75)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_75));
+  __Pyx_GOTREF(__pyx_k_tuple_75);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_74));
   PyTuple_SET_ITEM(__pyx_k_tuple_75, 0, ((PyObject *)__pyx_kp_s_74));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_74));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_75));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":329
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":329
  *                     trie_node_data_append(node, i)
  * 
  *         logger.info("    Computing collocations...")             # <<<<<<<<<<<<<<
@@ -61945,13 +64079,13 @@ static int __Pyx_InitCachedConstants(void) {
  *         ptr1 = 0
  */
   __pyx_k_tuple_77 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_77)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_77));
+  __Pyx_GOTREF(__pyx_k_tuple_77);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_76));
   PyTuple_SET_ITEM(__pyx_k_tuple_77, 0, ((PyObject *)__pyx_kp_s_76));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_76));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_77));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":393
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":393
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -61959,13 +64093,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_79 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_79)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_79));
+  __Pyx_GOTREF(__pyx_k_tuple_79);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_79, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_79));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":400
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":400
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -61973,13 +64107,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_80 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_80)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_80));
+  __Pyx_GOTREF(__pyx_k_tuple_80);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_80, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_80));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":407
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":407
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -61987,13 +64121,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  */
   __pyx_k_tuple_81 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_81)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_81));
+  __Pyx_GOTREF(__pyx_k_tuple_81);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_81, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_81));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":409
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":409
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1             # <<<<<<<<<<<<<<
@@ -62001,115 +64135,133 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_82 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_82)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_82));
+  __Pyx_GOTREF(__pyx_k_tuple_82);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_82, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_82));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":103
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]
  */
-  __pyx_k_tuple_93 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_93)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_93));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_92));
-  PyTuple_SET_ITEM(__pyx_k_tuple_93, 0, ((PyObject *)__pyx_kp_s_92));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_92));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_93));
+  __pyx_k_tuple_94 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_94)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_94);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_93));
+  PyTuple_SET_ITEM(__pyx_k_tuple_94, 0, ((PyObject *)__pyx_kp_s_93));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_93));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_94));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":202
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":202
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  */
-  __pyx_k_tuple_96 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_96)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_96));
+  __pyx_k_tuple_97 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_97)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_97);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
-  PyTuple_SET_ITEM(__pyx_k_tuple_96, 0, ((PyObject *)__pyx_kp_s_14));
+  PyTuple_SET_ITEM(__pyx_k_tuple_97, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_96));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_97));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":205
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":205
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
-  __pyx_k_tuple_97 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_97)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_97));
+  __pyx_k_tuple_98 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_98)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_98);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
-  PyTuple_SET_ITEM(__pyx_k_tuple_97, 0, ((PyObject *)__pyx_kp_s_14));
+  PyTuple_SET_ITEM(__pyx_k_tuple_98, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_97));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_98));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:
  */
-  __pyx_k_tuple_98 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_98)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_98));
+  __pyx_k_tuple_99 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_99)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_99);
   __Pyx_INCREF(Py_None);
-  PyTuple_SET_ITEM(__pyx_k_tuple_98, 0, Py_None);
+  PyTuple_SET_ITEM(__pyx_k_tuple_99, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
   __Pyx_INCREF(Py_None);
-  PyTuple_SET_ITEM(__pyx_k_tuple_98, 1, Py_None);
+  PyTuple_SET_ITEM(__pyx_k_tuple_99, 1, Py_None);
   __Pyx_GIVEREF(Py_None);
   __Pyx_INCREF(Py_None);
-  PyTuple_SET_ITEM(__pyx_k_tuple_98, 2, Py_None);
+  PyTuple_SET_ITEM(__pyx_k_tuple_99, 2, Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_98));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_99));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":105
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":105
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
  * 
  *     def sample(self, PhraseLocation phrase_location):
  */
-  __pyx_k_tuple_102 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_102)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_102));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_101));
-  PyTuple_SET_ITEM(__pyx_k_tuple_102, 0, ((PyObject *)__pyx_kp_s_101));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_101));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_102));
+  __pyx_k_tuple_103 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_103)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_103);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_102));
+  PyTuple_SET_ITEM(__pyx_k_tuple_103, 0, ((PyObject *)__pyx_kp_s_102));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_102));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_103));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":314
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":314
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
  *         self.alignment = alignment
  * 
  */
-  __pyx_k_tuple_107 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_107)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_107));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_106));
-  PyTuple_SET_ITEM(__pyx_k_tuple_107, 0, ((PyObject *)__pyx_kp_s_106));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_106));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_107));
+  __pyx_k_tuple_108 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_108)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_108);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_107));
+  PyTuple_SET_ITEM(__pyx_k_tuple_108, 0, ((PyObject *)__pyx_kp_s_107));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_107));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_108));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1020
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1020
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-  __pyx_k_tuple_122 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_122)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_122));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_121));
-  PyTuple_SET_ITEM(__pyx_k_tuple_122, 0, ((PyObject *)__pyx_kp_s_121));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_121));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_122));
+  __pyx_k_tuple_123 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_123)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_123);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_122));
+  PyTuple_SET_ITEM(__pyx_k_tuple_123, 0, ((PyObject *)__pyx_kp_s_122));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_122));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_123));
+
+  /* "_sa.pyx":9
+ *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
+ * 
+ * def gzip_or_text(char* filename):             # <<<<<<<<<<<<<<
+ *     if filename.endswith('.gz'):
+ *         return gzip.GzipFile(filename)
+ */
+  __pyx_k_tuple_136 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_136)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_136);
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
+  PyTuple_SET_ITEM(__pyx_k_tuple_136, 0, ((PyObject *)__pyx_n_s__filename));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
+  PyTuple_SET_ITEM(__pyx_k_tuple_136, 1, ((PyObject *)__pyx_n_s__filename));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_136));
+  __pyx_k_codeobj_137 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_136, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_138, __pyx_n_s__gzip_or_text, 9, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_137)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "_sa.pyx":15
  *         return open(filename)
@@ -62118,12 +64270,29 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  * include "float_list.pxi"
  */
-  __pyx_k_tuple_136 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_136)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_136));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_135));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 0, ((PyObject *)__pyx_kp_s_135));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_135));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_136));
+  __pyx_k_tuple_140 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_140)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_140);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_139));
+  PyTuple_SET_ITEM(__pyx_k_tuple_140, 0, ((PyObject *)__pyx_kp_s_139));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_139));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_140));
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":104
+ *     return ALPHABET.setindex(sym, id)
+ * 
+ * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
+ *     return ALPHABET.fromstring(string, terminal)
+ */
+  __pyx_k_tuple_141 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_141)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_141);
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__string));
+  PyTuple_SET_ITEM(__pyx_k_tuple_141, 0, ((PyObject *)__pyx_n_s__string));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__string));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__terminal));
+  PyTuple_SET_ITEM(__pyx_k_tuple_141, 1, ((PyObject *)__pyx_n_s__terminal));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__terminal));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_141));
+  __pyx_k_codeobj_142 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_141, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_143, __pyx_n_s__sym_fromstring, 104, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_142)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -62132,9 +64301,6 @@ static int __Pyx_InitCachedConstants(void) {
 }
 
 static int __Pyx_InitGlobals(void) {
-  #if PY_VERSION_HEX < 0x02040000
-  if (unlikely(__Pyx_Py23SetsImport() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #endif
   if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
@@ -62173,12 +64339,18 @@ PyMODINIT_FUNC PyInit__sa(void)
           Py_FatalError("failed to import 'refnanny' module");
   }
   #endif
-  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__sa(void)");
+  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__sa(void)", 0);
   if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #ifdef __pyx_binding_PyCFunctionType_USED
-  if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #ifdef __Pyx_CyFunction_USED
+  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
+  #ifdef __Pyx_FusedFunction_USED
+  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
+  #ifdef __Pyx_Generator_USED
+  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   /*--- Library function declarations ---*/
   /*--- Threads initialization code ---*/
@@ -62189,16 +64361,15 @@ PyMODINIT_FUNC PyInit__sa(void)
   #endif
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_sa"), __pyx_methods, 0, 0, PYTHON_API_VERSION);
+  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_sa"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
   #else
   __pyx_m = PyModule_Create(&__pyx_moduledef);
   #endif
-  if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
-  #if PY_MAJOR_VERSION < 3
-  Py_INCREF(__pyx_m);
+  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #if CYTHON_COMPILING_IN_PYPY
+  Py_INCREF(__pyx_b);
   #endif
-  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
-  if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   /*--- Initialize various global constants etc. ---*/
   if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -62335,10 +64506,10 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetAttrString(__pyx_m, "Precomputation", (PyObject *)&__pyx_type_3_sa_Precomputation) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Precomputation = &__pyx_type_3_sa_Precomputation;
   __pyx_vtabptr_3_sa_SuffixArray = &__pyx_vtable_3_sa_SuffixArray;
-  __pyx_vtable_3_sa_SuffixArray.__search_high = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_high;
-  __pyx_vtable_3_sa_SuffixArray.__search_low = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_low;
-  __pyx_vtable_3_sa_SuffixArray.__get_range = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int))__pyx_f_3_sa_11SuffixArray___get_range;
-  __pyx_vtable_3_sa_SuffixArray.__lookup_helper = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___lookup_helper;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___search_high = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_high;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___search_low = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_low;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___get_range = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int))__pyx_f_3_sa_11SuffixArray___get_range;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___lookup_helper = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___lookup_helper;
   if (PyType_Ready(&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetVtable(__pyx_type_3_sa_SuffixArray.tp_dict, __pyx_vtabptr_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "SuffixArray", (PyObject *)&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -62388,39 +64559,28 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetVtable(__pyx_type_3_sa_Scorer.tp_dict, __pyx_vtabptr_3_sa_Scorer) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "Scorer", (PyObject *)&__pyx_type_3_sa_Scorer) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Scorer = &__pyx_type_3_sa_Scorer;
-  if (PyType_Ready(&__pyx_Generator_type) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_3_sa___pyx_Generator = &__pyx_Generator_type;
-  __pyx_type_3_sa___pyx_scope_struct____iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct____iter__) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct____iter__ = &__pyx_type_3_sa___pyx_scope_struct____iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_1_read_bitext) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = &__pyx_type_3_sa___pyx_scope_struct_1_read_bitext;
-  __pyx_type_3_sa___pyx_scope_struct_2_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = &__pyx_type_3_sa___pyx_scope_struct_2_genexpr;
-  __pyx_type_3_sa___pyx_scope_struct_3_compute_stats.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_3_compute_stats) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats = &__pyx_type_3_sa___pyx_scope_struct_3_compute_stats;
-  __pyx_type_3_sa___pyx_scope_struct_4___iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_4___iter__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_4___iter__ = &__pyx_type_3_sa___pyx_scope_struct_4___iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_5___str__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_5___str__ = &__pyx_type_3_sa___pyx_scope_struct_5___str__;
-  __pyx_type_3_sa___pyx_scope_struct_6_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_6_genexpr) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_6_genexpr = &__pyx_type_3_sa___pyx_scope_struct_6_genexpr;
-  __pyx_type_3_sa___pyx_scope_struct_7_alignments.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_7_alignments) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_7_alignments = &__pyx_type_3_sa___pyx_scope_struct_7_alignments;
-  __pyx_type_3_sa___pyx_scope_struct_8_input.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_8_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_8_input = &__pyx_type_3_sa___pyx_scope_struct_8_input;
-  __pyx_type_3_sa___pyx_scope_struct_9___iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_9___iter__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_9___iter__ = &__pyx_type_3_sa___pyx_scope_struct_9___iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_10___str__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_10___str__ = &__pyx_type_3_sa___pyx_scope_struct_10___str__;
-  __pyx_type_3_sa___pyx_scope_struct_11_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_11_genexpr) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_11_genexpr = &__pyx_type_3_sa___pyx_scope_struct_11_genexpr;
   /*--- Type import code ---*/
@@ -62468,7 +64628,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  *     if filename.endswith('.gz'):
  *         return gzip.GzipFile(filename)
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_gzip_or_text, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_1gzip_or_text, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gzip_or_text, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -62485,13 +64645,13 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__getLogger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_136), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_140), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__logger, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
  *     cdef id2eword, id2fword, eword2id, fword2id
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
@@ -62504,7 +64664,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":17
  * from libc.string cimport memset
  * 
  * cdef int MIN_BOTTOM_SIZE = 32             # <<<<<<<<<<<<<<
@@ -62513,7 +64673,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MIN_BOTTOM_SIZE = 32;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":18
  * 
  * cdef int MIN_BOTTOM_SIZE = 32
  * cdef int MIN_BOTTOM_BITS = 5             # <<<<<<<<<<<<<<
@@ -62522,7 +64682,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MIN_BOTTOM_BITS = 5;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":28
  *         LOWER_MASK[i] = mask
  * 
  * _init_lower_mask()             # <<<<<<<<<<<<<<
@@ -62531,7 +64691,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_f_3_sa__init_lower_mask();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":4
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":4
  * from libc.stdlib cimport malloc, realloc, strtol
  * 
  * cdef int INDEX_SHIFT = 3             # <<<<<<<<<<<<<<
@@ -62540,7 +64700,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_INDEX_SHIFT = 3;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":5
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":5
  * 
  * cdef int INDEX_SHIFT = 3
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1             # <<<<<<<<<<<<<<
@@ -62549,7 +64709,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_INDEX_MASK = ((1 << __pyx_v_3_sa_INDEX_SHIFT) - 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":87
  *             return self.terminals.index(s)
  * 
  * cdef Alphabet ALPHABET = Alphabet()             # <<<<<<<<<<<<<<
@@ -62564,18 +64724,18 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_v_3_sa_ALPHABET = ((struct __pyx_obj_3_sa_Alphabet *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":104
  *     return ALPHABET.setindex(sym, id)
  * 
  * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
  *     return ALPHABET.fromstring(string, terminal)
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_1sym_fromstring, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_3sym_fromstring, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sym_fromstring, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":5
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":5
  * # Much faster than the Python numbers reported there.
  * # Note to reader: this code is closer to C than Python
  * import gc             # <<<<<<<<<<<<<<
@@ -62587,7 +64747,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gc, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":6
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":6
  * # Note to reader: this code is closer to C than Python
  * import gc
  * import itertools             # <<<<<<<<<<<<<<
@@ -62599,7 +64759,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__itertools, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":12
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":12
  * from libc.math cimport fmod, ceil, floor, log
  * 
  * from collections import defaultdict, Counter, namedtuple             # <<<<<<<<<<<<<<
@@ -62607,7 +64767,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  * FeatureContext = namedtuple('FeatureContext',
  */
   __pyx_t_1 = PyList_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__defaultdict));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__defaultdict));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__defaultdict));
@@ -62620,21 +64780,33 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__collections), ((PyObject *)__pyx_t_1), -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__defaultdict);
+  if (__pyx_t_1 == NULL) {
+    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__defaultdict);
+    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__defaultdict, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Counter); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Counter);
+  if (__pyx_t_1 == NULL) {
+    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__Counter);
+    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__Counter, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__namedtuple);
+  if (__pyx_t_1 == NULL) {
+    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__namedtuple);
+    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__namedtuple, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":14
  * from collections import defaultdict, Counter, namedtuple
  * 
  * FeatureContext = namedtuple('FeatureContext',             # <<<<<<<<<<<<<<
@@ -62644,7 +64816,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":15
  * 
  * FeatureContext = namedtuple('FeatureContext',
  *     ['fphrase',             # <<<<<<<<<<<<<<
@@ -62652,7 +64824,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  *      'paircount',
  */
   __pyx_t_1 = PyList_New(8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__fphrase));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__fphrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fphrase));
@@ -62678,7 +64850,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   PyList_SET_ITEM(__pyx_t_1, 7, ((PyObject *)__pyx_n_s__test_sentence));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__test_sentence));
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__FeatureContext));
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_n_s__FeatureContext));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__FeatureContext));
@@ -62692,7 +64864,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FeatureContext, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":25
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":25
  *     ])
  * 
  * cdef int PRECOMPUTE = 0             # <<<<<<<<<<<<<<
@@ -62701,7 +64873,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_PRECOMPUTE = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":26
  * 
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1             # <<<<<<<<<<<<<<
@@ -62710,7 +64882,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MERGE = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":27
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1
  * cdef int BAEZA_YATES = 2             # <<<<<<<<<<<<<<
@@ -62719,7 +64891,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_BAEZA_YATES = 2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":30
  * 
  * # NOTE: was encoded as a non-terminal in the previous version
  * cdef int EPSILON = sym_fromstring('*EPS*', True)             # <<<<<<<<<<<<<<
@@ -62731,10 +64903,10 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_3 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_137));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_137));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_137));
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_144));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_144));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_144));
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -62746,7 +64918,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_v_3_sa_EPSILON = __pyx_t_4;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":53
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":53
  *     cdef public int count
  *     cdef public root
  *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
@@ -62755,11 +64927,11 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_t_3 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_k_99 = __pyx_t_3;
+  __pyx_k_100 = __pyx_t_3;
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":1
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":1
  * cdef StringMap FD = StringMap() # Feature name dictionary             # <<<<<<<<<<<<<<
  * 
  * INITIAL_CAPACITY = 7 # default number of features
@@ -62772,7 +64944,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_v_3_sa_FD = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":3
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":3
  * cdef StringMap FD = StringMap() # Feature name dictionary
  * 
  * INITIAL_CAPACITY = 7 # default number of features             # <<<<<<<<<<<<<<
@@ -62781,7 +64953,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__INITIAL_CAPACITY, __pyx_int_7) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 3; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":4
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":4
  * 
  * INITIAL_CAPACITY = 7 # default number of features
  * INCREMENT = INITIAL_CAPACITY # double size             # <<<<<<<<<<<<<<
@@ -62823,7 +64995,6 @@ PyMODINIT_FUNC PyInit__sa(void)
 }
 
 /* Runtime support code */
-
 #if CYTHON_REFNANNY
 static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
     PyObject *m = NULL, *p = NULL;
@@ -62855,92 +65026,6 @@ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
     return result;
 }
 
-static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
-                                         Py_ssize_t end, int direction)
-{
-    const char* self_ptr = PyBytes_AS_STRING(self);
-    Py_ssize_t self_len = PyBytes_GET_SIZE(self);
-    const char* sub_ptr;
-    Py_ssize_t sub_len;
-    int retval;
-
-#if PY_VERSION_HEX >= 0x02060000
-    Py_buffer view;
-    view.obj = NULL;
-#endif
-
-    if ( PyBytes_Check(arg) ) {
-        sub_ptr = PyBytes_AS_STRING(arg);
-        sub_len = PyBytes_GET_SIZE(arg);
-    }
-#if PY_MAJOR_VERSION < 3
-    // Python 2.x allows mixing unicode and str
-    else if ( PyUnicode_Check(arg) ) {
-        return PyUnicode_Tailmatch(self, arg, start, end, direction);
-    }
-#endif
-    else {
-#if PY_VERSION_HEX < 0x02060000
-        if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
-            return -1;
-#else
-        if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
-            return -1;
-        sub_ptr = (const char*) view.buf;
-        sub_len = view.len;
-#endif
-    }
-
-    if (end > self_len)
-        end = self_len;
-    else if (end < 0)
-        end += self_len;
-    if (end < 0)
-        end = 0;
-    if (start < 0)
-        start += self_len;
-    if (start < 0)
-        start = 0;
-
-    if (direction > 0) {
-        /* endswith */
-        if (end-sub_len > start)
-            start = end - sub_len;
-    }
-
-    if (start + sub_len <= end)
-        retval = !memcmp(self_ptr+start, sub_ptr, sub_len);
-    else
-        retval = 0;
-
-#if PY_VERSION_HEX >= 0x02060000
-    if (view.obj)
-        PyBuffer_Release(&view);
-#endif
-
-    return retval;
-}
-
-static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
-                                   Py_ssize_t end, int direction)
-{
-    if (unlikely(PyTuple_Check(substr))) {
-        int result;
-        Py_ssize_t i;
-        for (i = 0; i < PyTuple_GET_SIZE(substr); i++) {
-            result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
-                                                   start, end, direction);
-            if (result) {
-                return result;
-            }
-        }
-        return 0;
-    }
-
-    return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
-}
-
-
 static void __Pyx_RaiseDoubleKeywordsError(
     const char* func_name,
     PyObject* kw_name)
@@ -62950,7 +65035,7 @@ static void __Pyx_RaiseDoubleKeywordsError(
         "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
         #else
         "%s() got multiple values for keyword argument '%s'", func_name,
-        PyString_AS_STRING(kw_name));
+        PyString_AsString(kw_name));
         #endif
 }
 
@@ -62966,55 +65051,77 @@ static int __Pyx_ParseOptionalKeywords(
     Py_ssize_t pos = 0;
     PyObject*** name;
     PyObject*** first_kw_arg = argnames + num_pos_args;
-
     while (PyDict_Next(kwds, &pos, &key, &value)) {
         name = first_kw_arg;
         while (*name && (**name != key)) name++;
         if (*name) {
             values[name-argnames] = value;
-        } else {
-            #if PY_MAJOR_VERSION < 3
-            if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) {
-            #else
-            if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) {
-            #endif
-                goto invalid_keyword_type;
-            } else {
-                for (name = first_kw_arg; *name; name++) {
-                    #if PY_MAJOR_VERSION >= 3
-                    if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
-                        PyUnicode_Compare(**name, key) == 0) break;
-                    #else
-                    if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
-                        _PyString_Eq(**name, key)) break;
-                    #endif
-                }
-                if (*name) {
+            continue;
+        }
+        name = first_kw_arg;
+        #if PY_MAJOR_VERSION < 3
+        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
+            while (*name) {
+                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
+                        && _PyString_Eq(**name, key)) {
                     values[name-argnames] = value;
-                } else {
-                    /* unexpected keyword found */
-                    for (name=argnames; name != first_kw_arg; name++) {
-                        if (**name == key) goto arg_passed_twice;
-                        #if PY_MAJOR_VERSION >= 3
-                        if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
-                            PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice;
-                        #else
-                        if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
-                            _PyString_Eq(**name, key)) goto arg_passed_twice;
-                        #endif
-                    }
-                    if (kwds2) {
-                        if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
-                    } else {
-                        goto invalid_keyword;
+                    break;
+                }
+                name++;
+            }
+            if (*name) continue;
+            else {
+                PyObject*** argname = argnames;
+                while (argname != first_kw_arg) {
+                    if ((**argname == key) || (
+                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
+                             && _PyString_Eq(**argname, key))) {
+                        goto arg_passed_twice;
                     }
+                    argname++;
+                }
+            }
+        } else
+        #endif
+        if (likely(PyUnicode_Check(key))) {
+            while (*name) {
+                int cmp = (**name == key) ? 0 :
+                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
+                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
+                #endif
+                    PyUnicode_Compare(**name, key);
+                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
+                if (cmp == 0) {
+                    values[name-argnames] = value;
+                    break;
+                }
+                name++;
+            }
+            if (*name) continue;
+            else {
+                PyObject*** argname = argnames;
+                while (argname != first_kw_arg) {
+                    int cmp = (**argname == key) ? 0 :
+                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
+                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
+                    #endif
+                        PyUnicode_Compare(**argname, key);
+                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
+                    if (cmp == 0) goto arg_passed_twice;
+                    argname++;
                 }
             }
+        } else
+            goto invalid_keyword_type;
+        if (kwds2) {
+            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
+        } else {
+            goto invalid_keyword;
         }
     }
     return 0;
 arg_passed_twice:
-    __Pyx_RaiseDoubleKeywordsError(function_name, **name);
+    __Pyx_RaiseDoubleKeywordsError(function_name, key);
     goto bad;
 invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
@@ -63042,7 +65149,6 @@ static void __Pyx_RaiseArgtupleInvalid(
 {
     Py_ssize_t num_expected;
     const char *more_or_less;
-
     if (num_found < num_min) {
         num_expected = num_min;
         more_or_less = "at least";
@@ -63054,15 +65160,15 @@ static void __Pyx_RaiseArgtupleInvalid(
         more_or_less = "exactly";
     }
     PyErr_Format(PyExc_TypeError,
-                 "%s() takes %s %"PY_FORMAT_SIZE_T"d positional argument%s (%"PY_FORMAT_SIZE_T"d given)",
+                 "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)",
                  func_name, more_or_less, num_expected,
                  (num_expected == 1) ? "" : "s", num_found);
 }
 
 static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
-
     tmp_type = tstate->curexc_type;
     tmp_value = tstate->curexc_value;
     tmp_tb = tstate->curexc_traceback;
@@ -63072,55 +65178,60 @@ static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyOb
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
+#else
+    PyErr_Restore(type, value, tb);
+#endif
 }
-
 static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->curexc_type;
     *value = tstate->curexc_value;
     *tb = tstate->curexc_traceback;
-
     tstate->curexc_type = 0;
     tstate->curexc_value = 0;
     tstate->curexc_traceback = 0;
+#else
+    PyErr_Fetch(type, value, tb);
+#endif
 }
 
-
 #if PY_MAJOR_VERSION < 3
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
-    /* cause is unused */
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
+                        CYTHON_UNUSED PyObject *cause) {
     Py_XINCREF(type);
-    Py_XINCREF(value);
-    Py_XINCREF(tb);
-    /* First, check the traceback argument, replacing None with NULL. */
-    if (tb == Py_None) {
-        Py_DECREF(tb);
-        tb = 0;
-    }
-    else if (tb != NULL && !PyTraceBack_Check(tb)) {
-        PyErr_SetString(PyExc_TypeError,
-            "raise: arg 3 must be a traceback or None");
-        goto raise_error;
-    }
-    /* Next, replace a missing value with None */
-    if (value == NULL) {
-        value = Py_None;
+    if (!value || value == Py_None)
+        value = NULL;
+    else
         Py_INCREF(value);
+    if (!tb || tb == Py_None)
+        tb = NULL;
+    else {
+        Py_INCREF(tb);
+        if (!PyTraceBack_Check(tb)) {
+            PyErr_SetString(PyExc_TypeError,
+                "raise: arg 3 must be a traceback or None");
+            goto raise_error;
+        }
     }
     #if PY_VERSION_HEX < 0x02050000
-    if (!PyClass_Check(type))
+    if (PyClass_Check(type)) {
     #else
-    if (!PyType_Check(type))
+    if (PyType_Check(type)) {
     #endif
-    {
-        /* Raising an instance.  The value should be a dummy. */
-        if (value != Py_None) {
+#if CYTHON_COMPILING_IN_PYPY
+        if (!value) {
+            Py_INCREF(Py_None);
+            value = Py_None;
+        }
+#endif
+        PyErr_NormalizeException(&type, &value, &tb);
+    } else {
+        if (value) {
             PyErr_SetString(PyExc_TypeError,
                 "instance exception may not have a separate value");
             goto raise_error;
         }
-        /* Normalize to raise <class>, <instance> */
-        Py_DECREF(value);
         value = type;
         #if PY_VERSION_HEX < 0x02050000
             if (PyInstance_Check(type)) {
@@ -63143,7 +65254,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             }
         #endif
     }
-
     __Pyx_ErrRestore(type, value, tb);
     return;
 raise_error:
@@ -63152,10 +65262,9 @@ raise_error:
     Py_XDECREF(tb);
     return;
 }
-
 #else /* Python 3+ */
-
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
+    PyObject* owned_instance = NULL;
     if (tb == Py_None) {
         tb = 0;
     } else if (tb && !PyTraceBack_Check(tb)) {
@@ -63165,7 +65274,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
     }
     if (value == Py_None)
         value = 0;
-
     if (PyExceptionInstance_Check(type)) {
         if (value) {
             PyErr_SetString(PyExc_TypeError,
@@ -63174,13 +65282,36 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
         }
         value = type;
         type = (PyObject*) Py_TYPE(value);
-    } else if (!PyExceptionClass_Check(type)) {
+    } else if (PyExceptionClass_Check(type)) {
+        PyObject *args;
+        if (!value)
+            args = PyTuple_New(0);
+        else if (PyTuple_Check(value)) {
+            Py_INCREF(value);
+            args = value;
+        }
+        else
+            args = PyTuple_Pack(1, value);
+        if (!args)
+            goto bad;
+        owned_instance = PyEval_CallObject(type, args);
+        Py_DECREF(args);
+        if (!owned_instance)
+            goto bad;
+        value = owned_instance;
+        if (!PyExceptionInstance_Check(value)) {
+            PyErr_Format(PyExc_TypeError,
+                         "calling %R should have returned an instance of "
+                         "BaseException, not %R",
+                         type, Py_TYPE(value));
+            goto bad;
+        }
+    } else {
         PyErr_SetString(PyExc_TypeError,
             "raise: exception class must be a subclass of BaseException");
         goto bad;
     }
-
-    if (cause) {
+    if (cause && cause != Py_None) {
         PyObject *fixed_cause;
         if (PyExceptionClass_Check(cause)) {
             fixed_cause = PyObject_CallObject(cause, NULL);
@@ -63197,14 +65328,9 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
                             "BaseException");
             goto bad;
         }
-        if (!value) {
-            value = PyObject_CallObject(type, NULL);
-        }
         PyException_SetCause(value, fixed_cause);
     }
-
     PyErr_SetObject(type, value);
-
     if (tb) {
         PyThreadState *tstate = PyThreadState_GET();
         PyObject* tmp_tb = tstate->curexc_traceback;
@@ -63214,8 +65340,8 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             Py_XDECREF(tmp_tb);
         }
     }
-
 bad:
+    Py_XDECREF(owned_instance);
     return;
 }
 #endif
@@ -63239,13 +65365,17 @@ static CYTHON_INLINE int __Pyx_CheckKeywordStrings(
 {
     PyObject* key = 0;
     Py_ssize_t pos = 0;
+#if CPYTHON_COMPILING_IN_PYPY
+    if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0))
+        goto invalid_keyword;
+    return 1;
+#else
     while (PyDict_Next(kwdict, &pos, &key, 0)) {
         #if PY_MAJOR_VERSION < 3
         if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key)))
-        #else
-        if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key)))
         #endif
-            goto invalid_keyword_type;
+            if (unlikely(!PyUnicode_Check(key)))
+                goto invalid_keyword_type;
     }
     if ((!kw_allowed) && unlikely(key))
         goto invalid_keyword;
@@ -63254,6 +65384,7 @@ invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
         "%s() keywords must be strings", function_name);
     return 0;
+#endif
 invalid_keyword:
     PyErr_Format(PyExc_TypeError,
     #if PY_MAJOR_VERSION < 3
@@ -63266,9 +65397,9 @@ invalid_keyword:
     return 0;
 }
 
-
 static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *local_type, *local_value, *local_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
     local_type = tstate->curexc_type;
@@ -63277,19 +65408,27 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->curexc_type = 0;
     tstate->curexc_value = 0;
     tstate->curexc_traceback = 0;
+#else
+    PyErr_Fetch(&local_type, &local_value, &local_tb);
+#endif
     PyErr_NormalizeException(&local_type, &local_value, &local_tb);
+#if CYTHON_COMPILING_IN_CPYTHON
     if (unlikely(tstate->curexc_type))
+#else
+    if (unlikely(PyErr_Occurred()))
+#endif
         goto bad;
     #if PY_MAJOR_VERSION >= 3
     if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
         goto bad;
     #endif
-    *type = local_type;
-    *value = local_value;
-    *tb = local_tb;
     Py_INCREF(local_type);
     Py_INCREF(local_value);
     Py_INCREF(local_tb);
+    *type = local_type;
+    *value = local_value;
+    *tb = local_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
     tmp_type = tstate->exc_type;
     tmp_value = tstate->exc_value;
     tmp_tb = tstate->exc_traceback;
@@ -63297,10 +65436,13 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->exc_value = local_value;
     tstate->exc_traceback = local_tb;
     /* Make sure tstate is in a consistent state when we XDECREF
-       these objects (XDECREF may run arbitrary code). */
+       these objects (DECREF may run arbitrary code). */
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
+#else
+    PyErr_SetExcInfo(local_type, local_value, local_tb);
+#endif
     return 0;
 bad:
     *type = 0;
@@ -63312,7 +65454,6 @@ bad:
     return -1;
 }
 
-
 static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
     PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
 }
@@ -63330,23 +65471,40 @@ static CYTHON_INLINE long __Pyx_mod_long(long a, long b) {
     return r;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
     PyErr_Format(PyExc_ValueError,
-                 "need more than %"PY_FORMAT_SIZE_T"d value%s to unpack",
-                 index, (index == 1) ? "" : "s");
+                 "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected);
 }
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
+static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
     PyErr_Format(PyExc_ValueError,
-                 "too many values to unpack (expected %"PY_FORMAT_SIZE_T"d)", expected);
+                 "need more than %" CYTHON_FORMAT_SSIZE_T "d value%s to unpack",
+                 index, (index == 1) ? "" : "s");
 }
 
-static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
-    if (unlikely(retval)) {
-        Py_DECREF(retval);
-        __Pyx_RaiseTooManyValuesError(expected);
-        return -1;
-    } else if (PyErr_Occurred()) {
+static CYTHON_INLINE int __Pyx_IterFinish(void) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyThreadState *tstate = PyThreadState_GET();
+    PyObject* exc_type = tstate->curexc_type;
+    if (unlikely(exc_type)) {
+        if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) {
+            PyObject *exc_value, *exc_tb;
+            exc_value = tstate->curexc_value;
+            exc_tb = tstate->curexc_traceback;
+            tstate->curexc_type = 0;
+            tstate->curexc_value = 0;
+            tstate->curexc_traceback = 0;
+            Py_DECREF(exc_type);
+            Py_XDECREF(exc_value);
+            Py_XDECREF(exc_tb);
+            return 0;
+        } else {
+            return -1;
+        }
+    }
+    return 0;
+#else
+    if (unlikely(PyErr_Occurred())) {
         if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) {
             PyErr_Clear();
             return 0;
@@ -63355,11 +65513,25 @@ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
         }
     }
     return 0;
+#endif
 }
 
+static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
+    if (unlikely(retval)) {
+        Py_DECREF(retval);
+        __Pyx_RaiseTooManyValuesError(expected);
+        return -1;
+    } else {
+        return __Pyx_IterFinish();
+    }
+    return 0;
+}
 
 static double __Pyx__PyObject_AsDouble(PyObject* obj) {
     PyObject* float_value;
+#if CYTHON_COMPILING_IN_PYPY
+    float_value = PyNumber_Float(obj);
+#else
     if (Py_TYPE(obj)->tp_as_number && Py_TYPE(obj)->tp_as_number->nb_float) {
         return PyFloat_AsDouble(obj);
     } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) {
@@ -63376,6 +65548,7 @@ static double __Pyx__PyObject_AsDouble(PyObject* obj) {
         PyTuple_SET_ITEM(args, 0, 0);
         Py_DECREF(args);
     }
+#endif
     if (likely(float_value)) {
         double value = PyFloat_AS_DOUBLE(float_value);
         Py_DECREF(float_value);
@@ -63409,8 +65582,158 @@ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed
     return 0;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is unsubscriptable");
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+}
+
+static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
+    if (t == Py_None) {
+      __Pyx_RaiseNoneNotIterableError();
+    } else if (PyTuple_GET_SIZE(t) < index) {
+      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
+    } else {
+      __Pyx_RaiseTooManyValuesError(index);
+    }
+}
+
+static CYTHON_INLINE int __Pyx_unpack_tuple2(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2,
+                                             int is_tuple, int has_known_size, int decref_tuple) {
+    Py_ssize_t index;
+    PyObject *value1 = NULL, *value2 = NULL, *iter = NULL;
+    if (!is_tuple && unlikely(!PyTuple_Check(tuple))) {
+        iternextfunc iternext;
+        iter = PyObject_GetIter(tuple);
+        if (unlikely(!iter)) goto bad;
+        if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; }
+        iternext = Py_TYPE(iter)->tp_iternext;
+        value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; }
+        value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; }
+        if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad;
+        Py_DECREF(iter);
+    } else {
+        if (!has_known_size && unlikely(PyTuple_GET_SIZE(tuple) != 2)) {
+            __Pyx_UnpackTupleError(tuple, 2);
+            goto bad;
+        }
+#if CYTHON_COMPILING_IN_PYPY
+        value1 = PySequence_ITEM(tuple, 0);
+        if (unlikely(!value1)) goto bad;
+        value2 = PySequence_ITEM(tuple, 1);
+        if (unlikely(!value2)) goto bad;
+#else
+        value1 = PyTuple_GET_ITEM(tuple, 0);
+        value2 = PyTuple_GET_ITEM(tuple, 1);
+        Py_INCREF(value1);
+        Py_INCREF(value2);
+#endif
+        if (decref_tuple) { Py_DECREF(tuple); }
+    }
+    *pvalue1 = value1;
+    *pvalue2 = value2;
+    return 0;
+unpacking_failed:
+    if (!has_known_size && __Pyx_IterFinish() == 0)
+        __Pyx_RaiseNeedMoreValuesError(index);
+bad:
+    Py_XDECREF(iter);
+    Py_XDECREF(value1);
+    Py_XDECREF(value2);
+    if (decref_tuple) { Py_XDECREF(tuple); }
+    return -1;
+}
+
+static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name,
+                                                   Py_ssize_t* p_orig_length, int* p_source_is_dict) {
+    is_dict = is_dict || likely(PyDict_CheckExact(iterable));
+    *p_source_is_dict = is_dict;
+#if !CYTHON_COMPILING_IN_PYPY
+    if (is_dict) {
+        *p_orig_length = PyDict_Size(iterable);
+        Py_INCREF(iterable);
+        return iterable;
+    }
+#endif
+    *p_orig_length = 0;
+    if (method_name) {
+        PyObject* iter;
+        iterable = PyObject_CallMethodObjArgs(iterable, method_name, NULL);
+        if (!iterable)
+            return NULL;
+#if !CYTHON_COMPILING_IN_PYPY
+        if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable))
+            return iterable;
+#endif
+        iter = PyObject_GetIter(iterable);
+        Py_DECREF(iterable);
+        return iter;
+    }
+    return PyObject_GetIter(iterable);
+}
+static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* iter_obj, Py_ssize_t orig_length, Py_ssize_t* ppos,
+                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) {
+    PyObject* next_item;
+#if !CYTHON_COMPILING_IN_PYPY
+    if (source_is_dict) {
+        PyObject *key, *value;
+        if (unlikely(orig_length != PyDict_Size(iter_obj))) {
+            PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration");
+            return -1;
+        }
+        if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) {
+            return 0;
+        }
+        if (pitem) {
+            PyObject* tuple = PyTuple_New(2);
+            if (unlikely(!tuple)) {
+                return -1;
+            }
+            Py_INCREF(key);
+            Py_INCREF(value);
+            PyTuple_SET_ITEM(tuple, 0, key);
+            PyTuple_SET_ITEM(tuple, 1, value);
+            *pitem = tuple;
+        } else {
+            if (pkey) {
+                Py_INCREF(key);
+                *pkey = key;
+            }
+            if (pvalue) {
+                Py_INCREF(value);
+                *pvalue = value;
+            }
+        }
+        return 1;
+    } else if (PyTuple_CheckExact(iter_obj)) {
+        Py_ssize_t pos = *ppos;
+        if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0;
+        *ppos = pos + 1;
+        next_item = PyTuple_GET_ITEM(iter_obj, pos);
+        Py_INCREF(next_item);
+    } else if (PyList_CheckExact(iter_obj)) {
+        Py_ssize_t pos = *ppos;
+        if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0;
+        *ppos = pos + 1;
+        next_item = PyList_GET_ITEM(iter_obj, pos);
+        Py_INCREF(next_item);
+    } else
+#endif
+    {
+        next_item = PyIter_Next(iter_obj);
+        if (unlikely(!next_item)) {
+            return __Pyx_IterFinish();
+        }
+    }
+    if (pitem) {
+        *pitem = next_item;
+    } else if (pkey && pvalue) {
+        if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1))
+            return -1;
+    } else if (pkey) {
+        *pkey = next_item;
+    } else {
+        *pvalue = next_item;
+    }
+    return 1;
 }
 
 static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
@@ -63421,6 +65744,7 @@ static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
 }
 
 static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->exc_type;
     *value = tstate->exc_value;
@@ -63428,9 +65752,12 @@ static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value,
     Py_XINCREF(*type);
     Py_XINCREF(*value);
     Py_XINCREF(*tb);
+#else
+    PyErr_GetExcInfo(type, value, tb);
+#endif
 }
-
 static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
     tmp_type = tstate->exc_type;
@@ -63442,6 +65769,9 @@ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb)
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
+#else
+    PyErr_SetExcInfo(type, value, tb);
+#endif
 }
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {
@@ -63470,12 +65800,33 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {
         goto bad;
     #if PY_VERSION_HEX >= 0x02050000
     {
-        PyObject *py_level = PyInt_FromLong(level);
-        if (!py_level)
-            goto bad;
-        module = PyObject_CallFunctionObjArgs(py_import,
-            name, global_dict, empty_dict, list, py_level, NULL);
-        Py_DECREF(py_level);
+        #if PY_MAJOR_VERSION >= 3
+        if (level == -1) {
+            if (strchr(__Pyx_MODULE_NAME, '.')) {
+                /* try package relative import first */
+                PyObject *py_level = PyInt_FromLong(1);
+                if (!py_level)
+                    goto bad;
+                module = PyObject_CallFunctionObjArgs(py_import,
+                    name, global_dict, empty_dict, list, py_level, NULL);
+                Py_DECREF(py_level);
+                if (!module) {
+                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
+                        goto bad;
+                    PyErr_Clear();
+                }
+            }
+            level = 0; /* try absolute import on failure */
+        }
+        #endif
+        if (!module) {
+            PyObject *py_level = PyInt_FromLong(level);
+            if (!py_level)
+                goto bad;
+            module = PyObject_CallFunctionObjArgs(py_import,
+                name, global_dict, empty_dict, list, py_level, NULL);
+            Py_DECREF(py_level);
+        }
     }
     #else
     if (level>0) {
@@ -63492,106 +65843,422 @@ bad:
     return module;
 }
 
-static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
-    if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
-        return (equals == Py_EQ);
-    } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
-        if (PyBytes_GET_SIZE(s1) != PyBytes_GET_SIZE(s2)) {
-            return (equals == Py_NE);
-        } else if (PyBytes_GET_SIZE(s1) == 1) {
-            if (equals == Py_EQ)
-                return (PyBytes_AS_STRING(s1)[0] == PyBytes_AS_STRING(s2)[0]);
-            else
-                return (PyBytes_AS_STRING(s1)[0] != PyBytes_AS_STRING(s2)[0]);
-        } else {
-            int result = memcmp(PyBytes_AS_STRING(s1), PyBytes_AS_STRING(s2), (size_t)PyBytes_GET_SIZE(s1));
-            return (equals == Py_EQ) ? (result == 0) : (result != 0);
-        }
-    } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
-        return (equals == Py_NE);
-    } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
-        return (equals == Py_NE);
-    } else {
-        int result;
-        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
-        if (!py_result)
-            return -1;
-        result = __Pyx_PyObject_IsTrue(py_result);
-        Py_DECREF(py_result);
-        return result;
-    }
+static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) {
+#if PY_MAJOR_VERSION < 3
+    PyErr_Format(PyExc_ImportError, "cannot import name %.230s",
+                 PyString_AsString(name));
+#else
+    PyErr_Format(PyExc_ImportError, "cannot import name %S", name);
+#endif
 }
 
-static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
-    if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
-        return (equals == Py_EQ);
-    } else if (PyUnicode_CheckExact(s1) & PyUnicode_CheckExact(s2)) {
-        if (PyUnicode_GET_SIZE(s1) != PyUnicode_GET_SIZE(s2)) {
-            return (equals == Py_NE);
-        } else if (PyUnicode_GET_SIZE(s1) == 1) {
-            if (equals == Py_EQ)
-                return (PyUnicode_AS_UNICODE(s1)[0] == PyUnicode_AS_UNICODE(s2)[0]);
-            else
-                return (PyUnicode_AS_UNICODE(s1)[0] != PyUnicode_AS_UNICODE(s2)[0]);
-        } else {
-            int result = PyUnicode_Compare(s1, s2);
-            if ((result == -1) && unlikely(PyErr_Occurred()))
-                return -1;
-            return (equals == Py_EQ) ? (result == 0) : (result != 0);
+static PyObject *
+__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure)
+{
+    if (op->func_doc == NULL && op->func.m_ml->ml_doc) {
+#if PY_MAJOR_VERSION >= 3
+        op->func_doc = PyUnicode_FromString(op->func.m_ml->ml_doc);
+#else
+        op->func_doc = PyString_FromString(op->func.m_ml->ml_doc);
+#endif
+    }
+    if (op->func_doc == 0) {
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+    Py_INCREF(op->func_doc);
+    return op->func_doc;
+}
+static int
+__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value)
+{
+    PyObject *tmp = op->func_doc;
+    if (value == NULL)
+        op->func_doc = Py_None; /* Mark as deleted */
+    else
+        op->func_doc = value;
+    Py_INCREF(op->func_doc);
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op)
+{
+    if (op->func_name == NULL) {
+#if PY_MAJOR_VERSION >= 3
+        op->func_name = PyUnicode_InternFromString(op->func.m_ml->ml_name);
+#else
+        op->func_name = PyString_InternFromString(op->func.m_ml->ml_name);
+#endif
+    }
+    Py_INCREF(op->func_name);
+    return op->func_name;
+}
+static int
+__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value)
+{
+    PyObject *tmp;
+#if PY_MAJOR_VERSION >= 3
+    if (value == NULL || !PyUnicode_Check(value)) {
+#else
+    if (value == NULL || !PyString_Check(value)) {
+#endif
+        PyErr_SetString(PyExc_TypeError,
+                        "__name__ must be set to a string object");
+        return -1;
+    }
+    tmp = op->func_name;
+    Py_INCREF(value);
+    op->func_name = value;
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure)
+{
+    PyObject *self;
+    self = m->func_closure;
+    if (self == NULL)
+        self = Py_None;
+    Py_INCREF(self);
+    return self;
+}
+static PyObject *
+__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op)
+{
+    if (op->func_dict == NULL) {
+        op->func_dict = PyDict_New();
+        if (op->func_dict == NULL)
+            return NULL;
+    }
+    Py_INCREF(op->func_dict);
+    return op->func_dict;
+}
+static int
+__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value)
+{
+    PyObject *tmp;
+    if (value == NULL) {
+        PyErr_SetString(PyExc_TypeError,
+               "function's dictionary may not be deleted");
+        return -1;
+    }
+    if (!PyDict_Check(value)) {
+        PyErr_SetString(PyExc_TypeError,
+               "setting function's dictionary to a non-dict");
+        return -1;
+    }
+    tmp = op->func_dict;
+    Py_INCREF(value);
+    op->func_dict = value;
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_globals(CYTHON_UNUSED __pyx_CyFunctionObject *op)
+{
+    PyObject* dict = PyModule_GetDict(__pyx_m);
+    Py_XINCREF(dict);
+    return dict;
+}
+static PyObject *
+__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op)
+{
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+static PyObject *
+__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op)
+{
+    PyObject* result = (op->func_code) ? op->func_code : Py_None;
+    Py_INCREF(result);
+    return result;
+}
+static PyObject *
+__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op)
+{
+    if (op->defaults_tuple) {
+        Py_INCREF(op->defaults_tuple);
+        return op->defaults_tuple;
+    }
+    if (op->defaults_getter) {
+        PyObject *res = op->defaults_getter((PyObject *) op);
+        if (res) {
+            Py_INCREF(res);
+            op->defaults_tuple = res;
         }
-    } else if ((s1 == Py_None) & PyUnicode_CheckExact(s2)) {
-        return (equals == Py_NE);
-    } else if ((s2 == Py_None) & PyUnicode_CheckExact(s1)) {
-        return (equals == Py_NE);
-    } else {
-        int result;
-        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
-        if (!py_result)
-            return -1;
-        result = __Pyx_PyObject_IsTrue(py_result);
-        Py_DECREF(py_result);
-        return result;
+        return res;
     }
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+static PyGetSetDef __pyx_CyFunction_getsets[] = {
+    {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
+    {(char *) "__doc__",  (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
+    {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
+    {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
+    {(char *) "__self__", (getter)__Pyx_CyFunction_get_self, 0, 0, 0},
+    {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
+    {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
+    {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
+    {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
+    {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
+    {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
+    {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
+    {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
+    {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, 0, 0, 0},
+    {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, 0, 0, 0},
+    {0, 0, 0, 0, 0}
+};
+#ifndef PY_WRITE_RESTRICTED /* < Py2.5 */
+#define PY_WRITE_RESTRICTED WRITE_RESTRICTED
+#endif
+static PyMemberDef __pyx_CyFunction_members[] = {
+    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CyFunctionObject, func.m_module), PY_WRITE_RESTRICTED, 0},
+    {0, 0, 0,  0, 0}
+};
+static PyObject *
+__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args)
+{
+#if PY_MAJOR_VERSION >= 3
+    return PyUnicode_FromString(m->func.m_ml->ml_name);
+#else
+    return PyString_FromString(m->func.m_ml->ml_name);
+#endif
 }
-
-
-static PyObject *__pyx_binding_PyCFunctionType_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) {
-    __pyx_binding_PyCFunctionType_object *op = PyObject_GC_New(__pyx_binding_PyCFunctionType_object, __pyx_binding_PyCFunctionType);
+static PyMethodDef __pyx_CyFunction_methods[] = {
+    {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0},
+    {0, 0, 0, 0}
+};
+static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags,
+                                      PyObject *closure, PyObject *module, PyObject* code) {
+    __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type);
     if (op == NULL)
         return NULL;
+    op->flags = flags;
+    op->func_weakreflist = NULL;
     op->func.m_ml = ml;
-    Py_XINCREF(self);
-    op->func.m_self = self;
+    op->func.m_self = (PyObject *) op;
+    Py_XINCREF(closure);
+    op->func_closure = closure;
     Py_XINCREF(module);
     op->func.m_module = module;
+    op->func_dict = NULL;
+    op->func_name = NULL;
+    op->func_doc = NULL;
+    op->func_classobj = NULL;
+    Py_XINCREF(code);
+    op->func_code = code;
+    op->defaults_pyobjects = 0;
+    op->defaults = NULL;
+    op->defaults_tuple = NULL;
+    op->defaults_getter = NULL;
     PyObject_GC_Track(op);
-    return (PyObject *)op;
+    return (PyObject *) op;
 }
-
-static void __pyx_binding_PyCFunctionType_dealloc(__pyx_binding_PyCFunctionType_object *m) {
+static int
+__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
+{
+    Py_CLEAR(m->func_closure);
+    Py_CLEAR(m->func.m_module);
+    Py_CLEAR(m->func_dict);
+    Py_CLEAR(m->func_name);
+    Py_CLEAR(m->func_doc);
+    Py_CLEAR(m->func_code);
+    Py_CLEAR(m->func_classobj);
+    Py_CLEAR(m->defaults_tuple);
+    if (m->defaults) {
+        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
+        int i;
+        for (i = 0; i < m->defaults_pyobjects; i++)
+            Py_XDECREF(pydefaults[i]);
+        PyMem_Free(m->defaults);
+        m->defaults = NULL;
+    }
+    return 0;
+}
+static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
+{
     PyObject_GC_UnTrack(m);
-    Py_XDECREF(m->func.m_self);
-    Py_XDECREF(m->func.m_module);
+    if (m->func_weakreflist != NULL)
+        PyObject_ClearWeakRefs((PyObject *) m);
+    __Pyx_CyFunction_clear(m);
     PyObject_GC_Del(m);
 }
-
-static PyObject *__pyx_binding_PyCFunctionType_descr_get(PyObject *func, PyObject *obj, PyObject *type) {
+static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg)
+{
+    Py_VISIT(m->func_closure);
+    Py_VISIT(m->func.m_module);
+    Py_VISIT(m->func_dict);
+    Py_VISIT(m->func_name);
+    Py_VISIT(m->func_doc);
+    Py_VISIT(m->func_code);
+    Py_VISIT(m->func_classobj);
+    Py_VISIT(m->defaults_tuple);
+    if (m->defaults) {
+        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
+        int i;
+        for (i = 0; i < m->defaults_pyobjects; i++)
+            Py_VISIT(pydefaults[i]);
+    }
+    return 0;
+}
+static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
+{
+    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
+    if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
+        Py_INCREF(func);
+        return func;
+    }
+    if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
+        if (type == NULL)
+            type = (PyObject *)(Py_TYPE(obj));
+        return PyMethod_New(func,
+                            type, (PyObject *)(Py_TYPE(type)));
+    }
     if (obj == Py_None)
-            obj = NULL;
+        obj = NULL;
     return PyMethod_New(func, obj, type);
 }
-
-static int __pyx_binding_PyCFunctionType_init(void) {
-    __pyx_binding_PyCFunctionType_type = PyCFunction_Type;
-    __pyx_binding_PyCFunctionType_type.tp_name = __Pyx_NAMESTR("cython_binding_builtin_function_or_method");
-    __pyx_binding_PyCFunctionType_type.tp_dealloc = (destructor)__pyx_binding_PyCFunctionType_dealloc;
-    __pyx_binding_PyCFunctionType_type.tp_descr_get = __pyx_binding_PyCFunctionType_descr_get;
-    if (PyType_Ready(&__pyx_binding_PyCFunctionType_type) < 0) {
-        return -1;
+static PyObject*
+__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op)
+{
+    PyObject *func_name = __Pyx_CyFunction_get_name(op);
+#if PY_MAJOR_VERSION >= 3
+    return PyUnicode_FromFormat("<cyfunction %U at %p>",
+                                func_name, (void *)op);
+#else
+    return PyString_FromFormat("<cyfunction %s at %p>",
+                               PyString_AsString(func_name), (void *)op);
+#endif
+}
+#if CYTHON_COMPILING_IN_PYPY
+static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+    PyCFunctionObject* f = (PyCFunctionObject*)func;
+    PyCFunction meth = PyCFunction_GET_FUNCTION(func);
+    PyObject *self = PyCFunction_GET_SELF(func);
+    Py_ssize_t size;
+    switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
+    case METH_VARARGS:
+        if (likely(kw == NULL) || PyDict_Size(kw) == 0)
+            return (*meth)(self, arg);
+        break;
+    case METH_VARARGS | METH_KEYWORDS:
+        return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
+    case METH_NOARGS:
+        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
+            size = PyTuple_GET_SIZE(arg);
+            if (size == 0)
+                return (*meth)(self, NULL);
+            PyErr_Format(PyExc_TypeError,
+                "%.200s() takes no arguments (%zd given)",
+                f->m_ml->ml_name, size);
+            return NULL;
+        }
+        break;
+    case METH_O:
+        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
+            size = PyTuple_GET_SIZE(arg);
+            if (size == 1)
+                return (*meth)(self, PyTuple_GET_ITEM(arg, 0));
+            PyErr_Format(PyExc_TypeError,
+                "%.200s() takes exactly one argument (%zd given)",
+                f->m_ml->ml_name, size);
+            return NULL;
+        }
+        break;
+    default:
+        PyErr_SetString(PyExc_SystemError, "Bad call flags in "
+                        "__Pyx_CyFunction_Call. METH_OLDARGS is no "
+                        "longer supported!");
+        return NULL;
     }
-    __pyx_binding_PyCFunctionType = &__pyx_binding_PyCFunctionType_type;
+    PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
+                 f->m_ml->ml_name);
+    return NULL;
+}
+#else
+static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+	return PyCFunction_Call(func, arg, kw);
+}
+#endif
+static PyTypeObject __pyx_CyFunctionType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    __Pyx_NAMESTR("cython_function_or_method"), /*tp_name*/
+    sizeof(__pyx_CyFunctionObject),   /*tp_basicsize*/
+    0,                                  /*tp_itemsize*/
+    (destructor) __Pyx_CyFunction_dealloc, /*tp_dealloc*/
+    0,                                  /*tp_print*/
+    0,                                  /*tp_getattr*/
+    0,                                  /*tp_setattr*/
+#if PY_MAJOR_VERSION < 3
+    0,                                  /*tp_compare*/
+#else
+    0,                                  /*reserved*/
+#endif
+    (reprfunc) __Pyx_CyFunction_repr,   /*tp_repr*/
+    0,                                  /*tp_as_number*/
+    0,                                  /*tp_as_sequence*/
+    0,                                  /*tp_as_mapping*/
+    0,                                  /*tp_hash*/
+    __Pyx_CyFunction_Call,              /*tp_call*/
+    0,                                  /*tp_str*/
+    0,                                  /*tp_getattro*/
+    0,                                  /*tp_setattro*/
+    0,                                  /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
+    0,                                  /*tp_doc*/
+    (traverseproc) __Pyx_CyFunction_traverse,   /*tp_traverse*/
+    (inquiry) __Pyx_CyFunction_clear,   /*tp_clear*/
+    0,                                  /*tp_richcompare*/
+    offsetof(__pyx_CyFunctionObject, func_weakreflist), /* tp_weaklistoffse */
+    0,                                  /*tp_iter*/
+    0,                                  /*tp_iternext*/
+    __pyx_CyFunction_methods,           /*tp_methods*/
+    __pyx_CyFunction_members,           /*tp_members*/
+    __pyx_CyFunction_getsets,           /*tp_getset*/
+    0,                                  /*tp_base*/
+    0,                                  /*tp_dict*/
+    __Pyx_CyFunction_descr_get,         /*tp_descr_get*/
+    0,                                  /*tp_descr_set*/
+    offsetof(__pyx_CyFunctionObject, func_dict),/*tp_dictoffset*/
+    0,                                  /*tp_init*/
+    0,                                  /*tp_alloc*/
+    0,                                  /*tp_new*/
+    0,                                  /*tp_free*/
+    0,                                  /*tp_is_gc*/
+    0,                                  /*tp_bases*/
+    0,                                  /*tp_mro*/
+    0,                                  /*tp_cache*/
+    0,                                  /*tp_subclasses*/
+    0,                                  /*tp_weaklist*/
+    0,                                  /*tp_del*/
+#if PY_VERSION_HEX >= 0x02060000
+    0,                                  /*tp_version_tag*/
+#endif
+};
+static int __Pyx_CyFunction_init(void) {
+#if !CYTHON_COMPILING_IN_PYPY
+    __pyx_CyFunctionType_type.tp_call = PyCFunction_Call;
+#endif
+    if (PyType_Ready(&__pyx_CyFunctionType_type) < 0)
+        return -1;
+    __pyx_CyFunctionType = &__pyx_CyFunctionType_type;
     return 0;
-
+}
+static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) {
+    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
+    m->defaults = PyMem_Malloc(size);
+    if (!m->defaults)
+        return PyErr_NoMemory();
+    memset(m->defaults, 0, sizeof(size));
+    m->defaults_pyobjects = pyobjects;
+    return m->defaults;
+}
+static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) {
+    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
+    m->defaults_tuple = tuple;
+    Py_INCREF(tuple);
 }
 
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
@@ -63994,8 +66661,8 @@ static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject*
     }
 }
 
-static void __Pyx_WriteUnraisable(const char *name, int clineno,
-                                  int lineno, const char *filename) {
+static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
+                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename) {
     PyObject *old_exc, *old_val, *old_tb;
     PyObject *ctx;
     __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
@@ -64015,125 +66682,522 @@ static void __Pyx_WriteUnraisable(const char *name, int clineno,
 
 static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *tmp_type, *tmp_value, *tmp_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
-
     tmp_type = tstate->exc_type;
     tmp_value = tstate->exc_value;
     tmp_tb = tstate->exc_traceback;
-
     tstate->exc_type = *type;
     tstate->exc_value = *value;
     tstate->exc_traceback = *tb;
-
+#else
+    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
+    PyErr_SetExcInfo(*type, *value, *tb);
+#endif
     *type = tmp_type;
     *value = tmp_value;
     *tb = tmp_tb;
 }
 
-static CYTHON_INLINE void __Pyx_Generator_ExceptionClear(struct __pyx_Generator_object *self)
-{
-    Py_XDECREF(self->exc_type);
-    Py_XDECREF(self->exc_value);
-    Py_XDECREF(self->exc_traceback);
-
+static PyObject *__Pyx_Generator_Next(PyObject *self);
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
+static PyObject *__Pyx_Generator_Close(PyObject *self);
+static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args);
+static PyTypeObject *__pyx_GeneratorType = 0;
+#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
+#define __Pyx_Generator_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
+#if 1 || PY_VERSION_HEX < 0x030300B0
+static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
+    PyObject *et, *ev, *tb;
+    PyObject *value = NULL;
+    __Pyx_ErrFetch(&et, &ev, &tb);
+    if (!et) {
+        Py_XDECREF(tb);
+        Py_XDECREF(ev);
+        Py_INCREF(Py_None);
+        *pvalue = Py_None;
+        return 0;
+    }
+    if (unlikely(et != PyExc_StopIteration) &&
+            unlikely(!PyErr_GivenExceptionMatches(et, PyExc_StopIteration))) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    if (likely(et == PyExc_StopIteration)) {
+        if (likely(!ev) || !PyObject_IsInstance(ev, PyExc_StopIteration)) {
+            if (!ev) {
+                Py_INCREF(Py_None);
+                ev = Py_None;
+            }
+            Py_XDECREF(tb);
+            Py_DECREF(et);
+            *pvalue = ev;
+            return 0;
+        }
+    }
+    PyErr_NormalizeException(&et, &ev, &tb);
+    if (unlikely(!PyObject_IsInstance(ev, PyExc_StopIteration))) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    Py_XDECREF(tb);
+    Py_DECREF(et);
+#if PY_VERSION_HEX >= 0x030300A0
+    value = ((PyStopIterationObject *)ev)->value;
+    Py_INCREF(value);
+    Py_DECREF(ev);
+#else
+    {
+        PyObject* args = PyObject_GetAttrString(ev, "args");
+        Py_DECREF(ev);
+        if (likely(args)) {
+            value = PyObject_GetItem(args, 0);
+            Py_DECREF(args);
+        }
+        if (unlikely(!value)) {
+            __Pyx_ErrRestore(NULL, NULL, NULL);
+            Py_INCREF(Py_None);
+            value = Py_None;
+        }
+    }
+#endif
+    *pvalue = value;
+    return 0;
+}
+#endif
+static CYTHON_INLINE
+void __Pyx_Generator_ExceptionClear(__pyx_GeneratorObject *self) {
+    PyObject *exc_type = self->exc_type;
+    PyObject *exc_value = self->exc_value;
+    PyObject *exc_traceback = self->exc_traceback;
     self->exc_type = NULL;
     self->exc_value = NULL;
     self->exc_traceback = NULL;
+    Py_XDECREF(exc_type);
+    Py_XDECREF(exc_value);
+    Py_XDECREF(exc_traceback);
 }
-
-static CYTHON_INLINE PyObject *__Pyx_Generator_SendEx(struct __pyx_Generator_object *self, PyObject *value)
-{
-    PyObject *retval;
-
-    if (self->is_running) {
+static CYTHON_INLINE
+int __Pyx_Generator_CheckRunning(__pyx_GeneratorObject *gen) {
+    if (unlikely(gen->is_running)) {
         PyErr_SetString(PyExc_ValueError,
                         "generator already executing");
-        return NULL;
+        return 1;
     }
-
-    if (self->resume_label == 0) {
-        if (value && value != Py_None) {
+    return 0;
+}
+static CYTHON_INLINE
+PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value) {
+    PyObject *retval;
+    assert(!self->is_running);
+    if (unlikely(self->resume_label == 0)) {
+        if (unlikely(value && value != Py_None)) {
             PyErr_SetString(PyExc_TypeError,
                             "can't send non-None value to a "
                             "just-started generator");
             return NULL;
         }
     }
-
-    if (self->resume_label == -1) {
+    if (unlikely(self->resume_label == -1)) {
         PyErr_SetNone(PyExc_StopIteration);
         return NULL;
     }
-
-
-    if (value)
-        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback);
-    else
+    if (value) {
+#if CYTHON_COMPILING_IN_PYPY
+#else
+        /* Generators always return to their most recent caller, not
+         * necessarily their creator. */
+        if (self->exc_traceback) {
+            PyThreadState *tstate = PyThreadState_GET();
+            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
+            PyFrameObject *f = tb->tb_frame;
+            Py_XINCREF(tstate->frame);
+            assert(f->f_back == NULL);
+            f->f_back = tstate->frame;
+        }
+#endif
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
+                            &self->exc_traceback);
+    } else {
         __Pyx_Generator_ExceptionClear(self);
-
+    }
     self->is_running = 1;
     retval = self->body((PyObject *) self, value);
     self->is_running = 0;
-
-    if (retval)
-        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback);
-    else
+    if (retval) {
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
+                            &self->exc_traceback);
+#if CYTHON_COMPILING_IN_PYPY
+#else
+        /* Don't keep the reference to f_back any longer than necessary.  It
+         * may keep a chain of frames alive or it could create a reference
+         * cycle. */
+        if (self->exc_traceback) {
+            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
+            PyFrameObject *f = tb->tb_frame;
+            Py_CLEAR(f->f_back);
+        }
+#endif
+    } else {
         __Pyx_Generator_ExceptionClear(self);
-
+    }
     return retval;
 }
-
-static PyObject *__Pyx_Generator_Next(PyObject *self)
-{
-    return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, Py_None);
-}
-
-static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value)
-{
-    return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, value);
+static CYTHON_INLINE
+PyObject *__Pyx_Generator_FinishDelegation(__pyx_GeneratorObject *gen) {
+    PyObject *ret;
+    PyObject *val = NULL;
+    __Pyx_Generator_Undelegate(gen);
+    __Pyx_PyGen_FetchStopIterationValue(&val);
+    ret = __Pyx_Generator_SendEx(gen, val);
+    Py_XDECREF(val);
+    return ret;
+}
+static PyObject *__Pyx_Generator_Next(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        ret = Py_TYPE(yf)->tp_iternext(yf);
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Generator_FinishDelegation(gen);
+    }
+    return __Pyx_Generator_SendEx(gen, Py_None);
 }
-
-static PyObject *__Pyx_Generator_Close(PyObject *self)
-{
-    struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
-    PyObject *retval;
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Send(yf, value);
+        } else {
+            if (value == Py_None)
+                ret = PyIter_Next(yf);
+            else
+                ret = PyObject_CallMethod(yf, (char*)"send", (char*)"O", value);
+        }
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Generator_FinishDelegation(gen);
+    }
+    return __Pyx_Generator_SendEx(gen, value);
+}
+static int __Pyx_Generator_CloseIter(__pyx_GeneratorObject *gen, PyObject *yf) {
+    PyObject *retval = NULL;
+    int err = 0;
+    if (__Pyx_Generator_CheckExact(yf)) {
+        retval = __Pyx_Generator_Close(yf);
+        if (!retval)
+            return -1;
+    } else {
+        PyObject *meth;
+        gen->is_running = 1;
+        meth = PyObject_GetAttrString(yf, "close");
+        if (unlikely(!meth)) {
+            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                PyErr_WriteUnraisable(yf);
+            }
+            PyErr_Clear();
+        } else {
+            retval = PyObject_CallFunction(meth, NULL);
+            Py_DECREF(meth);
+            if (!retval)
+                err = -1;
+        }
+        gen->is_running = 0;
+    }
+    Py_XDECREF(retval);
+    return err;
+}
+static PyObject *__Pyx_Generator_Close(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject *retval, *raised_exception;
+    PyObject *yf = gen->yieldfrom;
+    int err = 0;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        Py_INCREF(yf);
+        err = __Pyx_Generator_CloseIter(gen, yf);
+        __Pyx_Generator_Undelegate(gen);
+        Py_DECREF(yf);
+    }
+    if (err == 0)
 #if PY_VERSION_HEX < 0x02050000
-    PyErr_SetNone(PyExc_StopIteration);
+        PyErr_SetNone(PyExc_StopIteration);
 #else
-    PyErr_SetNone(PyExc_GeneratorExit);
+        PyErr_SetNone(PyExc_GeneratorExit);
 #endif
-    retval = __Pyx_Generator_SendEx(generator, NULL);
+    retval = __Pyx_Generator_SendEx(gen, NULL);
     if (retval) {
         Py_DECREF(retval);
         PyErr_SetString(PyExc_RuntimeError,
                         "generator ignored GeneratorExit");
         return NULL;
     }
-#if PY_VERSION_HEX < 0x02050000
-    if (PyErr_ExceptionMatches(PyExc_StopIteration))
-#else
-    if (PyErr_ExceptionMatches(PyExc_StopIteration)
-        || PyErr_ExceptionMatches(PyExc_GeneratorExit))
+    raised_exception = PyErr_Occurred();
+    if (!raised_exception
+        || raised_exception == PyExc_StopIteration
+#if PY_VERSION_HEX >= 0x02050000
+        || raised_exception == PyExc_GeneratorExit
+        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
 #endif
+        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
     {
-        PyErr_Clear();          /* ignore these errors */
+        if (raised_exception) PyErr_Clear();      /* ignore these errors */
         Py_INCREF(Py_None);
         return Py_None;
     }
     return NULL;
 }
-
-static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args, CYTHON_UNUSED PyObject *kwds)
-{
-    struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
+static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
     PyObject *typ;
     PyObject *tb = NULL;
     PyObject *val = NULL;
-
+    PyObject *yf = gen->yieldfrom;
     if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
         return NULL;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        Py_INCREF(yf);
+#if PY_VERSION_HEX >= 0x02050000
+        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
+            int err = __Pyx_Generator_CloseIter(gen, yf);
+            Py_DECREF(yf);
+            __Pyx_Generator_Undelegate(gen);
+            if (err < 0)
+                return __Pyx_Generator_SendEx(gen, NULL);
+            goto throw_here;
+        }
+#endif
+        gen->is_running = 1;
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Throw(yf, args);
+        } else {
+            PyObject *meth = PyObject_GetAttrString(yf, "throw");
+            if (unlikely(!meth)) {
+                Py_DECREF(yf);
+                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                    gen->is_running = 0;
+                    return NULL;
+                }
+                PyErr_Clear();
+                __Pyx_Generator_Undelegate(gen);
+                gen->is_running = 0;
+                goto throw_here;
+            }
+            ret = PyObject_CallObject(meth, args);
+            Py_DECREF(meth);
+        }
+        gen->is_running = 0;
+        Py_DECREF(yf);
+        if (!ret) {
+            ret = __Pyx_Generator_FinishDelegation(gen);
+        }
+        return ret;
+    }
+throw_here:
     __Pyx_Raise(typ, val, tb, NULL);
-    return __Pyx_Generator_SendEx(generator, NULL);
+    return __Pyx_Generator_SendEx(gen, NULL);
+}
+static int __Pyx_Generator_traverse(PyObject *self, visitproc visit, void *arg) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    Py_VISIT(gen->closure);
+    Py_VISIT(gen->classobj);
+    Py_VISIT(gen->yieldfrom);
+    Py_VISIT(gen->exc_type);
+    Py_VISIT(gen->exc_value);
+    Py_VISIT(gen->exc_traceback);
+    return 0;
+}
+static int __Pyx_Generator_clear(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    Py_CLEAR(gen->closure);
+    Py_CLEAR(gen->classobj);
+    Py_CLEAR(gen->yieldfrom);
+    Py_CLEAR(gen->exc_type);
+    Py_CLEAR(gen->exc_value);
+    Py_CLEAR(gen->exc_traceback);
+    return 0;
+}
+static void __Pyx_Generator_dealloc(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject_GC_UnTrack(gen);
+    if (gen->gi_weakreflist != NULL)
+        PyObject_ClearWeakRefs(self);
+    PyObject_GC_Track(self);
+    if (gen->resume_label > 0) {
+        Py_TYPE(gen)->tp_del(self);
+        if (self->ob_refcnt > 0)
+            return;                     /* resurrected.  :( */
+    }
+    PyObject_GC_UnTrack(self);
+    __Pyx_Generator_clear(self);
+    PyObject_GC_Del(gen);
+}
+static void __Pyx_Generator_del(PyObject *self) {
+    PyObject *res;
+    PyObject *error_type, *error_value, *error_traceback;
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    if (gen->resume_label <= 0)
+        return ;
+    assert(self->ob_refcnt == 0);
+    self->ob_refcnt = 1;
+    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
+    res = __Pyx_Generator_Close(self);
+    if (res == NULL)
+        PyErr_WriteUnraisable(self);
+    else
+        Py_DECREF(res);
+    __Pyx_ErrRestore(error_type, error_value, error_traceback);
+    /* Undo the temporary resurrection; can't use DECREF here, it would
+     * cause a recursive call.
+     */
+    assert(self->ob_refcnt > 0);
+    if (--self->ob_refcnt == 0)
+        return; /* this is the normal path out */
+    /* close() resurrected it!  Make it look like the original Py_DECREF
+     * never happened.
+     */
+    {
+        Py_ssize_t refcnt = self->ob_refcnt;
+        _Py_NewReference(self);
+        self->ob_refcnt = refcnt;
+    }
+#if CYTHON_COMPILING_FOR_CPYTHON
+    assert(PyType_IS_GC(self->ob_type) &&
+           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
+    /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
+     * we need to undo that. */
+    _Py_DEC_REFTOTAL;
+#endif
+    /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
+     * chain, so no more to do there.
+     * If COUNT_ALLOCS, the original decref bumped tp_frees, and
+     * _Py_NewReference bumped tp_allocs:  both of those need to be
+     * undone.
+     */
+#ifdef COUNT_ALLOCS
+    --Py_TYPE(self)->tp_frees;
+    --Py_TYPE(self)->tp_allocs;
+#endif
+}
+static PyMemberDef __pyx_Generator_memberlist[] = {
+    {(char *) "gi_running",
+#if PY_VERSION_HEX >= 0x02060000
+     T_BOOL,
+#else
+     T_BYTE,
+#endif
+     offsetof(__pyx_GeneratorObject, is_running),
+     READONLY,
+     NULL},
+    {0, 0, 0, 0, 0}
+};
+static PyMethodDef __pyx_Generator_methods[] = {
+    {__Pyx_NAMESTR("send"), (PyCFunction) __Pyx_Generator_Send, METH_O, 0},
+    {__Pyx_NAMESTR("throw"), (PyCFunction) __Pyx_Generator_Throw, METH_VARARGS, 0},
+    {__Pyx_NAMESTR("close"), (PyCFunction) __Pyx_Generator_Close, METH_NOARGS, 0},
+    {0, 0, 0, 0}
+};
+static PyTypeObject __pyx_GeneratorType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    __Pyx_NAMESTR("generator"),         /*tp_name*/
+    sizeof(__pyx_GeneratorObject),      /*tp_basicsize*/
+    0,                                  /*tp_itemsize*/
+    (destructor) __Pyx_Generator_dealloc,/*tp_dealloc*/
+    0,                                  /*tp_print*/
+    0,                                  /*tp_getattr*/
+    0,                                  /*tp_setattr*/
+#if PY_MAJOR_VERSION < 3
+    0,                                  /*tp_compare*/
+#else
+    0,                                  /*reserved*/
+#endif
+    0,                                   /*tp_repr*/
+    0,                                  /*tp_as_number*/
+    0,                                  /*tp_as_sequence*/
+    0,                                  /*tp_as_mapping*/
+    0,                                  /*tp_hash*/
+    0,                                  /*tp_call*/
+    0,                                  /*tp_str*/
+    0,                                  /*tp_getattro*/
+    0,                                  /*tp_setattro*/
+    0,                                  /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
+    0,                                  /*tp_doc*/
+    (traverseproc) __Pyx_Generator_traverse,   /*tp_traverse*/
+    0,                                  /*tp_clear*/
+    0,                                  /*tp_richcompare*/
+    offsetof(__pyx_GeneratorObject, gi_weakreflist), /* tp_weaklistoffse */
+    0,                                  /*tp_iter*/
+    (iternextfunc) __Pyx_Generator_Next, /*tp_iternext*/
+    __pyx_Generator_methods,            /*tp_methods*/
+    __pyx_Generator_memberlist,         /*tp_members*/
+    0,                                  /*tp_getset*/
+    0,                                  /*tp_base*/
+    0,                                  /*tp_dict*/
+    0,                                  /*tp_descr_get*/
+    0,                                  /*tp_descr_set*/
+    0,                                  /*tp_dictoffset*/
+    0,                                  /*tp_init*/
+    0,                                  /*tp_alloc*/
+    0,                                  /*tp_new*/
+    0,                                  /*tp_free*/
+    0,                                  /*tp_is_gc*/
+    0,                                  /*tp_bases*/
+    0,                                  /*tp_mro*/
+    0,                                  /*tp_cache*/
+    0,                                  /*tp_subclasses*/
+    0,                                  /*tp_weaklist*/
+    __Pyx_Generator_del,                /*tp_del*/
+#if PY_VERSION_HEX >= 0x02060000
+    0,                                  /*tp_version_tag*/
+#endif
+};
+static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                                  PyObject *closure) {
+    __pyx_GeneratorObject *gen =
+        PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType_type);
+    if (gen == NULL)
+        return NULL;
+    gen->body = body;
+    gen->closure = closure;
+    Py_XINCREF(closure);
+    gen->is_running = 0;
+    gen->resume_label = 0;
+    gen->classobj = NULL;
+    gen->yieldfrom = NULL;
+    gen->exc_type = NULL;
+    gen->exc_value = NULL;
+    gen->exc_traceback = NULL;
+    gen->gi_weakreflist = NULL;
+    PyObject_GC_Track(gen);
+    return gen;
+}
+static int __pyx_Generator_init(void) {
+    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
+    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
+    if (PyType_Ready(&__pyx_GeneratorType_type)) {
+        return -1;
+    }
+    __pyx_GeneratorType = &__pyx_GeneratorType_type;
+    return 0;
 }
 
 static int __Pyx_check_binary_version(void) {
@@ -64162,7 +67226,6 @@ static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *s
         void (*fp)(void);
         void *p;
     } tmp;
-
     d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__");
     if (!d) {
         PyErr_Clear();
@@ -64209,29 +67272,105 @@ bad:
     return -1;
 }
 
+static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
+    int start = 0, mid = 0, end = count - 1;
+    if (end >= 0 && code_line > entries[end].code_line) {
+        return count;
+    }
+    while (start < end) {
+        mid = (start + end) / 2;
+        if (code_line < entries[mid].code_line) {
+            end = mid;
+        } else if (code_line > entries[mid].code_line) {
+             start = mid + 1;
+        } else {
+            return mid;
+        }
+    }
+    if (code_line <= entries[mid].code_line) {
+        return mid;
+    } else {
+        return mid + 1;
+    }
+}
+static PyCodeObject *__pyx_find_code_object(int code_line) {
+    PyCodeObject* code_object;
+    int pos;
+    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
+        return NULL;
+    }
+    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
+        return NULL;
+    }
+    code_object = __pyx_code_cache.entries[pos].code_object;
+    Py_INCREF(code_object);
+    return code_object;
+}
+static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
+    int pos, i;
+    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
+    if (unlikely(!code_line)) {
+        return;
+    }
+    if (unlikely(!entries)) {
+        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
+        if (likely(entries)) {
+            __pyx_code_cache.entries = entries;
+            __pyx_code_cache.max_count = 64;
+            __pyx_code_cache.count = 1;
+            entries[0].code_line = code_line;
+            entries[0].code_object = code_object;
+            Py_INCREF(code_object);
+        }
+        return;
+    }
+    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
+        PyCodeObject* tmp = entries[pos].code_object;
+        entries[pos].code_object = code_object;
+        Py_DECREF(tmp);
+        return;
+    }
+    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
+        int new_max = __pyx_code_cache.max_count + 64;
+        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
+            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));
+        if (unlikely(!entries)) {
+            return;
+        }
+        __pyx_code_cache.entries = entries;
+        __pyx_code_cache.max_count = new_max;
+    }
+    for (i=__pyx_code_cache.count; i>pos; i--) {
+        entries[i] = entries[i-1];
+    }
+    entries[pos].code_line = code_line;
+    entries[pos].code_object = code_object;
+    __pyx_code_cache.count++;
+    Py_INCREF(code_object);
+}
+
 #include "compile.h"
 #include "frameobject.h"
 #include "traceback.h"
-
-static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
-                               int __pyx_lineno, const char *__pyx_filename) {
+static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
+            const char *funcname, int c_line,
+            int py_line, const char *filename) {
+    PyCodeObject *py_code = 0;
     PyObject *py_srcfile = 0;
     PyObject *py_funcname = 0;
-    PyObject *py_globals = 0;
-    PyCodeObject *py_code = 0;
-    PyFrameObject *py_frame = 0;
-
     #if PY_MAJOR_VERSION < 3
-    py_srcfile = PyString_FromString(__pyx_filename);
+    py_srcfile = PyString_FromString(filename);
     #else
-    py_srcfile = PyUnicode_FromString(__pyx_filename);
+    py_srcfile = PyUnicode_FromString(filename);
     #endif
     if (!py_srcfile) goto bad;
-    if (__pyx_clineno) {
+    if (c_line) {
         #if PY_MAJOR_VERSION < 3
-        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
+        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
         #else
-        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
+        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
         #endif
     }
     else {
@@ -64242,28 +67381,45 @@ static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
         #endif
     }
     if (!py_funcname) goto bad;
-    py_globals = PyModule_GetDict(__pyx_m);
-    if (!py_globals) goto bad;
-    py_code = PyCode_New(
+    py_code = __Pyx_PyCode_New(
         0,            /*int argcount,*/
-        #if PY_MAJOR_VERSION >= 3
         0,            /*int kwonlyargcount,*/
-        #endif
         0,            /*int nlocals,*/
         0,            /*int stacksize,*/
         0,            /*int flags,*/
         __pyx_empty_bytes, /*PyObject *code,*/
-        __pyx_empty_tuple,  /*PyObject *consts,*/
-        __pyx_empty_tuple,  /*PyObject *names,*/
-        __pyx_empty_tuple,  /*PyObject *varnames,*/
-        __pyx_empty_tuple,  /*PyObject *freevars,*/
-        __pyx_empty_tuple,  /*PyObject *cellvars,*/
+        __pyx_empty_tuple, /*PyObject *consts,*/
+        __pyx_empty_tuple, /*PyObject *names,*/
+        __pyx_empty_tuple, /*PyObject *varnames,*/
+        __pyx_empty_tuple, /*PyObject *freevars,*/
+        __pyx_empty_tuple, /*PyObject *cellvars,*/
         py_srcfile,   /*PyObject *filename,*/
         py_funcname,  /*PyObject *name,*/
-        __pyx_lineno,   /*int firstlineno,*/
+        py_line,      /*int firstlineno,*/
         __pyx_empty_bytes  /*PyObject *lnotab*/
     );
-    if (!py_code) goto bad;
+    Py_DECREF(py_srcfile);
+    Py_DECREF(py_funcname);
+    return py_code;
+bad:
+    Py_XDECREF(py_srcfile);
+    Py_XDECREF(py_funcname);
+    return NULL;
+}
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+                               int py_line, const char *filename) {
+    PyCodeObject *py_code = 0;
+    PyObject *py_globals = 0;
+    PyFrameObject *py_frame = 0;
+    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
+    if (!py_code) {
+        py_code = __Pyx_CreateCodeObjectForTraceback(
+            funcname, c_line, py_line, filename);
+        if (!py_code) goto bad;
+        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
+    }
+    py_globals = PyModule_GetDict(__pyx_m);
+    if (!py_globals) goto bad;
     py_frame = PyFrame_New(
         PyThreadState_GET(), /*PyThreadState *tstate,*/
         py_code,             /*PyCodeObject *code,*/
@@ -64271,11 +67427,9 @@ static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
         0                    /*PyObject *locals*/
     );
     if (!py_frame) goto bad;
-    py_frame->f_lineno = __pyx_lineno;
+    py_frame->f_lineno = py_line;
     PyTraceBack_Here(py_frame);
 bad:
-    Py_XDECREF(py_srcfile);
-    Py_XDECREF(py_funcname);
     Py_XDECREF(py_code);
     Py_XDECREF(py_frame);
 }
@@ -64310,6 +67464,7 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     return 0;
 }
 
+
 /* Type Conversion Functions */
 
 static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
diff --git a/python/src/sa/data_array.pxi b/python/src/sa/data_array.pxi
index 9f62dc0a..2626ce0f 100644
--- a/python/src/sa/data_array.pxi
+++ b/python/src/sa/data_array.pxi
@@ -32,10 +32,10 @@ cdef class DataArray:
     def __len__(self):
         return len(self.data)
 
-    def getSentId(self, i):
+    def get_sentence_id(self, i):
         return self.sent_id.arr[i]
 
-    def getSent(self, i):
+    def get_sentence(self, i):
         cdef int j, start, stop
         sent = []
         start = self.sent_index.arr[i]
@@ -44,7 +44,7 @@ cdef class DataArray:
             sent.append(self.id2word[self.data.arr[i]])
         return sent
 
-    def getSentPos(self, loc):
+    def get_sentence_position(self, loc):
         return loc - self.sent_index.arr[self.sent_id.arr[loc]]
 
     def get_id(self, word):
diff --git a/python/src/sa/int_list.pxi b/python/src/sa/int_list.pxi
index 63c0fe67..55f5d174 100644
--- a/python/src/sa/int_list.pxi
+++ b/python/src/sa/int_list.pxi
@@ -122,7 +122,7 @@ cdef class IntList:
     def __len__(self):
         return self.len
 
-    def getSize(self):
+    def get_size(self):
         return self.size
 
     def append(self, int val):
diff --git a/python/src/sa/rulefactory.pxi b/python/src/sa/rulefactory.pxi
index 54471ccd..fb496aff 100644
--- a/python/src/sa/rulefactory.pxi
+++ b/python/src/sa/rulefactory.pxi
@@ -1098,12 +1098,13 @@ cdef class HieroCachingRuleFactory:
                                 fphrases[f][e][als].append(loc)
                             for f, elist in fphrases.iteritems():
                                 for e, alslist in elist.iteritems():
-                                    alignment = max(alslist.iteritems(), key=lambda x: len(x[1]))[0]
+                                    alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
                                     locs = tuple(itertools.chain(alslist.itervalues()))
-                                    count = len(locs)
+                                    # count = len(locs) # Should be?
+                                    count = len(max_locs) # Was
                                     scores = self.scorer.score(FeatureContext(
                                                f, e, count, fcount[f], num_samples,
-                                               (k,i), locs, fwords
+                                               (k, i), locs, fwords
                                                ))
                                     yield Rule(self.category, f, e, scores, alignment)
 
diff --git a/python/src/sa/suffix_array.pxi b/python/src/sa/suffix_array.pxi
index d86e8ea6..baa3d546 100644
--- a/python/src/sa/suffix_array.pxi
+++ b/python/src/sa/suffix_array.pxi
@@ -20,14 +20,14 @@ cdef class SuffixArray:
     def __getitem__(self, i):
         return self.sa.arr[i]
 
-    def getSentId(self, i):
-        return self.darray.getSentId(i)
+    def get_sentence_id(self, i):
+        return self.darray.get_sentence_id(i)
 
-    def getSent(self, i):
-        return self.darray.getSent(i)
+    def get_sentence(self, i):
+        return self.darray.get_sentence(i)
 
-    def getSentPos(self, loc):
-        return self.darray.getSentPos(loc)
+    def get_sentence_position(self, loc):
+        return self.darray.get_sentence_position(loc)
 
     def read_text(self, filename, side):
         '''Constructs suffix array using the algorithm
-- 
cgit v1.2.3


From b674c40505f48bfc3aafe4df9e116321c89342fa Mon Sep 17 00:00:00 2001
From: Adam Lopez <alopez@cs.jhu.edu>
Date: Thu, 6 Sep 2012 05:46:57 -0400
Subject: Make Data_Array.data accessible via getter

---
 python/src/sa/_sa.c          | 19389 +++++++++++++++++------------------------
 python/src/sa/data_array.pxi |     3 +
 2 files changed, 8162 insertions(+), 11230 deletions(-)

(limited to 'python/src/sa')

diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index 8d906e3e..c85a54e7 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,16 +1,16 @@
-/* Generated by Cython 0.17 on Thu Sep  6 03:01:56 2012 */
+/* Generated by Cython 0.15.1 on Thu Sep  6 05:37:20 2012 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
-#elif PY_VERSION_HEX < 0x02040000
-    #error Cython requires Python 2.4+.
 #else
+
 #include <stddef.h> /* For offsetof */
 #ifndef offsetof
 #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
 #endif
+
 #if !defined(WIN32) && !defined(MS_WINDOWS)
   #ifndef __stdcall
     #define __stdcall
@@ -22,44 +22,36 @@
     #define __fastcall
   #endif
 #endif
+
 #ifndef DL_IMPORT
   #define DL_IMPORT(t) t
 #endif
 #ifndef DL_EXPORT
   #define DL_EXPORT(t) t
 #endif
+
 #ifndef PY_LONG_LONG
   #define PY_LONG_LONG LONG_LONG
 #endif
-#ifndef Py_HUGE_VAL
-  #define Py_HUGE_VAL HUGE_VAL
-#endif
-#ifdef PYPY_VERSION
-#define CYTHON_COMPILING_IN_PYPY 1
-#define CYTHON_COMPILING_IN_CPYTHON 0
-#else
-#define CYTHON_COMPILING_IN_PYPY 0
-#define CYTHON_COMPILING_IN_CPYTHON 1
+
+#if PY_VERSION_HEX < 0x02040000
+  #define METH_COEXIST 0
+  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
+  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)
 #endif
+
 #if PY_VERSION_HEX < 0x02050000
   typedef int Py_ssize_t;
   #define PY_SSIZE_T_MAX INT_MAX
   #define PY_SSIZE_T_MIN INT_MIN
   #define PY_FORMAT_SIZE_T ""
-  #define CYTHON_FORMAT_SSIZE_T ""
   #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
   #define PyInt_AsSsize_t(o)   __Pyx_PyInt_AsInt(o)
-  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \
-                                (PyErr_Format(PyExc_TypeError, \
-                                              "expected index value, got %.200s", Py_TYPE(o)->tp_name), \
-                                 (PyObject*)0))
-  #define PyIndex_Check(o)     (PyNumber_Check(o) && !PyFloat_Check(o) && !PyComplex_Check(o))
+  #define PyNumber_Index(o)    PyNumber_Int(o)
+  #define PyIndex_Check(o)     PyNumber_Check(o)
   #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
-  #define __PYX_BUILD_PY_SSIZE_T "i"
-#else
-  #define __PYX_BUILD_PY_SSIZE_T "n"
-  #define CYTHON_FORMAT_SSIZE_T "z"
 #endif
+
 #if PY_VERSION_HEX < 0x02060000
   #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
   #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
@@ -67,6 +59,7 @@
   #define PyVarObject_HEAD_INIT(type, size) \
           PyObject_HEAD_INIT(type) size,
   #define PyType_Modified(t)
+
   typedef struct {
      void *buf;
      PyObject *obj;
@@ -80,6 +73,7 @@
      Py_ssize_t *suboffsets;
      void *internal;
   } Py_buffer;
+
   #define PyBUF_SIMPLE 0
   #define PyBUF_WRITABLE 0x0001
   #define PyBUF_FORMAT 0x0004
@@ -89,44 +83,24 @@
   #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
   #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
   #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
-  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)
-  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)
-  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
-  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
+
 #endif
+
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
-          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
-          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
-#endif
-#if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6
-  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict")
 #endif
+
 #if PY_MAJOR_VERSION >= 3
   #define Py_TPFLAGS_CHECKTYPES 0
   #define Py_TPFLAGS_HAVE_INDEX 0
 #endif
+
 #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
-#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
-  #define CYTHON_PEP393_ENABLED 1
-  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \
-                                              0 : _PyUnicode_Ready((PyObject *)(op)))
-  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
-  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
-  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
-#else
-  #define CYTHON_PEP393_ENABLED 0
-  #define __Pyx_PyUnicode_READY(op)       (0)
-  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
-  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
-  #define __Pyx_PyUnicode_READ(k, d, i)   ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
-#endif
+
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
   #define PyStringObject               PyUnicodeObject
@@ -134,6 +108,7 @@
   #define PyString_Check               PyUnicode_Check
   #define PyString_CheckExact          PyUnicode_CheckExact
 #endif
+
 #if PY_VERSION_HEX < 0x02060000
   #define PyBytesObject                PyStringObject
   #define PyBytes_Type                 PyString_Type
@@ -152,6 +127,7 @@
   #define PyBytes_Concat               PyString_Concat
   #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
 #endif
+
 #if PY_VERSION_HEX < 0x02060000
   #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
   #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
@@ -159,7 +135,9 @@
 #ifndef PySet_CheckExact
   #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
 #endif
+
 #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
+
 #if PY_MAJOR_VERSION >= 3
   #define PyIntObject                  PyLongObject
   #define PyInt_Type                   PyLong_Type
@@ -176,9 +154,11 @@
   #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
   #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
 #endif
+
 #if PY_MAJOR_VERSION >= 3
   #define PyBoolObject                 PyLongObject
 #endif
+
 #if PY_VERSION_HEX < 0x03020000
   typedef long Py_hash_t;
   #define __Pyx_PyInt_FromHash_t PyInt_FromLong
@@ -187,6 +167,16 @@
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
   #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
 #endif
+
+
+#if PY_MAJOR_VERSION >= 3
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
+#else
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
+#endif
+
 #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)
   #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)
   #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)
@@ -205,9 +195,11 @@
         (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \
             (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1)))
 #endif
+
 #if PY_MAJOR_VERSION >= 3
   #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
 #endif
+
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
@@ -217,6 +209,7 @@
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
   #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
 #endif
+
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_NAMESTR(n) ((char *)(n))
   #define __Pyx_DOCSTR(n)  ((char *)(n))
@@ -225,15 +218,6 @@
   #define __Pyx_DOCSTR(n)  (n)
 #endif
 
-
-#if PY_MAJOR_VERSION >= 3
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
-#else
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
-#endif
-
 #ifndef __PYX_EXTERN_C
   #ifdef __cplusplus
     #define __PYX_EXTERN_C extern "C"
@@ -283,7 +267,7 @@
 #   else
 #     define CYTHON_UNUSED
 #   endif
-# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
+# elif defined(__ICC) || defined(__INTEL_COMPILER)
 #   define CYTHON_UNUSED __attribute__ ((__unused__))
 # else
 #   define CYTHON_UNUSED
@@ -307,12 +291,8 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
 static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 
-#if CYTHON_COMPILING_IN_CPYTHON
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
-#else
-#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
-#endif
-#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
+
 
 #ifdef __GNUC__
   /* Test for GCC > 2.95 */
@@ -356,8 +336,16 @@ static const char *__pyx_f[] = {
   "str_map.pxi",
 };
 
+static PyObject *__Pyx_Generator_Next(PyObject *self);
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
+static PyObject *__Pyx_Generator_Close(PyObject *self);
+static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args, CYTHON_UNUSED PyObject *kwds);
+
+typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
+
 /*--- Type declarations ---*/
 struct __pyx_obj_3_sa_HieroCachingRuleFactory;
+struct __pyx_Generator_object;
 struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__;
 struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats;
 struct __pyx_obj_3_sa_IntList;
@@ -550,6 +538,24 @@ struct __pyx_obj_3_sa_HieroCachingRuleFactory {
 };
 
 
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
+ *         free(self.arr)
+ * 
+ *     def __iter__(self):             # <<<<<<<<<<<<<<
+ *         cdef int i
+ *         for i in range(self.len):
+ */
+struct __pyx_Generator_object {
+  PyObject_HEAD
+  __pyx_generator_body_t body;
+  int is_running;
+  int resume_label;
+  PyObject *exc_type;
+  PyObject *exc_value;
+  PyObject *exc_traceback;
+};
+
+
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
@@ -558,9 +564,9 @@ struct __pyx_obj_3_sa_HieroCachingRuleFactory {
  *         for i from 0 <= i < self.n:
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   int __pyx_v_i;
-  struct __pyx_obj_3_sa_Phrase *__pyx_v_self;
+  PyObject *__pyx_v_self;
   int __pyx_t_0;
 };
 
@@ -573,7 +579,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ {
  *         particular, the frequency associated with each word is
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   int __pyx_v_N;
   int __pyx_v_freq;
   int __pyx_v_h;
@@ -589,7 +595,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
   PyObject *__pyx_v_ngram_starts;
   int __pyx_v_rs;
   struct __pyx_obj_3_sa_IntList *__pyx_v_run_start;
-  struct __pyx_obj_3_sa_LCP *__pyx_v_self;
+  PyObject *__pyx_v_self;
   int __pyx_v_valid;
   struct __pyx_obj_3_sa_VEB *__pyx_v_veb;
   int __pyx_t_0;
@@ -738,7 +744,7 @@ struct __pyx_obj_3_sa_Precomputation {
  *         it looks up all of the rules that can be used to translate
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   PyObject *__pyx_v_alignment;
   PyObject *__pyx_v_als;
   PyObject *__pyx_v_alslist;
@@ -788,7 +794,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
   PyObject *__pyx_v_sa_range;
   struct __pyx_obj_3_sa_IntList *__pyx_v_sample;
   struct __pyx_obj_3_sa_FeatureVector *__pyx_v_scores;
-  struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self;
+  PyObject *__pyx_v_self;
   PyObject *__pyx_v_spanlen;
   float __pyx_v_start_time;
   PyObject *__pyx_v_stop_time;
@@ -802,15 +808,13 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
   PyObject *__pyx_v_xnode;
   PyObject *__pyx_v_xroot;
   Py_ssize_t __pyx_t_0;
-  PyObject *__pyx_t_1;
-  Py_ssize_t __pyx_t_2;
-  int __pyx_t_3;
+  Py_ssize_t __pyx_t_1;
+  PyObject *__pyx_t_2;
+  PyObject *__pyx_t_3;
   PyObject *__pyx_t_4;
-  PyObject *__pyx_t_5;
-  int __pyx_t_6;
-  Py_ssize_t __pyx_t_7;
-  Py_ssize_t __pyx_t_8;
-  Py_ssize_t __pyx_t_9;
+  PyObject *(*__pyx_t_5)(PyObject *);
+  Py_ssize_t __pyx_t_6;
+  PyObject *(*__pyx_t_7)(PyObject *);
 };
 
 
@@ -874,7 +878,7 @@ struct __pyx_obj_3_sa_Rule {
  * 
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *__pyx_outer_scope;
   PyObject *__pyx_v_a;
   PyObject *__pyx_t_0;
@@ -883,7 +887,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -891,7 +895,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
  * 
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_outer_scope;
   PyObject *__pyx_v_line;
   PyObject *__pyx_t_0;
@@ -927,7 +931,7 @@ struct __pyx_obj_3_sa_PhraseLocation {
  * cdef class Scorer:
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *__pyx_outer_scope;
   PyObject *__pyx_v_feat;
   PyObject *__pyx_t_0;
@@ -945,11 +949,11 @@ struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ {
   PyObject_HEAD
-  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self;
+  PyObject *__pyx_v_self;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -985,9 +989,9 @@ struct __pyx_obj_3_sa_FeatureVector {
  *             yield point/65536, point%65536
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   PyObject *__pyx_v_point;
-  struct __pyx_obj_3_sa_Rule *__pyx_v_self;
+  PyObject *__pyx_v_self;
   PyObject *__pyx_t_0;
   Py_ssize_t __pyx_t_1;
   PyObject *(*__pyx_t_2)(PyObject *);
@@ -1031,9 +1035,9 @@ struct __pyx_obj_3_sa_Alignment {
  *         for i in range(self.names.len):
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   unsigned int __pyx_v_i;
-  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self;
+  PyObject *__pyx_v_self;
   int __pyx_t_0;
   unsigned int __pyx_t_1;
 };
@@ -1148,9 +1152,9 @@ struct __pyx_obj_3_sa_Phrase {
  *         for i in range(self.len):
  */
 struct __pyx_obj_3_sa___pyx_scope_struct____iter__ {
-  PyObject_HEAD
+  struct __pyx_Generator_object __pyx_base;
   int __pyx_v_i;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_self;
+  PyObject *__pyx_v_self;
   int __pyx_t_0;
   int __pyx_t_1;
 };
@@ -1180,7 +1184,7 @@ struct __pyx_obj_3_sa_TrieTable {
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ {
   PyObject_HEAD
-  struct __pyx_obj_3_sa_Rule *__pyx_v_self;
+  PyObject *__pyx_v_self;
 };
 
 
@@ -1452,15 +1456,17 @@ static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *__pyx_vtabptr_3_sa_
  */
 
 struct __pyx_vtabstruct_3_sa_SuffixArray {
-  int (*__pyx___search_high)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
-  int (*__pyx___search_low)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
-  PyObject *(*__pyx___get_range)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int);
-  PyObject *(*__pyx___lookup_helper)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  int (*__search_high)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  int (*__search_low)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  PyObject *(*__get_range)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int);
+  PyObject *(*__lookup_helper)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
 };
 static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
+
 #ifndef CYTHON_REFNANNY
   #define CYTHON_REFNANNY 0
 #endif
+
 #if CYTHON_REFNANNY
   typedef struct {
     void (*INCREF)(void*, PyObject*, int);
@@ -1473,21 +1479,8 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/
   #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
-#ifdef WITH_THREAD
-  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
-          if (acquire_gil) { \
-              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \
-              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
-              PyGILState_Release(__pyx_gilstate_save); \
-          } else { \
-              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
-          }
-#else
-  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
-          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
-#endif
-  #define __Pyx_RefNannyFinishContext() \
-          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
+  #define __Pyx_RefNannySetupContext(name)           __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
+  #define __Pyx_RefNannyFinishContext()           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
   #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
@@ -1498,7 +1491,7 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
 #else
   #define __Pyx_RefNannyDeclarations
-  #define __Pyx_RefNannySetupContext(name, acquire_gil)
+  #define __Pyx_RefNannySetupContext(name)
   #define __Pyx_RefNannyFinishContext()
   #define __Pyx_INCREF(r) Py_INCREF(r)
   #define __Pyx_DECREF(r) Py_DECREF(r)
@@ -1509,97 +1502,16 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   #define __Pyx_XGOTREF(r)
   #define __Pyx_XGIVEREF(r)
 #endif /* CYTHON_REFNANNY */
-#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
-#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
 
 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
 
-static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
-                                         Py_ssize_t end, int direction)
-{
-    const char* self_ptr = PyBytes_AS_STRING(self);
-    Py_ssize_t self_len = PyBytes_GET_SIZE(self);
-    const char* sub_ptr;
-    Py_ssize_t sub_len;
-    int retval;
-#if PY_VERSION_HEX >= 0x02060000
-    Py_buffer view;
-    view.obj = NULL;
-#endif
-    if ( PyBytes_Check(arg) ) {
-        sub_ptr = PyBytes_AS_STRING(arg);
-        sub_len = PyBytes_GET_SIZE(arg);
-    }
-#if PY_MAJOR_VERSION < 3
-    else if ( PyUnicode_Check(arg) ) {
-        return PyUnicode_Tailmatch(self, arg, start, end, direction);
-    }
-#endif
-    else {
-#if PY_VERSION_HEX < 0x02060000
-        if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
-            return -1;
-#else
-        if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
-            return -1;
-        sub_ptr = (const char*) view.buf;
-        sub_len = view.len;
-#endif
-    }
-    if (end > self_len)
-        end = self_len;
-    else if (end < 0)
-        end += self_len;
-    if (end < 0)
-        end = 0;
-    if (start < 0)
-        start += self_len;
-    if (start < 0)
-        start = 0;
-    if (direction > 0) {
-        if (end-sub_len > start)
-            start = end - sub_len;
-    }
-    if (start + sub_len <= end)
-        retval = !memcmp(self_ptr+start, sub_ptr, sub_len);
-    else
-        retval = 0;
-#if PY_VERSION_HEX >= 0x02060000
-    if (view.obj)
-        PyBuffer_Release(&view);
-#endif
-    return retval;
-}
-static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
-                                   Py_ssize_t end, int direction)
-{
-    if (unlikely(PyTuple_Check(substr))) {
-        Py_ssize_t i, count = PyTuple_GET_SIZE(substr);
-        for (i = 0; i < count; i++) {
-            int result;
-#if CYTHON_COMPILING_IN_CPYTHON
-            result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
-                                                   start, end, direction);
-#else
-            PyObject* sub = PySequence_GetItem(substr, i);
-            if (unlikely(!sub)) return -1;
-            result = __Pyx_PyBytes_SingleTailmatch(self, sub, start, end, direction);
-            Py_DECREF(sub);
-#endif
-            if (result) {
-                return result;
-            }
-        }
-        return 0;
-    }
-    return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
-}
+static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
+                                   Py_ssize_t end, int direction);
 
-static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/
+static void __Pyx_RaiseDoubleKeywordsError(
+    const char* func_name, PyObject* kw_name); /*proto*/
 
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
-    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
-    const char* function_name); /*proto*/
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
 
 static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
     Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
@@ -1611,7 +1523,9 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
 
 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
 
-static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /*proto*/
+static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict,
+    const char* function_name, int kw_allowed); /*proto*/
+
 
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
     PyObject *r;
@@ -1620,96 +1534,86 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j
     Py_DECREF(j);
     return r;
 }
+
+
 #define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_List_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-        PyObject *r = PyList_GET_ITEM(o, i);
-        Py_INCREF(r);
-        return r;
-    }
-    else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
-        PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
-        Py_INCREF(r);
-        return r;
+    if (likely(o != Py_None)) {
+        if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+            PyObject *r = PyList_GET_ITEM(o, i);
+            Py_INCREF(r);
+            return r;
+        }
+        else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
+            PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
+            Py_INCREF(r);
+            return r;
+        }
     }
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
-#else
-    return PySequence_GetItem(o, i);
-#endif
 }
+
 #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_Tuple_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-        PyObject *r = PyTuple_GET_ITEM(o, i);
-        Py_INCREF(r);
-        return r;
-    }
-    else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
-        PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
-        Py_INCREF(r);
-        return r;
+    if (likely(o != Py_None)) {
+        if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+            PyObject *r = PyTuple_GET_ITEM(o, i);
+            Py_INCREF(r);
+            return r;
+        }
+        else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
+            PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
+            Py_INCREF(r);
+            return r;
+        }
     }
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
-#else
-    return PySequence_GetItem(o, i);
-#endif
 }
+
+
 #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (PyList_CheckExact(o)) {
-        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
-        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
-            PyObject *r = PyList_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
-        }
+    PyObject *r;
+    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        r = PyList_GET_ITEM(o, i);
+        Py_INCREF(r);
     }
-    else if (PyTuple_CheckExact(o)) {
-        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
-        if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
-        }
-    } else {  /* inlined PySequence_GetItem() */
-        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
-        if (likely(m && m->sq_item)) {
-            if (unlikely(i < 0) && likely(m->sq_length)) {
-                Py_ssize_t l = m->sq_length(o);
-                if (unlikely(l < 0)) return NULL;
-                i += l;
-            }
-            return m->sq_item(o, i);
-        }
+    else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
     }
-#else
-    if (PySequence_Check(o)) {
-        return PySequence_GetItem(o, i);
+    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
+        r = PySequence_GetItem(o, i);
     }
-#endif
-    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+    else {
+        r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+    }
+    return r;
 }
 
-static CYTHON_INLINE int __Pyx_PySequence_Contains(PyObject* item, PyObject* seq, int eq) {
-    int result = PySequence_Contains(seq, item);
-    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
+static CYTHON_INLINE int __Pyx_NegateNonNeg(int b) { 
+    return unlikely(b < 0) ? b : !b; 
+}
+static CYTHON_INLINE PyObject* __Pyx_PyBoolOrNull_FromLong(long b) {
+    return unlikely(b < 0) ? NULL : __Pyx_PyBool_FromLong(b);
 }
 
 static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
     if (likely(PyList_CheckExact(L))) {
-        if (unlikely(PyList_Append(L, x) < 0)) return NULL;
+        if (PyList_Append(L, x) < 0) return NULL;
         Py_INCREF(Py_None);
         return Py_None; /* this is just to have an accurate signature */
-    } else {
+    }
+    else {
         PyObject *r, *m;
         m = __Pyx_GetAttrString(L, "append");
         if (!m) return NULL;
@@ -1727,17 +1631,16 @@ static CYTHON_INLINE long __Pyx_div_long(long, long); /* proto */
 
 static CYTHON_INLINE long __Pyx_mod_long(long, long); /* proto */
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
-
 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
 
-static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
 
 static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/
 
 #define __Pyx_SetItemInt(o, i, v, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_SetItemInt_Fast(o, i, v) : \
                                                     __Pyx_SetItemInt_Generic(o, to_py_func(i), v))
+
 static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
     int r;
     if (!j) return -1;
@@ -1745,126 +1648,130 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyOb
     Py_DECREF(j);
     return r;
 }
+
 static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    if (PyList_CheckExact(o)) {
-        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
-        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
-            PyObject* old = PyList_GET_ITEM(o, n);
-            Py_INCREF(v);
-            PyList_SET_ITEM(o, n, v);
-            Py_DECREF(old);
-            return 1;
-        }
-    } else {  /* inlined PySequence_SetItem() */
-        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
-        if (likely(m && m->sq_ass_item)) {
-            if (unlikely(i < 0) && likely(m->sq_length)) {
-                Py_ssize_t l = m->sq_length(o);
-                if (unlikely(l < 0)) return -1;
-                i += l;
-            }
-            return m->sq_ass_item(o, i, v);
-        }
+    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        Py_INCREF(v);
+        Py_DECREF(PyList_GET_ITEM(o, i));
+        PyList_SET_ITEM(o, i, v);
+        return 1;
     }
-#else
-#if CYTHON_COMPILING_IN_PYPY
-    if (PySequence_Check(o) && !PyDict_Check(o)) {
-#else
-    if (PySequence_Check(o)) {
-#endif
+    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0)))
         return PySequence_SetItem(o, i, v);
+    else {
+        PyObject *j = PyInt_FromSsize_t(i);
+        return __Pyx_SetItemInt_Generic(o, j, v);
     }
-#endif
-    return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v);
 }
 
 static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */
-#if CYTHON_COMPILING_IN_PYPY
-#define __Pyx_PyObject_AsDouble(obj) \
-(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \
- likely(PyInt_CheckExact(obj)) ? \
- PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
-#else
+
 #define __Pyx_PyObject_AsDouble(obj) \
-((likely(PyFloat_CheckExact(obj))) ? \
- PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
-#endif
+    ((likely(PyFloat_CheckExact(obj))) ? \
+     PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
 
 static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);
 
 static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact); /*proto*/
 
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
-    PyListObject* L = (PyListObject*) list;
-    Py_ssize_t len = Py_SIZE(list);
-    if (likely(L->allocated > len)) {
-        Py_INCREF(x);
-        PyList_SET_ITEM(list, len, x);
-        Py_SIZE(list) = len+1;
-        return 0;
-    }
-    return PyList_Append(list, x);
-}
-#else
-#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
-#endif
-
-static CYTHON_INLINE int __Pyx_PyDict_Contains(PyObject* item, PyObject* dict, int eq) {
-    int result = PyDict_Contains(dict, item);
-    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
-}
-
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
-
-static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
-
-static CYTHON_INLINE int __Pyx_unpack_tuple2(PyObject* tuple, PyObject** value1, PyObject** value2,
-                                             int is_tuple, int has_known_size, int decref_tuple);
-
-static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name,
-                                                   Py_ssize_t* p_orig_length, int* p_is_dict);
-static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos,
-                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict);
-
 #if PY_VERSION_HEX < 0x02050000
 #ifndef PyAnySet_CheckExact
+
 #define PyAnySet_CheckExact(ob) \
     ((ob)->ob_type == &PySet_Type || \
      (ob)->ob_type == &PyFrozenSet_Type)
+
 #define PySet_New(iterable) \
     PyObject_CallFunctionObjArgs((PyObject *)&PySet_Type, (iterable), NULL)
+
 #define Pyx_PyFrozenSet_New(iterable) \
     PyObject_CallFunctionObjArgs((PyObject *)&PyFrozenSet_Type, (iterable), NULL)
+
 #define PySet_Size(anyset) \
     PyObject_Size((anyset))
+
 #define PySet_Contains(anyset, key) \
     PySequence_Contains((anyset), (key))
+
 #define PySet_Pop(set) \
     PyObject_CallMethod(set, (char *)"pop", NULL)
+
 static CYTHON_INLINE int PySet_Clear(PyObject *set) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"clear", NULL);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
+
 static CYTHON_INLINE int PySet_Discard(PyObject *set, PyObject *key) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"discard", (char *)"O", key);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
+
 static CYTHON_INLINE int PySet_Add(PyObject *set, PyObject *key) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"add", (char *)"O", key);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
+
 #endif /* PyAnySet_CheckExact (<= Py2.4) */
+
+#if PY_VERSION_HEX < 0x02040000
+#ifndef Py_SETOBJECT_H
+#define Py_SETOBJECT_H
+
+static PyTypeObject *__Pyx_PySet_Type = NULL;
+static PyTypeObject *__Pyx_PyFrozenSet_Type = NULL;
+
+#define PySet_Type (*__Pyx_PySet_Type)
+#define PyFrozenSet_Type (*__Pyx_PyFrozenSet_Type)
+
+#define PyAnySet_Check(ob) \
+    (PyAnySet_CheckExact(ob) || \
+     PyType_IsSubtype((ob)->ob_type, &PySet_Type) || \
+     PyType_IsSubtype((ob)->ob_type, &PyFrozenSet_Type))
+
+#define PyFrozenSet_CheckExact(ob) ((ob)->ob_type == &PyFrozenSet_Type)
+
+static int __Pyx_Py23SetsImport(void) {
+    PyObject *sets=0, *Set=0, *ImmutableSet=0;
+
+    sets = PyImport_ImportModule((char *)"sets");
+    if (!sets) goto bad;
+    Set = PyObject_GetAttrString(sets, (char *)"Set");
+    if (!Set) goto bad;
+    ImmutableSet = PyObject_GetAttrString(sets, (char *)"ImmutableSet");
+    if (!ImmutableSet) goto bad;
+    Py_DECREF(sets);
+
+    __Pyx_PySet_Type       = (PyTypeObject*) Set;
+    __Pyx_PyFrozenSet_Type = (PyTypeObject*) ImmutableSet;
+
+    return 0;
+
+ bad:
+    Py_XDECREF(sets);
+    Py_XDECREF(Set);
+    Py_XDECREF(ImmutableSet);
+    return -1;
+}
+
+#else
+static int __Pyx_Py23SetsImport(void) { return 0; }
+#endif /* !Py_SETOBJECT_H */
+#endif /* < Py2.4  */
 #endif /* < Py2.5  */
 
+static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void);
+
 #if PY_MAJOR_VERSION >= 3
 static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
     PyObject *value;
+    if (unlikely(d == Py_None)) {
+        __Pyx_RaiseNoneIndexingError();
+        return NULL;
+    }
     value = PyDict_GetItemWithError(d, key);
     if (unlikely(!value)) {
         if (!PyErr_Occurred())
@@ -1883,9 +1790,10 @@ static CYTHON_INLINE int __Pyx_div_int(int, int); /* proto */
 #define UNARY_NEG_WOULD_OVERFLOW(x)            (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
 
 static CYTHON_INLINE PyObject* __Pyx_PyObject_Pop(PyObject* L) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02040000
+#if PY_VERSION_HEX >= 0x02040000
     if (likely(PyList_CheckExact(L))
-        && likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
+            /* Check that both the size is positive and no reallocation shrinking needs to be done. */
+            && likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
         Py_SIZE(L) -= 1;
         return PyList_GET_ITEM(L, PyList_GET_SIZE(L));
     }
@@ -1903,49 +1811,31 @@ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb);
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/
 
-static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name);
-
-#define __Pyx_CyFunction_USED 1
-#include <structmember.h>
-#define __Pyx_CYFUNCTION_STATICMETHOD  0x01
-#define __Pyx_CYFUNCTION_CLASSMETHOD   0x02
-#define __Pyx_CYFUNCTION_CCLASS        0x04
-#define __Pyx_CyFunction_GetClosure(f) \
-    (((__pyx_CyFunctionObject *) (f))->func_closure)
-#define __Pyx_CyFunction_GetClassObj(f) \
-    (((__pyx_CyFunctionObject *) (f))->func_classobj)
-#define __Pyx_CyFunction_Defaults(type, f) \
-    ((type *)(((__pyx_CyFunctionObject *) (f))->defaults))
-#define __Pyx_CyFunction_SetDefaultsGetter(f, g) \
-    ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g)
+#include <string.h>
+
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
+
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
+
+#if PY_MAJOR_VERSION >= 3
+#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
+#else
+#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
+#endif
+
+#define __pyx_binding_PyCFunctionType_USED 1
+
 typedef struct {
     PyCFunctionObject func;
-    int flags;
-    PyObject *func_dict;
-    PyObject *func_weakreflist;
-    PyObject *func_name;
-    PyObject *func_doc;
-    PyObject *func_code;
-    PyObject *func_closure;
-    PyObject *func_classobj; /* No-args super() class cell */
-    void *defaults;
-    int defaults_pyobjects;
-    PyObject *defaults_tuple; /* Const defaults tuple */
-    PyObject *(*defaults_getter)(PyObject *);
-} __pyx_CyFunctionObject;
-static PyTypeObject *__pyx_CyFunctionType = 0;
-#define __Pyx_CyFunction_NewEx(ml, flags, self, module, code) \
-    __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, self, module, code)
-static PyObject *__Pyx_CyFunction_New(PyTypeObject *,
-                                      PyMethodDef *ml, int flags,
-                                      PyObject *self, PyObject *module,
-                                      PyObject* code);
-static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m,
-                                                         size_t size,
-                                                         int pyobjects);
-static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m,
-                                                            PyObject *tuple);
-static int __Pyx_CyFunction_init(void);
+} __pyx_binding_PyCFunctionType_object;
+
+static PyTypeObject __pyx_binding_PyCFunctionType_type;
+static PyTypeObject *__pyx_binding_PyCFunctionType = NULL;
+
+static PyObject *__pyx_binding_PyCFunctionType_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module); /* proto */
+#define __pyx_binding_PyCFunctionType_New(ml, self) __pyx_binding_PyCFunctionType_NewEx(ml, self, NULL)
+
+static int __pyx_binding_PyCFunctionType_init(void); /* proto */
 
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
 
@@ -1984,59 +1874,17 @@ static void __Pyx_WriteUnraisable(const char *name, int clineno,
 
 static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
 
-#define __Pyx_Generator_USED
-#include <structmember.h>
-#include <frameobject.h>
-typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
-typedef struct {
-    PyObject_HEAD
-    __pyx_generator_body_t body;
-    PyObject *closure;
-    PyObject *exc_type;
-    PyObject *exc_value;
-    PyObject *exc_traceback;
-    PyObject *gi_weakreflist;
-    PyObject *classobj;
-    PyObject *yieldfrom;
-    int resume_label;
-    char is_running;  // using T_BOOL for property below requires char value
-} __pyx_GeneratorObject;
-static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
-                                                  PyObject *closure);
-static int __pyx_Generator_init(void);
-static int __Pyx_Generator_clear(PyObject* self);
-#if 1 || PY_VERSION_HEX < 0x030300B0
-static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
-#else
-#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
-#endif
-
 static int __Pyx_check_binary_version(void);
 
 static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/
 
 static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
 
-typedef struct {
-    int code_line;
-    PyCodeObject* code_object;
-} __Pyx_CodeObjectCacheEntry;
-struct __Pyx_CodeObjectCache {
-    int count;
-    int max_count;
-    __Pyx_CodeObjectCacheEntry* entries;
-};
-static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
-static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
-static PyCodeObject *__pyx_find_code_object(int code_line);
-static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
-
-static void __Pyx_AddTraceback(const char *funcname, int c_line,
-                               int py_line, const char *filename); /*proto*/
+static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
+                               int __pyx_lineno, const char *__pyx_filename); /*proto*/
 
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
 
-
 /* Module declarations from 'libc.stdio' */
 
 /* Module declarations from 'libc.stdlib' */
@@ -2071,6 +1919,7 @@ static PyTypeObject *__pyx_ptype_3_sa_PhraseLocation = 0;
 static PyTypeObject *__pyx_ptype_3_sa_Sampler = 0;
 static PyTypeObject *__pyx_ptype_3_sa_HieroCachingRuleFactory = 0;
 static PyTypeObject *__pyx_ptype_3_sa_Scorer = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_Generator = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct____iter__ = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = 0;
@@ -2095,6 +1944,7 @@ static int __pyx_v_3_sa_BAEZA_YATES;
 static int __pyx_v_3_sa_EPSILON;
 static struct __pyx_obj_3_sa_StringMap *__pyx_v_3_sa_FD = 0;
 static char *__pyx_f_3_sa_sym_tostring(int); /*proto*/
+static char *__pyx_f_3_sa_sym_tocat(int); /*proto*/
 static int __pyx_f_3_sa_sym_isvar(int); /*proto*/
 static int __pyx_f_3_sa_sym_getindex(int); /*proto*/
 static float __pyx_f_3_sa_monitor_cpu(void); /*proto*/
@@ -2119,6 +1969,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *);
 static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
+static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_Node *, int *, int); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *, PyObject *, PyObject *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *, PyObject *, PyObject *, int); /*proto*/
@@ -2143,192 +1994,6 @@ static PyObject *__pyx_builtin_StopIteration;
 static PyObject *__pyx_builtin_cmp;
 static PyObject *__pyx_builtin_sorted;
 static PyObject *__pyx_builtin_max;
-static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_filename); /* proto */
-static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len); /* proto */
-static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, float __pyx_v_val); /* proto */
-static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_val); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_16__iter__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_index); /* proto */
-static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_25get_size(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
-static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id); /* proto */
-static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_from_text, PyObject *__pyx_v_from_data, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_earray, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_alignment); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_eword); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword, PyObject *__pyx_v_eword, PyObject *__pyx_v_col); /* proto */
-static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBIterator *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_size); /* proto */
-static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa); /* proto */
-static PyObject *__pyx_pf_3_sa_3LCP_2compute_stats(struct __pyx_obj_3_sa_LCP *__pyx_v_self, int __pyx_v_max_n); /* proto */
-static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
-static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_2sym_fromstring(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_string, int __pyx_v_terminal); /* proto */
-static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_words); /* proto */
-static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_k); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_ci); /* proto */
-#if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
-#endif
-static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_28__iter__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_children); /* proto */
-static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, int __pyx_v_lhs, struct __pyx_obj_3_sa_Phrase *__pyx_v_f, struct __pyx_obj_3_sa_Phrase *__pyx_v_e, PyObject *__pyx_v_scores, PyObject *__pyx_v_word_alignments); /* proto */
-static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-#if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Rule *__pyx_v_other); /* proto */
-#endif
-static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Phrase *__pyx_v_f); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_7__str___genexpr(PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_12alignments(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, int __pyx_v_alphabet_size); /* proto */
-static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
-static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
-static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_flag); /* proto */
-static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_from_stats, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_precompute_rank, PyObject *__pyx_v_precompute_secondary_rank, PyObject *__pyx_v_max_length, PyObject *__pyx_v_max_nonterminals, PyObject *__pyx_v_train_max_initial_size, PyObject *__pyx_v_train_min_gap_size); /* proto */
-static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray); /* proto */
-static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high); /* proto */
-static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_3_sa_8TrieNode_8children_4__del__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_phrase, PyObject *__pyx_v_phrase_location, PyObject *__pyx_v_suffix_link); /* proto */
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_extended); /* proto */
-static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_9TrieTable_4root_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
-static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sa_low, int __pyx_v_sa_high, int __pyx_v_arr_low, int __pyx_v_arr_high, PyObject *__pyx_v_arr, int __pyx_v_num_subpatterns); /* proto */
-static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, int __pyx_v_sample_size, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray); /* proto */
-static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location); /* proto */
-static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment, float __pyx_v_by_slack_factor, char *__pyx_v_category, PyObject *__pyx_v_max_chunks, unsigned int __pyx_v_max_initial_size, unsigned int __pyx_v_max_length, unsigned int __pyx_v_max_nonterminals, PyObject *__pyx_v_max_target_chunks, PyObject *__pyx_v_max_target_length, unsigned int __pyx_v_min_gap_size, PyObject *__pyx_v_precompute_file, unsigned int __pyx_v_precompute_secondary_rank, unsigned int __pyx_v_precompute_rank, int __pyx_v_require_aligned_terminal, int __pyx_v_require_aligned_chunks, unsigned int __pyx_v_train_max_initial_size, unsigned int __pyx_v_train_min_gap_size, int __pyx_v_tight_phrases, int __pyx_v_use_baeza_yates, int __pyx_v_use_collocations, int __pyx_v_use_index); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray, struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray, struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler, struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_phrase); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_frontier, PyObject *__pyx_v_res, PyObject *__pyx_v_fwords); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_skip, PyObject *__pyx_v_i, PyObject *__pyx_v_spanlen, PyObject *__pyx_v_pathlen, PyObject *__pyx_v_fwords, PyObject *__pyx_v_next_states, PyObject *__pyx_v_reachable_buffer); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_dist); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_ito); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v__columns, PyObject *__pyx_v_curr_idx, PyObject *__pyx_v_min_dist); /* proto */
-static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords); /* proto */
-static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value); /* proto */
-static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str___genexpr(PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
-static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_self, PyObject *__pyx_v_models); /* proto */
 static char __pyx_k_1[] = ".gz";
 static char __pyx_k_2[] = "Requested index %d of %d-length FloatList";
 static char __pyx_k_3[] = "IntList[";
@@ -2423,10 +2088,8 @@ static char __pyx_k_132[] = "Subphrase [%d, %d] failed integrity check";
 static char __pyx_k_133[] = "Didn't extract anything from [%d, %d] -> [%d, %d]";
 static char __pyx_k_134[] = "Unable to extract basic phrase";
 static char __pyx_k_135[] = "%s=%s";
-static char __pyx_k_138[] = "/home/hltcoe/alopez/dev/cdec/python/src/sa/_sa.pyx";
-static char __pyx_k_139[] = "cdec.sa";
-static char __pyx_k_143[] = "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi";
-static char __pyx_k_144[] = "*EPS*";
+static char __pyx_k_136[] = "cdec.sa";
+static char __pyx_k_138[] = "*EPS*";
 static char __pyx_k__gc[] = "gc";
 static char __pyx_k__sa[] = "sa";
 static char __pyx_k___sa[] = "_sa";
@@ -2643,11 +2306,9 @@ static PyObject *__pyx_kp_s_132;
 static PyObject *__pyx_kp_s_133;
 static PyObject *__pyx_kp_s_134;
 static PyObject *__pyx_kp_s_135;
+static PyObject *__pyx_kp_s_136;
 static PyObject *__pyx_kp_s_138;
-static PyObject *__pyx_kp_s_139;
 static PyObject *__pyx_kp_s_14;
-static PyObject *__pyx_kp_s_143;
-static PyObject *__pyx_kp_s_144;
 static PyObject *__pyx_kp_s_18;
 static PyObject *__pyx_kp_s_2;
 static PyObject *__pyx_kp_s_21;
@@ -2948,11 +2609,7 @@ static PyObject *__pyx_k_tuple_99;
 static PyObject *__pyx_k_tuple_103;
 static PyObject *__pyx_k_tuple_108;
 static PyObject *__pyx_k_tuple_123;
-static PyObject *__pyx_k_tuple_136;
-static PyObject *__pyx_k_tuple_140;
-static PyObject *__pyx_k_tuple_141;
-static PyObject *__pyx_k_codeobj_137;
-static PyObject *__pyx_k_codeobj_142;
+static PyObject *__pyx_k_tuple_137;
 
 /* "_sa.pyx":5
  * import gzip
@@ -2973,7 +2630,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("monitor_cpu", 0);
+  __Pyx_RefNannySetupContext("monitor_cpu");
 
   /* "_sa.pyx":6
  * 
@@ -2993,7 +2650,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -3023,7 +2680,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   __pyx_t_4 = 0;
@@ -3038,7 +2695,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_r = __pyx_t_5;
   goto __pyx_L0;
@@ -3057,28 +2714,6 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_1gzip_or_text = {__Pyx_NAMESTR("gzip_or_text"), (PyCFunction)__pyx_pw_3_sa_1gzip_or_text, METH_O, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("gzip_or_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.gzip_or_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_gzip_or_text(__pyx_self, ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "_sa.pyx":9
  *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
  * 
@@ -3087,7 +2722,10 @@ static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__p
  *         return gzip.GzipFile(filename)
  */
 
-static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_gzip_or_text = {__Pyx_NAMESTR("gzip_or_text"), (PyCFunction)__pyx_pf_3_sa_gzip_or_text, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3097,7 +2735,17 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("gzip_or_text", 0);
+  __Pyx_RefNannySetupContext("gzip_or_text");
+  __pyx_self = __pyx_self;
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.gzip_or_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "_sa.pyx":10
  * 
@@ -3128,7 +2776,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -3139,7 +2787,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
   /*else*/ {
 
@@ -3154,7 +2802,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -3165,7 +2813,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
     __pyx_t_1 = 0;
     goto __pyx_L0;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -3181,22 +2829,32 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self,
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":11
+ * cdef class FloatList:
+ * 
+ *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
+ *         if initial_len > size:
+ *             size = initial_len
+ */
+
+static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -3204,7 +2862,7 @@ static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
@@ -3222,7 +2880,7 @@ static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3257,24 +2915,6 @@ static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9FloatList___cinit__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_size, __pyx_v_increment, __pyx_v_initial_len);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":11
- * cdef class FloatList:
- * 
- *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
- *         if initial_len > size:
- *             size = initial_len
- */
-
-static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":12
  * 
@@ -3294,9 +2934,9 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  *         self.increment = increment
  */
     __pyx_v_size = __pyx_v_initial_len;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":14
  *         if initial_len > size:
@@ -3305,7 +2945,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  *         self.increment = increment
  *         self.len = initial_len
  */
-  __pyx_v_self->size = __pyx_v_size;
+  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size = __pyx_v_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":15
  *             size = initial_len
@@ -3314,7 +2954,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))
  */
-  __pyx_v_self->increment = __pyx_v_increment;
+  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->increment = __pyx_v_increment;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":16
  *         self.size = size
@@ -3323,7 +2963,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  *         self.arr = <float*> malloc(size*sizeof(float))
  *         memset(self.arr, 0, initial_len*sizeof(float))
  */
-  __pyx_v_self->len = __pyx_v_initial_len;
+  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len = __pyx_v_initial_len;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":17
  *         self.increment = increment
@@ -3332,7 +2972,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
  */
-  __pyx_v_self->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
+  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":18
  *         self.len = initial_len
@@ -3341,22 +2981,13 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  * 
  *     def __dealloc__(self):
  */
-  memset(__pyx_v_self->arr, 0, (__pyx_v_initial_len * (sizeof(float))));
+  memset(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr, 0, (__pyx_v_initial_len * (sizeof(float))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_9FloatList_2__dealloc__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
@@ -3365,9 +2996,10 @@ static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self) {
+static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":21
  * 
@@ -3376,20 +3008,9 @@ static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatLis
  * 
  *     def __getitem__(self, i):
  */
-  free(__pyx_v_self->arr);
-
-  __Pyx_RefNannyFinishContext();
-}
+  free(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr);
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9FloatList_4__getitem__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((PyObject *)__pyx_v_i));
   __Pyx_RefNannyFinishContext();
-  return __pyx_r;
 }
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":23
@@ -3400,7 +3021,8 @@ static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, P
  *         if i<0:
  */
 
-static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_v_j = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -3413,7 +3035,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __Pyx_RefNannySetupContext("__getitem__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":24
  * 
@@ -3432,7 +3054,8 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
@@ -3444,7 +3067,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  */
-    __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
@@ -3452,9 +3075,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
     __Pyx_DECREF(__pyx_v_j);
     __pyx_v_j = __pyx_t_3;
     __pyx_t_3 = 0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":27
  *         if i<0:
@@ -3463,13 +3086,15 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         return self.arr[j]
  */
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (!__pyx_t_2) {
-    __pyx_t_3 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_j, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_j, __pyx_t_3, Py_GE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3486,10 +3111,10 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
  *         return self.arr[j]
  * 
  */
-    __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_i);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_i);
     __Pyx_GIVEREF(__pyx_v_i);
@@ -3500,7 +3125,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -3510,9 +3135,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
     __Pyx_Raise(__pyx_t_1, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L4;
+    goto __pyx_L6;
   }
-  __pyx_L4:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":29
  *         if j<0 or j>=self.len:
@@ -3523,7 +3148,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_j); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->arr[__pyx_t_6])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr[__pyx_t_6])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3563,7 +3188,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set", 0);
+  __Pyx_RefNannySetupContext("set");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":32
  * 
@@ -3624,7 +3249,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
     __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -3635,7 +3260,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -3668,17 +3293,6 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
-static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9FloatList_6__setitem__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((PyObject *)__pyx_v_i), ((PyObject *)__pyx_v_val));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":39
  *         self.arr[j] = v
  * 
@@ -3687,7 +3301,8 @@ static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -3695,7 +3310,7 @@ static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setitem__", 0);
+  __Pyx_RefNannySetupContext("__setitem__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":40
  * 
@@ -3705,8 +3320,8 @@ static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList
  *     def __len__(self):
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = __pyx_PyFloat_AsFloat(__pyx_v_val); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->set(__pyx_v_self, __pyx_t_1, __pyx_t_2);
+  __pyx_t_2 = __pyx_PyFloat_AsDouble(__pyx_v_val); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->set(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_t_1, __pyx_t_2);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -3718,17 +3333,6 @@ static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9FloatList_8__len__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":42
  *         self.set(i, val)
  * 
@@ -3737,10 +3341,11 @@ static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":43
  * 
@@ -3749,7 +3354,7 @@ static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatL
  * 
  *     def append(self, float val):
  */
-  __pyx_r = __pyx_v_self->len;
+  __pyx_r = ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -3758,27 +3363,6 @@ static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatL
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
-static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
-  float __pyx_v_val;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("append (wrapper)", 0);
-  assert(__pyx_arg_val); {
-    __pyx_v_val = __pyx_PyFloat_AsFloat(__pyx_arg_val); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.FloatList.append", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9FloatList_10append(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((float)__pyx_v_val));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":45
  *         return self.len
  * 
@@ -3787,11 +3371,25 @@ static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObj
  *             self.size = self.size + self.increment
  */
 
-static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, float __pyx_v_val) {
+static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
+static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
+  float __pyx_v_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("append", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("append");
+  assert(__pyx_arg_val); {
+    __pyx_v_val = __pyx_PyFloat_AsDouble(__pyx_arg_val); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.FloatList.append", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":46
  * 
@@ -3800,7 +3398,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  */
-  __pyx_t_1 = (__pyx_v_self->len == __pyx_v_self->size);
+  __pyx_t_1 = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len == ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size);
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":47
@@ -3810,7 +3408,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val
  */
-    __pyx_v_self->size = (__pyx_v_self->size + __pyx_v_self->increment);
+    ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size + ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->increment);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":48
  *         if self.len == self.size:
@@ -3819,10 +3417,10 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
  *         self.arr[self.len] = val
  *         self.len = self.len + 1
  */
-    __pyx_v_self->arr = ((float *)realloc(__pyx_v_self->arr, (__pyx_v_self->size * (sizeof(float)))));
-    goto __pyx_L3;
+    ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr = ((float *)realloc(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr, (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size * (sizeof(float)))));
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":49
  *             self.size = self.size + self.increment
@@ -3831,7 +3429,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
  *         self.len = self.len + 1
  * 
  */
-  (__pyx_v_self->arr[__pyx_v_self->len]) = __pyx_v_val;
+  (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr[((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len]) = __pyx_v_val;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":50
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
@@ -3840,7 +3438,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
  * 
  *     cdef void write_handle(self, FILE* f):
  */
-  __pyx_v_self->len = (__pyx_v_self->len + 1);
+  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len + 1);
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -3858,7 +3456,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
 
 static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_handle", 0);
+  __Pyx_RefNannySetupContext("write_handle");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":53
  * 
@@ -3881,27 +3479,6 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.FloatList.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9FloatList_12write(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":56
  *         fwrite(self.arr, sizeof(float), self.len, f)
  * 
@@ -3910,11 +3487,25 @@ static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObje
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.FloatList.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":58
  *     def write(self, char* filename):
@@ -3932,7 +3523,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":60
  *         f = fopen(filename, "w")
@@ -3959,7 +3550,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
 
 static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_handle", 0);
+  __Pyx_RefNannySetupContext("read_handle");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":63
  * 
@@ -4009,27 +3600,6 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.FloatList.read", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9FloatList_14read(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":69
  *         fread(self.arr, sizeof(float), self.len, f)
  * 
@@ -4038,11 +3608,25 @@ static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObjec
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.FloatList.read", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":71
  *     def read(self, char* filename):
@@ -4059,7 +3643,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":73
  *         f = fopen(filename, "r")
@@ -4074,22 +3658,32 @@ static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":11
+ * cdef class IntList:
+ * 
+ *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
+ *         if initial_len > size:
+ *             size = initial_len
+ */
+
+static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -4097,7 +3691,7 @@ static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *_
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
@@ -4115,7 +3709,7 @@ static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *_
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -4150,24 +3744,6 @@ static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList___cinit__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_size, __pyx_v_increment, __pyx_v_initial_len);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":11
- * cdef class IntList:
- * 
- *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
- *         if initial_len > size:
- *             size = initial_len
- */
-
-static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":12
  * 
@@ -4187,9 +3763,9 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  *         self.increment = increment
  */
     __pyx_v_size = __pyx_v_initial_len;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":14
  *         if initial_len > size:
@@ -4198,7 +3774,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  *         self.increment = increment
  *         self.len = initial_len
  */
-  __pyx_v_self->size = __pyx_v_size;
+  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size = __pyx_v_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":15
  *             size = initial_len
@@ -4207,7 +3783,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))
  */
-  __pyx_v_self->increment = __pyx_v_increment;
+  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->increment = __pyx_v_increment;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":16
  *         self.size = size
@@ -4216,7 +3792,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  *         self.arr = <int*> malloc(size*sizeof(int))
  *         memset(self.arr, 0, initial_len*sizeof(int))
  */
-  __pyx_v_self->len = __pyx_v_initial_len;
+  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len = __pyx_v_initial_len;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":17
  *         self.increment = increment
@@ -4225,7 +3801,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
  */
-  __pyx_v_self->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
+  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":18
  *         self.len = initial_len
@@ -4234,24 +3810,13 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  * 
  *     def __str__(self):
  */
-  memset(__pyx_v_self->arr, 0, (__pyx_v_initial_len * (sizeof(int))));
+  memset(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr, 0, (__pyx_v_initial_len * (sizeof(int))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_2__str__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
@@ -4260,7 +3825,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self) {
  *         ret = "IntList["
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   PyObject *__pyx_v_ret = NULL;
   int __pyx_v_idx;
   PyObject *__pyx_r = NULL;
@@ -4273,7 +3839,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__", 0);
+  __Pyx_RefNannySetupContext("__str__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":22
  *     def __str__(self):
@@ -4292,7 +3858,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
  *             if idx>0:
  *                 ret += ","
  */
-  __pyx_t_1 = __pyx_v_self->size;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_idx = __pyx_t_2;
 
@@ -4318,9 +3884,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
       __Pyx_DECREF(__pyx_v_ret);
       __pyx_v_ret = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":26
  *             if idx>0:
@@ -4329,10 +3895,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
  *         ret += "]"
  *         ret += "len="
  */
-    __pyx_t_4 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_idx])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_idx])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
@@ -4380,7 +3946,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
  *         return ret
  * 
  */
-  __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_ret, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
@@ -4415,17 +3981,6 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("index (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_4index(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_val));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":32
  *         return ret
  * 
@@ -4434,7 +3989,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject
  *         for i in range(self.len):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_val) {
+static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
   unsigned int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -4446,7 +4002,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("index", 0);
+  __Pyx_RefNannySetupContext("index");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":34
  *     def index(self, val):
@@ -4455,7 +4011,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
  *             if self.arr[i] == val:
  *                 return i
  */
-  __pyx_t_1 = __pyx_v_self->len;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
@@ -4466,9 +4022,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
  *                 return i
  *         return IndexError
  */
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_val, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_val, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
@@ -4487,9 +4044,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
       __pyx_r = __pyx_t_4;
       __pyx_t_4 = 0;
       goto __pyx_L0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":37
@@ -4517,39 +4074,60 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":39
+ *         return IndexError
+ * 
+ *     def partition(self,start,end):             # <<<<<<<<<<<<<<
+ *         pivot = self.arr[end]
+ *         bottom = start-1
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_end = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_pivot = NULL;
+  PyObject *__pyx_v_bottom = NULL;
+  PyObject *__pyx_v_top = NULL;
+  long __pyx_v_done;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("partition (wrapper)", 0);
+  Py_ssize_t __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  Py_ssize_t __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
+  __Pyx_RefNannySetupContext("partition");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("partition", 1, 2, 2, 1); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "partition") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "partition") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -4568,36 +4146,6 @@ static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObj
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList_6partition(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_start, __pyx_v_end);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":39
- *         return IndexError
- * 
- *     def partition(self,start,end):             # <<<<<<<<<<<<<<
- *         pivot = self.arr[end]
- *         bottom = start-1
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end) {
-  PyObject *__pyx_v_pivot = NULL;
-  PyObject *__pyx_v_bottom = NULL;
-  PyObject *__pyx_v_top = NULL;
-  long __pyx_v_done;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  Py_ssize_t __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("partition", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":40
  * 
@@ -4607,7 +4155,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *         top = end
  */
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_end); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_pivot = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -4685,7 +4233,8 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *                     done = 1
  *                     break
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_bottom, __pyx_v_top, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_bottom, __pyx_v_top, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
@@ -4706,10 +4255,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]
  */
-        goto __pyx_L6_break;
-        goto __pyx_L7;
+        goto __pyx_L9_break;
+        goto __pyx_L10;
       }
-      __pyx_L7:;
+      __pyx_L10:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":50
  *                     done = 1
@@ -4719,9 +4268,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *                     break
  */
       __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_2 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_pivot, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_pivot, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
@@ -4736,7 +4286,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
         __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
+        (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_5]) = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":52
  *                 if self.arr[bottom] > pivot:
@@ -4745,12 +4295,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *             while not done:
  *                 top -= 1
  */
-        goto __pyx_L6_break;
-        goto __pyx_L8;
+        goto __pyx_L9_break;
+        goto __pyx_L11;
       }
-      __pyx_L8:;
+      __pyx_L11:;
     }
-    __pyx_L6_break:;
+    __pyx_L9_break:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":53
  *                     self.arr[top] = self.arr[bottom]
@@ -4783,7 +4333,8 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *                     done = 1
  *                     break
  */
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_top, __pyx_v_bottom, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_top, __pyx_v_bottom, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
@@ -4804,10 +4355,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]
  */
-        goto __pyx_L10_break;
-        goto __pyx_L11;
+        goto __pyx_L13_break;
+        goto __pyx_L14;
       }
-      __pyx_L11:;
+      __pyx_L14:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":58
  *                     done = 1
@@ -4817,9 +4368,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *                     break
  */
       __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pivot, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pivot, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -4834,7 +4386,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
         __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
+        (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_5]) = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":60
  *                 if self.arr[top] < pivot:
@@ -4843,12 +4395,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  *         self.arr[top] = pivot
  *         return top
  */
-        goto __pyx_L10_break;
-        goto __pyx_L12;
+        goto __pyx_L13_break;
+        goto __pyx_L15;
       }
-      __pyx_L12:;
+      __pyx_L15:;
     }
-    __pyx_L10_break:;
+    __pyx_L13_break:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":61
@@ -4860,7 +4412,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
   __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_pivot); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  (__pyx_v_self->arr[__pyx_t_1]) = __pyx_t_6;
+  (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]) = __pyx_t_6;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":62
  *                     break
@@ -4890,39 +4442,55 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":64
+ *         return top
+ * 
+ *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
+ *         if start < end:
+ *             split = self.partition(start,end)
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_end = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_split = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_doquicksort (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
+  __Pyx_RefNannySetupContext("_doquicksort");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("_doquicksort", 1, 2, 2, 1); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_doquicksort") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_doquicksort") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -4941,31 +4509,6 @@ static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList_8_doquicksort(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_start, __pyx_v_end);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":64
- *         return top
- * 
- *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
- *         if start < end:
- *             split = self.partition(start,end)
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end) {
-  PyObject *__pyx_v_split = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_doquicksort", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":65
  * 
@@ -4974,7 +4517,8 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_start, __pyx_v_end, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_start, __pyx_v_end, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
@@ -4986,10 +4530,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
  *             self._doquicksort(start,split-1)
  *             self._doquicksort(split+1,end)
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__partition); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__partition); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_start);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_start);
     __Pyx_GIVEREF(__pyx_v_start);
@@ -5010,12 +4554,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
  *             self._doquicksort(split+1,end)
  *         else:
  */
-    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyNumber_Subtract(__pyx_v_split, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(__pyx_v_start);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_start);
     __Pyx_GIVEREF(__pyx_v_start);
@@ -5035,12 +4579,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
  *         else:
  *             return
  */
-    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_1 = PyNumber_Add(__pyx_v_split, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_end);
@@ -5052,7 +4596,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
   /*else*/ {
 
@@ -5067,7 +4611,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -5084,17 +4628,6 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sort (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_10sort(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":72
  *             return
  * 
@@ -5103,7 +4636,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UN
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -5112,7 +4646,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sort", 0);
+  __Pyx_RefNannySetupContext("sort");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":73
  * 
@@ -5121,12 +4655,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__
  * 
  *     def reset(self):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->len - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   __Pyx_INCREF(__pyx_int_0);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
@@ -5153,17 +4687,6 @@ static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("reset (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_12reset(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":75
  *         self._doquicksort(0,self.len-1)
  * 
@@ -5172,10 +4695,11 @@ static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_U
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("reset", 0);
+  __Pyx_RefNannySetupContext("reset");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":76
  * 
@@ -5184,7 +4708,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *_
  * 
  *     def __dealloc__(self):
  */
-  __pyx_v_self->len = 0;
+  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -5192,15 +4716,6 @@ static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_7IntList_14__dealloc__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":78
  *         self.len = 0
  * 
@@ -5209,9 +4724,10 @@ static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":79
  * 
@@ -5220,22 +4736,11 @@ static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *
  * 
  *     def __iter__(self):
  */
-  free(__pyx_v_self->arr);
-
-  __Pyx_RefNannyFinishContext();
-}
-static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+  free(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr);
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_16__iter__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
   __Pyx_RefNannyFinishContext();
-  return __pyx_r;
 }
+static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
@@ -5245,52 +4750,43 @@ static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self) {
  *         for i in range(self.len):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_16__iter__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_8__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_8__iter__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__", 0);
+  __Pyx_RefNannySetupContext("__iter__");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)__pyx_ptype_3_sa___pyx_scope_struct____iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct____iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_7IntList_18generator, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7IntList_9generator;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.IntList.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -5307,7 +4803,7 @@ static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx
  *             yield self.arr[i]
  * 
  */
-  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->len;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_cur_scope->__pyx_v_self)->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
@@ -5318,7 +4814,7 @@ static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx
  * 
  *     def __getitem__(self, index):
  */
-    __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->arr[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_cur_scope->__pyx_v_self)->arr[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
@@ -5327,37 +4823,25 @@ static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_19__getitem__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_index));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":86
  *             yield self.arr[i]
  * 
@@ -5366,7 +4850,8 @@ static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, Py
  *         if isinstance(index, int):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_index) {
+static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -5386,7 +4871,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __Pyx_RefNannySetupContext("__getitem__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":88
  *     def __getitem__(self, index):
@@ -5428,10 +4913,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  */
-      __pyx_v_j = (__pyx_v_self->len + __pyx_v_j);
-      goto __pyx_L4;
+      __pyx_v_j = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_j);
+      goto __pyx_L6;
     }
-    __pyx_L4:;
+    __pyx_L6:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":92
  *             if j < 0:
@@ -5442,7 +4927,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  */
     __pyx_t_2 = (__pyx_v_j < 0);
     if (!__pyx_t_2) {
-      __pyx_t_4 = (__pyx_v_j >= __pyx_v_self->len);
+      __pyx_t_4 = (__pyx_v_j >= ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
       __pyx_t_5 = __pyx_t_4;
     } else {
       __pyx_t_5 = __pyx_t_2;
@@ -5456,10 +4941,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  *             return self.arr[j]
  *         elif isinstance(index, slice):
  */
-      __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       __Pyx_INCREF(__pyx_v_index);
       PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_index);
       __Pyx_GIVEREF(__pyx_v_index);
@@ -5470,7 +4955,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
       __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_1));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
       __pyx_t_1 = 0;
@@ -5480,9 +4965,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __Pyx_Raise(__pyx_t_1, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":94
  *             if j<0 or j>=self.len:
@@ -5492,12 +4977,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  *             i = index.start
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_j])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_j])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":95
@@ -5556,10 +5041,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  *             if j < 0:
  *                 j = self.len + j
  */
-      __pyx_v_i = (__pyx_v_self->len + __pyx_v_i);
-      goto __pyx_L6;
+      __pyx_v_i = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_i);
+      goto __pyx_L8;
     }
-    __pyx_L6:;
+    __pyx_L8:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":100
  *             if i < 0:
@@ -5578,10 +5063,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  */
-      __pyx_v_j = (__pyx_v_self->len + __pyx_v_j);
-      goto __pyx_L7;
+      __pyx_v_j = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_j);
+      goto __pyx_L9;
     }
-    __pyx_L7:;
+    __pyx_L9:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":102
  *             if j < 0:
@@ -5592,11 +5077,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  */
     __pyx_t_5 = (__pyx_v_i < 0);
     if (!__pyx_t_5) {
-      __pyx_t_2 = (__pyx_v_i >= __pyx_v_self->len);
+      __pyx_t_2 = (__pyx_v_i >= ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
       if (!__pyx_t_2) {
         __pyx_t_4 = (__pyx_v_j < 0);
         if (!__pyx_t_4) {
-          __pyx_t_7 = (__pyx_v_j > __pyx_v_self->len);
+          __pyx_t_7 = (__pyx_v_j > ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
           __pyx_t_8 = __pyx_t_7;
         } else {
           __pyx_t_8 = __pyx_t_4;
@@ -5622,10 +5107,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_6 = PyObject_GetAttr(__pyx_v_index, __pyx_n_s__stop); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
       PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_6);
@@ -5639,7 +5124,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
       __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
       PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
       __pyx_t_9 = 0;
@@ -5649,9 +5134,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __Pyx_Raise(__pyx_t_9, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L8;
+      goto __pyx_L10;
     }
-    __pyx_L8:;
+    __pyx_L10:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":104
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
@@ -5680,10 +5165,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
  *             return result
  *         else:
  */
-      __pyx_t_9 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_k])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_k])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
       PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_9);
       __Pyx_GIVEREF(__pyx_t_9);
       __pyx_t_9 = 0;
@@ -5706,7 +5191,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __Pyx_INCREF(((PyObject *)__pyx_v_result));
     __pyx_r = ((PyObject *)__pyx_v_result);
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
   /*else*/ {
 
@@ -5720,7 +5205,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_9), ((PyObject *)Py_TYPE(__pyx_v_index))); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_9));
     __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_10);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
     PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
     __pyx_t_9 = 0;
@@ -5731,7 +5216,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -5769,7 +5254,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set", 0);
+  __Pyx_RefNannySetupContext("set");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":112
  * 
@@ -5830,7 +5315,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
     __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -5841,7 +5326,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -5874,17 +5359,6 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
-static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_21__setitem__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_i), ((PyObject *)__pyx_v_val));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":119
  *         self.arr[j] = val
  * 
@@ -5893,7 +5367,8 @@ static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -5901,7 +5376,7 @@ static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setitem__", 0);
+  __Pyx_RefNannySetupContext("__setitem__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":120
  * 
@@ -5912,7 +5387,7 @@ static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *_
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_v_val); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->set(__pyx_v_self, __pyx_t_1, __pyx_t_2);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->set(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_t_1, __pyx_t_2);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -5924,17 +5399,6 @@ static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_23__len__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":122
  *         self.set(i, val)
  * 
@@ -5943,10 +5407,11 @@ static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":123
  * 
@@ -5955,7 +5420,7 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList
  * 
  *     def get_size(self):
  */
-  __pyx_r = __pyx_v_self->len;
+  __pyx_r = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -5964,17 +5429,6 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_26get_size(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_26get_size(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_size (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_25get_size(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":125
  *         return self.len
  * 
@@ -5983,14 +5437,15 @@ static PyObject *__pyx_pw_3_sa_7IntList_26get_size(PyObject *__pyx_v_self, CYTHO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_25get_size(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_13get_size(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_13get_size(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_size", 0);
+  __Pyx_RefNannySetupContext("get_size");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":126
  * 
@@ -6000,7 +5455,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_25get_size(struct __pyx_obj_3_sa_IntList
  *     def append(self, int val):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -6018,13 +5473,23 @@ static PyObject *__pyx_pf_3_sa_7IntList_25get_size(struct __pyx_obj_3_sa_IntList
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":128
+ *         return self.size
+ * 
+ *     def append(self, int val):             # <<<<<<<<<<<<<<
+ *         self._append(val)
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
   int __pyx_v_val;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("append (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("append");
   assert(__pyx_arg_val); {
     __pyx_v_val = __Pyx_PyInt_AsInt(__pyx_arg_val); if (unlikely((__pyx_v_val == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -6034,23 +5499,6 @@ static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList_27append(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((int)__pyx_v_val));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":128
- *         return self.size
- * 
- *     def append(self, int val):             # <<<<<<<<<<<<<<
- *         self._append(val)
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("append", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":129
  * 
@@ -6059,7 +5507,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *
  * 
  *     cdef void _append(self, int val):
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->_append(__pyx_v_self, __pyx_v_val);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->_append(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_val);
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -6078,7 +5526,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *
 static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("_append", 0);
+  __Pyx_RefNannySetupContext("_append");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":132
  * 
@@ -6132,17 +5580,6 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("extend (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7IntList_29extend(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_other));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":138
  *         self.len = self.len + 1
  * 
@@ -6151,14 +5588,15 @@ static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_other) {
+static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extend", 0);
+  __Pyx_RefNannySetupContext("extend");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":139
  * 
@@ -6170,7 +5608,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *
   if (!(likely(((__pyx_v_other) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_other, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __pyx_v_other;
   __Pyx_INCREF(__pyx_t_1);
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->_extend(__pyx_v_self, ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1));
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->_extend(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1));
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -6195,7 +5633,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *
 
 static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, struct __pyx_obj_3_sa_IntList *__pyx_v_other) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_extend", 0);
+  __Pyx_RefNannySetupContext("_extend");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":142
  * 
@@ -6220,7 +5658,7 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
 static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int *__pyx_v_other, int __pyx_v_other_len) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("_extend_arr", 0);
+  __Pyx_RefNannySetupContext("_extend_arr");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":145
  * 
@@ -6284,7 +5722,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
 
 static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_clear", 0);
+  __Pyx_RefNannySetupContext("_clear");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":152
  * 
@@ -6335,7 +5773,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
 
 static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_handle", 0);
+  __Pyx_RefNannySetupContext("write_handle");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":158
  * 
@@ -6358,27 +5796,6 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.IntList.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList_31write(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":161
  *         fwrite(self.arr, sizeof(int), self.len, f)
  * 
@@ -6387,11 +5804,25 @@ static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.IntList.write", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":163
  *     def write(self, char* filename):
@@ -6409,7 +5840,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":165
  *         f = fopen(filename, "w")
@@ -6436,7 +5867,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
 
 static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_handle", 0);
+  __Pyx_RefNannySetupContext("read_handle");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":168
  * 
@@ -6486,27 +5917,6 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.IntList.read", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7IntList_33read(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":174
  *         fread(self.arr, sizeof(int), self.len, f)
  * 
@@ -6515,11 +5925,25 @@ static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.IntList.read", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":176
  *     def read(self, char* filename):
@@ -6536,7 +5960,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":178
  *         f = fopen(filename, "r")
@@ -6551,20 +5975,6 @@ static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
-  __pyx_r = __pyx_pf_3_sa_9StringMap___cinit__(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":13
  *     cdef int index(self, char *s)
  * 
@@ -6573,10 +5983,14 @@ static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self) {
+static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_RefNannySetupContext("__cinit__");
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":14
  * 
@@ -6585,22 +5999,13 @@ static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *_
  * 
  *     def __dealloc__(self):
  */
-  __pyx_v_self->vocab = stringmap_new();
+  ((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self)->vocab = stringmap_new();
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_9StringMap_2__dealloc__(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":16
  *         self.vocab = stringmap_new()
  * 
@@ -6609,9 +6014,10 @@ static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self) {
+static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":17
  * 
@@ -6620,7 +6026,7 @@ static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMa
  * 
  *     cdef char *word(self, int i):
  */
-  stringmap_delete(__pyx_v_self->vocab);
+  stringmap_delete(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self)->vocab);
 
   __Pyx_RefNannyFinishContext();
 }
@@ -6636,7 +6042,7 @@ static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMa
 static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx_v_self, int __pyx_v_i) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("word", 0);
+  __Pyx_RefNannySetupContext("word");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":20
  * 
@@ -6664,7 +6070,7 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
 static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_v_self, char *__pyx_v_s) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("index", 0);
+  __Pyx_RefNannySetupContext("index");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":23
  * 
@@ -6680,34 +6086,40 @@ static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":17
+ *     cdef bint use_sent_id
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
+ *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
+ *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
+ */
+
+static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_v_use_sent_id;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  long __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
     PyObject* values[4] = {0,0,0,0};
-
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":17
- *     cdef bint use_sent_id
- * 
- *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
- *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
- *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
- */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -6716,7 +6128,7 @@ static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -6739,7 +6151,7 @@ static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -6768,23 +6180,6 @@ static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray___cinit__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text, __pyx_v_side, __pyx_v_use_sent_id);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  long __pyx_t_5;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":18
  * 
@@ -6798,9 +6193,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__END_OF_FILE), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__END_OF_LINE), __pyx_int_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->word2id);
-  __Pyx_DECREF(__pyx_v_self->word2id);
-  __pyx_v_self->word2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id);
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":19
@@ -6811,7 +6206,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
  *         self.sent_id = IntList(1000,1000)
  */
   __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__END_OF_FILE));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__END_OF_FILE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__END_OF_FILE));
@@ -6819,9 +6214,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   PyList_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_n_s__END_OF_LINE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__END_OF_LINE));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->id2word);
-  __Pyx_DECREF(__pyx_v_self->id2word);
-  __pyx_v_self->id2word = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word);
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
@@ -6834,9 +6229,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->data);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->data));
-  __pyx_v_self->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data));
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":21
@@ -6849,9 +6244,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_11), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->sent_id);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_id));
-  __pyx_v_self->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id));
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":22
@@ -6864,9 +6259,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_12), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->sent_index);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
-  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index));
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":23
@@ -6876,7 +6271,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
  *         if from_binary:
  *             self.read_binary(from_binary)
  */
-  __pyx_v_self->use_sent_id = __pyx_v_use_sent_id;
+  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id = __pyx_v_use_sent_id;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":24
  *         self.sent_index = IntList(1000,1000)
@@ -6895,10 +6290,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
  *         elif from_text:
  *             if side:
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -6907,7 +6302,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":26
@@ -6937,11 +6332,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
  *             else:
  *                 self.read_text(from_text)
  */
-      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_bitext); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_bitext); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_side, ((PyObject *)__pyx_n_s__source), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_2 = __Pyx_PyString_Equals(__pyx_v_side, ((PyObject *)__pyx_n_s__source), Py_EQ); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_2) {
         __pyx_t_5 = 0;
       } else {
@@ -6950,7 +6343,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
       __pyx_t_3 = PyInt_FromLong(__pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_INCREF(__pyx_v_from_text);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
       __Pyx_GIVEREF(__pyx_v_from_text);
@@ -6962,7 +6355,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L4;
+      goto __pyx_L7;
     }
     /*else*/ {
 
@@ -6973,10 +6366,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
  * 
  *     def __len__(self):
  */
-      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_INCREF(__pyx_v_from_text);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
       __Pyx_GIVEREF(__pyx_v_from_text);
@@ -6986,10 +6379,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     }
-    __pyx_L4:;
-    goto __pyx_L3;
+    __pyx_L7:;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -7004,17 +6397,6 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_2__len__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":32
  *                 self.read_text(from_text)
  * 
@@ -7023,7 +6405,8 @@ static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -7031,16 +6414,16 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataAr
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":33
  * 
  *     def __len__(self):
  *         return len(self.data)             # <<<<<<<<<<<<<<
  * 
- *     def get_sentence_id(self, i):
+ *     def get_data(self):
  */
-  __pyx_t_1 = ((PyObject *)__pyx_v_self->data);
+  __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
   __Pyx_INCREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -7058,26 +6441,49 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataAr
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":35
+ *         return len(self.data)
+ * 
+ *     def get_data(self):             # <<<<<<<<<<<<<<
+ *         return self.data
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_2get_data(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_2get_data(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_4get_sentence_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannySetupContext("get_data");
+
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":36
+ * 
+ *     def get_data(self):
+ *         return self.data             # <<<<<<<<<<<<<<
+ * 
+ *     def get_sentence_id(self, i):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data));
+  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":35
- *         return len(self.data)
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":38
+ *         return self.data
  * 
  *     def get_sentence_id(self, i):             # <<<<<<<<<<<<<<
  *         return self.sent_id.arr[i]
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_3get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_3get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -7085,9 +6491,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_id", 0);
+  __Pyx_RefNannySetupContext("get_sentence_id");
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":36
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":39
  * 
  *     def get_sentence_id(self, i):
  *         return self.sent_id.arr[i]             # <<<<<<<<<<<<<<
@@ -7095,8 +6501,8 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa
  *     def get_sentence(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -7114,18 +6520,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_6get_sentence(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":38
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":41
  *         return self.sent_id.arr[i]
  * 
  *     def get_sentence(self, i):             # <<<<<<<<<<<<<<
@@ -7133,7 +6528,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence(PyObject *__pyx_v_self,
  *         sent = []
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_sent = NULL;
@@ -7147,45 +6543,45 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence", 0);
+  __Pyx_RefNannySetupContext("get_sentence");
   __Pyx_INCREF(__pyx_v_i);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
  *     def get_sentence(self, i):
  *         cdef int j, start, stop
  *         sent = []             # <<<<<<<<<<<<<<
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_sent = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":44
  *         cdef int j, start, stop
  *         sent = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:
  */
-  __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
+  __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_start = (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":45
  *         sent = []
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])
  */
-  __pyx_t_1 = PyNumber_Add(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_Add(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_stop = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
+  __pyx_v_stop = (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":46
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -7194,41 +6590,44 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
  */
   __pyx_t_3 = __pyx_v_stop;
   for (__pyx_t_4 = __pyx_v_start; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) {
-    __pyx_t_1 = PyInt_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":44
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":47
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])             # <<<<<<<<<<<<<<
  *         return sent
  * 
  */
-    __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_self->id2word, (__pyx_v_self->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_v_sent) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyList_Append(__pyx_v_sent, __pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyList_Append(__pyx_v_sent, __pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":46
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
  *             sent.append(self.id2word[self.data.arr[i]])
  *         return sent
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_v_i);
   __pyx_v_i = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":45
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":48
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])
  *         return sent             # <<<<<<<<<<<<<<
@@ -7254,18 +6653,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence_position (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_8get_sentence_position(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":47
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":50
  *         return sent
  * 
  *     def get_sentence_position(self, loc):             # <<<<<<<<<<<<<<
@@ -7273,7 +6661,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence_position(PyObject *__pyx
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_9DataArray_5get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_5get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -7282,9 +6671,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_ob
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_position", 0);
+  __Pyx_RefNannySetupContext("get_sentence_position");
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":48
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":51
  * 
  *     def get_sentence_position(self, loc):
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]             # <<<<<<<<<<<<<<
@@ -7292,10 +6681,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_ob
  *     def get_id(self, word):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_index->arr[(__pyx_v_self->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyNumber_Subtract(__pyx_v_loc, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyNumber_Subtract(__pyx_v_loc, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_r = __pyx_t_3;
@@ -7315,18 +6704,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_ob
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_10get_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_word));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":50
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":53
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]
  * 
  *     def get_id(self, word):             # <<<<<<<<<<<<<<
@@ -7334,7 +6712,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObj
  *             self.word2id[word] = len(self.id2word)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word) {
+static PyObject *__pyx_pf_3_sa_9DataArray_6get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_6get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -7344,50 +6723,50 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArr
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_id", 0);
+  __Pyx_RefNannySetupContext("get_id");
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":51
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":54
  * 
  *     def get_id(self, word):
  *         if not word in self.word2id:             # <<<<<<<<<<<<<<
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (!__pyx_t_1);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":52
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":55
  *     def get_id(self, word):
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
  *             self.id2word.append(word)
  *         return self.word2id[word]
  */
-    __pyx_t_3 = __pyx_v_self->id2word;
+    __pyx_t_3 = ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word;
     __Pyx_INCREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (PyObject_SetItem(__pyx_v_self->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":53
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":56
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
  *         return self.word2id[word]
  * 
  */
-    __pyx_t_3 = __Pyx_PyObject_Append(__pyx_v_self->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":57
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *         return self.word2id[word]             # <<<<<<<<<<<<<<
@@ -7395,7 +6774,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArr
  *     def get_word(self, id):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_3 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -7413,18 +6792,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArr
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_word (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_12get_word(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_id));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":56
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":59
  *         return self.word2id[word]
  * 
  *     def get_word(self, id):             # <<<<<<<<<<<<<<
@@ -7432,16 +6800,17 @@ static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id) {
+static PyObject *__pyx_pf_3_sa_9DataArray_7get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_7get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_word", 0);
+  __Pyx_RefNannySetupContext("get_word");
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def get_word(self, id):
  *         return self.id2word[id]             # <<<<<<<<<<<<<<
@@ -7449,7 +6818,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataA
  *     def write_text(self, char* filename):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetItem(__pyx_v_self->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -7467,28 +6836,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataA
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_14write_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":59
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":62
  *         return self.id2word[id]
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -7496,7 +6844,9 @@ static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, P
  *             for w_id in self.data:
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_w_id = NULL;
   PyObject *__pyx_r = NULL;
@@ -7507,10 +6857,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  Py_ssize_t __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
-  int __pyx_t_10;
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  int __pyx_t_9;
+  PyObject *__pyx_t_10 = NULL;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
   PyObject *__pyx_t_13 = NULL;
@@ -7518,9 +6868,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text", 0);
+  __Pyx_RefNannySetupContext("write_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7528,175 +6887,168 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
  *                 if w_id > 1:
  */
   /*with:*/ {
-    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
     PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_n_s__w));
     __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":61
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":64
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             for w_id in self.data:             # <<<<<<<<<<<<<<
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->data)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->data))) {
-            __pyx_t_4 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data))) {
+            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
             } else {
-              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_w_id);
-            __pyx_v_w_id = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_w_id = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":62
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":65
  *         with open(filename, "w") as f:
  *             for w_id in self.data:
  *                 if w_id > 1:             # <<<<<<<<<<<<<<
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  */
-            __pyx_t_1 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            if (__pyx_t_10) {
+            __pyx_t_2 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":66
  *             for w_id in self.data:
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))             # <<<<<<<<<<<<<<
  *                 if w_id == 1:
  *                     f.write("\n")
  */
-              __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_word); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_11);
+              __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_word); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_10);
+              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(((PyObject *)__pyx_t_11));
               __Pyx_INCREF(__pyx_v_w_id);
               PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_w_id);
               __Pyx_GIVEREF(__pyx_v_w_id);
-              __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(((PyObject *)__pyx_t_11));
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_12);
+              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(((PyObject *)__pyx_t_12));
               PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
               __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
               __pyx_t_11 = 0;
-              __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-              goto __pyx_L18;
+              goto __pyx_L19;
             }
-            __pyx_L18:;
+            __pyx_L19:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":64
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":67
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:             # <<<<<<<<<<<<<<
  *                     f.write("\n")
  * 
  */
-            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            if (__pyx_t_10) {
+            if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":65
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              goto __pyx_L19;
+              goto __pyx_L20;
             }
-            __pyx_L19:;
+            __pyx_L20:;
           }
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7705,75 +7057,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_4);
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_INCREF(__pyx_t_4);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
-          __Pyx_GIVEREF(__pyx_t_4);
+          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
+          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
-          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __pyx_t_14 = (!__pyx_t_10);
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __pyx_t_14 = (!__pyx_t_9);
           if (__pyx_t_14) {
-            __Pyx_GIVEREF(__pyx_t_4);
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_12);
             __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_ErrRestore(__pyx_t_4, __pyx_t_12, __pyx_t_11);
-            __pyx_t_4 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L22;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_12, __pyx_t_11);
+            __pyx_t_1 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L23;
           }
-          __pyx_L22:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_L23:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L23;
-    __pyx_L3_error:;
+    goto __pyx_L24;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L23:;
+    __pyx_L24:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7781,7 +7133,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
@@ -7794,28 +7146,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_16read_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":67
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":70
  *                     f.write("\n")
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -7823,7 +7154,9 @@ static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, Py
  *             self.read_text_data(fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_fp = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -7841,9 +7174,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text", 0);
+  __Pyx_RefNannySetupContext("read_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7851,27 +7193,27 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
  * 
  */
   /*with:*/ {
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -7879,40 +7221,39 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_v_fp = __pyx_t_1;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_v_fp = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":69
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:
  *             self.read_text_data(fp)             # <<<<<<<<<<<<<<
  * 
  *     def read_bitext(self, char* filename, int side):
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_INCREF(__pyx_v_fp);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fp);
+          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fp);
           __Pyx_GIVEREF(__pyx_v_fp);
-          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7921,75 +7262,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
-            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L18;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_3, __pyx_t_2);
+            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L19;
           }
-          __pyx_L18:;
+          __pyx_L19:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_4) {
         __pyx_t_7 = PyObject_Call(__pyx_t_4, __pyx_k_tuple_17, NULL);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L19;
-    __pyx_L3_error:;
+    goto __pyx_L20;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L19:;
+    __pyx_L20:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -8007,65 +7348,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
+static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  char *__pyx_v_filename;
-  int __pyx_v_side;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_bitext (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename)) != 0)) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-    }
-    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_18read_bitext(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -8073,45 +7358,37 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self) {
+static PyObject *__pyx_pf_3_sa_11read_bitext_genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_11read_bitext_genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("genexpr", 0);
+  __Pyx_RefNannySetupContext("genexpr");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *) __pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)__pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_9DataArray_11read_bitext_2generator6, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_self = __pyx_self;
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_11read_bitext_1generator6;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_bitext.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
@@ -8119,8 +7396,8 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -8128,37 +7405,28 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     return NULL;
   }
   __pyx_L3_first_run:;
-  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
     __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -8169,12 +7437,12 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_cur_scope->__pyx_v_line = __pyx_t_4;
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_19), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_19), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_side, sizeof(int), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_side, sizeof(int), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_r = __pyx_t_4;
@@ -8186,7 +7454,7 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -8194,10 +7462,10 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     __Pyx_XGOTREF(__pyx_t_1);
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
-    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -8206,13 +7474,12 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -8220,8 +7487,10 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
  *             data = (line.split(' ||| ')[side] for line in fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side) {
+static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_cur_scope;
+  char *__pyx_v_filename;
   PyObject *__pyx_v_data = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -8239,16 +7508,60 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_bitext", 0);
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
+  __Pyx_RefNannySetupContext("read_bitext");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_v_side = __pyx_v_side;
+  {
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  0:
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename);
+        if (likely(values[0])) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side);
+        if (likely(values[1])) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_cur_scope->__pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_cur_scope->__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":75
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8256,27 +7569,27 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
  *             self.read_text_data(data)
  */
   /*with:*/ {
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -8284,53 +7597,52 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
-          __pyx_cur_scope->__pyx_v_fp = __pyx_t_1;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_cur_scope->__pyx_v_fp = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
  *             self.read_text_data(data)
  * 
  */
-          __pyx_t_1 = __pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_v_data = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_t_2 = __pyx_pf_3_sa_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_v_data = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":77
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)
  *             self.read_text_data(data)             # <<<<<<<<<<<<<<
  * 
  *     def read_text_data(self, data):
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_INCREF(__pyx_v_data);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_data);
+          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_data);
           __Pyx_GIVEREF(__pyx_v_data);
-          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        goto __pyx_L17_try_end;
+        __pyx_L10_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":75
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8338,76 +7650,76 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
  *             self.read_text_data(data)
  */
         /*except:*/ {
-          __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_AddTraceback("_sa.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
-            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L18;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_3, __pyx_t_2);
+            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+            goto __pyx_L20;
           }
-          __pyx_L18:;
+          __pyx_L20:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L11_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L12_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L11_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __pyx_L17_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_4) {
         __pyx_t_7 = PyObject_Call(__pyx_t_4, __pyx_k_tuple_20, NULL);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L19;
-    __pyx_L3_error:;
+    goto __pyx_L21;
+    __pyx_L6_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L19:;
+    __pyx_L21:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -8427,18 +7739,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_text_data (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_20read_text_data(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_data));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":79
  *             self.read_text_data(data)
  * 
  *     def read_text_data(self, data):             # <<<<<<<<<<<<<<
@@ -8446,7 +7747,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_sel
  *         for line_num, line in enumerate(data):
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data) {
+static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
   int __pyx_v_word_count;
   PyObject *__pyx_v_line_num = NULL;
   PyObject *__pyx_v_line = NULL;
@@ -8466,9 +7768,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text_data", 0);
+  __Pyx_RefNannySetupContext("read_text_data");
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":77
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":80
  * 
  *     def read_text_data(self, data):
  *         cdef int word_count = 0             # <<<<<<<<<<<<<<
@@ -8477,7 +7779,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
   __pyx_v_word_count = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":78
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":81
  *     def read_text_data(self, data):
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):             # <<<<<<<<<<<<<<
@@ -8490,31 +7792,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     __pyx_t_2 = __pyx_v_data; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
+    if (PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
+    } else if (PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -8526,68 +7820,60 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     __Pyx_INCREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_line_num);
     __pyx_v_line_num = __pyx_t_1;
-    __pyx_t_5 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_1);
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":79
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":82
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))
  */
-    __pyx_t_5 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":80
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":83
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)
  *             for word in line.split():             # <<<<<<<<<<<<<<
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:
  */
-    __pyx_t_6 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_5 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (PyList_CheckExact(__pyx_t_5) || PyTuple_CheckExact(__pyx_t_5)) {
       __pyx_t_6 = __pyx_t_5; __Pyx_INCREF(__pyx_t_6); __pyx_t_7 = 0;
       __pyx_t_8 = NULL;
     } else {
-      __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __pyx_t_8 = Py_TYPE(__pyx_t_6)->tp_iternext;
     }
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     for (;;) {
-      if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_6)) {
+      if (PyList_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
-      } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_6)) {
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
+      } else if (PyTuple_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
       } else {
         __pyx_t_5 = __pyx_t_8(__pyx_t_6);
         if (unlikely(!__pyx_t_5)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -8597,53 +7883,53 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
       __pyx_v_word = __pyx_t_5;
       __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":81
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":84
  *             self.sent_index.append(word_count)
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))             # <<<<<<<<<<<<<<
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  */
-      __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       __Pyx_INCREF(__pyx_v_word);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_word);
       __Pyx_GIVEREF(__pyx_v_word);
-      __pyx_t_10 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":82
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":85
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:             # <<<<<<<<<<<<<<
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  */
-      if (__pyx_v_self->use_sent_id) {
+      if (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":83
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":86
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *                 word_count = word_count + 1
  *             self.data.append(1)
  */
-        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        goto __pyx_L7;
+        goto __pyx_L9;
       }
-      __pyx_L7:;
+      __pyx_L9:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":84
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":87
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -8654,41 +7940,41 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     }
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":85
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":88
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  *             self.data.append(1)             # <<<<<<<<<<<<<<
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  */
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":86
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":89
  *                 word_count = word_count + 1
  *             self.data.append(1)
  *             if self.use_sent_id:             # <<<<<<<<<<<<<<
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  */
-    if (__pyx_v_self->use_sent_id) {
+    if (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":87
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":90
  *             self.data.append(1)
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *             word_count = word_count + 1
  *         self.data.append(0)
  */
-      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L8;
+      goto __pyx_L10;
     }
-    __pyx_L8:;
+    __pyx_L10:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":88
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":91
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -8700,27 +7986,27 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":89
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":92
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  *         self.data.append(0)             # <<<<<<<<<<<<<<
  *         self.sent_index.append(word_count)
  * 
  */
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":90
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":93
  *             word_count = word_count + 1
  *         self.data.append(0)
  *         self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -8745,28 +8031,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_22read_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":93
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":96
  * 
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -8774,13 +8039,27 @@ static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self,
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_12read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_12read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":95
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":98
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -8789,16 +8068,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":96
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":99
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":97
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":100
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -8813,7 +8092,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":99
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":102
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -8824,7 +8103,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
 static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, FILE *__pyx_v_f) {
   int __pyx_v_num_words;
   int __pyx_v_word_len;
-  CYTHON_UNUSED unsigned int __pyx_v_i;
+  unsigned int __pyx_v_i;
   char *__pyx_v_word;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -8836,9 +8115,9 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_handle", 0);
+  __Pyx_RefNannySetupContext("read_handle");
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":104
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":107
  *         cdef char* word
  * 
  *         self.data.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8847,7 +8126,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->read_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":108
  * 
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8856,7 +8135,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":106
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":109
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8865,7 +8144,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->read_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":107
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":110
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8874,7 +8153,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":108
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":111
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):             # <<<<<<<<<<<<<<
@@ -8885,7 +8164,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":109
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":112
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8894,7 +8173,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":110
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":113
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -8903,7 +8182,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":111
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":114
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -8912,7 +8191,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":112
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":115
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
@@ -8921,31 +8200,31 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     __pyx_t_3 = __pyx_v_self->id2word;
     __Pyx_INCREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-    if (PyObject_SetItem(__pyx_v_self->word2id, ((PyObject *)__pyx_t_5), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_self->word2id, ((PyObject *)__pyx_t_5), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":113
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":116
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
  *             free(word)
  *         if len(self.sent_id) == 0:
  */
-    __pyx_t_3 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __pyx_t_5 = __Pyx_PyObject_Append(__pyx_v_self->id2word, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_Append(__pyx_v_self->id2word, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":114
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":117
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -8955,7 +8234,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     free(__pyx_v_word);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":115
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":118
  *             self.id2word.append(word)
  *             free(word)
  *         if len(self.sent_id) == 0:             # <<<<<<<<<<<<<<
@@ -8964,12 +8243,12 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   __pyx_t_5 = ((PyObject *)__pyx_v_self->sent_id);
   __Pyx_INCREF(__pyx_t_5);
-  __pyx_t_4 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_t_6 = (__pyx_t_4 == 0);
   if (__pyx_t_6) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":116
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":119
  *             free(word)
  *         if len(self.sent_id) == 0:
  *             self.use_sent_id = False             # <<<<<<<<<<<<<<
@@ -8981,7 +8260,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":118
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":121
  *             self.use_sent_id = False
  *         else:
  *             self.use_sent_id = True             # <<<<<<<<<<<<<<
@@ -9001,7 +8280,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":120
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":123
  *             self.use_sent_id = True
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -9023,9 +8302,9 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_handle", 0);
+  __Pyx_RefNannySetupContext("write_handle");
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":124
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":127
  *         cdef int num_words
  * 
  *         self.data.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9034,7 +8313,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->write_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":125
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":128
  * 
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9043,7 +8322,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":126
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":129
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9052,7 +8331,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->write_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":127
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":130
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2             # <<<<<<<<<<<<<<
@@ -9061,11 +8340,11 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   __pyx_t_1 = __pyx_v_self->id2word;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_num_words = (__pyx_t_2 - 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":128
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":131
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9074,45 +8353,37 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":129
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":132
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:             # <<<<<<<<<<<<<<
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  */
-  __pyx_t_1 = __Pyx_PySequence_GetSlice(__pyx_v_self->id2word, 2, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PySequence_GetSlice(__pyx_v_self->id2word, 2, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
     __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (;;) {
-    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
+    if (PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
     } else {
       __pyx_t_1 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_1)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9122,17 +8393,17 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_v_word = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":130
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":133
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)
  */
-    __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":131
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":134
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9141,14 +8412,14 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":132
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":135
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
  * 
  *     def write_binary(self, char* filename):
  */
-    __pyx_t_6 = PyBytes_AsString(__pyx_v_word); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyBytes_AsString(__pyx_v_word); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     fwrite(((char *)__pyx_t_6), (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -9163,28 +8434,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_24write_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":134
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":137
  *             fwrite(<char *>word, sizeof(char), word_len, f)
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9192,13 +8442,27 @@ static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self,
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":139
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -9207,16 +8471,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":137
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":140
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":138
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":141
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -9231,18 +8495,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_enhanced_handle (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_26write_enhanced_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_f));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":140
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":143
  *         fclose(f)
  * 
  *     def write_enhanced_handle(self, f):             # <<<<<<<<<<<<<<
@@ -9250,7 +8503,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__py
  *             f.write("%d " %i)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_word = NULL;
   PyObject *__pyx_r = NULL;
@@ -9264,44 +8518,36 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced_handle", 0);
+  __Pyx_RefNannySetupContext("write_enhanced_handle");
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":141
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":144
  * 
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)__pyx_v_self->data)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->data))) {
-    __pyx_t_1 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data))) {
+    __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9311,23 +8557,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":142
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":145
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
  *         f.write("\n")
  *         for i in self.sent_index:
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
@@ -9335,56 +8581,48 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":143
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_22), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_22), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":144
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":147
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_index:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_index))) {
-    __pyx_t_5 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index))) {
+    __pyx_t_5 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_3 = Py_TYPE(__pyx_t_5)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_5)) {
+    if (PyList_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_5)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_5)) {
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
     } else {
       __pyx_t_1 = __pyx_t_3(__pyx_t_5);
       if (unlikely(!__pyx_t_1)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9394,23 +8632,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":145
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":148
  *         f.write("\n")
  *         for i in self.sent_index:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
  *         f.write("\n")
  *         for i in self.sent_id:
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_6));
-    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_6));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
     __pyx_t_6 = 0;
-    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -9418,56 +8656,48 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  */
-  __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_6 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_k_tuple_23), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_k_tuple_23), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":147
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":150
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_id:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_id)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_id))) {
-    __pyx_t_6 = ((PyObject *)__pyx_v_self->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id))) {
+    __pyx_t_6 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_3 = Py_TYPE(__pyx_t_6)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_6)) {
+    if (PyList_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_6)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_6)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_6);
       if (unlikely(!__pyx_t_5)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9477,23 +8707,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":148
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":151
  *         f.write("\n")
  *         for i in self.sent_id:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
  *         f.write("\n")
  *         for word in self.id2word:
  */
-    __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -9501,56 +8731,48 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  */
-  __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_4 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_k_tuple_24), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_k_tuple_24), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":150
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":153
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for word in self.id2word:             # <<<<<<<<<<<<<<
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")
  */
-  if (PyList_CheckExact(__pyx_v_self->id2word) || PyTuple_CheckExact(__pyx_v_self->id2word)) {
-    __pyx_t_4 = __pyx_v_self->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word)) {
+    __pyx_t_4 = ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_self->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
+    if (PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
+      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
     } else {
       __pyx_t_6 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_6)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9560,34 +8782,34 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_word = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":151
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":154
  *         f.write("\n")
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))             # <<<<<<<<<<<<<<
  *         f.write("\n")
  * 
  */
-    __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_1 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_INCREF(__pyx_v_word);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_word);
     __Pyx_GIVEREF(__pyx_v_word);
     PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_25), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_25), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -9595,16 +8817,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def write_enhanced(self, char* filename):
  */
-  __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_26), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_26), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -9626,28 +8848,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_28write_enhanced(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":154
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":157
  *         f.write("\n")
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9655,7 +8856,9 @@ static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_sel
  *             self.write_enhanced_handle(self, f)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -9673,78 +8876,86 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced", 0);
+  __Pyx_RefNannySetupContext("write_enhanced");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":158
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.write_enhanced_handle(self, f)
  */
   /*with:*/ {
-    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
     PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_n_s__w));
     __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":156
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":159
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.write_enhanced_handle(self, f)             # <<<<<<<<<<<<<<
  */
-          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s_27); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_INCREF(((PyObject *)__pyx_v_self));
-          PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
-          __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
+          __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+          __Pyx_INCREF(__pyx_v_self);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self);
+          __Pyx_GIVEREF(__pyx_v_self);
           __Pyx_INCREF(__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":158
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -9752,75 +8963,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_7);
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+          __Pyx_INCREF(__pyx_t_7);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7);
+          __Pyx_GIVEREF(__pyx_t_7);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
-          __Pyx_INCREF(__pyx_t_4);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_4);
-          __Pyx_GIVEREF(__pyx_t_4);
           __pyx_t_10 = PyObject_Call(__pyx_t_3, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
+            __Pyx_GIVEREF(__pyx_t_7);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_GIVEREF(__pyx_t_4);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_4);
-            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_4 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L18;
+            __Pyx_ErrRestore(__pyx_t_7, __pyx_t_2, __pyx_t_1);
+            __pyx_t_7 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L19;
           }
-          __pyx_L18:;
+          __pyx_L19:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L19;
-    __pyx_L3_error:;
+    goto __pyx_L20;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L19:;
+    __pyx_L20:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -9828,7 +9039,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -9847,10 +9058,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
  *         return i*65536 + j
  */
 
-static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
+static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("link", 0);
+  __Pyx_RefNannySetupContext("link");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":14
  *     cdef int link(self, int i, int j):
@@ -9868,18 +9079,6 @@ static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alig
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link); /*proto*/
-static char __pyx_doc_3_sa_9Alignment_unlink[] = "De-integerizes an alignment link pair";
-static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("unlink (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9Alignment_unlink(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((PyObject *)__pyx_v_link));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":16
  *         return i*65536 + j
  * 
@@ -9888,7 +9087,9 @@ static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObje
  *         return (link/65536, link%65536)
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link) {
+static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link); /*proto*/
+static char __pyx_doc_3_sa_9Alignment_unlink[] = "De-integerizes an alignment link pair";
+static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -9897,7 +9098,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("unlink", 0);
+  __Pyx_RefNannySetupContext("unlink");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":18
  *     def unlink(self, link):
@@ -9912,7 +9113,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
   __pyx_t_2 = PyNumber_Remainder(__pyx_v_link, __pyx_int_65536); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -9945,10 +9146,10 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
  *         e[0] = link%65536
  */
 
-static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_link, int *__pyx_v_f, int *__pyx_v_e) {
+static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_link, int *__pyx_v_f, int *__pyx_v_e) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_unlink", 0);
+  __Pyx_RefNannySetupContext("_unlink");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":21
  * 
@@ -9974,27 +9175,6 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id) {
-  int __pyx_v_sent_id;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sent_links (wrapper)", 0);
-  assert(__pyx_arg_sent_id); {
-    __pyx_v_sent_id = __Pyx_PyInt_AsInt(__pyx_arg_sent_id); if (unlikely((__pyx_v_sent_id == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.get_sent_links", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_2get_sent_links(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((int)__pyx_v_sent_id));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":24
  *         e[0] = link%65536
  * 
@@ -10003,7 +9183,9 @@ static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self
  *         cdef int* arr
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id) {
+static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id) {
+  int __pyx_v_sent_id;
   struct __pyx_obj_3_sa_IntList *__pyx_v_sent_links = 0;
   int *__pyx_v_arr;
   int __pyx_v_arr_len;
@@ -10013,7 +9195,16 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sent_links", 0);
+  __Pyx_RefNannySetupContext("get_sent_links");
+  assert(__pyx_arg_sent_id); {
+    __pyx_v_sent_id = __Pyx_PyInt_AsInt(__pyx_arg_sent_id); if (unlikely((__pyx_v_sent_id == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.get_sent_links", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":28
  *         cdef int* arr
@@ -10034,7 +9225,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)
  */
-  __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->_get_sent_links(__pyx_v_self, __pyx_v_sent_id, (&__pyx_v_arr_len));
+  __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->__pyx_vtab)->_get_sent_links(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_v_sent_id, (&__pyx_v_arr_len));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":30
  *         sent_links = IntList()
@@ -10099,7 +9290,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_get_sent_links", 0);
+  __Pyx_RefNannySetupContext("_get_sent_links");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":37
  *         cdef int* sent_links
@@ -10180,38 +9371,43 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_from_binary = 0;
-  PyObject *__pyx_v_from_text = 0;
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
-    PyObject* values[2] = {0,0};
-
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":45
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":45
  *         return sent_links
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):             # <<<<<<<<<<<<<<
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  */
+
+static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_from_binary = 0;
+  PyObject *__pyx_v_from_text = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
+  __Pyx_RefNannySetupContext("__cinit__");
+  {
+    PyObject* values[2] = {0,0};
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -10224,7 +9420,7 @@ static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -10245,22 +9441,6 @@ static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_4__cinit__(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":46
  * 
@@ -10272,9 +9452,9 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_29), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->links);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->links));
-  __pyx_v_self->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links));
+  ((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":47
@@ -10287,9 +9467,9 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_30), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->sent_index);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
-  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index));
+  ((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":48
@@ -10309,10 +9489,10 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
  *         elif from_text:
  *             self.read_text(from_text)
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -10321,7 +9501,7 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":50
@@ -10341,10 +9521,10 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
  * 
  *     def read_text(self, char* filename):
  */
-    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -10353,9 +9533,9 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -10370,27 +9550,6 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_6read_text(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":53
  *             self.read_text(from_text)
  * 
@@ -10399,7 +9558,9 @@ static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyO
  *             for line in f:
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_line = NULL;
   PyObject *__pyx_v_pairs = NULL;
@@ -10431,7 +9592,16 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text", 0);
+  __Pyx_RefNannySetupContext("read_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
  * 
@@ -10446,7 +9616,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -10456,12 +9626,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -10469,9 +9639,8 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_v_f = __pyx_t_1;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_v_f = __pyx_t_2;
+          __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":55
  *     def read_text(self, char* filename):
@@ -10481,42 +9650,34 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  *                 pairs = line.split()
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_3 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_3)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_3);
             }
             __Pyx_XDECREF(__pyx_v_line);
-            __pyx_v_line = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_line = __pyx_t_3;
+            __pyx_t_3 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":56
  *         with gzip_or_text(filename) as f:
@@ -10525,16 +9686,16 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  *                 pairs = line.split()
  *                 for pair in pairs:
  */
-            __pyx_t_2 = ((PyObject *)__pyx_v_self->links);
-            __Pyx_INCREF(__pyx_t_2);
-            __pyx_t_10 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_3 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_3 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
+            __Pyx_INCREF(__pyx_t_3);
+            __pyx_t_10 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":57
  *             for line in f:
@@ -10543,14 +9704,14 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_XDECREF(__pyx_v_pairs);
-            __pyx_v_pairs = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_pairs = __pyx_t_3;
+            __pyx_t_3 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":58
  *                 self.sent_index.append(len(self.links))
@@ -10560,42 +9721,34 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  *                     self.links.append(self.link(i, j))
  */
             if (PyList_CheckExact(__pyx_v_pairs) || PyTuple_CheckExact(__pyx_v_pairs)) {
-              __pyx_t_2 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_2); __pyx_t_10 = 0;
+              __pyx_t_3 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
               __pyx_t_11 = NULL;
             } else {
-              __pyx_t_10 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_11 = Py_TYPE(__pyx_t_2)->tp_iternext;
+              __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
             }
             for (;;) {
-              if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_2)) {
-                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_2)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                #else
-                __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                #endif
-              } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_2)) {
-                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                #else
-                __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                #endif
+              if (PyList_CheckExact(__pyx_t_3)) {
+                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
+                __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++;
+              } else if (PyTuple_CheckExact(__pyx_t_3)) {
+                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+                __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++;
               } else {
-                __pyx_t_3 = __pyx_t_11(__pyx_t_2);
-                if (unlikely(!__pyx_t_3)) {
+                __pyx_t_1 = __pyx_t_11(__pyx_t_3);
+                if (unlikely(!__pyx_t_1)) {
                   if (PyErr_Occurred()) {
                     if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                    else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                   }
                   break;
                 }
-                __Pyx_GOTREF(__pyx_t_3);
+                __Pyx_GOTREF(__pyx_t_1);
               }
               __Pyx_XDECREF(__pyx_v_pair);
-              __pyx_v_pair = __pyx_t_3;
-              __pyx_t_3 = 0;
+              __pyx_v_pair = __pyx_t_1;
+              __pyx_t_1 = 0;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
@@ -10604,74 +9757,67 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  *                     self.links.append(self.link(i, j))
  *             self.sent_index.append(len(self.links))
  */
-              __pyx_t_3 = PyObject_GetAttr(__pyx_v_pair, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_3);
-              __pyx_t_12 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_k_tuple_32), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyObject_GetAttr(__pyx_v_pair, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_12 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_32), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
               __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-              PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
+              PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
               __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-              PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_12);
+              PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
               __Pyx_GIVEREF(__pyx_t_12);
               __pyx_t_12 = 0;
-              __pyx_t_12 = PyObject_Call(__pyx_builtin_map, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_builtin_map, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+              __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               if ((likely(PyTuple_CheckExact(__pyx_t_12))) || (PyList_CheckExact(__pyx_t_12))) {
                 PyObject* sequence = __pyx_t_12;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                Py_ssize_t size = Py_SIZE(sequence);
-                #else
-                Py_ssize_t size = PySequence_Size(sequence);
-                #endif
-                if (unlikely(size != 2)) {
-                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                  {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                }
-                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  }
+                  __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
-                  __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
+                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  }
+                  __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
                 }
-                __Pyx_INCREF(__pyx_t_3);
+                __Pyx_INCREF(__pyx_t_1);
                 __Pyx_INCREF(__pyx_t_13);
-                #else
-                __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                __pyx_t_13 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                #endif
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              } else
-              {
+              } else {
                 Py_ssize_t index = -1;
-                __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
                 __pyx_t_15 = Py_TYPE(__pyx_t_14)->tp_iternext;
-                index = 0; __pyx_t_3 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_3)) goto __pyx_L20_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_3);
-                index = 1; __pyx_t_13 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L20_unpacking_failed;
+                index = 0; __pyx_t_1 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_1)) goto __pyx_L21_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_1);
+                index = 1; __pyx_t_13 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L21_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_13);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_14), 2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                __pyx_t_15 = NULL;
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_14), 2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                goto __pyx_L21_unpacking_done;
-                __pyx_L20_unpacking_failed:;
+                goto __pyx_L22_unpacking_done;
+                __pyx_L21_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __pyx_t_15 = NULL;
-                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                __pyx_L21_unpacking_done:;
+                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                __pyx_L22_unpacking_done:;
               }
               __Pyx_XDECREF(__pyx_v_i);
-              __pyx_v_i = __pyx_t_3;
-              __pyx_t_3 = 0;
+              __pyx_v_i = __pyx_t_1;
+              __pyx_t_1 = 0;
               __Pyx_XDECREF(__pyx_v_j);
               __pyx_v_j = __pyx_t_13;
               __pyx_t_13 = 0;
@@ -10683,18 +9829,18 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  *             self.sent_index.append(len(self.links))
  * 
  */
-              __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_12 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->link(__pyx_v_self, __pyx_t_16, __pyx_t_17)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->__pyx_vtab)->link(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_t_16, __pyx_t_17)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __pyx_t_13 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->links), __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_13 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links), __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_13);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
             }
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":61
  *                     (i, j) = map(int, pair.split('-'))
@@ -10703,28 +9849,28 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  * 
  *     def read_binary(self, char* filename):
  */
-          __pyx_t_1 = ((PyObject *)__pyx_v_self->links);
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_t_8 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
+          __Pyx_INCREF(__pyx_t_2);
+          __pyx_t_8 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_3 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
-        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
  * 
@@ -10735,57 +9881,57 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_13) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_13) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_12);
+          __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+          __Pyx_INCREF(__pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_3);
+          __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_13);
           PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_t_13);
           __Pyx_GIVEREF(__pyx_t_13);
           __pyx_t_19 = PyObject_Call(__pyx_t_4, __pyx_t_12, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_19);
           __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_19);
           __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-          if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_20 = (!__pyx_t_18);
           if (__pyx_t_20) {
+            __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_13);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_13);
-            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_13 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L24;
+            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_13);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_13 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L25;
           }
-          __pyx_L24:;
+          __pyx_L25:;
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
@@ -10799,11 +9945,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
         if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L25;
-    __pyx_L3_error:;
+    goto __pyx_L26;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L25:;
+    __pyx_L26:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -10829,27 +9975,6 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_8read_binary(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":63
  *             self.sent_index.append(len(self.links))
  * 
@@ -10858,11 +9983,25 @@ static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, P
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":65
  *     def read_binary(self, char* filename):
@@ -10880,7 +10019,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Ali
  *         self.sent_index.read_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->read_handle(__pyx_v_self->links, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":67
  *         f = fopen(filename, "r")
@@ -10889,7 +10028,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Ali
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":68
  *         self.links.read_handle(f)
@@ -10906,27 +10045,6 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Ali
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_10write_text(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":70
  *         fclose(f)
  * 
@@ -10935,7 +10053,9 @@ static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, P
  *             sent_num = 0
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_sent_num = NULL;
   PyObject *__pyx_v_i = NULL;
@@ -10948,9 +10068,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  Py_ssize_t __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
   PyObject *__pyx_t_10 = NULL;
   int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
@@ -10960,7 +10080,16 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text", 0);
+  __Pyx_RefNannySetupContext("write_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
  * 
@@ -10973,7 +10102,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -10985,22 +10114,21 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":72
  *     def write_text(self, char* filename):
@@ -11020,52 +10148,44 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
  *                     f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_4 = __pyx_int_0;
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->links)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->links))) {
-            __pyx_t_1 = ((PyObject *)__pyx_v_self->links); __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          __pyx_t_1 = __pyx_int_0;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links))) {
+            __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links); __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->links)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_9 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++;
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_9 = __pyx_t_8(__pyx_t_2);
+              if (unlikely(!__pyx_t_9)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_9);
             }
             __Pyx_XDECREF(__pyx_v_link);
-            __pyx_v_link = __pyx_t_2;
-            __pyx_t_2 = 0;
-            __Pyx_INCREF(__pyx_t_4);
+            __pyx_v_link = __pyx_t_9;
+            __pyx_t_9 = 0;
+            __Pyx_INCREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_4;
-            __pyx_t_2 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_4);
-            __pyx_t_4 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_9 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_DECREF(__pyx_t_1);
+            __pyx_t_1 = __pyx_t_9;
+            __pyx_t_9 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":74
  *             sent_num = 0
@@ -11075,11 +10195,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
  *                     sent_num = sent_num + 1
  */
             while (1) {
-              __pyx_t_2 = PyObject_GetItem(((PyObject *)__pyx_v_self->sent_index), __pyx_v_sent_num); if (!__pyx_t_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_9 = PyObject_GetItem(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_v_sent_num); if (!__pyx_t_9) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_9, Py_GE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_10);
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               if (!__pyx_t_11) break;
 
@@ -11090,12 +10211,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  */
-              __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_2 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_k_tuple_34), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_k_tuple_34), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":76
  *                 while i >= self.sent_index[sent_num]:
@@ -11104,11 +10225,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")
  */
-              __pyx_t_2 = PyNumber_Add(__pyx_v_sent_num, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_9 = PyNumber_Add(__pyx_v_sent_num, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_v_sent_num);
-              __pyx_v_sent_num = __pyx_t_2;
-              __pyx_t_2 = 0;
+              __pyx_v_sent_num = __pyx_t_9;
+              __pyx_t_9 = 0;
             }
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":77
@@ -11118,35 +10239,35 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
  *             f.write("\n")
  * 
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__unlink); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__unlink); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_12);
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_INCREF(__pyx_v_link);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_link);
             __Pyx_GIVEREF(__pyx_v_link);
-            __pyx_t_13 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_13 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_13);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __pyx_t_12 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_35), __pyx_t_13); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_35), __pyx_t_13); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_13);
+            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_13));
             PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_t_12));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
             __pyx_t_12 = 0;
-            __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           }
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
@@ -11155,24 +10276,24 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
  * 
  *     def write_binary(self, char* filename):
  */
-          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_36), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_36), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
  * 
@@ -11183,75 +10304,75 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_4, &__pyx_t_12) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_12) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_13);
+          __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+          __Pyx_INCREF(__pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_2);
+          __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
-          __Pyx_INCREF(__pyx_t_4);
-          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4);
-          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_12);
           PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __pyx_t_14 = PyObject_Call(__pyx_t_3, __pyx_t_13, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_14);
           __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_15 = (!__pyx_t_11);
           if (__pyx_t_15) {
+            __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_12);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_4, __pyx_t_12);
-            __pyx_t_1 = 0; __pyx_t_4 = 0; __pyx_t_12 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L22;
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_12);
+            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_12 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L23;
           }
-          __pyx_L22:;
+          __pyx_L23:;
           __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_37, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_37, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L23;
-    __pyx_L3_error:;
+    goto __pyx_L24;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L23:;
+    __pyx_L24:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -11259,7 +10380,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_XDECREF(__pyx_t_13);
@@ -11275,27 +10396,6 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_12write_binary(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":80
  *             f.write("\n")
  * 
@@ -11304,11 +10404,25 @@ static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self,
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":82
  *     def write_binary(self, char* filename):
@@ -11326,7 +10440,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_A
  *         self.sent_index.write_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->write_handle(__pyx_v_self->links, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":84
  *         f = fopen(filename, "w")
@@ -11335,7 +10449,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_A
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":85
  *         self.links.write_handle(f)
@@ -11352,27 +10466,6 @@ static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_A
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9Alignment_14write_enhanced(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":87
  *         fclose(f)
  * 
@@ -11381,9 +10474,11 @@ static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_sel
  *             sent_num = 1
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
-  CYTHON_UNUSED long __pyx_v_sent_num;
+  long __pyx_v_sent_num;
   PyObject *__pyx_v_link = NULL;
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_r = NULL;
@@ -11394,9 +10489,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  Py_ssize_t __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
   PyObject *__pyx_t_10 = NULL;
   int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
@@ -11404,7 +10499,16 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced", 0);
+  __Pyx_RefNannySetupContext("write_enhanced");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
  * 
@@ -11417,7 +10521,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -11429,22 +10533,21 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":89
  *     def write_enhanced(self, char* filename):
@@ -11462,43 +10565,35 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  *                 f.write("%d " % link)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->links)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->links))) {
-            __pyx_t_4 = ((PyObject *)__pyx_v_self->links); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links))) {
+            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->links)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
             } else {
-              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_link);
-            __pyx_v_link = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_link = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":91
  *             sent_num = 1
@@ -11507,22 +10602,22 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  *             f.write("\n")
  *             for i in self.sent_index:
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_2));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
+            __pyx_t_9 = 0;
+            __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           }
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
@@ -11531,12 +10626,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  */
-          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_38), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_38), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":93
  *                 f.write("%d " % link)
@@ -11545,43 +10640,35 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  *                 f.write("%d " % i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_index))) {
-            __pyx_t_2 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index))) {
+            __pyx_t_9 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index); __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
             } else {
-              __pyx_t_4 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_4)) {
+              __pyx_t_1 = __pyx_t_8(__pyx_t_9);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_4);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_4;
-            __pyx_t_4 = 0;
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":94
  *             f.write("\n")
@@ -11590,22 +10677,22 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  *             f.write("\n")
  * 
  */
-            __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
@@ -11614,21 +10701,21 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  * 
  *     def alignment(self, i):
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_39), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_39), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
@@ -11640,75 +10727,75 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_9, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
           __Pyx_INCREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
+          __Pyx_INCREF(__pyx_t_9);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
+          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
-          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
+          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
+            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_2, __pyx_t_1);
-            __pyx_t_10 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L22;
+            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_9, __pyx_t_2);
+            __pyx_t_10 = 0; __pyx_t_9 = 0; __pyx_t_2 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L23;
           }
-          __pyx_L22:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+          __pyx_L23:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_40, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_40, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L23;
-    __pyx_L3_error:;
+    goto __pyx_L24;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L23:;
+    __pyx_L24:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -11716,7 +10803,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -11729,18 +10816,6 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static char __pyx_doc_3_sa_9Alignment_16alignment[] = "Return all (e,f) pairs for sentence i";
-static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("alignment (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9Alignment_16alignment(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":97
  *             f.write("\n")
  * 
@@ -11749,7 +10824,9 @@ static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, Py
  *         cdef int j, start, end
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static char __pyx_doc_3_sa_9Alignment_8alignment[] = "Return all (e,f) pairs for sentence i";
+static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_j;
   int __pyx_v_start;
   int __pyx_v_end;
@@ -11765,7 +10842,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("alignment", 0);
+  __Pyx_RefNannySetupContext("alignment");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":100
  *         """Return all (e,f) pairs for sentence i"""
@@ -11775,7 +10852,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
  *         end = self.sent_index.arr[i+1]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -11787,7 +10864,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
  *         for j from start <= j < end:
  */
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
+  __pyx_v_start = (((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":102
  *         result = []
@@ -11800,7 +10877,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_end = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
+  __pyx_v_end = (((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":103
  *         start = self.sent_index.arr[i]
@@ -11818,12 +10895,15 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
  *             result.append(self.unlink(self.links.arr[j]))             # <<<<<<<<<<<<<<
  *         return result
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__unlink); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_v_result) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__unlink); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyInt_FromLong((__pyx_v_self->links->arr[__pyx_v_j])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->arr[__pyx_v_j])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
@@ -11872,7 +10952,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   struct __pyx_t_3_sa__node *__pyx_v_n;
   struct __pyx_t_3_sa__node *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_node", 0);
+  __Pyx_RefNannySetupContext("new_node");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":17
  * cdef _node* new_node(int key):
@@ -11951,7 +11031,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("del_node", 0);
+  __Pyx_RefNannySetupContext("del_node");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":26
  * 
@@ -12034,7 +11114,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("get_val", 0);
+  __Pyx_RefNannySetupContext("get_val");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":33
  * 
@@ -12163,9 +11243,16 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
+ *     cdef id2eword, id2fword, eword2id, fword2id
+ * 
+ *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
+ *             earray=None, fsarray=None, alignment=None):
+ *         self.id2eword = []
+ */
+
+static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_from_data = 0;
   PyObject *__pyx_v_from_binary = 0;
@@ -12174,18 +11261,18 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
   PyObject *__pyx_v_alignment = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
     PyObject* values[6] = {0,0,0,0,0,0};
-
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
- *     cdef id2eword, id2fword, eword2id, fword2id
- * 
- *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
- *             earray=None, fsarray=None, alignment=None):
- *         self.id2eword = []
- */
     values[0] = ((PyObject *)Py_None);
     values[1] = __pyx_k_41;
     values[2] = ((PyObject *)Py_None);
@@ -12202,8 +11289,7 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
     values[5] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -12214,7 +11300,7 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_text);
@@ -12247,7 +11333,7 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -12276,31 +11362,6 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex___cinit__(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_v_from_text, __pyx_v_from_data, __pyx_v_from_binary, __pyx_v_earray, __pyx_v_fsarray, __pyx_v_alignment);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
- *     cdef id2eword, id2fword, eword2id, fword2id
- * 
- *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
- *             earray=None, fsarray=None, alignment=None):
- *         self.id2eword = []
- */
-
-static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_from_text, PyObject *__pyx_v_from_data, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_earray, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_alignment) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":56
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,
@@ -12310,11 +11371,11 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  *         self.eword2id = {}
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->id2eword);
-  __Pyx_DECREF(__pyx_v_self->id2eword);
-  __pyx_v_self->id2eword = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword);
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":57
@@ -12325,11 +11386,11 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  *         self.fword2id = {}
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->id2fword);
-  __Pyx_DECREF(__pyx_v_self->id2fword);
-  __pyx_v_self->id2fword = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword);
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":58
@@ -12342,9 +11403,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->eword2id);
-  __Pyx_DECREF(__pyx_v_self->eword2id);
-  __pyx_v_self->eword2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id);
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":59
@@ -12357,9 +11418,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->fword2id);
-  __Pyx_DECREF(__pyx_v_self->fword2id);
-  __pyx_v_self->fword2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id);
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":60
@@ -12372,9 +11433,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->e_index);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->e_index));
-  __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":61
@@ -12387,9 +11448,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->f_index);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->f_index));
-  __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index));
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":62
@@ -12402,9 +11463,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->col1);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->col1));
-  __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":63
@@ -12417,9 +11478,9 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->col2);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->col2));
-  __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
+  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":64
@@ -12439,10 +11500,10 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  *         elif from_data:
  *             self.compute_from_data(fsarray, earray, alignment)
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -12451,7 +11512,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":66
@@ -12480,13 +11541,13 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
     if (!(likely(((__pyx_v_alignment) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_alignment, __pyx_ptype_3_sa_Alignment))))) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __pyx_v_alignment;
     __Pyx_INCREF(__pyx_t_1);
-    __pyx_t_5 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->compute_from_data(__pyx_v_self, ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_t_4), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_3), ((struct __pyx_obj_3_sa_Alignment *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->compute_from_data(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_t_4), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_3), ((struct __pyx_obj_3_sa_Alignment *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
   /*else*/ {
 
@@ -12497,10 +11558,10 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  * 
  * 
  */
-    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -12510,7 +11571,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -12578,7 +11639,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("compute_from_data", 0);
+  __Pyx_RefNannySetupContext("compute_from_data");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":79
  *         cdef int null_word
@@ -12605,20 +11666,12 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -12674,20 +11727,12 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
+    if (PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_5)) {
@@ -12739,20 +11784,12 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -12808,20 +11845,12 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
+    if (PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_5)) {
@@ -13118,7 +12147,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_12 = PyInt_FromLong((__pyx_v_sent_id + 1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_12);
         __pyx_t_13 = PyTuple_New(5); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_13);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4);
@@ -13138,7 +12167,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __Pyx_GOTREF(((PyObject *)__pyx_t_12));
         __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
         __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_13);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
         PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_t_12));
         __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
         __pyx_t_12 = 0;
@@ -13596,7 +12625,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_13);
   if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_GIVEREF(__pyx_t_13);
@@ -13618,7 +12647,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_12);
   if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
   __Pyx_GIVEREF(__pyx_t_12);
@@ -13640,7 +12669,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_13);
   if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_GIVEREF(__pyx_t_13);
@@ -13662,7 +12691,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_12);
   if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
   __Pyx_GIVEREF(__pyx_t_12);
@@ -13810,7 +12839,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_add_node", 0);
+  __Pyx_RefNannySetupContext("_add_node");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":191
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):
@@ -13925,27 +12954,6 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_2write_binary(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":202
  * 
  * 
@@ -13954,7 +12962,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyOb
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -13963,7 +12973,16 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary", 0);
+  __Pyx_RefNannySetupContext("write_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":204
  *     def write_binary(self, char* filename):
@@ -13981,7 +13000,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->write_handle(__pyx_v_self->f_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":206
  *         f = fopen(filename, "w")
@@ -13990,7 +13009,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->write_handle(__pyx_v_self->e_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":207
  *         self.f_index.write_handle(f)
@@ -13999,7 +13018,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->write_handle(__pyx_v_self->col1, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":208
  *         self.e_index.write_handle(f)
@@ -14008,7 +13027,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->write_handle(__pyx_v_self->col2, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":209
  *         self.col1.write_handle(f)
@@ -14017,9 +13036,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  *         self.write_wordlist(self.id2eword, f)
  *         fclose(f)
  */
-  __pyx_t_1 = __pyx_v_self->id2fword;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->write_wordlist(__pyx_v_self, __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->write_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -14031,9 +13050,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  *         fclose(f)
  * 
  */
-  __pyx_t_2 = __pyx_v_self->id2eword;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->write_wordlist(__pyx_v_self, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->write_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -14068,7 +13087,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  *         cdef int num_words
  */
 
-static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_wordlist, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_wordlist, FILE *__pyx_v_f) {
   int __pyx_v_word_len;
   int __pyx_v_num_words;
   PyObject *__pyx_v_word = NULL;
@@ -14083,7 +13102,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_wordlist", 0);
+  __Pyx_RefNannySetupContext("write_wordlist");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":218
  *         cdef int num_words
@@ -14120,20 +13139,12 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
     __pyx_t_3 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_2)) {
+    if (PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_2)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
+    } else if (PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
@@ -14202,11 +13213,11 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
  *         cdef int word_len
  */
 
-static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_word2id, PyObject *__pyx_v_id2word, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_word2id, PyObject *__pyx_v_id2word, FILE *__pyx_v_f) {
   int __pyx_v_num_words;
   int __pyx_v_word_len;
   char *__pyx_v_word;
-  CYTHON_UNUSED long __pyx_v_i;
+  long __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -14216,7 +13227,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_wordlist", 0);
+  __Pyx_RefNannySetupContext("read_wordlist");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":231
  *         cdef char* word
@@ -14317,27 +13328,6 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_4read_binary(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":240
  *             free(word)
  * 
@@ -14346,7 +13336,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObj
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -14356,7 +13348,16 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary", 0);
+  __Pyx_RefNannySetupContext("read_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":242
  *     def read_binary(self, char* filename):
@@ -14374,7 +13375,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->read_handle(__pyx_v_self->f_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":244
  *         f = fopen(filename, "r")
@@ -14383,7 +13384,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->read_handle(__pyx_v_self->e_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":245
  *         self.f_index.read_handle(f)
@@ -14392,7 +13393,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->read_handle(__pyx_v_self->col1, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":246
  *         self.e_index.read_handle(f)
@@ -14401,7 +13402,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->read_handle(__pyx_v_self->col2, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":247
  *         self.col1.read_handle(f)
@@ -14410,11 +13411,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  *         fclose(f)
  */
-  __pyx_t_1 = __pyx_v_self->fword2id;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_v_self->id2fword;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->read_wordlist(__pyx_v_self, __pyx_t_1, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->read_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_1, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -14427,11 +13428,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  *         fclose(f)
  * 
  */
-  __pyx_t_3 = __pyx_v_self->eword2id;
+  __pyx_t_3 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id;
   __Pyx_INCREF(__pyx_t_3);
-  __pyx_t_2 = __pyx_v_self->id2eword;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->read_wordlist(__pyx_v_self, __pyx_t_3, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->read_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_3, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -14460,17 +13461,6 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_e_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_5BiLex_6get_e_id(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((PyObject *)__pyx_v_eword));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":252
  * 
  * 
@@ -14479,8 +13469,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject
  *             e_id = len(self.id2eword)
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_eword) {
-  PyObject *__pyx_v_e_id = NULL;
+static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword) {
+  Py_ssize_t __pyx_v_e_id;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -14489,7 +13480,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_e_id", 0);
+  __Pyx_RefNannySetupContext("get_e_id");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":253
  * 
@@ -14498,7 +13489,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":254
@@ -14508,14 +13499,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id
  */
-    __pyx_t_2 = __pyx_v_self->id2eword;
+    __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_v_e_id = __pyx_t_2;
-    __pyx_t_2 = 0;
+    __pyx_v_e_id = __pyx_t_3;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":255
  *         if eword not in self.eword2id:
@@ -14524,7 +13512,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
  *             self.eword2id[eword] = e_id
  *         return self.eword2id[eword]
  */
-    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_self->id2eword, __pyx_v_eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword, __pyx_v_eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
@@ -14535,10 +13523,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
  *         return self.eword2id[eword]
  * 
  */
-    if (PyObject_SetItem(__pyx_v_self->eword2id, __pyx_v_eword, __pyx_v_e_id) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_e_id); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    if (PyObject_SetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":257
  *             self.id2eword.append(eword)
@@ -14548,7 +13539,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -14561,23 +13552,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
   __Pyx_AddTraceback("_sa.BiLex.get_e_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_e_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_f_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_5BiLex_8get_f_id(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((PyObject *)__pyx_v_fword));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":260
  * 
  * 
@@ -14586,8 +13565,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject
  *             f_id = len(self.id2fword)
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword) {
-  PyObject *__pyx_v_f_id = NULL;
+static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword) {
+  Py_ssize_t __pyx_v_f_id;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -14596,7 +13576,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_f_id", 0);
+  __Pyx_RefNannySetupContext("get_f_id");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":261
  * 
@@ -14605,7 +13585,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":262
@@ -14615,14 +13595,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id
  */
-    __pyx_t_2 = __pyx_v_self->id2fword;
+    __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_v_f_id = __pyx_t_2;
-    __pyx_t_2 = 0;
+    __pyx_v_f_id = __pyx_t_3;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":263
  *         if fword not in self.fword2id:
@@ -14631,7 +13608,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
  *             self.fword2id[fword] = f_id
  *         return self.fword2id[fword]
  */
-    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_self->id2fword, __pyx_v_fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword, __pyx_v_fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
@@ -14642,10 +13619,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
  *         return self.fword2id[fword]
  * 
  */
-    if (PyObject_SetItem(__pyx_v_self->fword2id, __pyx_v_fword, __pyx_v_f_id) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_f_id); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    if (PyObject_SetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":265
  *             self.id2fword.append(fword)
@@ -14655,7 +13635,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -14668,33 +13648,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
   __Pyx_AddTraceback("_sa.BiLex.get_f_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_f_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_10read_text(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":268
  * 
  * 
@@ -14703,7 +13661,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObje
  *         cdef IntList fcount
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_j = 0;
   PyObject *__pyx_v_e_id = 0;
@@ -14748,7 +13708,16 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text", 0);
+  __Pyx_RefNannySetupContext("read_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":272
  *         cdef IntList fcount
@@ -14775,7 +13744,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -14785,12 +13754,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -14798,9 +13767,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_v_f = __pyx_t_1;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_v_f = __pyx_t_2;
+          __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":275
  *         with gzip_or_text(filename) as f:
@@ -14810,42 +13778,34 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 f_id = self.get_f_id(fword)
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_3 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_3)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_3);
             }
             __Pyx_XDECREF(__pyx_v_line);
-            __pyx_v_line = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_line = __pyx_t_3;
+            __pyx_t_3 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":276
  *             # first loop merely establishes size of array objects
@@ -14854,75 +13814,66 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-              PyObject* sequence = __pyx_t_3;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              Py_ssize_t size = Py_SIZE(sequence);
-              #else
-              Py_ssize_t size = PySequence_Size(sequence);
-              #endif
-              if (unlikely(size != 4)) {
-                if (size > 4) __Pyx_RaiseTooManyValuesError(4);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              }
-              #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
+              PyObject* sequence = __pyx_t_1;
               if (likely(PyTuple_CheckExact(sequence))) {
-                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
+                if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
+                  if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
+                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
                 __pyx_t_12 = PyTuple_GET_ITEM(sequence, 3); 
               } else {
-                __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
+                if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
+                  if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
+                __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
                 __pyx_t_12 = PyList_GET_ITEM(sequence, 3); 
               }
-              __Pyx_INCREF(__pyx_t_2);
+              __Pyx_INCREF(__pyx_t_3);
               __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_12);
-              #else
-              Py_ssize_t i;
-              PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_10,&__pyx_t_11,&__pyx_t_12};
-              for (i=0; i < 4; i++) {
-                PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                *(temps[i]) = item;
-              }
-              #endif
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            } else
-            {
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            } else {
               Py_ssize_t index = -1;
-              PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_10,&__pyx_t_11,&__pyx_t_12};
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              for (index=0; index < 4; index++) {
-                PyObject* item = __pyx_t_14(__pyx_t_13); if (unlikely(!item)) goto __pyx_L18_unpacking_failed;
-                __Pyx_GOTREF(item);
-                *(temps[index]) = item;
-              }
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_14 = NULL;
+              index = 0; __pyx_t_3 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L19_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_3);
+              index = 1; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L19_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_10);
+              index = 2; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L19_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_11);
+              index = 3; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L19_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_12);
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L19_unpacking_done;
-              __pyx_L18_unpacking_failed:;
+              goto __pyx_L20_unpacking_done;
+              __pyx_L19_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              __pyx_t_14 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_L19_unpacking_done:;
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_L20_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_fword);
-            __pyx_v_fword = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_fword = __pyx_t_3;
+            __pyx_t_3 = 0;
             __Pyx_XDECREF(__pyx_v_eword);
             __pyx_v_eword = __pyx_t_10;
             __pyx_t_10 = 0;
@@ -14940,16 +13891,16 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_12);
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_INCREF(__pyx_v_fword);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_fword);
             __Pyx_GIVEREF(__pyx_v_fword);
-            __pyx_t_11 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XDECREF(__pyx_v_f_id);
             __pyx_v_f_id = __pyx_t_11;
@@ -14962,20 +13913,20 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)
  */
-            __pyx_t_11 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_12);
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_INCREF(__pyx_v_eword);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_eword);
             __Pyx_GIVEREF(__pyx_v_eword);
-            __pyx_t_3 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_e_id = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":279
  *                 f_id = self.get_f_id(fword)
@@ -14985,12 +13936,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  */
             while (1) {
-              __pyx_t_15 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_3);
-              __pyx_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_15 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_12);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               if (!__pyx_t_16) break;
 
@@ -15001,7 +13953,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  * 
  */
-              __pyx_t_12 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_fcount), __pyx_int_0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_fcount), __pyx_int_0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             }
@@ -15013,11 +13965,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  * 
  *             # Allocate space for dictionary in arrays
  */
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             (__pyx_v_fcount->arr[__pyx_t_17]) = ((__pyx_v_fcount->arr[__pyx_t_15]) + 1);
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":284
  * 
@@ -15036,11 +13988,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:
  */
-          __pyx_t_8 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_v_n_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_t_8 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_v_n_f = __pyx_t_2;
+          __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":286
  *             N = 0
@@ -15049,19 +14001,19 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N
  */
-          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-          __pyx_t_12 = PyNumber_Add(__pyx_v_n_f, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+          __pyx_t_12 = PyNumber_Add(__pyx_v_n_f, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(__pyx_v_self->f_index);
-          __Pyx_DECREF(((PyObject *)__pyx_v_self->f_index));
-          __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
+          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index);
+          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index));
+          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
@@ -15071,9 +14023,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  */
-          __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19++) {
-            __pyx_t_12 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_XDECREF(__pyx_v_i);
             __pyx_v_i = __pyx_t_12;
@@ -15086,9 +14038,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0
  */
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":289
  *             for i from 0 <= i < n_f:
@@ -15097,15 +14049,15 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_12 = PyInt_FromLong((__pyx_v_fcount->arr[__pyx_t_8])); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyInt_FromLong((__pyx_v_fcount->arr[__pyx_t_8])); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_1 = PyNumber_Add(__pyx_v_N, __pyx_t_12); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_2 = PyNumber_Add(__pyx_v_N, __pyx_t_12); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             __Pyx_DECREF(__pyx_v_N);
-            __pyx_v_N = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_N = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":290
  *                 self.f_index.arr[i] = N
@@ -15114,9 +14066,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             (__pyx_v_fcount->arr[__pyx_t_8]) = 0;
-            __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           }
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
@@ -15126,11 +14078,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  */
-          __pyx_t_1 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_XDECREF(__pyx_v_i);
-          __pyx_v_i = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_v_i = __pyx_t_2;
+          __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":291
  *                 N = N + fcount.arr[i]
@@ -15139,9 +14091,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)
  */
-          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
+          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":292
  *                 fcount.arr[i] = 0
@@ -15150,16 +14102,16 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             self.col1 = FloatList(initial_len=N)
  *             self.col2 = FloatList(initial_len=N)
  */
-          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(__pyx_v_self->e_index);
-          __Pyx_DECREF(((PyObject *)__pyx_v_self->e_index));
-          __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
+          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
+          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
+          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":293
@@ -15169,17 +14121,17 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             self.col2 = FloatList(initial_len=N)
  * 
  */
-          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-          __Pyx_GIVEREF(__pyx_t_1);
-          __Pyx_GOTREF(__pyx_v_self->col1);
-          __Pyx_DECREF(((PyObject *)__pyx_v_self->col1));
-          __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
-          __pyx_t_1 = 0;
+          __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1);
+          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
+          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_2);
+          __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":294
  *             self.e_index = IntList(initial_len=N)
@@ -15188,16 +14140,16 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  * 
  *             # Re-read file, placing words into buckets
  */
-          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(__pyx_v_self->col2);
-          __Pyx_DECREF(((PyObject *)__pyx_v_self->col2));
-          __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
+          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2);
+          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
+          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":297
@@ -15207,12 +14159,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  */
-          __pyx_t_12 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_1 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":298
  *             # Re-read file, placing words into buckets
@@ -15222,34 +14174,26 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 f_id = self.get_f_id(fword)
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_12 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_12 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
             } else {
-              __pyx_t_12 = __pyx_t_9(__pyx_t_1);
+              __pyx_t_12 = __pyx_t_9(__pyx_t_2);
               if (unlikely(!__pyx_t_12)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
@@ -15266,71 +14210,62 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  */
-            __pyx_t_12 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-              PyObject* sequence = __pyx_t_3;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              Py_ssize_t size = Py_SIZE(sequence);
-              #else
-              Py_ssize_t size = PySequence_Size(sequence);
-              #endif
-              if (unlikely(size != 4)) {
-                if (size > 4) __Pyx_RaiseTooManyValuesError(4);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              }
-              #if CYTHON_COMPILING_IN_CPYTHON
+            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
+              PyObject* sequence = __pyx_t_1;
               if (likely(PyTuple_CheckExact(sequence))) {
+                if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
+                  if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
                 __pyx_t_12 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
-                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 3); 
+                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 3); 
               } else {
+                if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
+                  if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
                 __pyx_t_12 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
-                __pyx_t_2 = PyList_GET_ITEM(sequence, 3); 
+                __pyx_t_3 = PyList_GET_ITEM(sequence, 3); 
               }
               __Pyx_INCREF(__pyx_t_12);
               __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_2);
-              #else
-              Py_ssize_t i;
-              PyObject** temps[4] = {&__pyx_t_12,&__pyx_t_11,&__pyx_t_10,&__pyx_t_2};
-              for (i=0; i < 4; i++) {
-                PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-                *(temps[i]) = item;
-              }
-              #endif
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            } else
-            {
+              __Pyx_INCREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            } else {
               Py_ssize_t index = -1;
-              PyObject** temps[4] = {&__pyx_t_12,&__pyx_t_11,&__pyx_t_10,&__pyx_t_2};
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              for (index=0; index < 4; index++) {
-                PyObject* item = __pyx_t_14(__pyx_t_13); if (unlikely(!item)) goto __pyx_L26_unpacking_failed;
-                __Pyx_GOTREF(item);
-                *(temps[index]) = item;
-              }
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_14 = NULL;
+              index = 0; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L27_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_12);
+              index = 1; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L27_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_11);
+              index = 2; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L27_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_10);
+              index = 3; __pyx_t_3 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L27_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_3);
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L27_unpacking_done;
-              __pyx_L26_unpacking_failed:;
+              goto __pyx_L28_unpacking_done;
+              __pyx_L27_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              __pyx_t_14 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_L27_unpacking_done:;
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_L28_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_fword);
             __pyx_v_fword = __pyx_t_12;
@@ -15342,8 +14277,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_score1 = __pyx_t_10;
             __pyx_t_10 = 0;
             __Pyx_XDECREF(__pyx_v_score2);
-            __pyx_v_score2 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_score2 = __pyx_t_3;
+            __pyx_t_3 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":300
  *             for line in f:
@@ -15352,17 +14287,17 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
             __Pyx_INCREF(__pyx_v_fword);
-            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fword);
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fword);
             __Pyx_GIVEREF(__pyx_v_fword);
-            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
             __Pyx_XDECREF(__pyx_v_f_id);
             __pyx_v_f_id = __pyx_t_10;
             __pyx_t_10 = 0;
@@ -15374,20 +14309,20 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  */
-            __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
             __Pyx_INCREF(__pyx_v_eword);
-            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_eword);
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_eword);
             __Pyx_GIVEREF(__pyx_v_eword);
-            __pyx_t_3 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_e_id = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":302
  *                 f_id = self.get_f_id(fword)
@@ -15396,13 +14331,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)
  */
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_3 = PyInt_FromLong(((__pyx_v_self->f_index->arr[__pyx_t_15]) + (__pyx_v_fcount->arr[__pyx_t_17]))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyInt_FromLong(((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_15]) + (__pyx_v_fcount->arr[__pyx_t_17]))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_index);
-            __pyx_v_index = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_index = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":303
  *                 e_id = self.get_e_id(eword)
@@ -15411,8 +14346,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)
  */
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             (__pyx_v_fcount->arr[__pyx_t_15]) = ((__pyx_v_fcount->arr[__pyx_t_17]) + 1);
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":304
@@ -15422,18 +14357,18 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 self.col1[index] = float(score1)
  *                 self.col2[index] = float(score2)
  */
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_INCREF(__pyx_v_e_id);
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_e_id);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_e_id);
             __Pyx_GIVEREF(__pyx_v_e_id);
-            __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            (__pyx_v_self->e_index->arr[__pyx_t_17]) = __pyx_t_20;
+            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_17]) = __pyx_t_20;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":305
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
@@ -15442,11 +14377,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *                 self.col2[index] = float(score2)
  * 
  */
-            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score1); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_2 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            if (PyObject_SetItem(((PyObject *)__pyx_v_self->col1), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score1); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_3 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            if (PyObject_SetItem(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1), __pyx_v_index, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":306
  *                 self.e_index.arr[index] = int(e_id)
@@ -15455,26 +14390,26 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  * 
  *         # Sort buckets by eword
  */
-            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score2); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_2 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            if (PyObject_SetItem(((PyObject *)__pyx_v_self->col2), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score2); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_3 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            if (PyObject_SetItem(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2), __pyx_v_index, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
  * 
@@ -15485,57 +14420,57 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_22 = PyObject_Call(__pyx_t_4, __pyx_t_10, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_22)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_22)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_22);
           __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_22);
           __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
-          if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_23 = (!__pyx_t_16);
           if (__pyx_t_23) {
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_3);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_3);
-            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L30;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_3, __pyx_t_1);
+            __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L31;
           }
-          __pyx_L30:;
+          __pyx_L31:;
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          goto __pyx_L8_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
@@ -15549,12 +14484,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
         if (unlikely(__pyx_t_23 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L31;
-    __pyx_L3_error:;
+    goto __pyx_L32;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L31:;
+    __pyx_L32:;
   }
+  if (unlikely(!__pyx_v_n_f)) { __Pyx_RaiseUnboundLocalError("n_f"); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":309
  * 
@@ -15563,14 +14499,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  */
-  if (unlikely(!__pyx_v_n_f)) { __Pyx_RaiseUnboundLocalError("n_f"); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_19; __pyx_t_18++) {
-    __pyx_t_3 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_b);
-    __pyx_v_b = __pyx_t_3;
-    __pyx_t_3 = 0;
+    __pyx_v_b = __pyx_t_1;
+    __pyx_t_1 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":310
  *         # Sort buckets by eword
@@ -15580,11 +14514,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             self.qsort(i,j, "")
  */
     __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_b); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_i);
-    __pyx_v_i = __pyx_t_3;
-    __pyx_t_3 = 0;
+    __pyx_v_i = __pyx_t_1;
+    __pyx_t_1 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":311
  *         for b from 0 <= b < n_f:
@@ -15593,15 +14527,15 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             self.qsort(i,j, "")
  * 
  */
-    __pyx_t_3 = PyNumber_Add(__pyx_v_b, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_1 = PyNumber_Add(__pyx_v_b, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_j);
-    __pyx_v_j = __pyx_t_3;
-    __pyx_t_3 = 0;
+    __pyx_v_j = __pyx_t_1;
+    __pyx_t_1 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":312
  *             i = self.f_index.arr[b]
@@ -15612,12 +14546,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  */
     __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_24 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_24 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_3 = ((PyObject *)__pyx_kp_s_45);
-    __Pyx_INCREF(__pyx_t_3);
-    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->qsort(__pyx_v_self, __pyx_t_20, __pyx_t_24, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = ((PyObject *)__pyx_kp_s_45);
+    __Pyx_INCREF(__pyx_t_1);
+    __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->qsort(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_20, __pyx_t_24, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_b); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
@@ -15628,11 +14562,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  */
-  __pyx_t_2 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_v_b);
-  __pyx_v_b = __pyx_t_2;
-  __pyx_t_2 = 0;
+  __pyx_v_b = __pyx_t_3;
+  __pyx_t_3 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -15681,7 +14615,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("swap", 0);
+  __Pyx_RefNannySetupContext("swap");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":319
  *         cdef float ftmp
@@ -15816,7 +14750,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("qsort", 0);
+  __Pyx_RefNannySetupContext("qsort");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":338
  *         cdef int pval, p
@@ -16026,27 +14960,6 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_12write_enhanced(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":358
  * 
  * 
@@ -16055,7 +14968,9 @@ static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, P
  *             for i in self.f_index:
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_s1 = NULL;
@@ -16069,9 +14984,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  Py_ssize_t __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
   PyObject *__pyx_t_10 = NULL;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
@@ -16082,7 +14997,16 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced", 0);
+  __Pyx_RefNannySetupContext("write_enhanced");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
  * 
@@ -16095,7 +15019,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -16107,22 +15031,21 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":360
  *     def write_enhanced(self, char* filename):
@@ -16131,43 +15054,35 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *                 f.write("%d " % i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->f_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->f_index))) {
-            __pyx_t_4 = ((PyObject *)__pyx_v_self->f_index); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index))) {
+            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->f_index)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
             } else {
-              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_i = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":361
  *         with open(filename, "w") as f:
@@ -16176,22 +15091,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_2));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
+            __pyx_t_9 = 0;
+            __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           }
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
@@ -16200,12 +15115,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  */
-          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_49), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_49), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":363
  *                 f.write("%d " % i)
@@ -16214,116 +15129,100 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")
  */
-          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_INCREF(((PyObject *)__pyx_v_self->e_index));
-          PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->e_index));
-          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e_index));
-          __Pyx_INCREF(((PyObject *)__pyx_v_self->col1));
-          PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->col1));
-          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->col1));
-          __Pyx_INCREF(((PyObject *)__pyx_v_self->col2));
-          PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->col2));
-          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->col2));
-          __pyx_t_4 = PyObject_Call(__pyx_builtin_zip, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
-            __pyx_t_2 = __pyx_t_4; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
+          PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
+          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
+          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
+          PyTuple_SET_ITEM(__pyx_t_9, 1, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
+          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
+          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
+          PyTuple_SET_ITEM(__pyx_t_9, 2, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
+          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
+          __pyx_t_1 = PyObject_Call(__pyx_builtin_zip, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+          if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
+            __pyx_t_9 = __pyx_t_1; __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
           }
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
             } else {
-              __pyx_t_4 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_4)) {
+              __pyx_t_1 = __pyx_t_8(__pyx_t_9);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_4);
+              __Pyx_GOTREF(__pyx_t_1);
             }
-            if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
-              PyObject* sequence = __pyx_t_4;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              Py_ssize_t size = Py_SIZE(sequence);
-              #else
-              Py_ssize_t size = PySequence_Size(sequence);
-              #endif
-              if (unlikely(size != 3)) {
-                if (size > 3) __Pyx_RaiseTooManyValuesError(3);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              }
-              #if CYTHON_COMPILING_IN_CPYTHON
+            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
+              PyObject* sequence = __pyx_t_1;
               if (likely(PyTuple_CheckExact(sequence))) {
+                if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
+                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); 
-                __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); 
+                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
+                if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
+                  if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                }
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 0); 
-                __pyx_t_1 = PyList_GET_ITEM(sequence, 1); 
+                __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
               }
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_1);
+              __Pyx_INCREF(__pyx_t_2);
               __Pyx_INCREF(__pyx_t_11);
-              #else
-              __pyx_t_10 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_11 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-            } else
-            {
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            } else {
               Py_ssize_t index = -1;
-              __pyx_t_12 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __pyx_t_13 = Py_TYPE(__pyx_t_12)->tp_iternext;
-              index = 0; __pyx_t_10 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_10)) goto __pyx_L20_unpacking_failed;
+              index = 0; __pyx_t_10 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_10);
-              index = 1; __pyx_t_1 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_1)) goto __pyx_L20_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_1);
-              index = 2; __pyx_t_11 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L20_unpacking_failed;
+              index = 1; __pyx_t_2 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_2)) goto __pyx_L21_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_2);
+              index = 2; __pyx_t_11 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L21_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_11);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_t_13 = NULL;
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              goto __pyx_L21_unpacking_done;
-              __pyx_L20_unpacking_failed:;
+              goto __pyx_L22_unpacking_done;
+              __pyx_L21_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_13 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __pyx_L21_unpacking_done:;
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_L22_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_i);
             __pyx_v_i = __pyx_t_10;
             __pyx_t_10 = 0;
             __Pyx_XDECREF(__pyx_v_s1);
-            __pyx_v_s1 = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_s1 = __pyx_t_2;
+            __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_s2);
             __pyx_v_s2 = __pyx_t_11;
             __pyx_t_11 = 0;
@@ -16335,10 +15234,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):
  */
-            __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
             __Pyx_INCREF(__pyx_v_i);
             PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
@@ -16348,21 +15247,21 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             __Pyx_INCREF(__pyx_v_s2);
             PyTuple_SET_ITEM(__pyx_t_11, 2, __pyx_v_s2);
             __Pyx_GIVEREF(__pyx_v_s2);
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_50), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_t_1));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-            __pyx_t_1 = 0;
-            __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_50), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
             __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
+            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+            PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":365
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
@@ -16371,12 +15270,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_51), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_51), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":366
  *                 f.write("%d %f %f " % (i, s1, s2))
@@ -16386,36 +15285,28 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_1 = __pyx_int_0;
-          if (PyList_CheckExact(__pyx_v_self->id2fword) || PyTuple_CheckExact(__pyx_v_self->id2fword)) {
-            __pyx_t_2 = __pyx_v_self->id2fword; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          __pyx_t_2 = __pyx_int_0;
+          if (PyList_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword)) {
+            __pyx_t_9 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword; __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self->id2fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_11 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_11 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_11); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_9)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_11); __pyx_t_7++;
             } else {
-              __pyx_t_11 = __pyx_t_9(__pyx_t_2);
+              __pyx_t_11 = __pyx_t_8(__pyx_t_9);
               if (unlikely(!__pyx_t_11)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
@@ -16424,13 +15315,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             __Pyx_XDECREF(__pyx_v_w);
             __pyx_v_w = __pyx_t_11;
             __pyx_t_11 = 0;
-            __Pyx_INCREF(__pyx_t_1);
+            __Pyx_INCREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_11 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_v_i = __pyx_t_2;
+            __pyx_t_11 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_1);
-            __pyx_t_1 = __pyx_t_11;
+            __Pyx_DECREF(__pyx_t_2);
+            __pyx_t_2 = __pyx_t_11;
             __pyx_t_11 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":367
@@ -16440,32 +15331,32 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):
  */
-            __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_INCREF(__pyx_v_i);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
             __Pyx_INCREF(__pyx_v_w);
-            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_w);
+            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_w);
             __Pyx_GIVEREF(__pyx_v_w);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_10));
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
@@ -16474,12 +15365,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_53), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_53), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":369
  *                 f.write("%d %s " % (i, w))
@@ -16489,36 +15380,28 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_2 = __pyx_int_0;
-          if (PyList_CheckExact(__pyx_v_self->id2eword) || PyTuple_CheckExact(__pyx_v_self->id2eword)) {
-            __pyx_t_1 = __pyx_v_self->id2eword; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
-            __pyx_t_9 = NULL;
+          __pyx_t_9 = __pyx_int_0;
+          if (PyList_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword)) {
+            __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
+            __pyx_t_8 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->id2eword); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_10 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_10 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_10); __pyx_t_7++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_10); __pyx_t_7++;
             } else {
-              __pyx_t_10 = __pyx_t_9(__pyx_t_1);
+              __pyx_t_10 = __pyx_t_8(__pyx_t_2);
               if (unlikely(!__pyx_t_10)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
@@ -16527,13 +15410,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             __Pyx_XDECREF(__pyx_v_w);
             __pyx_v_w = __pyx_t_10;
             __pyx_t_10 = 0;
-            __Pyx_INCREF(__pyx_t_2);
+            __Pyx_INCREF(__pyx_t_9);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_2;
-            __pyx_t_10 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_v_i = __pyx_t_9;
+            __pyx_t_10 = PyNumber_Add(__pyx_t_9, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_2);
-            __pyx_t_2 = __pyx_t_10;
+            __Pyx_DECREF(__pyx_t_9);
+            __pyx_t_9 = __pyx_t_10;
             __pyx_t_10 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":370
@@ -16543,32 +15426,32 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  *             f.write("\n")
  * 
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_INCREF(__pyx_v_i);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
             __Pyx_INCREF(__pyx_v_w);
-            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_w);
+            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_w);
             __Pyx_GIVEREF(__pyx_v_w);
-            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_11));
-            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_11));
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_11));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
             __pyx_t_11 = 0;
-            __pyx_t_11 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
@@ -16577,24 +15460,24 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  * 
  * 
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_54), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_54), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
  * 
@@ -16605,75 +15488,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_9, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_9);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
+          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
-          __pyx_t_15 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
+          __pyx_t_15 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_16 = (!__pyx_t_14);
           if (__pyx_t_16) {
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_11);
-            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L28;
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_9, __pyx_t_11);
+            __pyx_t_2 = 0; __pyx_t_9 = 0; __pyx_t_11 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L29;
           }
-          __pyx_L28:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_L29:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          goto __pyx_L8_exception_handled;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_55, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_55, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L29;
-    __pyx_L3_error:;
+    goto __pyx_L30;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L29:;
+    __pyx_L30:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -16681,7 +15564,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
@@ -16698,22 +15581,41 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":374
+ * 
+ * 
+ *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
+ *         cdef e_id, f_id, low, high, midpoint, val
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fword = 0;
   PyObject *__pyx_v_eword = 0;
   PyObject *__pyx_v_col = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_e_id = 0;
+  PyObject *__pyx_v_f_id = 0;
+  PyObject *__pyx_v_low = 0;
+  PyObject *__pyx_v_high = 0;
+  PyObject *__pyx_v_midpoint = 0;
+  PyObject *__pyx_v_val = 0;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_score (wrapper)", 0);
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
+  __Pyx_RefNannySetupContext("get_score");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -16721,23 +15623,26 @@ static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObje
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fword)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fword);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eword)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eword);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_score", 1, 3, 3, 1); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__col)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__col);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_score", 1, 3, 3, 2); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_score") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_score") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -16758,36 +15663,6 @@ static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObje
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_14get_score(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_v_fword, __pyx_v_eword, __pyx_v_col);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":374
- * 
- * 
- *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
- *         cdef e_id, f_id, low, high, midpoint, val
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword, PyObject *__pyx_v_eword, PyObject *__pyx_v_col) {
-  PyObject *__pyx_v_e_id = 0;
-  PyObject *__pyx_v_f_id = 0;
-  PyObject *__pyx_v_low = 0;
-  PyObject *__pyx_v_high = 0;
-  PyObject *__pyx_v_midpoint = 0;
-  PyObject *__pyx_v_val = 0;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_score", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":377
  *         cdef e_id, f_id, low, high, midpoint, val
@@ -16796,7 +15671,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *             return None
  *         if fword not in self.fword2id:
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":378
@@ -16810,9 +15685,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __Pyx_INCREF(Py_None);
     __pyx_r = Py_None;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":379
  *         if eword not in self.eword2id:
@@ -16821,7 +15696,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *             return None
  *         f_id = self.fword2id[fword]
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":380
@@ -16835,9 +15710,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __Pyx_INCREF(Py_None);
     __pyx_r = Py_None;
     goto __pyx_L0;
-    goto __pyx_L4;
+    goto __pyx_L7;
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":381
  *         if fword not in self.fword2id:
@@ -16846,7 +15721,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]
  */
-  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_f_id = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -16858,7 +15733,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]
  */
-  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_e_id = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -16871,7 +15746,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *         while high - low > 0:
  */
   __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_low = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -16887,7 +15762,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_t_2); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_high = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -16902,7 +15777,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   while (1) {
     __pyx_t_2 = PyNumber_Subtract(__pyx_v_high, __pyx_v_low); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
@@ -16932,7 +15808,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *                 if col == 0:
  */
     __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->e_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_XDECREF(__pyx_v_val);
     __pyx_v_val = __pyx_t_2;
@@ -16945,7 +15821,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
@@ -16957,7 +15834,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
@@ -16971,14 +15849,14 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  */
         __Pyx_XDECREF(__pyx_r);
         __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_2 = PyFloat_FromDouble((__pyx_v_self->col1->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_r = __pyx_t_2;
         __pyx_t_2 = 0;
         goto __pyx_L0;
-        goto __pyx_L8;
+        goto __pyx_L11;
       }
-      __pyx_L8:;
+      __pyx_L11:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":391
  *                 if col == 0:
@@ -16987,7 +15865,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
@@ -17001,17 +15880,17 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  */
         __Pyx_XDECREF(__pyx_r);
         __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_2 = PyFloat_FromDouble((__pyx_v_self->col2->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_r = __pyx_t_2;
         __pyx_t_2 = 0;
         goto __pyx_L0;
-        goto __pyx_L9;
+        goto __pyx_L12;
       }
-      __pyx_L9:;
-      goto __pyx_L7;
+      __pyx_L12:;
+      goto __pyx_L10;
     }
-    __pyx_L7:;
+    __pyx_L10:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":393
  *                 if col == 1:
@@ -17020,7 +15899,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *                 high = midpoint
  *             if val < e_id:
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
@@ -17035,9 +15915,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
       __Pyx_INCREF(__pyx_v_midpoint);
       __Pyx_DECREF(__pyx_v_high);
       __pyx_v_high = __pyx_v_midpoint;
-      goto __pyx_L10;
+      goto __pyx_L13;
     }
-    __pyx_L10:;
+    __pyx_L13:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":395
  *             if val > e_id:
@@ -17046,7 +15926,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
  *                 low = midpoint + 1
  *         return None
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
@@ -17063,9 +15944,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
       __Pyx_DECREF(__pyx_v_low);
       __pyx_v_low = __pyx_t_2;
       __pyx_t_2 = 0;
-      goto __pyx_L11;
+      goto __pyx_L14;
     }
-    __pyx_L11:;
+    __pyx_L14:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":397
@@ -17099,28 +15980,6 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static char __pyx_doc_3_sa_5BiLex_16write_text[] = "Note: does not guarantee writing the dictionary in the original order";
-static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_5BiLex_16write_text(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":400
  * 
  * 
@@ -17129,7 +15988,10 @@ static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObj
  *         cdef i, N, e_id, f_id
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static char __pyx_doc_3_sa_5BiLex_8write_text[] = "Note: does not guarantee writing the dictionary in the original order";
+static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_N = 0;
   PyObject *__pyx_v_e_id = 0;
@@ -17145,18 +16007,27 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  Py_ssize_t __pyx_t_8;
+  Py_ssize_t __pyx_t_7;
+  long __pyx_t_8;
   long __pyx_t_9;
-  long __pyx_t_10;
-  int __pyx_t_11;
+  int __pyx_t_10;
+  PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
   PyObject *__pyx_t_13 = NULL;
   int __pyx_t_14;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text", 0);
+  __Pyx_RefNannySetupContext("write_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
@@ -17169,7 +16040,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -17181,22 +16052,21 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":405
  * 
@@ -17205,14 +16075,14 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  *             f_id = 0
  *             for i from 0 <= i < N:
  */
-          __pyx_t_4 = ((PyObject *)__pyx_v_self->e_index);
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_t_8 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_v_N = __pyx_t_4;
-          __pyx_t_4 = 0;
+          __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_t_7 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_v_N = __pyx_t_1;
+          __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":406
  *         with open(filename, "w") as f:
@@ -17231,13 +16101,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  */
-          __pyx_t_9 = __Pyx_PyInt_AsLong(__pyx_v_N); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10++) {
-            __pyx_t_4 = PyInt_FromLong(__pyx_t_10); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_8 = __Pyx_PyInt_AsLong(__pyx_v_N); if (unlikely((__pyx_t_8 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9++) {
+            __pyx_t_1 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_4;
-            __pyx_t_4 = 0;
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_1 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":408
  *             f_id = 0
@@ -17247,17 +16117,18 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  *                 e_id = self.e_index.arr[i]
  */
             while (1) {
-              __pyx_t_4 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_4);
-              __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-              __pyx_t_4 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_4);
-              __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_v_i, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              if (!__pyx_t_11) break;
+              __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_7])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_v_i, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              if (!__pyx_t_10) break;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":409
  *             for i from 0 <= i < N:
@@ -17266,11 +16137,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]
  */
-              __pyx_t_1 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_2 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __Pyx_GOTREF(__pyx_t_2);
               __Pyx_DECREF(__pyx_v_f_id);
-              __pyx_v_f_id = __pyx_t_1;
-              __pyx_t_1 = 0;
+              __pyx_v_f_id = __pyx_t_2;
+              __pyx_t_2 = 0;
             }
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":410
@@ -17280,12 +16151,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_1 = PyInt_FromLong((__pyx_v_self->e_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_e_id = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":411
  *                     f_id = f_id + 1
@@ -17294,12 +16165,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->col1->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_score1);
-            __pyx_v_score1 = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_score1 = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":412
  *                 e_id = self.e_index.arr[i]
@@ -17307,52 +16178,52 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  *                 score2 = self.col2.arr[i]             # <<<<<<<<<<<<<<
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->col2->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_score2);
-            __pyx_v_score2 = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_score2 = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":413
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))             # <<<<<<<<<<<<<<
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_4 = PyObject_GetItem(__pyx_v_self->id2fword, __pyx_v_f_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_2 = PyObject_GetItem(__pyx_v_self->id2eword, __pyx_v_e_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_12 = PyTuple_New(4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_12);
-            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_4);
-            __Pyx_GIVEREF(__pyx_t_4);
-            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_2);
+            __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword, __pyx_v_f_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_11 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword, __pyx_v_e_id); if (!__pyx_t_11) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_12 = PyTuple_New(4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_1);
+            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_11);
+            __Pyx_GIVEREF(__pyx_t_11);
             __Pyx_INCREF(__pyx_v_score1);
             PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_v_score1);
             __Pyx_GIVEREF(__pyx_v_score1);
             __Pyx_INCREF(__pyx_v_score2);
             PyTuple_SET_ITEM(__pyx_t_12, 3, __pyx_v_score2);
             __Pyx_GIVEREF(__pyx_v_score2);
-            __pyx_t_4 = 0;
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_56), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_12);
-            PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_2));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_1 = 0;
+            __pyx_t_11 = 0;
+            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_56), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
+            __pyx_t_11 = 0;
+            __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_10 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+            __pyx_t_9 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           }
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":407
@@ -17362,21 +16233,21 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_11 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_11);
           __Pyx_XDECREF(__pyx_v_i);
-          __pyx_v_i = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_v_i = __pyx_t_11;
+          __pyx_t_11 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
@@ -17387,75 +16258,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_12, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          if (__Pyx_GetException(&__pyx_t_11, &__pyx_t_12, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(__pyx_t_11);
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __Pyx_INCREF(__pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
+          __Pyx_GIVEREF(__pyx_t_11);
           __Pyx_INCREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_12);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
-          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
+          __Pyx_INCREF(__pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
+          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-          __pyx_t_14 = (!__pyx_t_11);
+          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __pyx_t_14 = (!__pyx_t_10);
           if (__pyx_t_14) {
-            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_11);
             __Pyx_GIVEREF(__pyx_t_12);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_12, __pyx_t_1);
-            __pyx_t_2 = 0; __pyx_t_12 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L22;
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_ErrRestore(__pyx_t_11, __pyx_t_12, __pyx_t_2);
+            __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_2 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L23;
           }
-          __pyx_L22:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_L23:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L8_exception_handled;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_57, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_57, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L23;
-    __pyx_L3_error:;
+    goto __pyx_L24;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L23:;
+    __pyx_L24:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -17463,7 +16334,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -17494,7 +16365,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   unsigned int __pyx_t_2;
-  __Pyx_RefNannySetupContext("_init_lower_mask", 0);
+  __Pyx_RefNannySetupContext("_init_lower_mask");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":23
  * cdef void _init_lower_mask():
@@ -17550,7 +16421,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   struct __pyx_t_3_sa__BitSet *__pyx_v_b;
   struct __pyx_t_3_sa__BitSet *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_BitSet", 0);
+  __Pyx_RefNannySetupContext("new_BitSet");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":40
  *     cdef _BitSet* b
@@ -17632,7 +16503,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("bitset_findsucc", 0);
+  __Pyx_RefNannySetupContext("bitset_findsucc");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":52
  *     cdef int low, high, mid
@@ -17814,7 +16685,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("bitset_insert", 0);
+  __Pyx_RefNannySetupContext("bitset_insert");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":74
  *     cdef int val
@@ -17972,7 +16843,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("bitset_contains", 0);
+  __Pyx_RefNannySetupContext("bitset_contains");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":93
  *     cdef int val
@@ -18024,17 +16895,6 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_14BitSetIterator___next__(((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":104
  *     cdef int next_val
  * 
@@ -18043,7 +16903,8 @@ static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self) {
   int __pyx_v_ret_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -18052,7 +16913,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__next__", 0);
+  __Pyx_RefNannySetupContext("__next__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":107
  *         cdef int ret_val
@@ -18061,7 +16922,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
  *             raise StopIteration()
  *         ret_val = self.next_val
  */
-  __pyx_t_1 = (__pyx_v_self->next_val == -1);
+  __pyx_t_1 = (((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val == -1);
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":108
@@ -18076,9 +16937,9 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[6]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":109
  *         if self.next_val == -1:
@@ -18087,7 +16948,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
  *         self.next_val = bitset_findsucc(self.b, ret_val)
  *         return ret_val
  */
-  __pyx_v_ret_val = __pyx_v_self->next_val;
+  __pyx_v_ret_val = ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":110
  *             raise StopIteration()
@@ -18096,7 +16957,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
  *         return ret_val
  * 
  */
-  __pyx_v_self->next_val = __pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_v_ret_val);
+  ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val = __pyx_f_3_sa_bitset_findsucc(((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->b, __pyx_v_ret_val);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":111
  *         ret_val = self.next_val
@@ -18124,20 +16985,6 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
-  __pyx_r = __pyx_pf_3_sa_6BitSet___cinit__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":122
  *     cdef _BitSet* b
  * 
@@ -18146,10 +16993,14 @@ static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__
  * 
  */
 
-static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_RefNannySetupContext("__cinit__");
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":123
  * 
@@ -18158,22 +17009,13 @@ static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v
  * 
  *     def __dealloc__(self):
  */
-  __pyx_v_self->b = __pyx_f_3_sa_new_BitSet();
+  ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b = __pyx_f_3_sa_new_BitSet();
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_6BitSet_2__dealloc__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":125
  *         self.b = new_BitSet()
  * 
@@ -18182,9 +17024,10 @@ static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":126
  * 
@@ -18193,20 +17036,9 @@ static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__p
  * 
  *     def __iter__(self):
  */
-  free(__pyx_v_self->b);
-
-  __Pyx_RefNannyFinishContext();
-}
+  free(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b);
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_4__iter__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
   __Pyx_RefNannyFinishContext();
-  return __pyx_r;
 }
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":128
@@ -18217,7 +17049,8 @@ static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self) {
  *         it = BitSetIterator()
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_it = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -18225,7 +17058,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__", 0);
+  __Pyx_RefNannySetupContext("__iter__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":130
  *     def __iter__(self):
@@ -18246,7 +17079,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
  *         it.next_val = self.b.min_val
  *         return it
  */
-  __pyx_v_it->b = __pyx_v_self->b;
+  __pyx_v_it->b = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":132
  *         it = BitSetIterator()
@@ -18255,7 +17088,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
  *         return it
  * 
  */
-  __pyx_v_it->next_val = __pyx_v_self->b->min_val;
+  __pyx_v_it->next_val = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":133
  *         it.b = self.b
@@ -18282,17 +17115,6 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_6insert(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":135
  *         return it
  * 
@@ -18301,7 +17123,8 @@ static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -18309,7 +17132,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert", 0);
+  __Pyx_RefNannySetupContext("insert");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":136
  * 
@@ -18320,7 +17143,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__p
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_insert(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_insert(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -18338,17 +17161,6 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("findsucc (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_8findsucc(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":138
  *         return bitset_insert(self.b, i)
  * 
@@ -18357,7 +17169,8 @@ static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -18365,7 +17178,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("findsucc", 0);
+  __Pyx_RefNannySetupContext("findsucc");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":139
  * 
@@ -18376,7 +17189,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *_
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_findsucc(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -18394,17 +17207,6 @@ static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_10__str__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":141
  *         return bitset_findsucc(self.b, i)
  * 
@@ -18413,7 +17215,8 @@ static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -18422,7 +17225,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__", 0);
+  __Pyx_RefNannySetupContext("__str__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":142
  * 
@@ -18432,15 +17235,15 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
  *     def min(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = ((PyObject *)__pyx_f_3_sa_dec2bin(__pyx_v_self->b->bitset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PyObject *)__pyx_f_3_sa_dec2bin(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->bitset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyNumber_Add(__pyx_t_1, ((PyObject *)__pyx_kp_s_58)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -18454,10 +17257,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
   __pyx_t_1 = PyNumber_Add(__pyx_t_3, ((PyObject *)__pyx_kp_s_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromLong(__pyx_v_self->b->min_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -18471,10 +17274,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
   __pyx_t_3 = PyNumber_Add(__pyx_t_2, ((PyObject *)__pyx_kp_s_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyInt_FromLong(__pyx_v_self->b->max_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->max_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -18506,17 +17309,6 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("min (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_12min(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":144
  *         return dec2bin(self.b.bitset)+"  ("+str(self.b.size)+","+str(self.b.min_val)+","+str(self.b.max_val)+")"
  * 
@@ -18525,14 +17317,15 @@ static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUS
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("min", 0);
+  __Pyx_RefNannySetupContext("min");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":145
  * 
@@ -18542,7 +17335,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx
  *     def max(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->min_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -18560,17 +17353,6 @@ static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("max (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_14max(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":147
  *         return self.b.min_val
  * 
@@ -18579,14 +17361,15 @@ static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUS
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("max", 0);
+  __Pyx_RefNannySetupContext("max");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":148
  * 
@@ -18596,7 +17379,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx
  *     def __len__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->max_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->max_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -18614,17 +17397,6 @@ static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_16__len__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":150
  *         return self.b.max_val
  * 
@@ -18633,10 +17405,11 @@ static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":151
  * 
@@ -18645,7 +17418,7 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *
  * 
  *     def __contains__(self, i):
  */
-  __pyx_r = __pyx_v_self->b->size;
+  __pyx_r = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->size;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -18654,17 +17427,6 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6BitSet_18__contains__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":153
  *         return self.b.size
  * 
@@ -18673,7 +17435,8 @@ static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
+static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -18682,7 +17445,7 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__contains__", 0);
+  __Pyx_RefNannySetupContext("__contains__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":154
  * 
@@ -18692,7 +17455,7 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
  * 
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_contains(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_contains(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -18720,7 +17483,7 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
 
 static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   PyObject *__pyx_v_result = 0;
-  CYTHON_UNUSED unsigned int __pyx_v_d;
+  unsigned int __pyx_v_d;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -18730,7 +17493,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("dec2bin", 0);
+  __Pyx_RefNannySetupContext("dec2bin");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":158
  * 
@@ -18848,7 +17611,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("new_VEB", 0);
+  __Pyx_RefNannySetupContext("new_VEB");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":181
  *     cdef int num_bits, num_top_bits, i
@@ -19031,7 +17794,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("VEB_insert", 0);
+  __Pyx_RefNannySetupContext("VEB_insert");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":208
  *     cdef int a, b, tmp
@@ -19392,7 +18155,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("del_VEB", 0);
+  __Pyx_RefNannySetupContext("del_VEB");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":249
  *     cdef int i
@@ -19593,7 +18356,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("VEB_findsucc", 0);
+  __Pyx_RefNannySetupContext("VEB_findsucc");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":278
  *     cdef int a, b, j, c, found
@@ -19932,7 +18695,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("VEB_contains", 0);
+  __Pyx_RefNannySetupContext("VEB_contains");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":318
  *     cdef int a, b
@@ -20119,17 +18882,6 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11VEBIterator___next__(((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":344
  *     cdef int next_val
  * 
@@ -20138,7 +18890,8 @@ static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBIterator *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
   int __pyx_v_ret_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -20147,7 +18900,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__next__", 0);
+  __Pyx_RefNannySetupContext("__next__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":347
  *         cdef int ret_val
@@ -20156,7 +18909,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
  *             raise StopIteration()
  *         ret_val = self.next_val
  */
-  __pyx_t_1 = (__pyx_v_self->next_val == -1);
+  __pyx_t_1 = (((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val == -1);
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":348
@@ -20171,9 +18924,9 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[6]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":349
  *         if self.next_val == -1:
@@ -20182,7 +18935,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
  *         self.next_val = VEB_findsucc(self.v, ret_val)
  *         return ret_val
  */
-  __pyx_v_ret_val = __pyx_v_self->next_val;
+  __pyx_v_ret_val = ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":350
  *             raise StopIteration()
@@ -20191,7 +18944,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
  *         return ret_val
  * 
  */
-  __pyx_v_self->next_val = __pyx_f_3_sa_VEB_findsucc(__pyx_v_self->v, __pyx_v_ret_val);
+  ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val = __pyx_f_3_sa_VEB_findsucc(((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->v, __pyx_v_ret_val);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":351
  *         ret_val = self.next_val
@@ -20219,32 +18972,42 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":360
+ *     cdef int _first(self)
+ * 
+ *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
+ *         self.veb = new_VEB(size)
+ * 
+ */
+
+static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -20261,23 +19024,6 @@ static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_3VEB___cinit__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), __pyx_v_size);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":360
- *     cdef int _first(self)
- * 
- *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
- *         self.veb = new_VEB(size)
- * 
- */
-
-static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_size) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":361
  * 
@@ -20286,22 +19032,13 @@ static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
  * 
  *     def __dealloc__(self):
  */
-  __pyx_v_self->veb = __pyx_f_3_sa_new_VEB(__pyx_v_size);
+  ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb = __pyx_f_3_sa_new_VEB(__pyx_v_size);
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_3VEB_2__dealloc__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":363
  *         self.veb = new_VEB(size)
  * 
@@ -20310,13 +19047,14 @@ static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
+static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":364
  * 
@@ -20325,7 +19063,7 @@ static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_s
  * 
  *     def __iter__(self):
  */
-  __pyx_t_1 = __pyx_f_3_sa_del_VEB(__pyx_v_self->veb); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_3_sa_del_VEB(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -20337,17 +19075,6 @@ static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_s
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_3VEB_4__iter__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":366
  *         del_VEB(self.veb)
  * 
@@ -20356,7 +19083,8 @@ static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self) {
  *         it = VEBIterator()
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa_VEBIterator *__pyx_v_it = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -20364,7 +19092,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__", 0);
+  __Pyx_RefNannySetupContext("__iter__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":368
  *     def __iter__(self):
@@ -20385,7 +19113,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
  *         it.next_val = self.veb.min_val
  *         return it
  */
-  __pyx_v_it->v = __pyx_v_self->veb;
+  __pyx_v_it->v = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":370
  *         it = VEBIterator()
@@ -20394,7 +19122,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
  *         return it
  * 
  */
-  __pyx_v_it->next_val = __pyx_v_self->veb->min_val;
+  __pyx_v_it->next_val = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb->min_val;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":371
  *         it.v = self.veb
@@ -20421,17 +19149,6 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_3VEB_6insert(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":373
  *         return it
  * 
@@ -20440,7 +19157,8 @@ static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -20448,7 +19166,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert", 0);
+  __Pyx_RefNannySetupContext("insert");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":374
  * 
@@ -20459,7 +19177,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_s
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_insert(__pyx_v_self->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_insert(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -20488,7 +19206,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_s
 static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_insert", 0);
+  __Pyx_RefNannySetupContext("_insert");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":377
  * 
@@ -20506,17 +19224,6 @@ static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("findsucc (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_3VEB_8findsucc(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":379
  *         return VEB_insert(self.veb, i)
  * 
@@ -20525,7 +19232,8 @@ static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -20533,7 +19241,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("findsucc", 0);
+  __Pyx_RefNannySetupContext("findsucc");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":380
  * 
@@ -20544,7 +19252,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_findsucc(__pyx_v_self->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_findsucc(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -20573,7 +19281,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v
 static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_first", 0);
+  __Pyx_RefNannySetupContext("_first");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":383
  * 
@@ -20602,7 +19310,7 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
 static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_findsucc", 0);
+  __Pyx_RefNannySetupContext("_findsucc");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":386
  * 
@@ -20620,17 +19328,6 @@ static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_3VEB_10__len__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":388
  *         return VEB_findsucc(self.veb, i)
  * 
@@ -20639,10 +19336,11 @@ static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":389
  * 
@@ -20651,7 +19349,7 @@ static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_
  * 
  *     def __contains__(self, i):
  */
-  __pyx_r = __pyx_v_self->veb->size;
+  __pyx_r = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb->size;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -20660,17 +19358,6 @@ static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_3VEB_12__contains__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":391
  *         return self.veb.size
  * 
@@ -20678,14 +19365,15 @@ static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *_
  *         return VEB_contains(self.veb, i)
  */
 
-static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
+static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__contains__", 0);
+  __Pyx_RefNannySetupContext("__contains__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":392
  * 
@@ -20693,7 +19381,7 @@ static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_
  *         return VEB_contains(self.veb, i)             # <<<<<<<<<<<<<<
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_f_3_sa_VEB_contains(__pyx_v_self->veb, __pyx_t_1);
+  __pyx_r = __pyx_f_3_sa_VEB_contains(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1);
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -20706,32 +19394,55 @@ static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":9
+ *     cdef IntList lcp
+ * 
+ *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
+ *         cdef int i, k, j, h, n
+ *         cdef IntList rank
+ */
+
+static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa = 0;
+  int __pyx_v_i;
+  int __pyx_v_k;
+  int __pyx_v_j;
+  int __pyx_v_h;
+  int __pyx_v_n;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_rank = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -20749,43 +19460,6 @@ static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sa), __pyx_ptype_3_sa_SuffixArray, 1, "sa", 0))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_3LCP___cinit__(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self), __pyx_v_sa);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":9
- *     cdef IntList lcp
- * 
- *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
- *         cdef int i, k, j, h, n
- *         cdef IntList rank
- */
-
-static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa) {
-  int __pyx_v_i;
-  int __pyx_v_k;
-  int __pyx_v_j;
-  int __pyx_v_h;
-  int __pyx_v_n;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_rank = 0;
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  int __pyx_t_4;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
@@ -20813,9 +19487,9 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_sa));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_sa));
-  __Pyx_GOTREF(__pyx_v_self->sa);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
-  __pyx_v_self->sa = __pyx_v_sa;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa));
+  ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa = __pyx_v_sa;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":15
  *         logger.info("Constructing LCP array")
@@ -20824,7 +19498,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  *         self.lcp = IntList(initial_len=n)
  * 
  */
-  __pyx_v_n = __pyx_v_self->sa->sa->len;
+  __pyx_v_n = ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa->sa->len;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":16
  *         self.sa = sa
@@ -20839,13 +19513,13 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->lcp);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->lcp));
-  __pyx_v_self->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp));
+  ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":18
@@ -20861,7 +19535,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
@@ -20932,8 +19606,8 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  *             else:
  *                 j = sa.sa.arr[k-1]
  */
-      (__pyx_v_self->lcp->arr[__pyx_v_k]) = -1;
-      goto __pyx_L7;
+      (((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp->arr[__pyx_v_k]) = -1;
+      goto __pyx_L10;
     }
     /*else*/ {
 
@@ -20986,9 +19660,9 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  *             if h > 0:
  *                 h = h-1
  */
-      (__pyx_v_self->lcp->arr[__pyx_v_k]) = __pyx_v_h;
+      (((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp->arr[__pyx_v_k]) = __pyx_v_h;
     }
-    __pyx_L7:;
+    __pyx_L10:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":32
  *                     h = h+1
@@ -21008,9 +19682,9 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  * 
  */
       __pyx_v_h = (__pyx_v_h - 1);
-      goto __pyx_L10;
+      goto __pyx_L13;
     }
-    __pyx_L10:;
+    __pyx_L13:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":34
@@ -21042,29 +19716,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n); /*proto*/
-static char __pyx_doc_3_sa_3LCP_2compute_stats[] = "Note: the output of this function is not exact.  In\n        particular, the frequency associated with each word is \n        not guaranteed to be correct.  This is due to a bit of\n        laxness in the design; the function is intended only to\n        obtain a list of the most frequent words; for this \n        purpose it is perfectly fine";
-static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n) {
-  int __pyx_v_max_n;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("compute_stats (wrapper)", 0);
-  assert(__pyx_arg_max_n); {
-    __pyx_v_max_n = __Pyx_PyInt_AsInt(__pyx_arg_max_n); if (unlikely((__pyx_v_max_n == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_3LCP_2compute_stats(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self), ((int)__pyx_v_max_n));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
@@ -21074,46 +19726,51 @@ static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObj
  *         particular, the frequency associated with each word is
  */
 
-static PyObject *__pyx_pf_3_sa_3LCP_2compute_stats(struct __pyx_obj_3_sa_LCP *__pyx_v_self, int __pyx_v_max_n) {
+static PyObject *__pyx_pf_3_sa_3LCP_1compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n); /*proto*/
+static char __pyx_doc_3_sa_3LCP_1compute_stats[] = "Note: the output of this function is not exact.  In\n        particular, the frequency associated with each word is \n        not guaranteed to be correct.  This is due to a bit of\n        laxness in the design; the function is intended only to\n        obtain a list of the most frequent words; for this \n        purpose it is perfectly fine";
+static PyObject *__pyx_pf_3_sa_3LCP_1compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("compute_stats", 0);
+  __Pyx_RefNannySetupContext("compute_stats");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_v_max_n = __pyx_v_max_n;
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_3LCP_4generator1, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
+  assert(__pyx_arg_max_n); {
+    __pyx_cur_scope->__pyx_v_max_n = __Pyx_PyInt_AsInt(__pyx_arg_max_n); if (unlikely((__pyx_cur_scope->__pyx_v_max_n == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF((PyObject *)__pyx_cur_scope->__pyx_v_self); __pyx_cur_scope->__pyx_v_self = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_3LCP_2generator1;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   int __pyx_t_2;
@@ -21126,8 +19783,8 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   long __pyx_t_9;
   PyObject *__pyx_t_10 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L26_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -21144,7 +19801,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  * 
  *         ngram_starts = []
  */
-  __pyx_cur_scope->__pyx_v_N = __pyx_cur_scope->__pyx_v_self->sa->sa->len;
+  __pyx_cur_scope->__pyx_v_N = ((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->sa->len;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":50
  *         N = self.sa.sa.len
@@ -21154,7 +19811,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  *             ngram_starts.append(IntList(initial_len=N))
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_cur_scope->__pyx_v_ngram_starts = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -21176,13 +19833,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  * 
  *         run_start = IntList(initial_len=max_n)
  */
+    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_ngram_starts) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __pyx_t_4 = PyList_Append(__pyx_cur_scope->__pyx_v_ngram_starts, __pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -21202,7 +19862,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
@@ -21219,7 +19879,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_t_1 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -21247,7 +19907,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  *             if h < 0:
  *                 h = 0
  */
-    __pyx_cur_scope->__pyx_v_h = (__pyx_cur_scope->__pyx_v_self->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
+    __pyx_cur_scope->__pyx_v_h = (((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":59
  *         for i from 0 <= i < N:
@@ -21481,7 +20141,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  *                     valid = 1
  *                     for k from 0 <= k < n+1:
  */
-        __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_self->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
+        __pyx_cur_scope->__pyx_v_j = (((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":80
  *                 while (ii==-1 or iii < ii) and rs != 0:
@@ -21509,7 +20169,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  *                             valid = 0
  *                     if valid:
  */
-          __pyx_t_7 = ((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
+          __pyx_t_7 = ((((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
           if (__pyx_t_7) {
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":83
@@ -21542,13 +20202,13 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  *                     iii = iii + 1
  */
           __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
           __pyx_t_9 = (__pyx_cur_scope->__pyx_v_n + 1);
           for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_9; __pyx_t_6+=1) {
             __pyx_cur_scope->__pyx_v_k = __pyx_t_6;
-            __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           }
           __pyx_t_3 = ((PyObject *)PyList_AsTuple(__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -21572,7 +20232,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_t_1 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_n + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
           PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
@@ -21588,7 +20248,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __Pyx_XGIVEREF(__pyx_r);
           __Pyx_RefNannyFinishContext();
           /* return from generator, yielding value */
-          __pyx_generator->resume_label = 1;
+          __pyx_cur_scope->__pyx_base.resume_label = 1;
           return __pyx_r;
           __pyx_L26_resume_from_yield:;
           __pyx_t_2 = __pyx_cur_scope->__pyx_t_0;
@@ -21623,7 +20283,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
     __pyx_cur_scope->__pyx_v_i = __pyx_cur_scope->__pyx_v_ii;
   }
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -21632,26 +20292,11 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __Pyx_AddTraceback("compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
-  __pyx_r = __pyx_pf_3_sa_8Alphabet___cinit__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":12
  *     cdef dict id2sym
  * 
@@ -21660,14 +20305,18 @@ static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.nonterminals = StringMap()
  */
 
-static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
+static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_RefNannySetupContext("__cinit__");
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":13
  * 
@@ -21679,9 +20328,9 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->terminals);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->terminals));
-  __pyx_v_self->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals));
+  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":14
@@ -21694,9 +20343,9 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->nonterminals);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->nonterminals));
-  __pyx_v_self->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals));
+  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":15
@@ -21709,9 +20358,9 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->id2sym);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->id2sym));
-  __pyx_v_self->id2sym = __pyx_t_1;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym));
+  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym = __pyx_t_1;
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":16
@@ -21721,7 +20370,7 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
  * 
  *     def __dealloc__(self):
  */
-  __pyx_v_self->first_nonterminal = -1;
+  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->first_nonterminal = -1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -21734,15 +20383,6 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_8Alphabet_2__dealloc__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":18
  *         self.first_nonterminal = -1
  * 
@@ -21751,9 +20391,10 @@ static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
+static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
   __Pyx_RefNannyFinishContext();
 }
@@ -21766,10 +20407,10 @@ static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_isvar(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("isvar", 0);
+  __Pyx_RefNannySetupContext("isvar");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":22
  * 
@@ -21795,10 +20436,10 @@ static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alph
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_isword(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("isword", 0);
+  __Pyx_RefNannySetupContext("isword");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":25
  * 
@@ -21824,10 +20465,10 @@ static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alp
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_getindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getindex", 0);
+  __Pyx_RefNannySetupContext("getindex");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":28
  * 
@@ -21853,10 +20494,10 @@ static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym, int __pyx_v_ind) {
+static int __pyx_f_3_sa_8Alphabet_setindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym, int __pyx_v_ind) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("setindex", 0);
+  __Pyx_RefNannySetupContext("setindex");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":31
  * 
@@ -21882,10 +20523,10 @@ static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_clearindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("clearindex", 0);
+  __Pyx_RefNannySetupContext("clearindex");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":34
  * 
@@ -21914,7 +20555,7 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa
 static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym1, int __pyx_v_sym2) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("match", 0);
+  __Pyx_RefNannySetupContext("match");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":37
  * 
@@ -21943,7 +20584,7 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
 static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("tocat", 0);
+  __Pyx_RefNannySetupContext("tocat");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":40
  * 
@@ -21974,7 +20615,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("fromcat", 0);
+  __Pyx_RefNannySetupContext("fromcat");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":44
  *     cdef int fromcat(self, char *s):
@@ -22066,7 +20707,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("tostring", 0);
+  __Pyx_RefNannySetupContext("tostring");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":53
  *     cdef char* tostring(self, int sym):
@@ -22088,10 +20729,9 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_2 = PyInt_FromLong(__pyx_v_sym); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
-      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
     }
-    __pyx_t_3 = (__Pyx_PyDict_Contains(__pyx_t_2, ((PyObject *)__pyx_v_self->id2sym), Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = ((PyDict_Contains(((PyObject *)__pyx_v_self->id2sym), __pyx_t_2))); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_3) {
 
@@ -22102,10 +20742,6 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
  *             ind = self.getindex(sym)
  *             if ind > 0:
  */
-      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
       __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_4 = PyBytes_AsString(__pyx_t_2); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -22147,7 +20783,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_5 = PyInt_FromLong(__pyx_v_ind); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -22157,10 +20793,6 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_64), ((PyObject *)__pyx_t_6)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
-      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
       if (__Pyx_SetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, ((PyObject *)__pyx_t_5), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       goto __pyx_L5;
@@ -22179,10 +20811,6 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_65), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
       if (__Pyx_SetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, ((PyObject *)__pyx_t_6), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     }
@@ -22195,10 +20823,6 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
  *         else:
  *             return self.terminals.word(sym)
  */
-    if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
     __pyx_t_6 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, sizeof(int), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_4 = PyBytes_AsString(__pyx_t_6); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -22260,7 +20884,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("fromstring", 0);
+  __Pyx_RefNannySetupContext("fromstring");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":69
  *         cdef char *comma
@@ -22445,17 +21069,6 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_8Alphabet_9terminals___get__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":8
  * 
  * cdef class Alphabet:
@@ -22464,13 +21077,14 @@ static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_s
  *     cdef dict id2sym
  */
 
-static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->terminals));
-  __pyx_r = ((PyObject *)__pyx_v_self->terminals);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals));
+  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -22480,24 +21094,14 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_8Alphabet_12nonterminals___get__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->nonterminals));
-  __pyx_r = ((PyObject *)__pyx_v_self->nonterminals);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals));
+  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -22518,7 +21122,7 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj
 static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_tostring", 0);
+  __Pyx_RefNannySetupContext("sym_tostring");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":90
  * 
@@ -22547,7 +21151,7 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
 static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_tocat", 0);
+  __Pyx_RefNannySetupContext("sym_tocat");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":93
  * 
@@ -22576,7 +21180,7 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_isvar", 0);
+  __Pyx_RefNannySetupContext("sym_isvar");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":96
  * 
@@ -22605,7 +21209,7 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_getindex", 0);
+  __Pyx_RefNannySetupContext("sym_getindex");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":99
  * 
@@ -22634,7 +21238,7 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_setindex", 0);
+  __Pyx_RefNannySetupContext("sym_setindex");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":102
  * 
@@ -22652,40 +21256,52 @@ static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_3sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_3sym_fromstring = {__Pyx_NAMESTR("sym_fromstring"), (PyCFunction)__pyx_pw_3_sa_3sym_fromstring, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pw_3_sa_3sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
+ *     return ALPHABET.setindex(sym, id)
+ * 
+ * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
+ *     return ALPHABET.fromstring(string, terminal)
+ */
+
+static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_1sym_fromstring = {__Pyx_NAMESTR("sym_fromstring"), (PyCFunction)__pyx_pf_3_sa_1sym_fromstring, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_string;
   int __pyx_v_terminal;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_fromstring (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__string,&__pyx_n_s__terminal,0};
+  __Pyx_RefNannySetupContext("sym_fromstring");
+  __pyx_self = __pyx_self;
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__string,&__pyx_n_s__terminal,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__string)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__string);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__terminal)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__terminal);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("sym_fromstring", 1, 2, 2, 1); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "sym_fromstring") < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "sym_fromstring") < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -22704,26 +21320,6 @@ static PyObject *__pyx_pw_3_sa_3sym_fromstring(PyObject *__pyx_self, PyObject *_
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_2sym_fromstring(__pyx_self, __pyx_v_string, __pyx_v_terminal);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
- *     return ALPHABET.setindex(sym, id)
- * 
- * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
- *     return ALPHABET.fromstring(string, terminal)
- */
-
-static PyObject *__pyx_pf_3_sa_2sym_fromstring(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_string, int __pyx_v_terminal) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sym_fromstring", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":105
  * 
@@ -22749,32 +21345,50 @@ static PyObject *__pyx_pf_3_sa_2sym_fromstring(CYTHON_UNUSED PyObject *__pyx_sel
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":6
+ * cdef class Phrase:
+ * 
+ *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
+ *         cdef int i, j, n, n_vars
+ *         n_vars = 0
+ */
+
+static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_words = 0;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_n;
+  int __pyx_v_n_vars;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  Py_ssize_t __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__words,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__words,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__words)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__words);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -22791,34 +21405,6 @@ static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_6Phrase___cinit__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_v_words);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":6
- * cdef class Phrase:
- * 
- *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
- *         cdef int i, j, n, n_vars
- *         n_vars = 0
- */
-
-static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_words) {
-  int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_n;
-  int __pyx_v_n_vars;
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":8
  *     def __cinit__(self, words):
@@ -22846,7 +21432,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]
  */
-  __pyx_v_self->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
+  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":11
  *         n = len(words)
@@ -22869,7 +21455,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    (__pyx_v_self->syms[__pyx_v_i]) = __pyx_t_4;
+    (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) = __pyx_t_4;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":13
  *         for i from 0 <= i < n:
@@ -22878,7 +21464,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *                 n_vars += 1
  *         self.n = n
  */
-    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
+    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":14
@@ -22889,9 +21475,9 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *         self.n_vars = n_vars
  */
       __pyx_v_n_vars = (__pyx_v_n_vars + 1);
-      goto __pyx_L5;
+      goto __pyx_L8;
     }
-    __pyx_L5:;
+    __pyx_L8:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":15
@@ -22901,7 +21487,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  */
-  __pyx_v_self->n = __pyx_v_n;
+  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n = __pyx_v_n;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":16
  *                 n_vars += 1
@@ -22910,7 +21496,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0
  */
-  __pyx_v_self->n_vars = __pyx_v_n_vars;
+  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars = __pyx_v_n_vars;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":17
  *         self.n = n
@@ -22919,7 +21505,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *         j = 0
  *         for i from 0 <= i < n:
  */
-  __pyx_v_self->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
+  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":18
  *         self.n_vars = n_vars
@@ -22947,7 +21533,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *                 self.varpos[j] = i
  *                 j = j + 1
  */
-    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
+    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":21
@@ -22957,7 +21543,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *                 j = j + 1
  * 
  */
-      (__pyx_v_self->varpos[__pyx_v_j]) = __pyx_v_i;
+      (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_v_j]) = __pyx_v_i;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":22
  *             if sym_isvar(self.syms[i]):
@@ -22967,9 +21553,9 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *     def __dealloc__(self):
  */
       __pyx_v_j = (__pyx_v_j + 1);
-      goto __pyx_L8;
+      goto __pyx_L11;
     }
-    __pyx_L8:;
+    __pyx_L11:;
   }
 
   __pyx_r = 0;
@@ -22983,15 +21569,6 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_6Phrase_2__dealloc__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":24
  *                 j = j + 1
  * 
@@ -23000,9 +21577,10 @@ static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self) {
  *         free(self.varpos)
  */
 
-static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":25
  * 
@@ -23011,7 +21589,7 @@ static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__p
  *         free(self.varpos)
  * 
  */
-  free(__pyx_v_self->syms);
+  free(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":26
  *     def __dealloc__(self):
@@ -23020,22 +21598,11 @@ static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__p
  * 
  *     def __str__(self):
  */
-  free(__pyx_v_self->varpos);
+  free(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_4__str__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":28
  *         free(self.varpos)
  * 
@@ -23044,7 +21611,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self) {
  *         cdef int i, s
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   PyObject *__pyx_v_strs = NULL;
   int __pyx_v_i;
   int __pyx_v_s;
@@ -23058,7 +21626,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__", 0);
+  __Pyx_RefNannySetupContext("__str__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":29
  * 
@@ -23068,7 +21636,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
  *         for i from 0 <= i < self.n:
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -23079,7 +21647,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))
  */
-  __pyx_t_2 = __pyx_v_self->n;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":32
@@ -23089,7 +21657,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
  *             strs.append(sym_tostring(s))
  *         return ' '.join(strs)
  */
-    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_i]);
+    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":33
  *         for i from 0 <= i < self.n:
@@ -23098,6 +21666,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
  *         return ' '.join(strs)
  * 
  */
+    if (unlikely(((PyObject *)__pyx_v_strs) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_v_s)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_3 = PyList_Append(__pyx_v_strs, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -23115,7 +21686,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_INCREF(((PyObject *)__pyx_v_strs));
   PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_strs));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_strs));
@@ -23142,18 +21713,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static char __pyx_doc_3_sa_6Phrase_6handle[] = "return a hashable representation that normalizes the ordering\n        of the nonterminal indices";
-static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("handle (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_6handle(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":36
  *         return ' '.join(strs)
  * 
@@ -23162,7 +21721,9 @@ static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UN
  *         of the nonterminal indices"""
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_3_sa_6Phrase_3handle[] = "return a hashable representation that normalizes the ordering\n        of the nonterminal indices";
+static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_v_norm = NULL;
   int __pyx_v_i;
   int __pyx_v_j;
@@ -23176,7 +21737,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("handle", 0);
+  __Pyx_RefNannySetupContext("handle");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":39
  *         """return a hashable representation that normalizes the ordering
@@ -23186,7 +21747,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  *         i = 1
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -23215,7 +21776,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  *             s = self.syms[j]
  *             if sym_isvar(s):
  */
-  __pyx_t_2 = __pyx_v_self->n;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":44
@@ -23225,7 +21786,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  */
-    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
+    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_j]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":45
  *         for j from 0 <= j < self.n:
@@ -23254,9 +21815,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  *         return tuple(norm)
  */
       __pyx_v_i = (__pyx_v_i + 1);
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":48
  *                 s = sym_setindex(s,i)
@@ -23265,6 +21826,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  *         return tuple(norm)
  * 
  */
+    if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_1 = PyInt_FromLong(__pyx_v_s); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyList_Append(__pyx_v_norm, __pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -23279,6 +21843,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  *     def strhandle(self):
  */
   __Pyx_XDECREF(__pyx_r);
+  if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
   __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_v_norm)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_r = ((PyObject *)__pyx_t_1);
@@ -23298,17 +21865,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("strhandle (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_8strhandle(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":51
  *         return tuple(norm)
  * 
@@ -23317,8 +21873,9 @@ static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON
  *         norm = []
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
-  CYTHON_UNUSED PyObject *__pyx_v_strs = NULL;
+static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_v_strs = NULL;
   PyObject *__pyx_v_norm = NULL;
   int __pyx_v_i;
   int __pyx_v_j;
@@ -23334,7 +21891,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("strhandle", 0);
+  __Pyx_RefNannySetupContext("strhandle");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":52
  * 
@@ -23344,7 +21901,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  *         cdef int i, j, s
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -23356,7 +21913,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  *         i = 1
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -23385,7 +21942,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  *             s = self.syms[j]
  *             if sym_isvar(s):
  */
-  __pyx_t_2 = __pyx_v_self->n;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":58
@@ -23395,7 +21952,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  */
-    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
+    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_j]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":59
  *         for j from 0 <= j < self.n:
@@ -23424,9 +21981,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  *         return ' '.join(norm)
  */
       __pyx_v_i = (__pyx_v_i + 1);
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":62
  *                 s = sym_setindex(s,i)
@@ -23435,6 +21992,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  *         return ' '.join(norm)
  * 
  */
+    if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_v_s)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyList_Append(__pyx_v_norm, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -23452,7 +22012,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
   __Pyx_INCREF(((PyObject *)__pyx_v_norm));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_norm));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_norm));
@@ -23480,17 +22040,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("arity (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_10arity(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":65
  *         return ' '.join(norm)
  * 
@@ -23499,14 +22048,15 @@ static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UN
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("arity", 0);
+  __Pyx_RefNannySetupContext("arity");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":66
  * 
@@ -23516,7 +22066,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__p
  *     def getvarpos(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -23534,17 +22084,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getvarpos (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_12getvarpos(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":68
  *         return self.n_vars
  * 
@@ -23553,7 +22092,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObj
  *             return self.varpos[i]
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23563,7 +22103,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getvarpos", 0);
+  __Pyx_RefNannySetupContext("getvarpos");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":69
  * 
@@ -23572,12 +22112,14 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
  *             return self.varpos[i]
  *         else:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
     __Pyx_DECREF(__pyx_t_1);
-    __pyx_t_2 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -23593,12 +22135,12 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->varpos[__pyx_t_4])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_t_4])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
   /*else*/ {
 
@@ -23612,7 +22154,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
     __Pyx_Raise(__pyx_builtin_IndexError, 0, 0, 0);
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -23627,17 +22169,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getvar (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_14getvar(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":74
  *             raise IndexError
  * 
@@ -23646,7 +22177,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject
  *             return self.syms[self.varpos[i]]
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23656,7 +22188,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getvar", 0);
+  __Pyx_RefNannySetupContext("getvar");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":75
  * 
@@ -23665,12 +22197,14 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
  *             return self.syms[self.varpos[i]]
  *         else:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
     __Pyx_DECREF(__pyx_t_1);
-    __pyx_t_2 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -23686,12 +22220,12 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->syms[(__pyx_v_self->varpos[__pyx_t_4])])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_t_4])])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
   /*else*/ {
 
@@ -23705,7 +22239,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
     __Pyx_Raise(__pyx_builtin_IndexError, 0, 0, 0);
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -23732,7 +22266,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("chunkpos", 0);
+  __Pyx_RefNannySetupContext("chunkpos");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":81
  * 
@@ -23787,7 +22321,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("chunklen", 0);
+  __Pyx_RefNannySetupContext("chunklen");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":87
  * 
@@ -23874,17 +22408,6 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("clen (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_16clen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_k));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":96
  *             return self.varpos[k]-self.varpos[k-1]-1
  * 
@@ -23893,7 +22416,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_k) {
+static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -23901,7 +22425,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("clen", 0);
+  __Pyx_RefNannySetupContext("clen");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":97
  * 
@@ -23912,7 +22436,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__py
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_k); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunklen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -23930,17 +22454,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__py
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getchunk (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_18getchunk(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_ci));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":99
  *          return self.chunklen(k)
  * 
@@ -23949,7 +22462,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObje
  *         start = self.chunkpos(ci)
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_ci) {
+static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_chunk = NULL;
@@ -23962,7 +22476,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getchunk", 0);
+  __Pyx_RefNannySetupContext("getchunk");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":101
  *     def getchunk(self, ci):
@@ -23972,7 +22486,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
  *         chunk = []
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunkpos(__pyx_v_self, __pyx_t_1);
+  __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunkpos(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":102
  *         cdef int start, stop
@@ -23982,7 +22496,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
  *         for i from start <= i < stop:
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1));
+  __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunklen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":103
  *         start = self.chunkpos(ci)
@@ -23992,7 +22506,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
  *             chunk.append(self.syms[i])
  */
   __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __pyx_v_chunk = __pyx_t_2;
   __pyx_t_2 = 0;
 
@@ -24013,7 +22527,10 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
  *         return chunk
  * 
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->syms[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_v_chunk) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_3 = PyList_Append(__pyx_v_chunk, __pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -24044,19 +22561,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   return __pyx_r;
 }
 
-/* Python wrapper */
-#if PY_MAJOR_VERSION < 3
-static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cmp__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_20__cmp__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_other));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-#endif /*!(#if PY_MAJOR_VERSION < 3)*/
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":108
  *         return chunk
  * 
@@ -24066,7 +22570,8 @@ static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
 
 #if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_other) {
+static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
   struct __pyx_obj_3_sa_Phrase *__pyx_v_otherp = 0;
   int __pyx_v_i;
   int __pyx_r;
@@ -24078,7 +22583,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cmp__", 0);
+  __Pyx_RefNannySetupContext("__cmp__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":111
  *         cdef Phrase otherp
@@ -24099,7 +22604,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *                 return -1
  */
   __pyx_t_1 = __pyx_v_otherp->n;
-  __pyx_t_2 = __pyx_v_self->n;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   if ((__pyx_t_1 < __pyx_t_2)) {
     __pyx_t_3 = __pyx_t_1;
   } else {
@@ -24115,7 +22620,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:
  */
-    __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
+    __pyx_t_4 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":114
@@ -24127,7 +22632,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
       __pyx_r = -1;
       goto __pyx_L0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":115
@@ -24137,7 +22642,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *                 return 1
  *         if self.n < otherp.n:
  */
-    __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
+    __pyx_t_4 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":116
@@ -24149,9 +22654,9 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
       __pyx_r = 1;
       goto __pyx_L0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":117
@@ -24161,7 +22666,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *             return -1
  *         elif self.n > otherp.n:
  */
-  __pyx_t_4 = (__pyx_v_self->n < __pyx_v_otherp->n);
+  __pyx_t_4 = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n < __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":118
@@ -24173,7 +22678,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
     __pyx_r = -1;
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L8;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":119
@@ -24183,7 +22688,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  *             return 1
  *         else:
  */
-  __pyx_t_4 = (__pyx_v_self->n > __pyx_v_otherp->n);
+  __pyx_t_4 = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n > __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":120
@@ -24195,7 +22700,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
     __pyx_r = 1;
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L8;
   }
   /*else*/ {
 
@@ -24209,7 +22714,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __pyx_r = 0;
     goto __pyx_L0;
   }
-  __pyx_L6:;
+  __pyx_L8:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -24223,17 +22728,6 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* Python wrapper */
-static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self) {
-  Py_hash_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_22__hash__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":124
  *             return 0
  * 
@@ -24242,14 +22736,15 @@ static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self) {
  *         cdef unsigned h
  */
 
-static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self); /*proto*/
+static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
   int __pyx_v_i;
   unsigned int __pyx_v_h;
   Py_hash_t __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("__hash__", 0);
+  __Pyx_RefNannySetupContext("__hash__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":127
  *         cdef int i
@@ -24267,7 +22762,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
  *             if self.syms[i] > 0:
  *                 h = (h << 1) + self.syms[i]
  */
-  __pyx_t_1 = __pyx_v_self->n;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":129
@@ -24277,7 +22772,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
  *                 h = (h << 1) + self.syms[i]
  *             else:
  */
-    __pyx_t_2 = ((__pyx_v_self->syms[__pyx_v_i]) > 0);
+    __pyx_t_2 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) > 0);
     if (__pyx_t_2) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":130
@@ -24287,8 +22782,8 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
  *             else:
  *                 h = (h << 1) + -self.syms[i]
  */
-      __pyx_v_h = ((__pyx_v_h << 1) + (__pyx_v_self->syms[__pyx_v_i]));
-      goto __pyx_L5;
+      __pyx_v_h = ((__pyx_v_h << 1) + (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+      goto __pyx_L7;
     }
     /*else*/ {
 
@@ -24299,9 +22794,9 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
  *         return h
  * 
  */
-      __pyx_v_h = ((__pyx_v_h << 1) + (-(__pyx_v_self->syms[__pyx_v_i])));
+      __pyx_v_h = ((__pyx_v_h << 1) + (-(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])));
     }
-    __pyx_L5:;
+    __pyx_L7:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":133
@@ -24321,17 +22816,6 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self) {
-  Py_ssize_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_24__len__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":135
  *         return h
  * 
@@ -24340,10 +22824,11 @@ static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__", 0);
+  __Pyx_RefNannySetupContext("__len__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":136
  * 
@@ -24352,7 +22837,7 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *
  * 
  *     def __getitem__(self, i):
  */
-  __pyx_r = __pyx_v_self->n;
+  __pyx_r = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -24361,17 +22846,6 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_26__getitem__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":138
  *         return self.n
  * 
@@ -24380,7 +22854,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -24388,7 +22863,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phras
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __Pyx_RefNannySetupContext("__getitem__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":139
  * 
@@ -24399,7 +22874,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phras
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->syms[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -24416,18 +22891,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phras
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_28__iter__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
@@ -24437,51 +22901,42 @@ static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self) {
  *         for i from 0 <= i < self.n:
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_28__iter__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_14__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_14__iter__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__", 0);
+  __Pyx_RefNannySetupContext("__iter__");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_4___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_4___iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_6Phrase_30generator2, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_6Phrase_15generator2;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.Phrase.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -24498,7 +22953,7 @@ static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx
  *             yield self.syms[i]
  * 
  */
-  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->n;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_self)->n;
   for (__pyx_cur_scope->__pyx_v_i = 0; __pyx_cur_scope->__pyx_v_i < __pyx_t_1; __pyx_cur_scope->__pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":144
@@ -24508,7 +22963,7 @@ static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx
  * 
  *     def subst(self, start, children):
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->syms[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_self)->syms[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
@@ -24516,58 +22971,74 @@ static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":146
+ *             yield self.syms[i]
+ * 
+ *     def subst(self, start, children):             # <<<<<<<<<<<<<<
+ *         cdef int i
+ *         for i from 0 <= i < self.n:
+ */
+
+static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_children = 0;
-  PyObject *__pyx_r = 0;
+  int __pyx_v_i;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("subst (wrapper)", 0);
+  int __pyx_t_1;
+  int __pyx_t_2;
+  long __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
+  __Pyx_RefNannySetupContext("subst");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("subst", 1, 2, 2, 1); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "subst") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "subst") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -24586,32 +23057,6 @@ static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_6Phrase_31subst(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_v_start, __pyx_v_children);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":146
- *             yield self.syms[i]
- * 
- *     def subst(self, start, children):             # <<<<<<<<<<<<<<
- *         cdef int i
- *         for i from 0 <= i < self.n:
- */
-
-static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_children) {
-  int __pyx_v_i;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  long __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("subst", 0);
   __Pyx_INCREF(__pyx_v_start);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":148
@@ -24621,7 +23066,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
  *             if sym_isvar(self.syms[i]):
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  */
-  __pyx_t_1 = __pyx_v_self->n;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":149
@@ -24631,7 +23076,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  *             else:
  */
-    __pyx_t_2 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
+    __pyx_t_2 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
     if (__pyx_t_2) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":150
@@ -24641,7 +23086,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
  *             else:
  *                 start = start + (self.syms[i],)
  */
-      __pyx_t_3 = (__pyx_f_3_sa_sym_getindex((__pyx_v_self->syms[__pyx_v_i])) - 1);
+      __pyx_t_3 = (__pyx_f_3_sa_sym_getindex((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])) - 1);
       __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_children, __pyx_t_3, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_5 = PyNumber_Add(__pyx_v_start, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -24650,7 +23095,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
       __Pyx_DECREF(__pyx_v_start);
       __pyx_v_start = __pyx_t_5;
       __pyx_t_5 = 0;
-      goto __pyx_L5;
+      goto __pyx_L8;
     }
     /*else*/ {
 
@@ -24661,10 +23106,10 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
  *         return start
  * 
  */
-      __pyx_t_5 = PyInt_FromLong((__pyx_v_self->syms[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
@@ -24675,7 +23120,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
       __pyx_v_start = __pyx_t_5;
       __pyx_t_5 = 0;
     }
-    __pyx_L5:;
+    __pyx_L8:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":153
@@ -24704,17 +23149,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_6Phrase_5words___get__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":156
  * 
  *     property words:
@@ -24723,7 +23157,8 @@ static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_v_w = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -24737,7 +23172,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":157
  *     property words:
@@ -24748,30 +23183,22 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyList_CheckExact(((PyObject *)__pyx_v_self)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self))) {
-    __pyx_t_2 = ((PyObject *)__pyx_v_self); __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  if (PyList_CheckExact(__pyx_v_self) || PyTuple_CheckExact(__pyx_v_self)) {
+    __pyx_t_2 = __pyx_v_self; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
+    if (PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
+    } else if (PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
@@ -24792,11 +23219,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-      if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_INCREF(((PyObject *)__pyx_t_1));
@@ -24819,9 +23246,16 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":161
+ * cdef class Rule:
+ * 
+ *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
+ *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
+ *         self.lhs = lhs
+ */
+
+static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_lhs;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_f = 0;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_e = 0;
@@ -24829,24 +23263,21 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
   PyObject *__pyx_v_word_alignments = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
     PyObject* values[5] = {0,0,0,0,0};
-
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":161
- * cdef class Rule:
- * 
- *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
- *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
- *         self.lhs = lhs
- */
     values[3] = ((PyObject *)Py_None);
     values[4] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -24856,17 +23287,20 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lhs)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lhs);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -24882,7 +23316,7 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -24911,25 +23345,6 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_e), __pyx_ptype_3_sa_Phrase, 1, "e", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_4Rule___cinit__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), __pyx_v_lhs, __pyx_v_f, __pyx_v_e, __pyx_v_scores, __pyx_v_word_alignments);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, int __pyx_v_lhs, struct __pyx_obj_3_sa_Phrase *__pyx_v_f, struct __pyx_obj_3_sa_Phrase *__pyx_v_e, PyObject *__pyx_v_scores, PyObject *__pyx_v_word_alignments) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":162
  * 
@@ -24946,7 +23361,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -24956,9 +23371,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":163
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):
@@ -24967,7 +23382,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
  *         self.f = f
  *         self.e = e
  */
-  __pyx_v_self->lhs = __pyx_v_lhs;
+  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs = __pyx_v_lhs;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":164
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
@@ -24978,9 +23393,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_f));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_f));
-  __Pyx_GOTREF(__pyx_v_self->f);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
-  __pyx_v_self->f = __pyx_v_f;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f = __pyx_v_f;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":165
  *         self.lhs = lhs
@@ -24991,9 +23406,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_e));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_e));
-  __Pyx_GOTREF(__pyx_v_self->e);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->e));
-  __pyx_v_self->e = __pyx_v_e;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e = __pyx_v_e;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":166
  *         self.f = f
@@ -25004,9 +23419,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
  */
   __Pyx_INCREF(__pyx_v_word_alignments);
   __Pyx_GIVEREF(__pyx_v_word_alignments);
-  __Pyx_GOTREF(__pyx_v_self->word_alignments);
-  __Pyx_DECREF(__pyx_v_self->word_alignments);
-  __pyx_v_self->word_alignments = __pyx_v_word_alignments;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments = __pyx_v_word_alignments;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":167
  *         self.e = e
@@ -25018,9 +23433,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
   if (!(likely(((__pyx_v_scores) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_scores, __pyx_ptype_3_sa_FeatureVector))))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_scores);
   __Pyx_GIVEREF(__pyx_v_scores);
-  __Pyx_GOTREF(__pyx_v_self->scores);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->scores));
-  __pyx_v_self->scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_scores);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores));
+  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_scores);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -25034,17 +23449,6 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
   return __pyx_r;
 }
 
-/* Python wrapper */
-static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self) {
-  Py_hash_t __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_2__hash__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":169
  *         self.scores = scores
  * 
@@ -25053,7 +23457,8 @@ static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self); /*proto*/
+static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
   Py_hash_t __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -25062,7 +23467,7 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__hash__", 0);
+  __Pyx_RefNannySetupContext("__hash__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":170
  * 
@@ -25071,18 +23476,18 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx
  * 
  *     def __cmp__(self, Rule other):
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->f));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->f));
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->e));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
   __pyx_t_1 = 0;
   __pyx_t_3 = PyObject_Hash(((PyObject *)__pyx_t_2)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -25102,24 +23507,6 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-#if PY_MAJOR_VERSION < 3
-static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cmp__ (wrapper)", 0);
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_ptype_3_sa_Rule, 1, "other", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_4Rule_4__cmp__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), ((struct __pyx_obj_3_sa_Rule *)__pyx_v_other));
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-#endif /*!(#if PY_MAJOR_VERSION < 3)*/
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":172
  *         return hash((self.lhs, self.f, self.e))
  * 
@@ -25129,7 +23516,8 @@ static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
 
 #if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Rule *__pyx_v_other) {
+static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -25139,7 +23527,8 @@ static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cmp__", 0);
+  __Pyx_RefNannySetupContext("__cmp__");
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_ptype_3_sa_Rule, 1, "other", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":173
  * 
@@ -25148,21 +23537,21 @@ static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->f));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->f));
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->e));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e));
-  __Pyx_INCREF(__pyx_v_self->word_alignments);
-  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->word_alignments);
-  __Pyx_GIVEREF(__pyx_v_self->word_alignments);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  PyTuple_SET_ITEM(__pyx_t_2, 3, ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_GIVEREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":174
@@ -25172,24 +23561,24 @@ static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self
  * 
  *     def fmerge(self, Phrase f):
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_other->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)__pyx_v_other->f));
-  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_other->f));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_other->f));
-  __Pyx_INCREF(((PyObject *)__pyx_v_other->e));
-  PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)__pyx_v_other->e));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_other->e));
-  __Pyx_INCREF(__pyx_v_self->word_alignments);
-  PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_v_self->word_alignments);
-  __Pyx_GIVEREF(__pyx_v_self->word_alignments);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
+  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
+  PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  PyTuple_SET_ITEM(__pyx_t_3, 3, ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_GIVEREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
   __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_3));
@@ -25218,22 +23607,6 @@ static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("fmerge (wrapper)", 0);
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_4Rule_6fmerge(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_f));
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":176
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
@@ -25242,7 +23615,8 @@ static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *_
  *             self.f = f
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Phrase *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -25250,7 +23624,8 @@ static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("fmerge", 0);
+  __Pyx_RefNannySetupContext("fmerge");
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":177
  * 
@@ -25259,7 +23634,8 @@ static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v
  *             self.f = f
  * 
  */
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_self->f), ((PyObject *)__pyx_v_f), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f), __pyx_v_f, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
@@ -25271,14 +23647,14 @@ static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v
  * 
  *     def arity(self):
  */
-    __Pyx_INCREF(((PyObject *)__pyx_v_f));
-    __Pyx_GIVEREF(((PyObject *)__pyx_v_f));
-    __Pyx_GOTREF(__pyx_v_self->f);
-    __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
-    __pyx_v_self->f = __pyx_v_f;
-    goto __pyx_L3;
+    __Pyx_INCREF(__pyx_v_f);
+    __Pyx_GIVEREF(__pyx_v_f);
+    __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
+    __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+    ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_f);
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -25292,17 +23668,6 @@ static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("arity (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_8arity(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":180
  *             self.f = f
  * 
@@ -25311,7 +23676,8 @@ static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSE
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -25319,7 +23685,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("arity", 0);
+  __Pyx_RefNannySetupContext("arity");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":181
  * 
@@ -25329,7 +23695,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_
  *     def __str__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->f), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -25350,18 +23716,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_10__str__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
@@ -25371,53 +23726,45 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_7__str___genexpr(PyObject *__pyx_self) {
+static PyObject *__pyx_pf_3_sa_7__str___genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_7__str___genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("genexpr", 0);
+  __Pyx_RefNannySetupContext("genexpr");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *) __pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)__pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_7__str___2generator7, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_self = __pyx_self;
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7__str___1generator7;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.Rule.__str__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   Py_ssize_t __pyx_t_3;
   PyObject *(*__pyx_t_4)(PyObject *);
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -25426,8 +23773,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self), __pyx_n_s__alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self, __pyx_n_s__alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -25442,20 +23788,12 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   for (;;) {
-    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
     } else {
       __pyx_t_2 = __pyx_t_4(__pyx_t_1);
       if (unlikely(!__pyx_t_2)) {
@@ -25483,7 +23821,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -25494,7 +23832,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -25502,8 +23840,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -25516,7 +23853,8 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator7(__pyx_GeneratorObject
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *__pyx_cur_scope;
   PyObject *__pyx_v_fields = NULL;
   PyObject *__pyx_r = NULL;
@@ -25531,15 +23869,15 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__", 0);
+  __Pyx_RefNannySetupContext("__str__");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_5___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_5___str__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":185
@@ -25549,34 +23887,34 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  */
-  __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_cur_scope->__pyx_v_self->lhs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->lhs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
-  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
   __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
-  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
   __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
-  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
+  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
   __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyList_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
@@ -25599,7 +23937,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  *         return ' ||| '.join(fields)
  */
-  __pyx_t_6 = (__pyx_cur_scope->__pyx_v_self->word_alignments != Py_None);
+  __pyx_t_6 = (((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments != Py_None);
   if (__pyx_t_6) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
@@ -25609,12 +23947,15 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
  *         return ' ||| '.join(fields)
  * 
  */
+    if (unlikely(((PyObject *)__pyx_v_fields) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_5 = __pyx_pf_3_sa_4Rule_7__str___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __pyx_pf_3_sa_7__str___genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
@@ -25624,9 +23965,9 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_t_7 = PyList_Append(__pyx_v_fields, __pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":188
  *         if self.word_alignments is not None:
@@ -25639,7 +23980,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_18), __pyx_n_s__join); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_INCREF(((PyObject *)__pyx_v_fields));
   PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_fields));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fields));
@@ -25668,18 +24009,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("alignments (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_12alignments(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
@@ -25689,45 +24019,36 @@ static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON
  *             yield point/65536, point%65536
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_12alignments(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_6alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_6alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("alignments", 0);
+  __Pyx_RefNannySetupContext("alignments");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)__pyx_ptype_3_sa___pyx_scope_struct_7_alignments->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_7_alignments, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_14generator3, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_7generator3;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.Rule.alignments", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
@@ -25736,8 +24057,8 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -25753,29 +24074,21 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
  *         for point in self.word_alignments:             # <<<<<<<<<<<<<<
  *             yield point/65536, point%65536
  */
-  if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_self->word_alignments) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_self->word_alignments)) {
-    __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->word_alignments; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments)) {
+    __pyx_t_1 = ((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_self->word_alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -25803,7 +24116,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
     __pyx_t_5 = PyNumber_Remainder(__pyx_cur_scope->__pyx_v_point, __pyx_int_65536); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -25819,7 +24132,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -25830,7 +24143,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -25840,23 +24153,11 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
   __Pyx_AddTraceback("alignments", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_1f___get__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "_sa.pxd":37
  * cdef class Rule:
  *     cdef int lhs
@@ -25865,13 +24166,14 @@ static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self) {
  *     cdef int n_scores
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
-  __pyx_r = ((PyObject *)__pyx_v_self->f);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
+  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -25881,24 +24183,14 @@ static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__py
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_4Rule_1e_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_4Rule_1e_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_4Rule_1e___get__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
-  __pyx_r = ((PyObject *)__pyx_v_self->e);
+  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -25920,7 +24212,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   struct __pyx_t_3_sa__Trie_Node *__pyx_v_node;
   struct __pyx_t_3_sa__Trie_Node *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_trie_node", 0);
+  __Pyx_RefNannySetupContext("new_trie_node");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":23
  * cdef _Trie_Node* new_trie_node():
@@ -25986,7 +24278,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   struct __pyx_t_3_sa__Trie_Edge *__pyx_v_edge;
   struct __pyx_t_3_sa__Trie_Edge *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_trie_edge", 0);
+  __Pyx_RefNannySetupContext("new_trie_edge");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":31
  * cdef _Trie_Edge* new_trie_edge(int val):
@@ -26065,7 +24357,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("free_trie_node", 0);
+  __Pyx_RefNannySetupContext("free_trie_node");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":39
  * 
@@ -26128,7 +24420,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("free_trie_edge", 0);
+  __Pyx_RefNannySetupContext("free_trie_edge");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":44
  * 
@@ -26203,7 +24495,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("trie_find", 0);
+  __Pyx_RefNannySetupContext("trie_find");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":51
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):
@@ -26328,7 +24620,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   int __pyx_v_new_len;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("trie_node_data_append", 0);
+  __Pyx_RefNannySetupContext("trie_node_data_append");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":64
  * cdef trie_node_data_append(_Trie_Node* node, int val):
@@ -26384,7 +24676,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   int __pyx_v_new_len;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("trie_node_data_extend", 0);
+  __Pyx_RefNannySetupContext("trie_node_data_extend");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":71
  * cdef trie_node_data_extend(_Trie_Node* node, int* vals, int num_vals):
@@ -26443,7 +24735,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("trie_insert", 0);
+  __Pyx_RefNannySetupContext("trie_insert");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":79
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):
@@ -26571,7 +24863,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("trie_node_to_map", 0);
+  __Pyx_RefNannySetupContext("trie_node_to_map");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":92
  *     cdef IntList arr
@@ -26698,7 +24990,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("trie_edge_to_map", 0);
+  __Pyx_RefNannySetupContext("trie_edge_to_map");
   __Pyx_INCREF(__pyx_v_prefix);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":103
@@ -26743,7 +25035,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __pyx_t_2 = PyInt_FromLong(__pyx_v_edge->val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
@@ -26782,32 +25074,42 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":114
+ *     cdef int V
+ * 
+ *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
+ *         self.V = alphabet_size
+ *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
+ */
+
+static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_alphabet_size;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alphabet_size)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alphabet_size);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -26824,23 +25126,6 @@ static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_7TrieMap___cinit__(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_alphabet_size);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":114
- *     cdef int V
- * 
- *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
- *         self.V = alphabet_size
- *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
- */
-
-static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, int __pyx_v_alphabet_size) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":115
  * 
@@ -26849,7 +25134,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))
  */
-  __pyx_v_self->V = __pyx_v_alphabet_size;
+  ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V = __pyx_v_alphabet_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":116
  *     def __cinit__(self, int alphabet_size):
@@ -26858,7 +25143,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))
  * 
  */
-  __pyx_v_self->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
+  ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":117
  *         self.V = alphabet_size
@@ -26867,22 +25152,13 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx
  * 
  * 
  */
-  memset(__pyx_v_self->root, 0, (__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *))));
+  memset(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root, 0, (((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3_sa_7TrieMap_2__dealloc__(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":120
  * 
  * 
@@ -26891,7 +25167,8 @@ static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self) {
  *         for i from 0 <= i < self.V:
  */
 
-static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self) {
+static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
   int __pyx_v_i;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -26900,7 +25177,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__dealloc__", 0);
+  __Pyx_RefNannySetupContext("__dealloc__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":122
  *     def __dealloc__(self):
@@ -26909,7 +25186,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])
  */
-  __pyx_t_1 = __pyx_v_self->V;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":123
@@ -26919,7 +25196,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
  *                 free_trie_node(self.root[i])
  *         free(self.root)
  */
-    __pyx_t_2 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
+    __pyx_t_2 = ((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]) != NULL);
     if (__pyx_t_2) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":124
@@ -26929,12 +25206,12 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
  *         free(self.root)
  * 
  */
-      __pyx_t_3 = __pyx_f_3_sa_free_trie_node((__pyx_v_self->root[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __pyx_f_3_sa_free_trie_node((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":125
@@ -26944,7 +25221,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
  * 
  * 
  */
-  free(__pyx_v_self->root);
+  free(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root);
 
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -26954,17 +25231,6 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7TrieMap_4insert(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":128
  * 
  * 
@@ -26973,7 +25239,8 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject
  *         cdef int i, l
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
   int *__pyx_v_p;
   int __pyx_v_i;
   int __pyx_v_l;
@@ -26986,7 +25253,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert", 0);
+  __Pyx_RefNannySetupContext("insert");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":131
  *         cdef int* p
@@ -27038,7 +25305,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
  *         free(p)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_insert(__pyx_v_self, __pyx_v_p, __pyx_v_l);
+  ((struct __pyx_vtabstruct_3_sa_TrieMap *)((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->__pyx_vtab)->_insert(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_p, __pyx_v_l);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":136
  *             p[i] = pattern[i]
@@ -27076,7 +25343,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("_insert", 0);
+  __Pyx_RefNannySetupContext("_insert");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":142
  *         cdef int i
@@ -27145,17 +25412,6 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("contains (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7TrieMap_6contains(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":149
  *         return node
  * 
@@ -27164,7 +25420,8 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObje
  *         cdef int i, l
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
   int *__pyx_v_p;
   int __pyx_v_i;
   int __pyx_v_l;
@@ -27179,7 +25436,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("contains", 0);
+  __Pyx_RefNannySetupContext("contains");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":153
  *         cdef int i, l
@@ -27231,7 +25488,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
  *         free(p)
  *         if node == NULL:
  */
-  __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_contains(__pyx_v_self, __pyx_v_p, __pyx_v_l);
+  __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->__pyx_vtab)->_contains(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_p, __pyx_v_l);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":158
  *             p[i] = pattern[i]
@@ -27265,7 +25522,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
     __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L7;
   }
   /*else*/ {
 
@@ -27283,7 +25540,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
     __pyx_t_3 = 0;
     goto __pyx_L0;
   }
-  __pyx_L5:;
+  __pyx_L7:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -27313,7 +25570,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("_contains", 0);
+  __Pyx_RefNannySetupContext("_contains");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":167
  *         cdef int i
@@ -27385,17 +25642,6 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
-static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("toMap (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_7TrieMap_8toMap(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_flag));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":174
  *         return node
  * 
@@ -27404,7 +25650,8 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_flag) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
+static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
   int __pyx_v_i;
   int __pyx_v_include_zeros;
   PyObject *__pyx_v_result = NULL;
@@ -27417,7 +25664,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("toMap", 0);
+  __Pyx_RefNannySetupContext("toMap");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":177
  *         cdef int i, include_zeros
@@ -27437,7 +25684,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
  *             include_zeros=0
  */
     __pyx_v_include_zeros = 1;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
   /*else*/ {
 
@@ -27450,7 +25697,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
  */
     __pyx_v_include_zeros = 0;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":181
  *         else:
@@ -27471,7 +25718,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  */
-  __pyx_t_3 = __pyx_v_self->V;
+  __pyx_t_3 = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":183
@@ -27481,7 +25728,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  *         return result
  */
-    __pyx_t_1 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
+    __pyx_t_1 = ((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]) != NULL);
     if (__pyx_t_1) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":184
@@ -27494,17 +25741,17 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
       __pyx_t_2 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_2 = 0;
-      __pyx_t_2 = __pyx_f_3_sa_trie_node_to_map((__pyx_v_self->root[__pyx_v_i]), ((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_4), __pyx_v_include_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __pyx_f_3_sa_trie_node_to_map((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]), ((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_4), __pyx_v_include_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      goto __pyx_L6;
+      goto __pyx_L8;
     }
-    __pyx_L6:;
+    __pyx_L8:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":185
@@ -27533,9 +25780,16 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":200
+ *     cdef write_map(self, m, FILE* f)
+ * 
+ *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
+ *             precompute_rank=1000, precompute_secondary_rank=20,
+ *             max_length=5, max_nonterminals=2,
+ */
+
+static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fsarray = 0;
   PyObject *__pyx_v_from_stats = 0;
   PyObject *__pyx_v_from_binary = 0;
@@ -27547,18 +25801,18 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
   PyObject *__pyx_v_train_min_gap_size = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
     PyObject* values[9] = {0,0,0,0,0,0,0,0,0};
-
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":200
- *     cdef write_map(self, m, FILE* f)
- * 
- *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
- *             precompute_rank=1000, precompute_secondary_rank=20,
- *             max_length=5, max_nonterminals=2,
- */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
@@ -27570,8 +25824,7 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
     values[8] = ((PyObject *)__pyx_int_2);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
         case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
         case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
@@ -27585,7 +25838,7 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
@@ -27633,7 +25886,7 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -27668,23 +25921,6 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_14Precomputation___cinit__(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_from_stats, __pyx_v_from_binary, __pyx_v_precompute_rank, __pyx_v_precompute_secondary_rank, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_from_stats, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_precompute_rank, PyObject *__pyx_v_precompute_secondary_rank, PyObject *__pyx_v_max_length, PyObject *__pyx_v_max_nonterminals, PyObject *__pyx_v_train_max_initial_size, PyObject *__pyx_v_train_min_gap_size) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":204
  *             max_length=5, max_nonterminals=2,
@@ -27694,7 +25930,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         self.max_length = max_length
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->precompute_rank = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":205
  *             train_max_initial_size=10, train_min_gap_size=2):
@@ -27704,7 +25940,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         self.max_nonterminals = max_nonterminals
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_secondary_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->precompute_secondary_rank = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":206
  *         self.precompute_rank = precompute_rank
@@ -27714,7 +25950,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         self.train_max_initial_size = train_max_initial_size
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_length); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->max_length = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":207
  *         self.precompute_secondary_rank = precompute_secondary_rank
@@ -27724,7 +25960,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         self.train_min_gap_size = train_min_gap_size
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_nonterminals); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->max_nonterminals = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":208
  *         self.max_length = max_length
@@ -27734,7 +25970,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         if from_binary:
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_max_initial_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->train_max_initial_size = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":209
  *         self.max_nonterminals = max_nonterminals
@@ -27744,7 +25980,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *             self.read_binary(from_binary)
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_min_gap_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->train_min_gap_size = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":210
  *         self.train_max_initial_size = train_max_initial_size
@@ -27763,10 +25999,10 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  *         elif from_stats:
  *             self.precompute(from_stats, fsarray)
  */
-    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -27775,7 +26011,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":212
@@ -27795,10 +26031,10 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
  * 
  * 
  */
-    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__precompute); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_INCREF(__pyx_v_from_stats);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_from_stats);
     __Pyx_GIVEREF(__pyx_v_from_stats);
@@ -27810,9 +26046,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -27827,27 +26063,6 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_14Precomputation_2read_binary(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":216
  * 
  * 
@@ -27856,7 +26071,9 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_s
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -27864,7 +26081,16 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary", 0);
+  __Pyx_RefNannySetupContext("read_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":218
  *     def read_binary(self, char* filename):
@@ -27882,7 +26108,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)
  */
-  fread((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":220
  *         f = fopen(filename, "r")
@@ -27891,7 +26117,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  */
-  fread((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":221
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)
@@ -27900,7 +26126,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  */
-  fread((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":222
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
@@ -27909,7 +26135,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  */
-  fread((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":223
  *         fread(&(self.max_length), sizeof(int), 1, f)
@@ -27918,7 +26144,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)
  */
-  fread((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":224
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
@@ -27927,7 +26153,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)
  */
-  fread((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
+  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":225
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
@@ -27936,12 +26162,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  *         self.precomputed_collocations = self.read_map(f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->read_map(__pyx_v_self, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->read_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
-  __Pyx_DECREF(__pyx_v_self->precomputed_index);
-  __pyx_v_self->precomputed_index = __pyx_t_1;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":226
@@ -27951,12 +26177,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  *         fclose(f)
  * 
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->read_map(__pyx_v_self, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->read_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
-  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
-  __pyx_v_self->precomputed_collocations = __pyx_t_1;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations = __pyx_t_1;
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":227
@@ -27980,27 +26206,6 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_14Precomputation_4write_binary(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":230
  * 
  * 
@@ -28009,7 +26214,9 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -28018,7 +26225,16 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary", 0);
+  __Pyx_RefNannySetupContext("write_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":232
  *     def write_binary(self, char* filename):
@@ -28036,7 +26252,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  */
-  fwrite((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":234
  *         f = fopen(filename, "w")
@@ -28045,7 +26261,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  */
-  fwrite((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":235
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)
@@ -28054,7 +26270,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  */
-  fwrite((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":236
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
@@ -28063,7 +26279,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  */
-  fwrite((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":237
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
@@ -28072,7 +26288,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)
  */
-  fwrite((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":238
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
@@ -28081,7 +26297,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)
  */
-  fwrite((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":239
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
@@ -28090,9 +26306,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  *         self.write_map(self.precomputed_collocations, f)
  *         fclose(f)
  */
-  __pyx_t_1 = __pyx_v_self->precomputed_index;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->write_map(__pyx_v_self, __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->write_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -28104,9 +26320,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  *         fclose(f)
  * 
  */
-  __pyx_t_2 = __pyx_v_self->precomputed_collocations;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->write_map(__pyx_v_self, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->write_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -28141,7 +26357,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  *         cdef IntList arr
  */
 
-static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_m, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_m, FILE *__pyx_v_f) {
   int __pyx_v_i;
   int __pyx_v_N;
   struct __pyx_obj_3_sa_IntList *__pyx_v_arr = 0;
@@ -28152,17 +26368,19 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *(*__pyx_t_4)(PyObject *);
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  int __pyx_t_7;
-  Py_ssize_t __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  Py_ssize_t __pyx_t_9;
+  PyObject *(*__pyx_t_10)(PyObject *);
+  int __pyx_t_11;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_map", 0);
+  __Pyx_RefNannySetupContext("write_map");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":248
  *         cdef IntList arr
@@ -28190,22 +26408,80 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)
  */
-  __pyx_t_1 = 0;
-  if (unlikely(__pyx_v_m == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_v_m, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+    __pyx_t_2 = __pyx_t_3; __Pyx_INCREF(__pyx_t_2); __pyx_t_1 = 0;
+    __pyx_t_4 = NULL;
+  } else {
+    __pyx_t_1 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
-  __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_m, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_2);
-  __pyx_t_2 = __pyx_t_5;
-  __pyx_t_5 = 0;
-  while (1) {
-    __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_2, __pyx_t_3, &__pyx_t_1, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4);
-    if (unlikely(__pyx_t_7 == 0)) break;
-    if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  for (;;) {
+    if (PyList_CheckExact(__pyx_t_2)) {
+      if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
+    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
+    } else {
+      __pyx_t_3 = __pyx_t_4(__pyx_t_2);
+      if (unlikely(!__pyx_t_3)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+      PyObject* sequence = __pyx_t_3;
+      if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
+        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
+      } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
+        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
+      }
+      __Pyx_INCREF(__pyx_t_5);
+      __Pyx_INCREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    } else {
+      Py_ssize_t index = -1;
+      __pyx_t_7 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
+      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_5);
+      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_6);
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L6_unpacking_done;
+      __pyx_L5_unpacking_failed:;
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_L6_unpacking_done:;
+    }
     __Pyx_XDECREF(__pyx_v_pattern);
     __pyx_v_pattern = __pyx_t_5;
     __pyx_t_5 = 0;
@@ -28220,8 +26496,8 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:
  */
-    __pyx_t_8 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_N = __pyx_t_8;
+    __pyx_t_9 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_N = __pyx_t_9;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":252
  *         for pattern, val in m.iteritems():
@@ -28240,42 +26516,34 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  *                 fwrite(&(i), sizeof(int), 1, f)
  */
     if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-      __pyx_t_6 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_6); __pyx_t_8 = 0;
-      __pyx_t_9 = NULL;
+      __pyx_t_3 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_3); __pyx_t_9 = 0;
+      __pyx_t_10 = NULL;
     } else {
-      __pyx_t_8 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_9 = Py_TYPE(__pyx_t_6)->tp_iternext;
+      __pyx_t_9 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_10 = Py_TYPE(__pyx_t_3)->tp_iternext;
     }
     for (;;) {
-      if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_6)) {
-        if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_6)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
-      } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_6)) {
-        if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+      if (PyList_CheckExact(__pyx_t_3)) {
+        if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_3)) break;
+        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++;
+      } else if (PyTuple_CheckExact(__pyx_t_3)) {
+        if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++;
       } else {
-        __pyx_t_5 = __pyx_t_9(__pyx_t_6);
-        if (unlikely(!__pyx_t_5)) {
+        __pyx_t_6 = __pyx_t_10(__pyx_t_3);
+        if (unlikely(!__pyx_t_6)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
             else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
-        __Pyx_GOTREF(__pyx_t_5);
+        __Pyx_GOTREF(__pyx_t_6);
       }
       __Pyx_XDECREF(__pyx_v_word_id);
-      __pyx_v_word_id = __pyx_t_5;
-      __pyx_t_5 = 0;
+      __pyx_v_word_id = __pyx_t_6;
+      __pyx_t_6 = 0;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":254
  *             fwrite(&(N), sizeof(int), 1, f)
@@ -28284,8 +26552,8 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val
  */
-      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_i = __pyx_t_7;
+      __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_i = __pyx_t_11;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":255
  *             for word_id in pattern:
@@ -28296,7 +26564,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  */
       fwrite((&__pyx_v_i), (sizeof(int)), 1, __pyx_v_f);
     }
-    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":256
  *                 i = word_id
@@ -28325,8 +26593,10 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_5);
   __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_AddTraceback("_sa.Precomputation.write_map", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
@@ -28347,10 +26617,10 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  *         cdef IntList arr
  */
 
-static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, FILE *__pyx_v_f) {
   int __pyx_v_i;
-  CYTHON_UNUSED int __pyx_v_j;
-  CYTHON_UNUSED int __pyx_v_k;
+  int __pyx_v_j;
+  int __pyx_v_k;
   int __pyx_v_word_id;
   int __pyx_v_N;
   struct __pyx_obj_3_sa_IntList *__pyx_v_arr = 0;
@@ -28365,7 +26635,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_map", 0);
+  __Pyx_RefNannySetupContext("read_map");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":264
  *         cdef IntList arr
@@ -28447,7 +26717,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
       __pyx_t_1 = PyInt_FromLong(__pyx_v_word_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
@@ -28519,67 +26789,6 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_stats = 0;
-  struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray = 0;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("precompute (wrapper)", 0);
-  {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__sarray,0};
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stats)) != 0)) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sarray)) != 0)) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, 1); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "precompute") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-    }
-    __pyx_v_stats = values[0];
-    __pyx_v_sarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sarray), __pyx_ptype_3_sa_SuffixArray, 1, "sarray", 0))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_14Precomputation_6precompute(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_stats, __pyx_v_sarray);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":278
  * 
  * 
@@ -28588,7 +26797,10 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_se
  *         cdef DataArray darray = sarray.darray
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray) {
+static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_stats = 0;
+  struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray = 0;
   int __pyx_v_i;
   int __pyx_v_l;
   int __pyx_v_N;
@@ -28621,7 +26833,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   PyObject *__pyx_v_pattern_rank = NULL;
   float __pyx_v_start_time;
   PyObject *__pyx_v_rank = NULL;
-  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
+  PyObject *__pyx_v__ = NULL;
   PyObject *__pyx_v_phrase = NULL;
   int __pyx_v_sa_word_id;
   PyObject *__pyx_v_x = NULL;
@@ -28636,7 +26848,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   PyObject *__pyx_v_arity = NULL;
   PyObject *__pyx_v_cumul_cost = NULL;
   PyObject *__pyx_v_cumul_count = NULL;
-  PyObject *__pyx_v_num_found_patterns = NULL;
+  Py_ssize_t __pyx_v_num_found_patterns;
   float __pyx_v_stop_time;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -28663,7 +26875,52 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("precompute", 0);
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__sarray,0};
+  __Pyx_RefNannySetupContext("precompute");
+  {
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  0:
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stats);
+        if (likely(values[0])) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sarray);
+        if (likely(values[1])) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, 1); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "precompute") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_stats = values[0];
+    __pyx_v_sarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sarray), __pyx_ptype_3_sa_SuffixArray, 1, "sarray", 0))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":280
  *     def precompute(self, stats, SuffixArray sarray):
@@ -28699,7 +26956,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -28723,7 +26980,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -28747,7 +27004,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -28870,20 +27127,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
+    if (PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_5)) {
@@ -28897,22 +27146,21 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
       PyObject* sequence = __pyx_t_5;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      Py_ssize_t size = Py_SIZE(sequence);
-      #else
-      Py_ssize_t size = PySequence_Size(sequence);
-      #endif
-      if (unlikely(size != 3)) {
-        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
+          if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_8 = PyTuple_GET_ITEM(sequence, 2); 
       } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
+          if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_8 = PyList_GET_ITEM(sequence, 2); 
@@ -28920,35 +27168,28 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_INCREF(__pyx_t_6);
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_8);
-      #else
-      __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    } else
-    {
+    } else {
       Py_ssize_t index = -1;
       __pyx_t_9 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_10 = Py_TYPE(__pyx_t_9)->tp_iternext;
-      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
+      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
-      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L5_unpacking_failed;
+      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L8_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L5_unpacking_failed;
+      index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L8_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_8);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_9), 3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_10 = NULL;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      goto __pyx_L6_unpacking_done;
-      __pyx_L5_unpacking_failed:;
+      goto __pyx_L9_unpacking_done;
+      __pyx_L8_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_10 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L6_unpacking_done:;
+      __pyx_L9_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v__);
     __pyx_v__ = __pyx_t_6;
@@ -28975,9 +27216,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  */
-    __pyx_t_5 = PyInt_FromLong(__pyx_v_self->precompute_rank); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_8 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_5, Py_GE); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
@@ -28990,10 +27232,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)
  */
-      goto __pyx_L4_break;
-      goto __pyx_L7;
+      goto __pyx_L7_break;
+      goto __pyx_L10;
     }
-    __pyx_L7:;
+    __pyx_L10:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":304
  *             if rank >= self.precompute_rank:
@@ -29021,7 +27263,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_frequent_patterns), __pyx_n_s__insert); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_INCREF(__pyx_v_phrase);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_phrase);
     __Pyx_GIVEREF(__pyx_v_phrase);
@@ -29038,6 +27280,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:
  */
+    if (unlikely(((PyObject *)__pyx_v_I_set) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_15 = PySet_Add(__pyx_v_I_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":307
@@ -29056,9 +27301,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 super_frequent_patterns.insert(phrase)
  *                 J_set.add(phrase)
  */
-    __pyx_t_7 = PyInt_FromLong(__pyx_v_self->precompute_secondary_rank); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyInt_FromLong(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_7, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_7, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -29074,7 +27320,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_super_frequent_patterns), __pyx_n_s__insert); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_7));
       __Pyx_INCREF(__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_v_phrase);
@@ -29091,12 +27337,15 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  * 
  *         queue = IntList(increment=1000)
  */
+      if (unlikely(((PyObject *)__pyx_v_J_set) == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+      }
       __pyx_t_15 = PySet_Add(__pyx_v_J_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L8;
+      goto __pyx_L11;
     }
-    __pyx_L8:;
+    __pyx_L11:;
   }
-  __pyx_L4_break:;
+  __pyx_L7_break:;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -29110,7 +27359,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__increment), __pyx_int_1000) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_queue = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
@@ -29180,7 +27429,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 for l from 1 <= l <= max_pattern_len:
  */
       ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, -1);
-      goto __pyx_L11;
+      goto __pyx_L14;
     }
     /*else*/ {
 
@@ -29220,10 +27469,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                     queue._append(i)
  *                     queue._append(l)
  */
-          goto __pyx_L13_break;
-          goto __pyx_L14;
+          goto __pyx_L16_break;
+          goto __pyx_L17;
         }
-        __pyx_L14:;
+        __pyx_L17:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":325
  *                     if node == NULL:
@@ -29254,9 +27503,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       }
-      __pyx_L13_break:;
+      __pyx_L16_break:;
     }
-    __pyx_L11:;
+    __pyx_L14:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":329
@@ -29381,7 +27630,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_t_11 = (__pyx_v_i2 == -1);
         if (!__pyx_t_11) {
-          __pyx_t_17 = ((__pyx_v_i2 - __pyx_v_i1) >= __pyx_v_self->train_max_initial_size);
+          __pyx_t_17 = ((__pyx_v_i2 - __pyx_v_i1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
           __pyx_t_18 = __pyx_t_17;
         } else {
           __pyx_t_18 = __pyx_t_11;
@@ -29395,10 +27644,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  */
-          goto __pyx_L19_break;
-          goto __pyx_L20;
+          goto __pyx_L22_break;
+          goto __pyx_L23;
         }
-        __pyx_L20:;
+        __pyx_L23:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":342
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
@@ -29416,7 +27665,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):
  */
-        __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= __pyx_v_self->train_min_gap_size);
+        __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size);
         if (__pyx_t_18) {
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":344
@@ -29426,7 +27675,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)
  */
-          __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
+          __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
           if (__pyx_t_11) {
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":345
@@ -29436,7 +27685,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)
  */
-            __pyx_t_17 = (((__pyx_v_l1 + __pyx_v_l2) + 1) <= __pyx_v_self->max_length);
+            __pyx_t_17 = (((__pyx_v_l1 + __pyx_v_l2) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
             __pyx_t_19 = __pyx_t_17;
           } else {
             __pyx_t_19 = __pyx_t_11;
@@ -29535,7 +27784,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                                 is_super = 0
  */
               __pyx_v_is_super = 1;
-              goto __pyx_L25;
+              goto __pyx_L28;
             }
             /*else*/ {
 
@@ -29548,7 +27797,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_v_is_super = 0;
             }
-            __pyx_L25:;
+            __pyx_L28:;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":357
  *                             else:
@@ -29588,7 +27837,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_t_11 = (__pyx_v_i3 == -1);
               if (!__pyx_t_11) {
-                __pyx_t_18 = ((__pyx_v_i3 - __pyx_v_i1) >= __pyx_v_self->train_max_initial_size);
+                __pyx_t_18 = ((__pyx_v_i3 - __pyx_v_i1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
                 __pyx_t_19 = __pyx_t_18;
               } else {
                 __pyx_t_19 = __pyx_t_11;
@@ -29602,10 +27851,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  */
-                goto __pyx_L27_break;
-                goto __pyx_L28;
+                goto __pyx_L30_break;
+                goto __pyx_L31;
               }
-              __pyx_L28:;
+              __pyx_L31:;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":362
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
@@ -29623,7 +27872,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):
  */
-              __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= __pyx_v_self->train_min_gap_size);
+              __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size);
               if (__pyx_t_19) {
 
                 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":364
@@ -29633,7 +27882,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  */
-                __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
+                __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
                 if (__pyx_t_11) {
 
                   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":365
@@ -29643,7 +27892,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)
  */
-                  __pyx_t_18 = ((((__pyx_v_l1 + __pyx_v_l2) + __pyx_v_l3) + 2) <= __pyx_v_self->max_length);
+                  __pyx_t_18 = ((((__pyx_v_l1 + __pyx_v_l2) + __pyx_v_l3) + 2) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
                   __pyx_t_17 = __pyx_t_18;
                 } else {
                   __pyx_t_17 = __pyx_t_11;
@@ -29768,12 +28017,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __pyx_t_3 = __pyx_f_3_sa_trie_node_data_append(__pyx_v_node, __pyx_v_i3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                  goto __pyx_L30;
+                  goto __pyx_L33;
                 }
-                __pyx_L30:;
-                goto __pyx_L29;
+                __pyx_L33:;
+                goto __pyx_L32;
               }
-              __pyx_L29:;
+              __pyx_L32:;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":377
  *                                         trie_node_data_append(node, i2)
@@ -29784,13 +28033,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_v_ptr3 = (__pyx_v_ptr3 + 2);
             }
-            __pyx_L27_break:;
-            goto __pyx_L24;
+            __pyx_L30_break:;
+            goto __pyx_L27;
           }
-          __pyx_L24:;
-          goto __pyx_L21;
+          __pyx_L27:;
+          goto __pyx_L24;
         }
-        __pyx_L21:;
+        __pyx_L24:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":378
  *                                         trie_node_data_append(node, i3)
@@ -29801,7 +28050,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_v_ptr2 = (__pyx_v_ptr2 + 2);
       }
-      __pyx_L19_break:;
+      __pyx_L22_break:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":379
  *                                 ptr3 = ptr3 + 2
@@ -29811,7 +28060,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 sent_count = sent_count + 1
  */
       __pyx_v_ptr1 = (__pyx_v_ptr1 + 2);
-      goto __pyx_L17;
+      goto __pyx_L20;
     }
     /*else*/ {
 
@@ -29849,7 +28098,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_t_3 = PyInt_FromLong(__pyx_v_sent_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_8);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_8));
         __Pyx_INCREF(((PyObject *)__pyx_kp_s_78));
         PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_78));
         __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_78));
@@ -29861,9 +28110,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        goto __pyx_L35;
+        goto __pyx_L38;
       }
-      __pyx_L35:;
+      __pyx_L38:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":384
  *                 if sent_count % 10000 == 0:
@@ -29874,7 +28123,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_ptr1 = (__pyx_v_ptr1 + 1);
     }
-    __pyx_L17:;
+    __pyx_L20:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":386
@@ -29889,7 +28138,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_8 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
   __pyx_t_8 = 0;
@@ -29898,9 +28147,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_8);
-  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
-  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
-  __pyx_v_self->precomputed_collocations = __pyx_t_8;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations = __pyx_t_8;
   __pyx_t_8 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":387
@@ -29915,7 +28164,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -29924,9 +28173,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
-  __Pyx_DECREF(__pyx_v_self->precomputed_index);
-  __pyx_v_self->precomputed_index = __pyx_t_1;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
+  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":389
@@ -30000,7 +28249,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < __pyx_v_self->max_length);
+      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
       if (__pyx_t_19) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":393
@@ -30026,10 +28275,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  * 
  *         for pattern1 in I_set:
  */
+        if (unlikely(((PyObject *)__pyx_v_J2_set) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_15 = PySet_Add(__pyx_v_J2_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L40;
+        goto __pyx_L43;
       }
-      __pyx_L40:;
+      __pyx_L43:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
@@ -30109,7 +28361,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= __pyx_v_self->max_length);
+      __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
       if (__pyx_t_19) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":400
@@ -30135,10 +28387,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  * 
  *         for pattern1 in I_set:
  */
+        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L45;
+        goto __pyx_L48;
       }
-      __pyx_L45:;
+      __pyx_L48:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
@@ -30218,7 +28473,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= __pyx_v_self->max_length);
+      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
       if (__pyx_t_19) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":407
@@ -30244,6 +28499,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  *                     IJ_set.add(combined_pattern)
  */
+        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":409
@@ -30269,10 +28527,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  * 
  *         N = len(pattern_rank)
  */
+        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L50;
+        goto __pyx_L53;
       }
-      __pyx_L50:;
+      __pyx_L53:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
@@ -30285,7 +28546,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)
  */
-  __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(((PyObject *)__pyx_v_pattern_rank) == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
+  __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); 
   __pyx_v_N = __pyx_t_14;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":413
@@ -30301,7 +28565,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_cost_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
@@ -30320,7 +28584,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __pyx_v_count_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
@@ -30333,28 +28597,86 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *             if pattern not in IJ_set:
  *                 s = ""
  */
-  __pyx_t_14 = 0;
-  if (unlikely(__pyx_v_self->precomputed_collocations == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_self->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_2), (&__pyx_t_13)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_1);
-  __pyx_t_1 = __pyx_t_3;
-  __pyx_t_3 = 0;
-  while (1) {
-    __pyx_t_16 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_2, &__pyx_t_14, &__pyx_t_3, &__pyx_t_8, NULL, __pyx_t_13);
-    if (unlikely(__pyx_t_16 == 0)) break;
-    if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+    __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_14 = 0;
+    __pyx_t_4 = NULL;
+  } else {
+    __pyx_t_14 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  for (;;) {
+    if (PyList_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_14 >= PyList_GET_SIZE(__pyx_t_1)) break;
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_14 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++;
+    } else {
+      __pyx_t_3 = __pyx_t_4(__pyx_t_1);
+      if (unlikely(!__pyx_t_3)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+      PyObject* sequence = __pyx_t_3;
+      if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
+        __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
+      } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
+        __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
+      }
+      __Pyx_INCREF(__pyx_t_8);
+      __Pyx_INCREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    } else {
+      Py_ssize_t index = -1;
+      __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_10 = Py_TYPE(__pyx_t_5)->tp_iternext;
+      index = 0; __pyx_t_8 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_8)) goto __pyx_L56_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_8);
+      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_7)) goto __pyx_L56_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_7);
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_5), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      goto __pyx_L57_unpacking_done;
+      __pyx_L56_unpacking_failed:;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_L57_unpacking_done:;
+    }
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_3;
-    __pyx_t_3 = 0;
-    __Pyx_XDECREF(__pyx_v_arr);
-    __pyx_v_arr = __pyx_t_8;
+    __pyx_v_pattern = __pyx_t_8;
     __pyx_t_8 = 0;
+    __Pyx_XDECREF(__pyx_v_arr);
+    __pyx_v_arr = __pyx_t_7;
+    __pyx_t_7 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":416
  *         count_by_rank = IntList(initial_len=N)
@@ -30363,7 +28685,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 s = ""
  *                 for word_id in pattern:
  */
-    __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, ((PyObject *)__pyx_v_IJ_set), Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_IJ_set), __pyx_v_pattern))); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":417
@@ -30385,42 +28707,34 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                         s = s + "X "
  */
       if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-        __pyx_t_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_12 = 0;
-        __pyx_t_4 = NULL;
+        __pyx_t_3 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
+        __pyx_t_20 = NULL;
       } else {
-        __pyx_t_12 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_4 = Py_TYPE(__pyx_t_8)->tp_iternext;
+        __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_20 = Py_TYPE(__pyx_t_3)->tp_iternext;
       }
       for (;;) {
-        if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_8)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_12); __Pyx_INCREF(__pyx_t_3); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
-        } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_12); __Pyx_INCREF(__pyx_t_3); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+        if (PyList_CheckExact(__pyx_t_3)) {
+          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
+          __pyx_t_7 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
+        } else if (PyTuple_CheckExact(__pyx_t_3)) {
+          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+          __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
         } else {
-          __pyx_t_3 = __pyx_t_4(__pyx_t_8);
-          if (unlikely(!__pyx_t_3)) {
+          __pyx_t_7 = __pyx_t_20(__pyx_t_3);
+          if (unlikely(!__pyx_t_7)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
               else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(__pyx_t_7);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_word_id = __pyx_t_7;
+        __pyx_t_7 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":419
  *                 s = ""
@@ -30429,9 +28743,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                         s = s + "X "
  *                     else:
  */
-        __pyx_t_3 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_7 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (__pyx_t_19) {
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":420
@@ -30441,12 +28756,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "
  */
-          __pyx_t_3 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_7 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_7);
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_3;
-          __pyx_t_3 = 0;
-          goto __pyx_L56;
+          __pyx_v_s = __pyx_t_7;
+          __pyx_t_7 = 0;
+          goto __pyx_L61;
         }
         /*else*/ {
 
@@ -30457,21 +28772,21 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)
  *             else:
  */
-          __pyx_t_3 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_7 = PyNumber_Add(__pyx_v_s, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_7 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyNumber_Add(__pyx_t_7, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_8 = PyNumber_Add(__pyx_v_s, __pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_t_7 = PyNumber_Add(__pyx_t_8, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __pyx_v_s = __pyx_t_7;
+          __pyx_t_7 = 0;
         }
-        __pyx_L56:;
+        __pyx_L61:;
       }
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":423
  *                     else:
@@ -30480,25 +28795,25 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *             else:
  *                 chunk = ()
  */
-      __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_3 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__warn); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_84));
-      PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_84));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_84));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_84));
       __Pyx_INCREF(__pyx_v_s);
-      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_s);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_s);
       __Pyx_GIVEREF(__pyx_v_s);
-      __pyx_t_7 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L53;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L58;
     }
     /*else*/ {
 
@@ -30541,42 +28856,34 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  */
       if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-        __pyx_t_7 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_7); __pyx_t_12 = 0;
-        __pyx_t_4 = NULL;
+        __pyx_t_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_2 = 0;
+        __pyx_t_20 = NULL;
       } else {
-        __pyx_t_12 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_4 = Py_TYPE(__pyx_t_7)->tp_iternext;
+        __pyx_t_2 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_20 = Py_TYPE(__pyx_t_8)->tp_iternext;
       }
       for (;;) {
-        if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_7)) {
-          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_7)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_8 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_8); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
-        } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_7)) {
-          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_8); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+        if (PyList_CheckExact(__pyx_t_8)) {
+          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_8)) break;
+          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
+        } else if (PyTuple_CheckExact(__pyx_t_8)) {
+          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
+          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
         } else {
-          __pyx_t_8 = __pyx_t_4(__pyx_t_7);
-          if (unlikely(!__pyx_t_8)) {
+          __pyx_t_3 = __pyx_t_20(__pyx_t_8);
+          if (unlikely(!__pyx_t_3)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
               else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_GOTREF(__pyx_t_3);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_8;
-        __pyx_t_8 = 0;
+        __pyx_v_word_id = __pyx_t_3;
+        __pyx_t_3 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":429
  *                 arity = 0
@@ -30585,9 +28892,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1
  */
-        __pyx_t_8 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __pyx_t_3 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_19) {
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":430
@@ -30597,28 +28905,29 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                         arity = arity + 1
  *                         chunk = ()
  */
-          __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
-          __pyx_t_16 = __pyx_v_max_rank;
-          __pyx_t_5 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_13 = __pyx_v_max_rank;
+          __pyx_t_5 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
-          __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_5, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, __pyx_t_5, Py_GT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_6);
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
           __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
           if (__pyx_t_19) {
-            __Pyx_INCREF(__pyx_t_8);
-            __pyx_t_3 = __pyx_t_8;
+            __Pyx_INCREF(__pyx_t_3);
+            __pyx_t_7 = __pyx_t_3;
           } else {
-            __pyx_t_6 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_6 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_6);
-            __pyx_t_3 = __pyx_t_6;
+            __pyx_t_7 = __pyx_t_6;
             __pyx_t_6 = 0;
           }
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_v_max_rank = __pyx_t_16;
+          __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_v_max_rank = __pyx_t_13;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":431
  *                     if word_id == -1:
@@ -30627,11 +28936,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                         chunk = ()
  *                     else:
  */
-          __pyx_t_3 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_7 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_7);
           __Pyx_DECREF(__pyx_v_arity);
-          __pyx_v_arity = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __pyx_v_arity = __pyx_t_7;
+          __pyx_t_7 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":432
  *                         max_rank = max(max_rank, pattern_rank[chunk])
@@ -30643,7 +28952,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
           __pyx_v_chunk = __pyx_empty_tuple;
-          goto __pyx_L59;
+          goto __pyx_L64;
         }
         /*else*/ {
 
@@ -30654,21 +28963,21 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  */
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_7));
           __Pyx_INCREF(__pyx_v_word_id);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_word_id);
+          PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_word_id);
           __Pyx_GIVEREF(__pyx_v_word_id);
-          __pyx_t_8 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+          __pyx_t_3 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
-          __pyx_v_chunk = __pyx_t_8;
-          __pyx_t_8 = 0;
+          __pyx_v_chunk = __pyx_t_3;
+          __pyx_t_3 = 0;
         }
-        __pyx_L59:;
+        __pyx_L64:;
       }
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":435
  *                     else:
@@ -30677,28 +28986,29 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  */
-      __pyx_t_7 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_13 = __pyx_v_max_rank;
+      __pyx_t_7 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_16 = __pyx_v_max_rank;
-      __pyx_t_3 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_6 = PyObject_RichCompare(__pyx_t_7, __pyx_t_3, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_7, Py_GT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       if (__pyx_t_19) {
-        __Pyx_INCREF(__pyx_t_7);
-        __pyx_t_8 = __pyx_t_7;
+        __Pyx_INCREF(__pyx_t_8);
+        __pyx_t_3 = __pyx_t_8;
       } else {
-        __pyx_t_6 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_8 = __pyx_t_6;
+        __pyx_t_3 = __pyx_t_6;
         __pyx_t_6 = 0;
       }
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_v_max_rank = __pyx_t_16;
+      __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_v_max_rank = __pyx_t_13;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":436
  *                         chunk = chunk + (word_id,)
@@ -30707,8 +29017,8 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  * 
  */
-      __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_12));
+      __pyx_t_2 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_2));
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":437
  *                 max_rank = max(max_rank, pattern_rank[chunk])
@@ -30717,26 +29027,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  * 
  *         cumul_cost = 0
  */
-      __pyx_t_8 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_2 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_7 = PyInt_FromSsize_t(__pyx_t_12); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_6 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_7 = __Pyx_PyNumber_Divide(__pyx_t_8, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyNumber_Add(__pyx_t_8, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyNumber_Add(__pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_16;
+      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_13;
     }
-    __pyx_L53:;
+    __pyx_L58:;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -30816,35 +29126,35 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_8 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
-    __pyx_t_7 = PyTuple_New(6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_8 = PyTuple_New(6); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_85));
+    PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_85));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
-    PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7);
+    __Pyx_GIVEREF(__pyx_t_7);
+    PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_8);
-    __Pyx_GIVEREF(__pyx_t_8);
     __Pyx_INCREF(__pyx_v_cumul_count);
-    PyTuple_SET_ITEM(__pyx_t_7, 4, __pyx_v_cumul_count);
+    PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_v_cumul_count);
     __Pyx_GIVEREF(__pyx_v_cumul_count);
     __Pyx_INCREF(__pyx_v_cumul_cost);
-    PyTuple_SET_ITEM(__pyx_t_7, 5, __pyx_v_cumul_cost);
+    PyTuple_SET_ITEM(__pyx_t_8, 5, __pyx_v_cumul_cost);
     __Pyx_GIVEREF(__pyx_v_cumul_cost);
     __pyx_t_1 = 0;
+    __pyx_t_7 = 0;
     __pyx_t_3 = 0;
-    __pyx_t_8 = 0;
-    __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":446
@@ -30854,14 +29164,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:
  */
-  __pyx_t_8 = __pyx_v_self->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_8);
-  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_v_num_found_patterns = __pyx_t_8;
-  __pyx_t_8 = 0;
+  __pyx_t_3 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_3);
+  __pyx_t_14 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_num_found_patterns = __pyx_t_14;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":447
  * 
@@ -30870,24 +29177,24 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *             if pattern not in self.precomputed_collocations:
  *                 self.precomputed_collocations[pattern] = IntList()
  */
-  __pyx_t_8 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_4 = Py_TYPE(__pyx_t_8)->tp_iternext;
+  __pyx_t_3 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
   for (;;) {
     {
-      __pyx_t_7 = __pyx_t_4(__pyx_t_8);
-      if (unlikely(!__pyx_t_7)) {
+      __pyx_t_8 = __pyx_t_4(__pyx_t_3);
+      if (unlikely(!__pyx_t_8)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
           else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
-      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_GOTREF(__pyx_t_8);
     }
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_7;
-    __pyx_t_7 = 0;
+    __pyx_v_pattern = __pyx_t_8;
+    __pyx_t_8 = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":448
  *         num_found_patterns = len(self.precomputed_collocations)
@@ -30896,7 +29203,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *                 self.precomputed_collocations[pattern] = IntList()
  * 
  */
-    __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, __pyx_v_self->precomputed_collocations, Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_v_pattern))); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":449
@@ -30906,15 +29213,15 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  * 
  *         cdef float stop_time = monitor_cpu()
  */
-      __pyx_t_7 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_pattern, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L64;
+      __pyx_t_8 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      if (PyObject_SetItem(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_v_pattern, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L69;
     }
-    __pyx_L64:;
+    __pyx_L69:;
   }
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":451
  *                 self.precomputed_collocations[pattern] = IntList()
@@ -30932,36 +29239,38 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))
  */
-  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_7);
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = __pyx_v_self->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_8);
-  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_8 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_6 = PyTuple_New(4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_num_found_patterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_6 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_6);
+  __pyx_t_14 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_14); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_86));
-  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_s_86));
+  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_86));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_86));
-  __Pyx_INCREF(__pyx_v_num_found_patterns);
-  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_v_num_found_patterns);
-  __Pyx_GIVEREF(__pyx_v_num_found_patterns);
-  PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_8);
-  __Pyx_GIVEREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_6);
   __Pyx_INCREF(__pyx_v_x);
-  PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_v_x);
+  PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_v_x);
   __Pyx_GIVEREF(__pyx_v_x);
-  __pyx_t_8 = 0;
-  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_6 = 0;
+  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":453
  *         cdef float stop_time = monitor_cpu()
@@ -30969,56 +29278,56 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))             # <<<<<<<<<<<<<<
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))
  */
-  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_6 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = __pyx_v_self->precomputed_index;
-  __Pyx_INCREF(__pyx_t_8);
-  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index;
+  __Pyx_INCREF(__pyx_t_6);
+  __pyx_t_14 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_14); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_8));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_87));
+  PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_87));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_8);
-  __Pyx_GIVEREF(__pyx_t_8);
-  __pyx_t_8 = 0;
-  __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_6);
+  __pyx_t_6 = 0;
+  __pyx_t_6 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":454
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
  */
-  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_7);
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_8 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_6 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_88));
-  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_s_88));
+  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_88));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_88));
-  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_8);
-  __Pyx_GIVEREF(__pyx_t_8);
-  __pyx_t_8 = 0;
-  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
+  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6);
+  __Pyx_GIVEREF(__pyx_t_6);
+  __pyx_t_6 = 0;
+  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -31061,39 +29370,43 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_XDECREF(__pyx_v_arity);
   __Pyx_XDECREF(__pyx_v_cumul_cost);
   __Pyx_XDECREF(__pyx_v_cumul_count);
-  __Pyx_XDECREF(__pyx_v_num_found_patterns);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":11
+ *     cdef IntList ha
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
+ *         self.darray = DataArray()
+ *         self.sa = IntList()
+ */
+
+static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
     PyObject* values[3] = {0,0,0};
-
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":11
- *     cdef IntList ha
- * 
- *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
- *         self.darray = DataArray()
- *         self.sa = IntList()
- */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -31101,7 +29414,7 @@ static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObje
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -31119,7 +29432,7 @@ static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObje
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -31142,22 +29455,6 @@ static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObje
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray___cinit__(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text, __pyx_v_side);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":12
  * 
@@ -31169,9 +29466,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->darray);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->darray));
-  __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":13
@@ -31184,9 +29481,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->sa);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
-  __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":14
@@ -31199,9 +29496,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->ha);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->ha));
-  __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":15
@@ -31221,10 +29518,10 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
  *         elif from_text:
  *             self.read_text(from_text, side)
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -31233,7 +29530,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":17
@@ -31253,10 +29550,10 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
  * 
  *     def __getitem__(self, i):
  */
-    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -31268,9 +29565,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -31285,17 +29582,6 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_2__getitem__(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":20
  *             self.read_text(from_text, side)
  * 
@@ -31304,7 +29590,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -31312,7 +29599,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__", 0);
+  __Pyx_RefNannySetupContext("__getitem__");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":21
  * 
@@ -31323,7 +29610,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sa->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -31341,17 +29628,6 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_4get_sentence_id(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":23
  *         return self.sa.arr[i]
  * 
@@ -31360,7 +29636,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_5get_sentence_id(PyObject *__pyx_v_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_2get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_2get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -31369,7 +29646,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_id", 0);
+  __Pyx_RefNannySetupContext("get_sentence_id");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":24
  * 
@@ -31379,10 +29656,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3
  *     def get_sentence(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__get_sentence_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__get_sentence_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(__pyx_v_i);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -31408,17 +29685,6 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_6get_sentence(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":26
  *         return self.darray.get_sentence_id(i)
  * 
@@ -31427,7 +29693,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_7get_sentence(PyObject *__pyx_v_sel
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_3get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_3get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -31436,7 +29703,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence", 0);
+  __Pyx_RefNannySetupContext("get_sentence");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":27
  * 
@@ -31446,10 +29713,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa
  *     def get_sentence_position(self, loc):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__get_sentence); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__get_sentence); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(__pyx_v_i);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -31475,17 +29742,6 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence_position (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_8get_sentence_position(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":29
  *         return self.darray.get_sentence(i)
  * 
@@ -31494,7 +29750,8 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_9get_sentence_position(PyObject *__
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -31503,7 +29760,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_position", 0);
+  __Pyx_RefNannySetupContext("get_sentence_position");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":30
  * 
@@ -31513,10 +29770,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx
  *     def read_text(self, filename, side):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_89); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s_89); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(__pyx_v_loc);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_loc);
   __Pyx_GIVEREF(__pyx_v_loc);
@@ -31542,40 +29799,75 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_10read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
-static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":32
+ *         return self.darray.get_sentence_position(loc)
+ * 
+ *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
+ *         '''Constructs suffix array using the algorithm
+ *         of Larsson & Sadahkane (1999)'''
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_5read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
+static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_filename = 0;
   PyObject *__pyx_v_side = 0;
-  PyObject *__pyx_r = 0;
+  int __pyx_v_V;
+  int __pyx_v_N;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_h;
+  int __pyx_v_a_i;
+  int __pyx_v_n;
+  int __pyx_v_current_run;
+  int __pyx_v_skip;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_word_count = 0;
+  float __pyx_v_sort_start_time;
+  float __pyx_v_start_time;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  long __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
+  __Pyx_RefNannySetupContext("read_text");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("read_text", 1, 2, 2, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -31594,50 +29886,6 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_10read_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":32
- *         return self.darray.get_sentence_position(loc)
- * 
- *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
- *         '''Constructs suffix array using the algorithm
- *         of Larsson & Sadahkane (1999)'''
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side) {
-  int __pyx_v_V;
-  int __pyx_v_N;
-  int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_h;
-  int __pyx_v_a_i;
-  int __pyx_v_n;
-  int __pyx_v_current_run;
-  int __pyx_v_skip;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_word_count = 0;
-  float __pyx_v_sort_start_time;
-  float __pyx_v_start_time;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  long __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":38
  *         cdef IntList isa, word_count
@@ -31654,13 +29902,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__use_sent_id), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->darray);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->darray));
-  __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
   __pyx_t_2 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":39
@@ -31670,7 +29918,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *         V = len(self.darray.id2word)
  * 
  */
-  __pyx_t_2 = ((PyObject *)__pyx_v_self->darray);
+  __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
   __Pyx_INCREF(__pyx_t_2);
   __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -31683,7 +29931,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  * 
  *         self.sa = IntList(initial_len=N)
  */
-  __pyx_t_2 = __pyx_v_self->darray->id2word;
+  __pyx_t_2 = ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->id2word;
   __Pyx_INCREF(__pyx_t_2);
   __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -31702,13 +29950,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->sa);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
-  __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":43
@@ -31724,13 +29972,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->ha);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->ha));
-  __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha));
+  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":45
@@ -31746,7 +29994,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_isa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
@@ -31765,7 +30013,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_word_count = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
@@ -31806,7 +30054,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  */
-    __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
+    __pyx_v_a_i = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->data->arr[__pyx_v_i]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":53
  *         for i from 0 <= i < N:
@@ -31844,7 +30092,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0
  */
-    (__pyx_v_self->ha->arr[__pyx_v_i]) = __pyx_v_n;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i]) = __pyx_v_n;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":58
  *         for i from 0 <= i < V+1:
@@ -31882,7 +30130,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  */
-    __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
+    __pyx_v_a_i = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->data->arr[__pyx_v_i]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":63
  *         for i from 0 <= i < N:
@@ -31891,7 +30139,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  */
-    (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":64
  *             a_i = self.darray.data.arr[i]
@@ -31900,7 +30148,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  */
-    (__pyx_v_isa->arr[__pyx_v_i]) = ((__pyx_v_self->ha->arr[(__pyx_v_a_i + 1)]) - 1);
+    (__pyx_v_isa->arr[__pyx_v_i]) = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[(__pyx_v_a_i + 1)]) - 1);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":65
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
@@ -31940,7 +30188,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_t_6 = (__pyx_v_i < __pyx_v_V);
     if (__pyx_t_6) {
-      __pyx_t_7 = (((__pyx_v_self->ha->arr[(__pyx_v_i + 1)]) - (__pyx_v_self->ha->arr[__pyx_v_i])) == 1);
+      __pyx_t_7 = (((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[(__pyx_v_i + 1)]) - (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i])) == 1);
       __pyx_t_8 = __pyx_t_7;
     } else {
       __pyx_t_8 = __pyx_t_6;
@@ -31955,7 +30203,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                 if current_run > 0:
  */
       __pyx_v_current_run = (__pyx_v_current_run + 1);
-      goto __pyx_L11;
+      goto __pyx_L14;
     }
     /*else*/ {
 
@@ -31976,7 +30224,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                     current_run = 0
  * 
  */
-        (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":75
  *                 if current_run > 0:
@@ -31986,11 +30234,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))
  */
         __pyx_v_current_run = 0;
-        goto __pyx_L12;
+        goto __pyx_L15;
       }
-      __pyx_L12:;
+      __pyx_L15:;
     }
-    __pyx_L11:;
+    __pyx_L14:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":77
@@ -32008,7 +30256,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_2 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_9));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_90));
   PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_90));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_90));
@@ -32038,7 +30286,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *             logger.debug("    Refining, sort depth = %d", h)
  */
   while (1) {
-    __pyx_t_8 = ((__pyx_v_self->sa->arr[0]) != (-__pyx_v_N));
+    __pyx_t_8 = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[0]) != (-__pyx_v_N));
     if (!__pyx_t_8) break;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":82
@@ -32065,7 +30313,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     __pyx_t_2 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_91));
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_91));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_91));
@@ -32114,7 +30362,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                     skip = skip + self.sa.arr[i]
  *                     i = i - self.sa.arr[i]
  */
-      __pyx_t_8 = ((__pyx_v_self->sa->arr[__pyx_v_i]) < 0);
+      __pyx_t_8 = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) < 0);
       if (__pyx_t_8) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":88
@@ -32124,7 +30372,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                     i = i - self.sa.arr[i]
  *                 else:
  */
-        __pyx_v_skip = (__pyx_v_skip + (__pyx_v_self->sa->arr[__pyx_v_i]));
+        __pyx_v_skip = (__pyx_v_skip + (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]));
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":89
  *                 if self.sa.arr[i] < 0:
@@ -32133,8 +30381,8 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                 else:
  *                     if skip < 0:
  */
-        __pyx_v_i = (__pyx_v_i - (__pyx_v_self->sa->arr[__pyx_v_i]));
-        goto __pyx_L17;
+        __pyx_v_i = (__pyx_v_i - (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]));
+        goto __pyx_L20;
       }
       /*else*/ {
 
@@ -32155,7 +30403,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  */
-          (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
+          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":93
  *                     if skip < 0:
@@ -32165,9 +30413,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                     self.q3sort(i, j, h, isa)
  */
           __pyx_v_skip = 0;
-          goto __pyx_L18;
+          goto __pyx_L21;
         }
-        __pyx_L18:;
+        __pyx_L21:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":94
  *                         self.sa.arr[i+skip] = skip
@@ -32176,7 +30424,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  */
-        __pyx_v_j = (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]);
+        __pyx_v_j = (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i])]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":95
  *                         skip = 0
@@ -32185,7 +30433,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *                     i = j+1
  *             if skip < 0:
  */
-        __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
@@ -32194,7 +30442,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
         __pyx_t_10 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __pyx_t_11 = PyTuple_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_11));
         PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_9);
@@ -32222,7 +30470,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
         __pyx_v_i = (__pyx_v_j + 1);
       }
-      __pyx_L17:;
+      __pyx_L20:;
     }
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":97
@@ -32242,10 +30490,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *             h = h * 2
  *             logger.debug("    Refinement took %f seconds", (monitor_cpu() - sort_start_time))
  */
-      (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
-      goto __pyx_L19;
+      (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
+      goto __pyx_L22;
     }
-    __pyx_L19:;
+    __pyx_L22:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":99
  *             if skip < 0:
@@ -32271,7 +30519,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_92));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_92));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_92));
@@ -32328,7 +30576,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
  * 
  */
-    (__pyx_v_self->sa->arr[__pyx_v_j]) = __pyx_v_i;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_j]) = __pyx_v_i;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":107
@@ -32346,7 +30594,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
   __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_11);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_11));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_95));
   PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_kp_s_95));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_95));
@@ -32377,26 +30625,49 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_12q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
-static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":109
+ *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
+ * 
+ *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
+ *         '''This is a ternary quicksort. It divides the array into
+ *         three partitions: items less than the pivot, items equal
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_6q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_h;
   struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
   PyObject *__pyx_v_pad = 0;
-  PyObject *__pyx_r = 0;
+  int __pyx_v_k;
+  int __pyx_v_midpoint;
+  int __pyx_v_pval;
+  int __pyx_v_phead;
+  int __pyx_v_ptail;
+  int __pyx_v_tmp;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("q3sort (wrapper)", 0);
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  long __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__i,&__pyx_n_s__j,&__pyx_n_s__h,&__pyx_n_s__isa,&__pyx_n_s__pad,0};
+  __Pyx_RefNannySetupContext("q3sort");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__i,&__pyx_n_s__j,&__pyx_n_s__h,&__pyx_n_s__isa,&__pyx_n_s__pad,0};
     PyObject* values[5] = {0,0,0,0,0};
     values[4] = ((PyObject *)__pyx_kp_s_45);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -32406,22 +30677,26 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa);
+        if (likely(values[3])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -32432,7 +30707,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -32460,44 +30735,6 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_isa), __pyx_ptype_3_sa_IntList, 1, "isa", 0))) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_12q3sort(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_i, __pyx_v_j, __pyx_v_h, __pyx_v_isa, __pyx_v_pad);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":109
- *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
- * 
- *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
- *         '''This is a ternary quicksort. It divides the array into
- *         three partitions: items less than the pivot, items equal
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad) {
-  int __pyx_v_k;
-  int __pyx_v_midpoint;
-  int __pyx_v_pval;
-  int __pyx_v_phead;
-  int __pyx_v_ptail;
-  int __pyx_v_tmp;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  long __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *__pyx_t_8 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("q3sort", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":116
  *         cdef int k, midpoint, pval, phead, ptail, tmp
@@ -32521,7 +30758,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __pyx_t_3 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -32532,7 +30769,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -32542,9 +30779,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":118
  *         if j-i < -1:
@@ -32566,9 +30803,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __Pyx_XDECREF(__pyx_r);
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
-    goto __pyx_L4;
+    goto __pyx_L7;
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":120
  *         if j-i == -1:    # recursive base case -- empty interval
@@ -32587,7 +30824,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *             self.sa.arr[i] = -1
  *             return
  */
-    (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]) = __pyx_v_i;
+    (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i])]) = __pyx_v_i;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":122
  *         if (j-i == 0):    # recursive base case -- singleton interval
@@ -32596,7 +30833,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *             return
  * 
  */
-    (__pyx_v_self->sa->arr[__pyx_v_i]) = -1;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) = -1;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":123
  *             isa.arr[self.sa.arr[i]] = i
@@ -32608,9 +30845,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __Pyx_XDECREF(__pyx_r);
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L8;
   }
-  __pyx_L5:;
+  __pyx_L8:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":132
  *         # If the method of assigning word_id's is changed, this method
@@ -32628,7 +30865,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  */
-  __pyx_v_pval = (__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
+  __pyx_v_pval = (__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":134
  *         midpoint = (i+j)/2
@@ -32647,7 +30884,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  */
-    __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_midpoint]);
+    __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":136
  *         if i != midpoint:
@@ -32656,7 +30893,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *             self.sa.arr[i] = tmp
  *         phead = i
  */
-    (__pyx_v_self->sa->arr[__pyx_v_midpoint]) = (__pyx_v_self->sa->arr[__pyx_v_i]);
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":137
  *             tmp = self.sa.arr[midpoint]
@@ -32665,10 +30902,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *         phead = i
  *         ptail = i
  */
-    (__pyx_v_self->sa->arr[__pyx_v_i]) = __pyx_v_tmp;
-    goto __pyx_L6;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) = __pyx_v_tmp;
+    goto __pyx_L9;
   }
-  __pyx_L6:;
+  __pyx_L9:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":138
  *             self.sa.arr[midpoint] = self.sa.arr[i]
@@ -32705,7 +30942,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]
  */
-    __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
+    __pyx_t_1 = ((__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
     if (__pyx_t_1) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":145
@@ -32725,7 +30962,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  */
-        __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
+        __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":147
  *                 if k > ptail+1:
@@ -32734,7 +30971,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  *                     self.sa.arr[ptail+1] = tmp
  */
-        (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":148
  *                     tmp = self.sa.arr[phead]
@@ -32743,7 +30980,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  */
-        (__pyx_v_self->sa->arr[__pyx_v_k]) = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":149
  *                     self.sa.arr[phead] = self.sa.arr[k]
@@ -32752,8 +30989,8 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]
  */
-        (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = __pyx_v_tmp;
-        goto __pyx_L10;
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]) = __pyx_v_tmp;
+        goto __pyx_L13;
       }
       /*else*/ {
 
@@ -32764,7 +31001,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  */
-        __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
+        __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":152
  *                 else: # k == ptail+1
@@ -32773,7 +31010,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  */
-        (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":153
  *                     tmp = self.sa.arr[phead]
@@ -32782,9 +31019,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                 phead = phead + 1
  *                 ptail = ptail + 1
  */
-        (__pyx_v_self->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
+        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
       }
-      __pyx_L10:;
+      __pyx_L13:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":154
  *                     self.sa.arr[phead] = self.sa.arr[k]
@@ -32803,7 +31040,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  */
       __pyx_v_ptail = (__pyx_v_ptail + 1);
-      goto __pyx_L9;
+      goto __pyx_L12;
     }
     /*else*/ {
 
@@ -32814,7 +31051,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]
  */
-      __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
+      __pyx_t_1 = ((__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
       if (__pyx_t_1) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":158
@@ -32834,7 +31071,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp
  */
-          __pyx_v_tmp = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
+          __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]);
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":160
  *                     if k > ptail+1:
@@ -32843,7 +31080,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                         self.sa.arr[k] = tmp
  *                     ptail = ptail + 1
  */
-          (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
+          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":161
  *                         tmp = self.sa.arr[ptail+1]
@@ -32852,10 +31089,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *                     ptail = ptail + 1
  * 
  */
-          (__pyx_v_self->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
-          goto __pyx_L12;
+          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
+          goto __pyx_L15;
         }
-        __pyx_L12:;
+        __pyx_L15:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":162
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
@@ -32865,11 +31102,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *         # recursively sort smaller suffixes
  */
         __pyx_v_ptail = (__pyx_v_ptail + 1);
-        goto __pyx_L11;
+        goto __pyx_L14;
       }
-      __pyx_L11:;
+      __pyx_L14:;
     }
-    __pyx_L9:;
+    __pyx_L12:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":165
@@ -32879,7 +31116,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  * 
  *         # update suffixes with pivot value
  */
-  __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_4 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
@@ -32890,7 +31127,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_7 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __pyx_t_8 = PyTuple_New(5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_8));
   PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
@@ -32929,7 +31166,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1
  */
-    (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
+    (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":171
@@ -32949,10 +31186,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  * 
  *         # recursively sort larger suffixes
  */
-    (__pyx_v_self->sa->arr[__pyx_v_phead]) = -1;
-    goto __pyx_L15;
+    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = -1;
+    goto __pyx_L18;
   }
-  __pyx_L15:;
+  __pyx_L18:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":175
  * 
@@ -32961,7 +31198,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  * 
  * 
  */
-  __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __pyx_t_8 = PyInt_FromLong((__pyx_v_ptail + 1)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
@@ -32972,7 +31209,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_2 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
   PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -33011,27 +31248,6 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_14write_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":178
  * 
  * 
@@ -33040,7 +31256,9 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -33049,7 +31267,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text", 0);
+  __Pyx_RefNannySetupContext("write_text");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":179
  * 
@@ -33058,12 +31285,12 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_
  * 
  *     def read_binary(self, char* filename):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_t_2 = 0;
@@ -33087,27 +31314,6 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_16read_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":181
  *         self.darray.write_text(filename)
  * 
@@ -33116,11 +31322,25 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_sel
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_binary", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":183
  *     def read_binary(self, char* filename):
@@ -33138,7 +31358,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->read_handle(__pyx_v_self->darray, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":185
  *         f = fopen(filename, "r")
@@ -33147,7 +31367,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
  *         self.ha.read_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->read_handle(__pyx_v_self->sa, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":186
  *         self.darray.read_handle(f)
@@ -33156,7 +31376,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->read_handle(__pyx_v_self->ha, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":187
  *         self.sa.read_handle(f)
@@ -33173,27 +31393,6 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_18write_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":189
  *         fclose(f)
  * 
@@ -33202,11 +31401,25 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_se
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_binary", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("write_binary");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":191
  *     def write_binary(self, char* filename):
@@ -33224,7 +31437,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->write_handle(__pyx_v_self->darray, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":193
  *         f = fopen(filename, "w")
@@ -33233,7 +31446,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
  *         self.ha.write_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->write_handle(__pyx_v_self->sa, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":194
  *         self.darray.write_handle(f)
@@ -33242,7 +31455,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->write_handle(__pyx_v_self->ha, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha, __pyx_v_f);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":195
  *         self.sa.write_handle(f)
@@ -33259,27 +31472,6 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_20write_enhanced(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":197
  *         fclose(f)
  * 
@@ -33288,7 +31480,9 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_
  *             self.darray.write_enhanced_handle(f)
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_a_i = NULL;
   PyObject *__pyx_v_w_i = NULL;
@@ -33310,7 +31504,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced", 0);
+  __Pyx_RefNannySetupContext("write_enhanced");
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
  * 
@@ -33323,7 +31526,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -33335,22 +31538,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
+        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_4);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_INCREF(__pyx_t_4);
-          __pyx_v_f = __pyx_t_4;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_v_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":199
  *     def write_enhanced(self, char* filename):
@@ -33359,18 +31561,18 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  */
-          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
           __Pyx_INCREF(__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":200
  *         with open(filename, "w") as f:
@@ -33379,43 +31581,35 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->sa)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sa))) {
-            __pyx_t_2 = ((PyObject *)__pyx_v_self->sa); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa))) {
+            __pyx_t_7 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa); __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sa)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_7);
+            __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_7)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break;
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
+            } else if (PyTuple_CheckExact(__pyx_t_7)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
             } else {
-              __pyx_t_1 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_7);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_a_i);
-            __pyx_v_a_i = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_a_i = __pyx_t_2;
+            __pyx_t_2 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":201
  *             self.darray.write_enhanced_handle(f)
@@ -33424,22 +31618,22 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  *             f.write("\n")
  *             for w_i in self.ha:
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_1));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
+            __pyx_t_1 = 0;
+            __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_4));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-            __pyx_t_4 = 0;
-            __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":202
  *             for a_i in self.sa:
@@ -33448,12 +31642,12 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_t_7 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_7);
+          __pyx_t_1 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":203
  *                 f.write("%d " % a_i)
@@ -33462,43 +31656,35 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  *                 f.write("%d " % w_i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)__pyx_v_self->ha)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->ha))) {
-            __pyx_t_4 = ((PyObject *)__pyx_v_self->ha); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha))) {
+            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha); __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->ha)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_4);
-            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
-            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_7 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_7); __pyx_t_8++;
+            } else if (PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_7); __pyx_t_8++;
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_4);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_7 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_7)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_7);
             }
             __Pyx_XDECREF(__pyx_v_w_i);
-            __pyx_v_w_i = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_w_i = __pyx_t_7;
+            __pyx_t_7 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":204
  *             f.write("\n")
@@ -33507,22 +31693,22 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  *             f.write("\n")
  * 
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_7 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(__pyx_t_7);
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":205
  *             for w_i in self.ha:
@@ -33531,21 +31717,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
-          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_98), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_98), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+        goto __pyx_L16_try_end;
+        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L14_try_end;
-        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
@@ -33557,75 +31743,75 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_4, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_1, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_7));
           __Pyx_INCREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
-          __Pyx_INCREF(__pyx_t_4);
-          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4);
-          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
-          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
+          __Pyx_INCREF(__pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_2);
+          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_7, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_4, __pyx_t_1);
-            __pyx_t_10 = 0; __pyx_t_4 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
-            goto __pyx_L22;
+            __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_1, __pyx_t_2);
+            __pyx_t_10 = 0; __pyx_t_1 = 0; __pyx_t_2 = 0; 
+            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+            goto __pyx_L23;
           }
-          __pyx_L22:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __pyx_L23:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L8_exception_handled;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          goto __pyx_L10_exception_handled;
         }
-        __pyx_L9_except_error:;
+        __pyx_L11_except_error:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
         goto __pyx_L1_error;
-        __pyx_L8_exception_handled:;
+        __pyx_L10_exception_handled:;
+        __Pyx_XGIVEREF(__pyx_t_4);
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_XGIVEREF(__pyx_t_7);
-        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L14_try_end:;
+        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __pyx_L16_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_99, NULL);
+        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_99, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L23;
-    __pyx_L3_error:;
+    goto __pyx_L24;
+    __pyx_L5_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L23:;
+    __pyx_L24:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -33633,7 +31819,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -33659,7 +31845,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__search_high", 0);
+  __Pyx_RefNannySetupContext("__search_high");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":210
  *         cdef int midpoint
@@ -33710,7 +31896,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
  *         else:
  *             return self.__search_high(word_id, offset, low, midpoint)
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
     goto __pyx_L0;
     goto __pyx_L4;
   }
@@ -33723,7 +31909,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
  * 
  *     cdef int __search_low(self, int word_id, int offset, int low, int high):
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
     goto __pyx_L0;
   }
   __pyx_L4:;
@@ -33747,7 +31933,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__search_low", 0);
+  __Pyx_RefNannySetupContext("__search_low");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":221
  *         cdef int midpoint
@@ -33798,7 +31984,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
  *         else:
  *             return self.__search_low(word_id, offset, midpoint+1, high)
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
     goto __pyx_L0;
     goto __pyx_L4;
   }
@@ -33811,7 +31997,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
     goto __pyx_L0;
   }
   __pyx_L4:;
@@ -33839,7 +32025,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get_range", 0);
+  __Pyx_RefNannySetupContext("__get_range");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":230
  * 
@@ -33849,7 +32035,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":231
@@ -33859,10 +32045,10 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):
  */
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -33906,7 +32092,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__lookup_helper", 0);
+  __Pyx_RefNannySetupContext("__lookup_helper");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":236
  *         cdef int midpoint
@@ -33931,7 +32117,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
     __pyx_t_3 = PyInt_FromLong((__pyx_v_self->ha->arr[(__pyx_v_word_id + 1)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -33997,7 +32183,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -34024,7 +32210,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -34041,7 +32227,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *     def lookup(self, word, int offset, int low, int high):
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -34063,23 +32249,37 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":249
+ *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
+ * 
+ *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
+ *         cdef int wordid
+ *         if low == -1:
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_word = 0;
   int __pyx_v_offset;
   int __pyx_v_low;
   int __pyx_v_high;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_word_id = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("lookup (wrapper)", 0);
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
+  __Pyx_RefNannySetupContext("lookup");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
     PyObject* values[4] = {0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -34088,28 +32288,32 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high);
+        if (likely(values[3])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -34132,31 +32336,6 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_22lookup(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_word, __pyx_v_offset, __pyx_v_low, __pyx_v_high);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":249
- *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
- * 
- *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
- *         cdef int wordid
- *         if low == -1:
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high) {
-  PyObject *__pyx_v_word_id = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lookup", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":251
  *     def lookup(self, word, int offset, int low, int high):
@@ -34176,9 +32355,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
  *             high = len(self.sa)
  */
     __pyx_v_low = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":253
  *         if low == -1:
@@ -34197,14 +32376,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]
  */
-    __pyx_t_2 = ((PyObject *)__pyx_v_self->sa);
+    __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_v_high = __pyx_t_3;
-    goto __pyx_L4;
+    goto __pyx_L7;
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":255
  *         if high == -1:
@@ -34213,7 +32392,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->darray->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->word2id, __pyx_v_word))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":256
@@ -34223,7 +32402,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_word_id = __pyx_t_2;
     __pyx_t_2 = 0;
@@ -34237,12 +32416,12 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->__pyx_vtab)->__lookup_helper(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L8;
   }
   /*else*/ {
 
@@ -34256,7 +32435,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
     __pyx_r = Py_None;
     goto __pyx_L0;
   }
-  __pyx_L5:;
+  __pyx_L8:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -34271,20 +32450,6 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
-  __pyx_r = __pyx_pf_3_sa_8TrieNode___cinit__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":37
  *     cdef public children
  * 
@@ -34293,14 +32458,18 @@ static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
+static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_RefNannySetupContext("__cinit__");
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":38
  * 
@@ -34312,9 +32481,9 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__p
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(__pyx_v_self->children);
-  __Pyx_DECREF(__pyx_v_self->children);
-  __pyx_v_self->children = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   __pyx_r = 0;
@@ -34328,17 +32497,6 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__p
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children___get__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":35
  * 
  * cdef class TrieNode:
@@ -34347,13 +32505,14 @@ static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_se
  *     def __cinit__(self):
  */
 
-static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->children);
-  __pyx_r = __pyx_v_self->children;
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  __pyx_r = ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -34363,85 +32522,66 @@ static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_8TrieNode_8children_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_8TrieNode_8children_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children_2__set__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_8TrieNode_8children_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_8TrieNode_8children_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->children);
-  __Pyx_DECREF(__pyx_v_self->children);
-  __pyx_v_self->children = __pyx_v_value;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_8TrieNode_8children_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_3_sa_8TrieNode_8children_5__del__(PyObject *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children_4__del__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_8TrieNode_8children_4__del__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
+static int __pyx_pf_3_sa_8TrieNode_8children_2__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pf_3_sa_8TrieNode_8children_2__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__del__");
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->children);
-  __Pyx_DECREF(__pyx_v_self->children);
-  __pyx_v_self->children = Py_None;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
+  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":45
+ *     cdef public suffix_link
+ * 
+ *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
+ *         self.phrase = phrase
+ *         self.phrase_location = phrase_location
+ */
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_phrase = 0;
   PyObject *__pyx_v_phrase_location = 0;
   PyObject *__pyx_v_suffix_link = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
     PyObject* values[3] = {0,0,0};
-
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":45
- *     cdef public suffix_link
- * 
- *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
- *         self.phrase = phrase
- *         self.phrase_location = phrase_location
- */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -34449,7 +32589,7 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__phrase);
@@ -34467,7 +32607,7 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -34490,15 +32630,6 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), __pyx_v_phrase, __pyx_v_phrase_location, __pyx_v_suffix_link);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_phrase, PyObject *__pyx_v_phrase_location, PyObject *__pyx_v_suffix_link) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":46
  * 
@@ -34509,9 +32640,9 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
  */
   __Pyx_INCREF(__pyx_v_phrase);
   __Pyx_GIVEREF(__pyx_v_phrase);
-  __Pyx_GOTREF(__pyx_v_self->phrase);
-  __Pyx_DECREF(__pyx_v_self->phrase);
-  __pyx_v_self->phrase = __pyx_v_phrase;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = __pyx_v_phrase;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":47
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
@@ -34522,9 +32653,9 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
  */
   __Pyx_INCREF(__pyx_v_phrase_location);
   __Pyx_GIVEREF(__pyx_v_phrase_location);
-  __Pyx_GOTREF(__pyx_v_self->phrase_location);
-  __Pyx_DECREF(__pyx_v_self->phrase_location);
-  __pyx_v_self->phrase_location = __pyx_v_phrase_location;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = __pyx_v_phrase_location;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":48
  *         self.phrase = phrase
@@ -34535,26 +32666,15 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
  */
   __Pyx_INCREF(__pyx_v_suffix_link);
   __Pyx_GIVEREF(__pyx_v_suffix_link);
-  __Pyx_GOTREF(__pyx_v_self->suffix_link);
-  __Pyx_DECREF(__pyx_v_self->suffix_link);
-  __pyx_v_self->suffix_link = __pyx_v_suffix_link;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = __pyx_v_suffix_link;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":41
  * 
  * cdef class ExtendedTrieNode(TrieNode):
@@ -34563,13 +32683,14 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__p
  *     cdef public suffix_link
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->phrase);
-  __pyx_r = __pyx_v_self->phrase;
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -34579,69 +32700,38 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_o
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->phrase);
-  __Pyx_DECREF(__pyx_v_self->phrase);
-  __pyx_v_self->phrase = __pyx_v_value;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(PyObject *__pyx_v_self) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__del__");
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->phrase);
-  __Pyx_DECREF(__pyx_v_self->phrase);
-  __pyx_v_self->phrase = Py_None;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":42
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase
@@ -34650,13 +32740,14 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->phrase_location);
-  __pyx_r = __pyx_v_self->phrase_location;
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -34666,69 +32757,38 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(stru
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->phrase_location);
-  __Pyx_DECREF(__pyx_v_self->phrase_location);
-  __pyx_v_self->phrase_location = __pyx_v_value;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(PyObject *__pyx_v_self) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__del__");
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->phrase_location);
-  __Pyx_DECREF(__pyx_v_self->phrase_location);
-  __pyx_v_self->phrase_location = Py_None;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":43
  *     cdef public phrase
  *     cdef public phrase_location
@@ -34737,13 +32797,14 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObjec
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->suffix_link);
-  __pyx_r = __pyx_v_self->suffix_link;
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -34753,79 +32814,71 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct _
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->suffix_link);
-  __Pyx_DECREF(__pyx_v_self->suffix_link);
-  __pyx_v_self->suffix_link = __pyx_v_value;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(PyObject *__pyx_v_self) {
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__del__");
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->suffix_link);
-  __Pyx_DECREF(__pyx_v_self->suffix_link);
-  __pyx_v_self->suffix_link = Py_None;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
+  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":55
+ *     cdef public int count
+ *     cdef public root
+ *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
+ *         self.count = 0
+ *         self.extended = extended
+ */
+
+static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_extended = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
     PyObject* values[1] = {0};
     values[0] = __pyx_k_100;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__extended);
@@ -34833,7 +32886,7 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -34852,29 +32905,6 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9TrieTable___cinit__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), __pyx_v_extended);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":55
- *     cdef public int count
- *     cdef public root
- *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
- *         self.count = 0
- *         self.extended = extended
- */
-
-static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_extended) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":56
  *     cdef public root
@@ -34883,7 +32913,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
  *         self.extended = extended
  *         if extended:
  */
-  __pyx_v_self->count = 0;
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":57
  *     def __cinit__(self, extended=False):
@@ -34893,7 +32923,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
  *             self.root = ExtendedTrieNode()
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_extended); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->extended = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended = __pyx_t_1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":58
  *         self.count = 0
@@ -34915,11 +32945,11 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
     __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    __Pyx_GOTREF(__pyx_v_self->root);
-    __Pyx_DECREF(__pyx_v_self->root);
-    __pyx_v_self->root = __pyx_t_3;
+    __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+    __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+    ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_t_3;
     __pyx_t_3 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
   /*else*/ {
 
@@ -34933,12 +32963,12 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
     __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    __Pyx_GOTREF(__pyx_v_self->root);
-    __Pyx_DECREF(__pyx_v_self->root);
-    __pyx_v_self->root = __pyx_t_3;
+    __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+    __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+    ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_t_3;
     __pyx_t_3 = 0;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -34951,17 +32981,6 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_8extended___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":52
  * 
  * cdef class TrieTable:
@@ -34970,16 +32989,17 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_s
  *     cdef public root
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -34997,27 +33017,17 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9TrieTable_8extended_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_9TrieTable_8extended_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_8extended_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->extended = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended = __pyx_t_1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -35029,17 +33039,6 @@ static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_Tri
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_5count___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":53
  * cdef class TrieTable:
  *     cdef public int extended
@@ -35048,16 +33047,17 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self
  *     def __cinit__(self, extended=False):
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -35075,27 +33075,17 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_T
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9TrieTable_5count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_9TrieTable_5count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_5count_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_self->count = __pyx_t_1;
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count = __pyx_t_1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -35107,17 +33097,6 @@ static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTa
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":54
  *     cdef public int extended
  *     cdef public int count
@@ -35126,13 +33105,14 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self)
  *         self.count = 0
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_RefNannySetupContext("__get__");
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(__pyx_v_self->root);
-  __pyx_r = __pyx_v_self->root;
+  __Pyx_INCREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+  __pyx_r = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -35142,52 +33122,32 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_Tr
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9TrieTable_4root_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pw_3_sa_9TrieTable_4root_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+static int __pyx_pf_3_sa_9TrieTable_4root_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pf_3_sa_9TrieTable_4root_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9TrieTable_4root_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_RefNannySetupContext("__set__");
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(__pyx_v_self->root);
-  __Pyx_DECREF(__pyx_v_self->root);
-  __pyx_v_self->root = __pyx_v_value;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_9TrieTable_4root_5__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pw_3_sa_9TrieTable_4root_5__del__(PyObject *__pyx_v_self) {
+static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root_4__del__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_RefNannySetupContext("__del__");
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(__pyx_v_self->root);
-  __Pyx_DECREF(__pyx_v_self->root);
-  __pyx_v_self->root = Py_None;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
+  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
@@ -35202,10 +33162,10 @@ static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTab
  * 
  */
 
-static int __pyx_f_3_sa_14PhraseLocation_contains(CYTHON_UNUSED struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, CYTHON_UNUSED int __pyx_v_sent_id) {
+static int __pyx_f_3_sa_14PhraseLocation_contains(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sent_id) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("contains", 0);
+  __Pyx_RefNannySetupContext("contains");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":82
  *     # returns true if sent_id is contained
@@ -35223,9 +33183,16 @@ static int __pyx_f_3_sa_14PhraseLocation_contains(CYTHON_UNUSED struct __pyx_obj
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":84
+ *         return 1
+ * 
+ *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
+ *             arr=None, int num_subpatterns=1):
+ *         self.sa_low = sa_low
+ */
+
+static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_sa_low;
   int __pyx_v_sa_high;
   int __pyx_v_arr_low;
@@ -35234,9 +33201,12 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
   int __pyx_v_num_subpatterns;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
     PyObject* values[6] = {0,0,0,0,0,0};
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":85
@@ -35249,8 +33219,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
     values[4] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -35261,7 +33230,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa_low);
@@ -35294,7 +33263,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -35343,26 +33312,6 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_14PhraseLocation___cinit__(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self), __pyx_v_sa_low, __pyx_v_sa_high, __pyx_v_arr_low, __pyx_v_arr_high, __pyx_v_arr, __pyx_v_num_subpatterns);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":84
- *         return 1
- * 
- *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
- *             arr=None, int num_subpatterns=1):
- *         self.sa_low = sa_low
- */
-
-static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sa_low, int __pyx_v_sa_high, int __pyx_v_arr_low, int __pyx_v_arr_high, PyObject *__pyx_v_arr, int __pyx_v_num_subpatterns) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":86
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
@@ -35371,7 +33320,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  */
-  __pyx_v_self->sa_low = __pyx_v_sa_low;
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->sa_low = __pyx_v_sa_low;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":87
  *             arr=None, int num_subpatterns=1):
@@ -35380,7 +33329,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  */
-  __pyx_v_self->sa_high = __pyx_v_sa_high;
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->sa_high = __pyx_v_sa_high;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":88
  *         self.sa_low = sa_low
@@ -35389,7 +33338,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  *         self.arr_high = arr_high
  *         self.arr = arr
  */
-  __pyx_v_self->arr_low = __pyx_v_arr_low;
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr_low = __pyx_v_arr_low;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":89
  *         self.sa_high = sa_high
@@ -35398,7 +33347,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns
  */
-  __pyx_v_self->arr_high = __pyx_v_arr_high;
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr_high = __pyx_v_arr_high;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":90
  *         self.arr_low = arr_low
@@ -35410,9 +33359,9 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
   if (!(likely(((__pyx_v_arr) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_arr, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_arr);
   __Pyx_GIVEREF(__pyx_v_arr);
-  __Pyx_GOTREF(__pyx_v_self->arr);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->arr));
-  __pyx_v_self->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr));
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":91
  *         self.arr_high = arr_high
@@ -35421,7 +33370,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  * 
  * 
  */
-  __pyx_v_self->num_subpatterns = __pyx_v_num_subpatterns;
+  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->num_subpatterns = __pyx_v_num_subpatterns;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -35433,39 +33382,54 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":101
+ *     cdef IntList sa
+ * 
+ *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
+ *         self.sample_size = sample_size
+ *         self.sa = fsarray.sa
+ */
+
+static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_sample_size;
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_size)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_size);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -35485,34 +33449,6 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_7Sampler___cinit__(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), __pyx_v_sample_size, __pyx_v_fsarray);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":101
- *     cdef IntList sa
- * 
- *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
- *         self.sample_size = sample_size
- *         self.sa = fsarray.sa
- */
-
-static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, int __pyx_v_sample_size, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":102
  * 
@@ -35521,7 +33457,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  */
-  __pyx_v_self->sample_size = __pyx_v_sample_size;
+  ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size = __pyx_v_sample_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":103
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
@@ -35532,9 +33468,9 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray->sa));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray->sa));
-  __Pyx_GOTREF(__pyx_v_self->sa);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
-  __pyx_v_self->sa = __pyx_v_fsarray->sa;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa));
+  ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa = __pyx_v_fsarray->sa;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":104
  *         self.sample_size = sample_size
@@ -35561,7 +33497,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
     __pyx_t_2 = PyInt_FromLong(__pyx_v_sample_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_101));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_101));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_101));
@@ -35573,7 +33509,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
   /*else*/ {
 
@@ -35594,7 +33530,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -35609,23 +33545,6 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location); /*proto*/
-static char __pyx_doc_3_sa_7Sampler_2sample[] = "Returns a sample of the locations for\n        the phrase.    If there are less than self.sample_size\n        locations, return all of them; otherwise, return\n        up to self.sample_size locations.    In the latter case,\n        we choose to sample UNIFORMLY -- that is, the locations\n        are chosen at uniform intervals over the entire set, rather\n        than randomly.    This makes the algorithm deterministic, which\n        is good for things like MERT";
-static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sample (wrapper)", 0);
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_7Sampler_2sample(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location));
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":109
  *             logger.info("Sampling strategy: no sampling")
  * 
@@ -35634,7 +33553,9 @@ static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject
  *         the phrase.    If there are less than self.sample_size
  */
 
-static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location) {
+static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location); /*proto*/
+static char __pyx_doc_3_sa_7Sampler_1sample[] = "Returns a sample of the locations for\n        the phrase.    If there are less than self.sample_size\n        locations, return all of them; otherwise, return\n        up to self.sample_size locations.    In the latter case,\n        we choose to sample UNIFORMLY -- that is, the locations\n        are chosen at uniform intervals over the entire set, rather\n        than randomly.    This makes the algorithm deterministic, which\n        is good for things like MERT";
+static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location) {
   struct __pyx_obj_3_sa_IntList *__pyx_v_sample = 0;
   double __pyx_v_i;
   double __pyx_v_stepsize;
@@ -35651,7 +33572,8 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sample", 0);
+  __Pyx_RefNannySetupContext("sample");
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":122
  *         cdef int num_locations, val, j
@@ -35672,7 +33594,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  */
-  __pyx_t_2 = (((PyObject *)__pyx_v_phrase_location->arr) == Py_None);
+  __pyx_t_2 = (((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr) == Py_None);
   if (__pyx_t_2) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":124
@@ -35682,7 +33604,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  */
-    __pyx_v_num_locations = (__pyx_v_phrase_location->sa_high - __pyx_v_phrase_location->sa_low);
+    __pyx_v_num_locations = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_high - ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":125
  *         if phrase_location.arr is None:
@@ -35691,9 +33613,9 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  */
-    __pyx_t_2 = (__pyx_v_self->sample_size == -1);
+    __pyx_t_2 = (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size == -1);
     if (!__pyx_t_2) {
-      __pyx_t_3 = (__pyx_v_num_locations <= __pyx_v_self->sample_size);
+      __pyx_t_3 = (__pyx_v_num_locations <= ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
       __pyx_t_4 = __pyx_t_3;
     } else {
       __pyx_t_4 = __pyx_t_2;
@@ -35707,8 +33629,8 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  */
-      ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_self->sa->arr + __pyx_v_phrase_location->sa_low), __pyx_v_num_locations);
-      goto __pyx_L4;
+      ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa->arr + ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low), __pyx_v_num_locations);
+      goto __pyx_L6;
     }
     /*else*/ {
 
@@ -35719,11 +33641,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:
  */
-      if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
+      if (unlikely(((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
+      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size));
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":129
  *             else:
@@ -35732,7 +33654,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:
  *                     '''Note: int(i) not guaranteed to have the desired
  */
-      __pyx_v_i = __pyx_v_phrase_location->sa_low;
+      __pyx_v_i = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":130
  *                 stepsize = float(num_locations)/float(self.sample_size)
@@ -35742,9 +33664,9 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                     effect, according to the python documentation'''
  */
       while (1) {
-        __pyx_t_4 = (__pyx_v_i < __pyx_v_phrase_location->sa_high);
+        __pyx_t_4 = (__pyx_v_i < ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_high);
         if (__pyx_t_4) {
-          __pyx_t_2 = (__pyx_v_sample->len < __pyx_v_self->sample_size);
+          __pyx_t_2 = (__pyx_v_sample->len < ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
           __pyx_t_3 = __pyx_t_2;
         } else {
           __pyx_t_3 = __pyx_t_4;
@@ -35769,7 +33691,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                         val = int(floor(i))
  */
           __pyx_v_val = ((int)ceil(__pyx_v_i));
-          goto __pyx_L7;
+          goto __pyx_L9;
         }
         /*else*/ {
 
@@ -35782,7 +33704,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
           __pyx_v_val = ((int)floor(__pyx_v_i));
         }
-        __pyx_L7:;
+        __pyx_L9:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":137
  *                     else:
@@ -35791,7 +33713,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                     i = i + stepsize
  *         else:
  */
-        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (__pyx_v_self->sa->arr[__pyx_v_val]));
+        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa->arr[__pyx_v_val]));
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":138
  *                         val = int(floor(i))
@@ -35803,8 +33725,8 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         __pyx_v_i = (__pyx_v_i + __pyx_v_stepsize);
       }
     }
-    __pyx_L4:;
-    goto __pyx_L3;
+    __pyx_L6:;
+    goto __pyx_L5;
   }
   /*else*/ {
 
@@ -35815,16 +33737,16 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr
  */
-    __pyx_t_5 = (__pyx_v_phrase_location->arr_high - __pyx_v_phrase_location->arr_low);
-    if (unlikely(__pyx_v_phrase_location->num_subpatterns == 0)) {
+    __pyx_t_5 = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_high - ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low);
+    if (unlikely(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns == 0)) {
       PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_phrase_location->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
+    else if (sizeof(int) == sizeof(long) && unlikely(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
       PyErr_Format(PyExc_OverflowError, "value too large to perform division");
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, __pyx_v_phrase_location->num_subpatterns);
+    __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns);
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":141
  *         else:
@@ -35833,9 +33755,9 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                 sample = phrase_location.arr
  *             else:
  */
-    __pyx_t_3 = (__pyx_v_self->sample_size == -1);
+    __pyx_t_3 = (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size == -1);
     if (!__pyx_t_3) {
-      __pyx_t_4 = (__pyx_v_num_locations <= __pyx_v_self->sample_size);
+      __pyx_t_4 = (__pyx_v_num_locations <= ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
       __pyx_t_2 = __pyx_t_4;
     } else {
       __pyx_t_2 = __pyx_t_3;
@@ -35849,10 +33771,10 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  */
-      __Pyx_INCREF(((PyObject *)__pyx_v_phrase_location->arr));
+      __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr));
       __Pyx_DECREF(((PyObject *)__pyx_v_sample));
-      __pyx_v_sample = __pyx_v_phrase_location->arr;
-      goto __pyx_L8;
+      __pyx_v_sample = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr;
+      goto __pyx_L10;
     }
     /*else*/ {
 
@@ -35863,11 +33785,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:
  */
-      if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
+      if (unlikely(((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
+      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size));
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":145
  *             else:
@@ -35876,7 +33798,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:
  *                     '''Note: int(i) not guaranteed to have the desired
  */
-      __pyx_v_i = __pyx_v_phrase_location->arr_low;
+      __pyx_v_i = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":146
  *                 stepsize = float(num_locations)/float(self.sample_size)
@@ -35888,7 +33810,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
       while (1) {
         __pyx_t_2 = (__pyx_v_i < __pyx_v_num_locations);
         if (__pyx_t_2) {
-          __pyx_t_3 = (__pyx_v_sample->len < (__pyx_v_self->sample_size * __pyx_v_phrase_location->num_subpatterns));
+          __pyx_t_3 = (__pyx_v_sample->len < (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size * ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns));
           __pyx_t_4 = __pyx_t_3;
         } else {
           __pyx_t_4 = __pyx_t_2;
@@ -35913,7 +33835,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                         val = int(floor(i))
  */
           __pyx_v_val = ((int)ceil(__pyx_v_i));
-          goto __pyx_L11;
+          goto __pyx_L13;
         }
         /*else*/ {
 
@@ -35926,7 +33848,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
           __pyx_v_val = ((int)floor(__pyx_v_i));
         }
-        __pyx_L11:;
+        __pyx_L13:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":153
  *                     else:
@@ -35935,7 +33857,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  */
-        __pyx_v_j = (__pyx_v_phrase_location->arr_low + (__pyx_v_val * __pyx_v_phrase_location->num_subpatterns));
+        __pyx_v_j = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low + (__pyx_v_val * ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns));
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":154
  *                         val = int(floor(i))
@@ -35944,7 +33866,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  *                     i = i + stepsize
  *         return sample
  */
-        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_phrase_location->arr->arr + __pyx_v_j), __pyx_v_phrase_location->num_subpatterns);
+        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr->arr + __pyx_v_j), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns);
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":155
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
@@ -35956,9 +33878,9 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         __pyx_v_i = (__pyx_v_i + __pyx_v_stepsize);
       }
     }
-    __pyx_L8:;
+    __pyx_L10:;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":156
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
@@ -35995,7 +33917,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
 
 static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m, int *__pyx_v_arr, int __pyx_v_start, int __pyx_v_step, int *__pyx_v_sent_id_arr) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("assign_matching", 0);
+  __Pyx_RefNannySetupContext("assign_matching");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":169
  * 
@@ -36053,14 +33975,14 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  *     cdef int i, new_len
  */
 
-static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx_t_3_sa_Matching *__pyx_v_loc1, struct __pyx_t_3_sa_Matching *__pyx_v_loc2, CYTHON_UNUSED int __pyx_v_offset_by_one, int __pyx_v_num_subpatterns, int *__pyx_v_result_len) {
+static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx_t_3_sa_Matching *__pyx_v_loc1, struct __pyx_t_3_sa_Matching *__pyx_v_loc2, int __pyx_v_offset_by_one, int __pyx_v_num_subpatterns, int *__pyx_v_result_len) {
   int __pyx_v_i;
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("append_combined_matching", 0);
+  __Pyx_RefNannySetupContext("append_combined_matching");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":180
  *     cdef int i, new_len
@@ -36159,7 +34081,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("extend_arr", 0);
+  __Pyx_RefNannySetupContext("extend_arr");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":194
  *     cdef int new_len
@@ -36228,7 +34150,7 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("median", 0);
+  __Pyx_RefNannySetupContext("median");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":201
  * 
@@ -36272,7 +34194,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("find_comparable_matchings", 0);
+  __Pyx_RefNannySetupContext("find_comparable_matchings");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":208
  *     # in which all matchings have the same first index as the one
@@ -36349,9 +34271,16 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   __Pyx_RefNannyFinishContext();
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":265
+ *     cdef IntList findexes1
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *             # compiled alignment object (REQUIRED)
+ *             Alignment alignment,
+ */
+
+static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment = 0;
   float __pyx_v_by_slack_factor;
   char *__pyx_v_category;
@@ -36375,9 +34304,18 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
   int __pyx_v_use_index;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_104,&__pyx_n_s_105,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
+  __Pyx_RefNannySetupContext("__cinit__");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_104,&__pyx_n_s_105,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
     PyObject* values[21] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":273
@@ -36417,8 +34355,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
     values[10] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case 21: values[20] = PyTuple_GET_ITEM(__pyx_args, 20);
         case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);
         case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
@@ -36444,9 +34381,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
         if (kw_args > 0) {
@@ -36550,7 +34488,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -36581,7 +34519,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
     }
     __pyx_v_alignment = ((struct __pyx_obj_3_sa_Alignment *)values[0]);
     if (values[1]) {
-      __pyx_v_by_slack_factor = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_by_slack_factor = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":269
@@ -36730,36 +34668,6 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_alignment), __pyx_ptype_3_sa_Alignment, 1, "alignment", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_alignment, __pyx_v_by_slack_factor, __pyx_v_category, __pyx_v_max_chunks, __pyx_v_max_initial_size, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_max_target_chunks, __pyx_v_max_target_length, __pyx_v_min_gap_size, __pyx_v_precompute_file, __pyx_v_precompute_secondary_rank, __pyx_v_precompute_rank, __pyx_v_require_aligned_terminal, __pyx_v_require_aligned_chunks, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size, __pyx_v_tight_phrases, __pyx_v_use_baeza_yates, __pyx_v_use_collocations, __pyx_v_use_index);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":265
- *     cdef IntList findexes1
- * 
- *     def __cinit__(self,             # <<<<<<<<<<<<<<
- *             # compiled alignment object (REQUIRED)
- *             Alignment alignment,
- */
-
-static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment, float __pyx_v_by_slack_factor, char *__pyx_v_category, PyObject *__pyx_v_max_chunks, unsigned int __pyx_v_max_initial_size, unsigned int __pyx_v_max_length, unsigned int __pyx_v_max_nonterminals, PyObject *__pyx_v_max_target_chunks, PyObject *__pyx_v_max_target_length, unsigned int __pyx_v_min_gap_size, PyObject *__pyx_v_precompute_file, unsigned int __pyx_v_precompute_secondary_rank, unsigned int __pyx_v_precompute_rank, int __pyx_v_require_aligned_terminal, int __pyx_v_require_aligned_chunks, unsigned int __pyx_v_train_max_initial_size, unsigned int __pyx_v_train_min_gap_size, int __pyx_v_tight_phrases, int __pyx_v_use_baeza_yates, int __pyx_v_use_collocations, int __pyx_v_use_index) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":313
  *         respectively.    This is because Chiang's model does not require
@@ -36771,7 +34679,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -36779,9 +34687,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->rules);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->rules));
-  __pyx_v_self->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":314
@@ -36797,13 +34705,13 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->rules->root);
-  __Pyx_DECREF(__pyx_v_self->rules->root);
-  __pyx_v_self->rules->root = __pyx_t_2;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root = __pyx_t_2;
   __pyx_t_2 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":315
@@ -36828,9 +34736,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":317
  *         if alignment is None:
@@ -36841,9 +34749,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_alignment));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_alignment));
-  __Pyx_GOTREF(__pyx_v_self->alignment);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->alignment));
-  __pyx_v_self->alignment = __pyx_v_alignment;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment = __pyx_v_alignment;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":321
  *         # grammar parameters and settings
@@ -36852,7 +34760,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  */
-  __pyx_v_self->max_length = __pyx_v_max_length;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length = __pyx_v_max_length;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":322
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
@@ -36861,7 +34769,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  */
-  __pyx_v_self->max_nonterminals = __pyx_v_max_nonterminals;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals = __pyx_v_max_nonterminals;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":323
  *         self.max_length = max_length
@@ -36870,7 +34778,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  */
-  __pyx_v_self->max_initial_size = __pyx_v_max_initial_size;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size = __pyx_v_max_initial_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":324
  *         self.max_nonterminals = max_nonterminals
@@ -36879,7 +34787,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  */
-  __pyx_v_self->train_max_initial_size = __pyx_v_train_max_initial_size;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size = __pyx_v_train_max_initial_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":325
  *         self.max_initial_size = max_initial_size
@@ -36888,7 +34796,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)
  */
-  __pyx_v_self->min_gap_size = __pyx_v_min_gap_size;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->min_gap_size = __pyx_v_min_gap_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":326
  *         self.train_max_initial_size = train_max_initial_size
@@ -36897,7 +34805,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.category = sym_fromstring(category, False)
  * 
  */
-  __pyx_v_self->train_min_gap_size = __pyx_v_train_min_gap_size;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size = __pyx_v_train_min_gap_size;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":327
  *         self.min_gap_size = min_gap_size
@@ -36913,7 +34821,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_4 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4);
@@ -36926,7 +34834,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
   __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_v_self->category = __pyx_t_6;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category = __pyx_t_6;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":329
  *         self.category = sym_fromstring(category, False)
@@ -36945,8 +34853,8 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         else:
  *             self.max_chunks = max_chunks
  */
-    __pyx_v_self->max_chunks = (__pyx_v_self->max_nonterminals + 1);
-    goto __pyx_L4;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_chunks = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals + 1);
+    goto __pyx_L7;
   }
   /*else*/ {
 
@@ -36958,9 +34866,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         if max_target_chunks is None:
  */
     __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_self->max_chunks = __pyx_t_6;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_chunks = __pyx_t_6;
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":334
  *             self.max_chunks = max_chunks
@@ -36979,8 +34887,8 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         else:
  *             self.max_target_chunks = max_target_chunks
  */
-    __pyx_v_self->max_target_chunks = (__pyx_v_self->max_nonterminals + 1);
-    goto __pyx_L5;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_chunks = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals + 1);
+    goto __pyx_L8;
   }
   /*else*/ {
 
@@ -36992,9 +34900,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         if max_target_length is None:
  */
     __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_self->max_target_chunks = __pyx_t_6;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_chunks = __pyx_t_6;
   }
-  __pyx_L5:;
+  __pyx_L8:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":339
  *             self.max_target_chunks = max_target_chunks
@@ -37013,8 +34921,8 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         else:
  *             self.max_target_length = max_target_length
  */
-    __pyx_v_self->max_target_length = __pyx_v_max_initial_size;
-    goto __pyx_L6;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_length = __pyx_v_max_initial_size;
+    goto __pyx_L9;
   }
   /*else*/ {
 
@@ -37026,9 +34934,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         # algorithmic parameters and settings
  */
     __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_self->max_target_length = __pyx_t_6;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_length = __pyx_t_6;
   }
-  __pyx_L6:;
+  __pyx_L9:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":345
  * 
@@ -37040,9 +34948,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
-  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
-  __pyx_v_self->precomputed_collocations = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":346
@@ -37055,9 +34963,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
-  __Pyx_DECREF(__pyx_v_self->precomputed_index);
-  __pyx_v_self->precomputed_index = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":347
@@ -37067,7 +34975,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  */
-  __pyx_v_self->use_index = __pyx_v_use_index;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_index = __pyx_v_use_index;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":348
  *         self.precomputed_index = {}
@@ -37076,7 +34984,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  */
-  __pyx_v_self->use_collocations = __pyx_v_use_collocations;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_collocations = __pyx_v_use_collocations;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":349
  *         self.use_index = use_index
@@ -37088,9 +34996,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(__pyx_v_self->max_rank);
-  __Pyx_DECREF(__pyx_v_self->max_rank);
-  __pyx_v_self->max_rank = ((PyObject *)__pyx_t_4);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank = ((PyObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":350
@@ -37102,9 +35010,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __Pyx_INCREF(__pyx_v_precompute_file);
   __Pyx_GIVEREF(__pyx_v_precompute_file);
-  __Pyx_GOTREF(__pyx_v_self->precompute_file);
-  __Pyx_DECREF(__pyx_v_self->precompute_file);
-  __pyx_v_self->precompute_file = __pyx_v_precompute_file;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file = __pyx_v_precompute_file;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":351
  *         self.max_rank = {}
@@ -37113,7 +35021,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  */
-  __pyx_v_self->precompute_rank = __pyx_v_precompute_rank;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_rank = __pyx_v_precompute_rank;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":352
  *         self.precompute_file = precompute_file
@@ -37122,7 +35030,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  */
-  __pyx_v_self->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":353
  *         self.precompute_rank = precompute_rank
@@ -37131,7 +35039,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  */
-  __pyx_v_self->use_baeza_yates = __pyx_v_use_baeza_yates;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_baeza_yates = __pyx_v_use_baeza_yates;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":354
  *         self.precompute_secondary_rank = precompute_secondary_rank
@@ -37140,7 +35048,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         if tight_phrases:
  *             self.tight_phrases = 1
  */
-  __pyx_v_self->by_slack_factor = __pyx_v_by_slack_factor;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->by_slack_factor = __pyx_v_by_slack_factor;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":355
  *         self.use_baeza_yates = use_baeza_yates
@@ -37158,8 +35066,8 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         else:
  *             self.tight_phrases = 0
  */
-    __pyx_v_self->tight_phrases = 1;
-    goto __pyx_L7;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->tight_phrases = 1;
+    goto __pyx_L10;
   }
   /*else*/ {
 
@@ -37170,9 +35078,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  * 
  *         if require_aligned_chunks:
  */
-    __pyx_v_self->tight_phrases = 0;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->tight_phrases = 0;
   }
-  __pyx_L7:;
+  __pyx_L10:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":360
  *             self.tight_phrases = 0
@@ -37190,7 +35098,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  */
-    __pyx_v_self->require_aligned_chunks = 1;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 1;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":363
  *             # one condition is a stronger version of the other.
@@ -37199,8 +35107,8 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  */
-    __pyx_v_self->require_aligned_terminal = 1;
-    goto __pyx_L8;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 1;
+    goto __pyx_L11;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":364
@@ -37219,7 +35127,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *             self.require_aligned_terminal = 1
  *         else:
  */
-    __pyx_v_self->require_aligned_chunks = 0;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":366
  *         elif require_aligned_terminal:
@@ -37228,8 +35136,8 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         else:
  *             self.require_aligned_chunks = 0
  */
-    __pyx_v_self->require_aligned_terminal = 1;
-    goto __pyx_L8;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 1;
+    goto __pyx_L11;
   }
   /*else*/ {
 
@@ -37240,7 +35148,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *             self.require_aligned_terminal = 0
  * 
  */
-    __pyx_v_self->require_aligned_chunks = 0;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 0;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":369
  *         else:
@@ -37249,9 +35157,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  * 
  * 
  */
-    __pyx_v_self->require_aligned_terminal = 0;
+    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 0;
   }
-  __pyx_L8:;
+  __pyx_L11:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":373
  * 
@@ -37262,9 +35170,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __Pyx_GOTREF(__pyx_v_self->prev_norm_prefix);
-  __Pyx_DECREF(__pyx_v_self->prev_norm_prefix);
-  __pyx_v_self->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":375
  *         self.prev_norm_prefix = ()
@@ -37276,13 +35184,13 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
   __Pyx_GIVEREF(__pyx_t_5);
-  __Pyx_GOTREF(__pyx_v_self->findexes);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->findexes));
-  __pyx_v_self->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
   __pyx_t_5 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":376
@@ -37295,13 +35203,13 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_5));
   if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
   __Pyx_GIVEREF(__pyx_t_4);
-  __Pyx_GOTREF(__pyx_v_self->findexes1);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->findexes1));
-  __pyx_v_self->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_4);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_4);
   __pyx_t_4 = 0;
 
   __pyx_r = 0;
@@ -37318,24 +35226,35 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_23HieroCachingRuleFactory_2configure[] = "This gives the RuleFactory access to the Context object.\n        Here we also use it to precompute the most expensive intersections\n        in the corpus quickly.";
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":378
+ *         self.findexes1 = IntList(initial_len=10)
+ * 
+ *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
+ *             Sampler sampler, Scorer scorer):
+ *         '''This gives the RuleFactory access to the Context object.
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_23HieroCachingRuleFactory_1configure[] = "This gives the RuleFactory access to the Context object.\n        Here we also use it to precompute the most expensive intersections\n        in the corpus quickly.";
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray = 0;
   struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray = 0;
   struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler = 0;
   struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("configure (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
+  __Pyx_RefNannySetupContext("configure");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
     PyObject* values[4] = {0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -37344,28 +35263,32 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer);
+        if (likely(values[3])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -37392,32 +35315,6 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_edarray), __pyx_ptype_3_sa_DataArray, 1, "edarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sampler), __pyx_ptype_3_sa_Sampler, 1, "sampler", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_scorer), __pyx_ptype_3_sa_Scorer, 1, "scorer", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_edarray, __pyx_v_sampler, __pyx_v_scorer);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":378
- *         self.findexes1 = IntList(initial_len=10)
- * 
- *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
- *             Sampler sampler, Scorer scorer):
- *         '''This gives the RuleFactory access to the Context object.
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray, struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray, struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler, struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("configure", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":383
  *         Here we also use it to precompute the most expensive intersections
@@ -37428,9 +35325,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray));
-  __Pyx_GOTREF(__pyx_v_self->fsa);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->fsa));
-  __pyx_v_self->fsa = __pyx_v_fsarray;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa = __pyx_v_fsarray;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":384
  *         in the corpus quickly.'''
@@ -37441,9 +35338,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray->darray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray->darray));
-  __Pyx_GOTREF(__pyx_v_self->fda);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->fda));
-  __pyx_v_self->fda = __pyx_v_fsarray->darray;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda = __pyx_v_fsarray->darray;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":385
  *         self.fsa = fsarray
@@ -37454,9 +35351,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_edarray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_edarray));
-  __Pyx_GOTREF(__pyx_v_self->eda);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->eda));
-  __pyx_v_self->eda = __pyx_v_edarray;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda = __pyx_v_edarray;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":386
  *         self.fda = fsarray.darray
@@ -37465,16 +35362,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  */
-  __pyx_t_1 = ((PyObject *)__pyx_v_self->fda);
+  __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda);
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->__pyx_vtab)->set_idmap(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->fid2symid);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->fid2symid));
-  __pyx_v_self->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":387
@@ -37484,16 +35381,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  *         self.precompute()
  *         self.sampler = sampler
  */
-  __pyx_t_2 = ((PyObject *)__pyx_v_self->eda);
+  __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda);
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->__pyx_vtab)->set_idmap(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(__pyx_v_self->eid2symid);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->eid2symid));
-  __pyx_v_self->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":388
@@ -37503,7 +35400,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  *         self.sampler = sampler
  *         self.scorer = scorer
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -37519,9 +35416,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_sampler));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_sampler));
-  __Pyx_GOTREF(__pyx_v_self->sampler);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->sampler));
-  __pyx_v_self->sampler = __pyx_v_sampler;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler = __pyx_v_sampler;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":390
  *         self.precompute()
@@ -37532,9 +35429,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_scorer));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_scorer));
-  __Pyx_GOTREF(__pyx_v_self->scorer);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->scorer));
-  __pyx_v_self->scorer = __pyx_v_scorer;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer));
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer = __pyx_v_scorer;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -37557,7 +35454,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  *         cdef IntList idmap
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_DataArray *__pyx_v_darray) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_DataArray *__pyx_v_darray) {
   int __pyx_v_word_id;
   int __pyx_v_new_word_id;
   int __pyx_v_N;
@@ -37574,7 +35471,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set_idmap", 0);
+  __Pyx_RefNannySetupContext("set_idmap");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":396
  *         cdef IntList idmap
@@ -37602,7 +35499,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_idmap = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
@@ -37632,7 +35529,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
     __pyx_t_5 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -37685,17 +35582,6 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("pattern2phrase (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":404
  * 
  * 
@@ -37704,7 +35590,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObjec
  *         result = ()
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_arity = NULL;
   PyObject *__pyx_v_word_id = NULL;
@@ -37723,7 +35610,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("pattern2phrase", 0);
+  __Pyx_RefNannySetupContext("pattern2phrase");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":406
  *     def pattern2phrase(self, pattern):
@@ -37761,20 +35648,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -37797,7 +35676,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
@@ -37823,12 +35703,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_XDECREF(__pyx_v_new_id);
       __pyx_v_new_id = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
     /*else*/ {
 
@@ -37841,12 +35721,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  */
       __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
       __Pyx_GIVEREF(__pyx_t_7);
       PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
@@ -37861,7 +35741,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
       __pyx_v_new_id = __pyx_t_8;
       __pyx_t_8 = 0;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":414
  *             else:
@@ -37871,7 +35751,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  * 
  */
     __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
     __Pyx_INCREF(__pyx_v_new_id);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_new_id);
     __Pyx_GIVEREF(__pyx_v_new_id);
@@ -37893,7 +35773,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
@@ -37924,17 +35804,6 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("pattern2phrase_plus (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":417
  *         return Phrase(result)
  * 
@@ -37943,7 +35812,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(Py
  *         # suffixed/prefixed with the NT category.
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
   PyObject *__pyx_v_patterns = NULL;
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_arity = NULL;
@@ -37964,7 +35834,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("pattern2phrase_plus", 0);
+  __Pyx_RefNannySetupContext("pattern2phrase_plus");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":420
  *         # returns a list containing both the pattern, and pattern
@@ -37974,7 +35844,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  *         arity = 0
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_patterns = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -38014,20 +35884,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -38050,7 +35912,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
@@ -38076,12 +35939,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_XDECREF(__pyx_v_new_id);
       __pyx_v_new_id = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
     /*else*/ {
 
@@ -38094,12 +35957,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  */
       __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
       __Pyx_GIVEREF(__pyx_t_7);
       PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
@@ -38114,7 +35977,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
       __pyx_v_new_id = __pyx_t_8;
       __pyx_t_8 = 0;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":429
  *             else:
@@ -38124,7 +35987,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  */
     __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
     __Pyx_INCREF(__pyx_v_new_id);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_new_id);
     __Pyx_GIVEREF(__pyx_v_new_id);
@@ -38144,8 +36007,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  */
+  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
@@ -38162,10 +36028,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns
  */
-  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
+  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9);
   __Pyx_GIVEREF(__pyx_t_9);
   __pyx_t_9 = 0;
@@ -38173,7 +36042,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_GOTREF(((PyObject *)__pyx_t_9));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_9));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
   __pyx_t_9 = 0;
@@ -38190,10 +36059,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
  *         return patterns
  * 
  */
-  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
+  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9);
   __Pyx_GIVEREF(__pyx_t_9);
   __pyx_t_9 = 0;
@@ -38201,7 +36073,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_GOTREF(((PyObject *)__pyx_t_9));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_9));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
   __pyx_t_9 = 0;
@@ -38244,17 +36116,6 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("precompute (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":435
  *         return patterns
  * 
@@ -38263,7 +36124,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   struct __pyx_obj_3_sa_Precomputation *__pyx_v_pre = 0;
   PyObject *__pyx_v_start_time = NULL;
   PyObject *__pyx_v_pattern = NULL;
@@ -38279,15 +36141,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   Py_ssize_t __pyx_t_6;
-  Py_ssize_t __pyx_t_7;
-  int __pyx_t_8;
-  int __pyx_t_9;
+  PyObject *(*__pyx_t_7)(PyObject *);
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *(*__pyx_t_9)(PyObject *);
   Py_ssize_t __pyx_t_10;
   PyObject *(*__pyx_t_11)(PyObject *);
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("precompute", 0);
+  __Pyx_RefNannySetupContext("precompute");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":438
  *         cdef Precomputation pre
@@ -38296,7 +36158,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  */
-  __pyx_t_1 = (__pyx_v_self->precompute_file != Py_None);
+  __pyx_t_1 = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file != Py_None);
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":439
@@ -38324,13 +36186,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_109));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_109));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_109));
-    __Pyx_INCREF(__pyx_v_self->precompute_file);
-    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->precompute_file);
-    __Pyx_GIVEREF(__pyx_v_self->precompute_file);
+    __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
+    PyTuple_SET_ITEM(__pyx_t_2, 1, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
+    __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
     __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -38346,8 +36208,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
     __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), __pyx_v_self->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_v_pre = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_t_2);
@@ -38360,7 +36222,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  */
-    __pyx_t_1 = (__pyx_v_pre->max_nonterminals != __pyx_v_self->max_nonterminals);
+    __pyx_t_1 = (__pyx_v_pre->max_nonterminals != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals);
     if (__pyx_t_1) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":444
@@ -38377,10 +36239,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_s_110));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_110));
@@ -38395,9 +36257,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L4;
+      goto __pyx_L6;
     }
-    __pyx_L4:;
+    __pyx_L6:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":445
  *             if pre.max_nonterminals != self.max_nonterminals:
@@ -38406,7 +36268,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  */
-    __pyx_t_1 = (__pyx_v_pre->max_length != __pyx_v_self->max_length);
+    __pyx_t_1 = (__pyx_v_pre->max_length != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length);
     if (__pyx_t_1) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":446
@@ -38423,10 +36285,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyInt_FromLong(__pyx_v_self->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_111));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_111));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_111));
@@ -38441,9 +36303,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      goto __pyx_L5;
+      goto __pyx_L7;
     }
-    __pyx_L5:;
+    __pyx_L7:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":447
  *             if pre.max_length != self.max_length:
@@ -38452,7 +36314,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  */
-    __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != __pyx_v_self->train_max_initial_size);
+    __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size);
     if (__pyx_t_1) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":448
@@ -38464,10 +36326,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
       __pyx_t_4 = PyInt_FromLong(__pyx_v_pre->train_max_initial_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
@@ -38478,7 +36340,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       __pyx_t_2 = 0;
@@ -38488,9 +36350,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_Raise(__pyx_t_2, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L6;
+      goto __pyx_L8;
     }
-    __pyx_L6:;
+    __pyx_L8:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":449
  *             if pre.train_max_initial_size != self.train_max_initial_size:
@@ -38499,7 +36361,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  */
-    __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != __pyx_v_self->train_min_gap_size);
+    __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size);
     if (__pyx_t_1) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":450
@@ -38511,10 +36373,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
       __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyInt_FromLong(__pyx_v_self->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5);
@@ -38525,7 +36387,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_5));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
       __pyx_t_5 = 0;
@@ -38535,9 +36397,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_Raise(__pyx_t_5, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L7;
+      goto __pyx_L9;
     }
-    __pyx_L7:;
+    __pyx_L9:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":451
  *             if pre.train_min_gap_size != self.train_min_gap_size:
@@ -38546,7 +36408,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  */
-    if (__pyx_v_self->use_index) {
+    if (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_index) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":452
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
@@ -38567,7 +36429,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_114));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_114));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_114));
@@ -38587,28 +36449,86 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  */
-      __pyx_t_6 = 0;
-      if (unlikely(__pyx_v_pre->precomputed_index == Py_None)) {
-        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_index, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_v_pre->precomputed_index, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_2 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_XDECREF(__pyx_t_5);
-      __pyx_t_5 = __pyx_t_2;
-      __pyx_t_2 = 0;
-      while (1) {
-        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_7, &__pyx_t_6, &__pyx_t_2, &__pyx_t_4, NULL, __pyx_t_8);
-        if (unlikely(__pyx_t_9 == 0)) break;
-        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
+        __pyx_t_5 = __pyx_t_2; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0;
+        __pyx_t_7 = NULL;
+      } else {
+        __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
+      }
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      for (;;) {
+        if (PyList_CheckExact(__pyx_t_5)) {
+          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
+          __pyx_t_2 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++;
+        } else if (PyTuple_CheckExact(__pyx_t_5)) {
+          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
+          __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++;
+        } else {
+          __pyx_t_2 = __pyx_t_7(__pyx_t_5);
+          if (unlikely(!__pyx_t_2)) {
+            if (PyErr_Occurred()) {
+              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            break;
+          }
+          __Pyx_GOTREF(__pyx_t_2);
+        }
+        if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
+          PyObject* sequence = __pyx_t_2;
+          if (likely(PyTuple_CheckExact(sequence))) {
+            if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+              if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+              else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
+            __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
+          } else {
+            if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+              if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+              else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
+            __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
+          }
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        } else {
+          Py_ssize_t index = -1;
+          __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
+          index = 0; __pyx_t_4 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L13_unpacking_failed;
+          __Pyx_GOTREF(__pyx_t_4);
+          index = 1; __pyx_t_3 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_3)) goto __pyx_L13_unpacking_failed;
+          __Pyx_GOTREF(__pyx_t_3);
+          if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          goto __pyx_L14_unpacking_done;
+          __pyx_L13_unpacking_failed:;
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+          if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_L14_unpacking_done:;
+        }
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_2;
-        __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_4;
+        __pyx_v_pattern = __pyx_t_4;
         __pyx_t_4 = 0;
+        __Pyx_XDECREF(__pyx_v_arr);
+        __pyx_v_arr = __pyx_t_3;
+        __pyx_t_3 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":454
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
@@ -38617,20 +36537,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  */
-        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_3));
         __Pyx_INCREF(__pyx_v_pattern);
-        PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
+        PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
-        __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+        __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
         __Pyx_XDECREF(__pyx_v_phrases);
-        __pyx_v_phrases = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_phrases = __pyx_t_4;
+        __pyx_t_4 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":455
  *                 for pattern, arr in pre.precomputed_index.iteritems():
@@ -38640,42 +36560,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *             if self.use_collocations:
  */
         if (PyList_CheckExact(__pyx_v_phrases) || PyTuple_CheckExact(__pyx_v_phrases)) {
-          __pyx_t_3 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
+          __pyx_t_4 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_4); __pyx_t_10 = 0;
           __pyx_t_11 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
+          __pyx_t_10 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_11 = Py_TYPE(__pyx_t_4)->tp_iternext;
         }
         for (;;) {
-          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_3)) {
-            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
-          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_3)) {
-            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
+          if (PyList_CheckExact(__pyx_t_4)) {
+            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_4)) break;
+            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
+          } else if (PyTuple_CheckExact(__pyx_t_4)) {
+            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
           } else {
-            __pyx_t_2 = __pyx_t_11(__pyx_t_3);
-            if (unlikely(!__pyx_t_2)) {
+            __pyx_t_3 = __pyx_t_11(__pyx_t_4);
+            if (unlikely(!__pyx_t_3)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
                 else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
-            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_GOTREF(__pyx_t_3);
           }
           __Pyx_XDECREF(__pyx_v_phrase);
-          __pyx_v_phrase = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_v_phrase = __pyx_t_3;
+          __pyx_t_3 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":456
  *                     phrases = self.pattern2phrase_plus(pattern)
@@ -38684,14 +36596,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  */
-          if (PyObject_SetItem(__pyx_v_self->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyObject_SetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L8;
+      goto __pyx_L10;
     }
-    __pyx_L8:;
+    __pyx_L10:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":457
  *                     for phrase in phrases:
@@ -38700,7 +36612,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  */
-    if (__pyx_v_self->use_collocations) {
+    if (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_collocations) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":458
  *                         self.precomputed_index[phrase] = arr
@@ -38711,27 +36623,27 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
       __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_5 = __pyx_v_pre->precomputed_collocations;
       __Pyx_INCREF(__pyx_t_5);
-      __pyx_t_7 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
-      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_115));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_115));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_115));
-      PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":459
@@ -38741,28 +36653,86 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  */
-      __pyx_t_7 = 0;
-      if (unlikely(__pyx_v_pre->precomputed_collocations == Py_None)) {
-        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_v_pre->precomputed_collocations, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+        __pyx_t_5 = __pyx_t_3; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0;
+        __pyx_t_7 = NULL;
+      } else {
+        __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
       }
-      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_6), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_XDECREF(__pyx_t_5);
-      __pyx_t_5 = __pyx_t_2;
-      __pyx_t_2 = 0;
-      while (1) {
-        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_6, &__pyx_t_7, &__pyx_t_2, &__pyx_t_3, NULL, __pyx_t_8);
-        if (unlikely(__pyx_t_9 == 0)) break;
-        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      for (;;) {
+        if (PyList_CheckExact(__pyx_t_5)) {
+          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
+          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
+        } else if (PyTuple_CheckExact(__pyx_t_5)) {
+          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
+          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
+        } else {
+          __pyx_t_3 = __pyx_t_7(__pyx_t_5);
+          if (unlikely(!__pyx_t_3)) {
+            if (PyErr_Occurred()) {
+              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            break;
+          }
+          __Pyx_GOTREF(__pyx_t_3);
+        }
+        if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+          PyObject* sequence = __pyx_t_3;
+          if (likely(PyTuple_CheckExact(sequence))) {
+            if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+              if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+              else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
+            __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
+          } else {
+            if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+              if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+              else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
+            __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
+          }
+          __Pyx_INCREF(__pyx_t_4);
+          __Pyx_INCREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        } else {
+          Py_ssize_t index = -1;
+          __pyx_t_8 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
+          index = 0; __pyx_t_4 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L20_unpacking_failed;
+          __Pyx_GOTREF(__pyx_t_4);
+          index = 1; __pyx_t_2 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_2)) goto __pyx_L20_unpacking_failed;
+          __Pyx_GOTREF(__pyx_t_2);
+          if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          goto __pyx_L21_unpacking_done;
+          __pyx_L20_unpacking_failed:;
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+          if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_L21_unpacking_done:;
+        }
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_2;
-        __pyx_t_2 = 0;
+        __pyx_v_pattern = __pyx_t_4;
+        __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_arr = __pyx_t_2;
+        __pyx_t_2 = 0;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":460
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
@@ -38771,10 +36741,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  */
-        __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
         __Pyx_INCREF(__pyx_v_pattern);
         PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
@@ -38793,12 +36763,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)
  */
-        if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyObject_SetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L13;
+      goto __pyx_L17;
     }
-    __pyx_L13:;
+    __pyx_L17:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":462
  *                     phrase = self.pattern2phrase(pattern)
@@ -38827,7 +36797,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_t_5 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_116));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_116));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_116));
@@ -38839,9 +36809,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -38850,6 +36820,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -38865,17 +36836,6 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_precomputed_collocation (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_phrase));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":466
  * 
  * 
@@ -38884,7 +36844,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collo
  *             arr = self.precomputed_collocations[phrase]
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_phrase) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase) {
   PyObject *__pyx_v_arr = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -38896,7 +36857,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_precomputed_collocation", 0);
+  __Pyx_RefNannySetupContext("get_precomputed_collocation");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":467
  * 
@@ -38905,7 +36866,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_phrase, __pyx_v_self->precomputed_collocations, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":468
@@ -38915,7 +36876,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_arr = __pyx_t_2;
     __pyx_t_2 = 0;
@@ -38947,15 +36908,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L5;
   }
-  __pyx_L3:;
+  __pyx_L5:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":470
  *             arr = self.precomputed_collocations[phrase]
@@ -39028,7 +36989,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("baeza_yates_helper", 0);
+  __Pyx_RefNannySetupContext("baeza_yates_helper");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":486
  *         cdef Matching loc1, loc2
@@ -40135,7 +38096,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   long __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("compare_matchings_set", 0);
+  __Pyx_RefNannySetupContext("compare_matchings_set");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":637
  *         cdef Matching* loc1
@@ -40312,7 +38273,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("compare_matchings", 0);
+  __Pyx_RefNannySetupContext("compare_matchings");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":659
  *         cdef int i
@@ -40636,7 +38597,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("merge_helper", 0);
+  __Pyx_RefNannySetupContext("merge_helper");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":700
  *         cdef Matching loc1, loc2
@@ -40945,7 +38906,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sort_phrase_loc", 0);
+  __Pyx_RefNannySetupContext("sort_phrase_loc");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":741
  *         cdef IntList result
@@ -40954,7 +38915,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_phrase), __pyx_v_self->precomputed_index, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":742
@@ -40989,7 +38950,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __Pyx_GOTREF(__pyx_t_3);
     if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_GIVEREF(__pyx_t_3);
@@ -41008,7 +38969,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_3 = PyInt_FromLong(__pyx_v_arr->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
@@ -41141,7 +39102,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("intersect_helper", 0);
+  __Pyx_RefNannySetupContext("intersect_helper");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":763
  *         cdef int* result_ptr
@@ -41204,7 +39165,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
   __Pyx_GIVEREF(__pyx_t_5);
   __pyx_t_5 = 0;
@@ -41494,7 +39455,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
     __Pyx_GOTREF(__pyx_t_4);
     if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_r = __pyx_t_4;
@@ -41528,7 +39489,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  *         result = "{"
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_loc) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_loc) {
   int __pyx_v_i;
   int __pyx_v_j;
   PyObject *__pyx_v_result = NULL;
@@ -41541,7 +39502,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("loc2str", 0);
+  __Pyx_RefNannySetupContext("loc2str");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":810
  *     cdef loc2str(self, PhraseLocation loc):
@@ -41692,7 +39653,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_prefix_loc = 0;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_suffix_loc = 0;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_result = 0;
-  CYTHON_UNUSED PyObject *__pyx_v_intersect_method = NULL;
+  PyObject *__pyx_v_intersect_method = NULL;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -41702,7 +39663,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("intersect", 0);
+  __Pyx_RefNannySetupContext("intersect");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":825
  *         cdef PhraseLocation prefix_loc, suffix_loc, result
@@ -41766,7 +39727,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_120); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(((PyObject *)__pyx_v_phrase));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_phrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_phrase));
@@ -41910,22 +39871,56 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":843
+ *         return result
+ * 
+ *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
+ *         cdef unsigned na
+ *         nf = []
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_frontier = 0;
   PyObject *__pyx_v_res = 0;
   PyObject *__pyx_v_fwords = 0;
-  PyObject *__pyx_r = 0;
+  unsigned int __pyx_v_na;
+  PyObject *__pyx_v_nf = NULL;
+  PyObject *__pyx_v_toskip = NULL;
+  PyObject *__pyx_v_i = NULL;
+  PyObject *__pyx_v_alt = NULL;
+  PyObject *__pyx_v_pathlen = NULL;
+  PyObject *__pyx_v_spanlen = NULL;
+  PyObject *__pyx_v_ni = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  Py_ssize_t __pyx_t_13;
+  int __pyx_t_14;
+  int __pyx_t_15;
+  unsigned int __pyx_t_16;
+  int __pyx_t_17;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
+  __Pyx_RefNannySetupContext("advance");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -41933,23 +39928,26 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__frontier)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__frontier);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -41970,51 +39968,6 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_frontier, __pyx_v_res, __pyx_v_fwords);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":843
- *         return result
- * 
- *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
- *         cdef unsigned na
- *         nf = []
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_frontier, PyObject *__pyx_v_res, PyObject *__pyx_v_fwords) {
-  unsigned int __pyx_v_na;
-  PyObject *__pyx_v_nf = NULL;
-  PyObject *__pyx_v_toskip = NULL;
-  PyObject *__pyx_v_i = NULL;
-  PyObject *__pyx_v_alt = NULL;
-  PyObject *__pyx_v_pathlen = NULL;
-  PyObject *__pyx_v_spanlen = NULL;
-  PyObject *__pyx_v_ni = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *(*__pyx_t_3)(PyObject *);
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  int __pyx_t_12;
-  Py_ssize_t __pyx_t_13;
-  int __pyx_t_14;
-  int __pyx_t_15;
-  unsigned int __pyx_t_16;
-  int __pyx_t_17;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("advance", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":845
  *     def advance(self, frontier, res, fwords):
@@ -42024,7 +39977,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *             spanlen = fwords[i][alt][2]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_nf = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -42044,20 +39997,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -42071,74 +40016,66 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
       PyObject* sequence = __pyx_t_4;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      Py_ssize_t size = Py_SIZE(sequence);
-      #else
-      Py_ssize_t size = PySequence_Size(sequence);
-      #endif
-      if (unlikely(size != 2)) {
-        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
       } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
-      #else
-      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    } else
-    {
+    } else {
       Py_ssize_t index = -1;
       __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
-      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
+      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L8_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_5);
-      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
+      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L6_unpacking_done;
-      __pyx_L5_unpacking_failed:;
+      goto __pyx_L9_unpacking_done;
+      __pyx_L8_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_8 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L6_unpacking_done:;
+      __pyx_L9_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_toskip);
     __pyx_v_toskip = __pyx_t_5;
     __pyx_t_5 = 0;
     if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) {
       PyObject* sequence = __pyx_t_6;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      Py_ssize_t size = Py_SIZE(sequence);
-      #else
-      Py_ssize_t size = PySequence_Size(sequence);
-      #endif
-      if (unlikely(size != 3)) {
-        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
+          if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_7 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_9 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
       } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
+          if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_7 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_9 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
@@ -42146,35 +40083,28 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_t_10);
-      #else
-      __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_10 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    } else
-    {
+    } else {
       Py_ssize_t index = -1;
       __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_11)->tp_iternext;
-      index = 0; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L7_unpacking_failed;
+      index = 0; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L10_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      index = 1; __pyx_t_9 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_9)) goto __pyx_L7_unpacking_failed;
+      index = 1; __pyx_t_9 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_9)) goto __pyx_L10_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_9);
-      index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L7_unpacking_failed;
+      index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L10_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_10);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      goto __pyx_L8_unpacking_done;
-      __pyx_L7_unpacking_failed:;
+      goto __pyx_L11_unpacking_done;
+      __pyx_L10_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      __pyx_t_8 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L8_unpacking_done:;
+      __pyx_L11_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_7;
@@ -42212,7 +40142,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
@@ -42225,7 +40156,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  */
       __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       __Pyx_INCREF(__pyx_v_i);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
       __Pyx_GIVEREF(__pyx_v_i);
@@ -42239,9 +40170,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L9;
+      goto __pyx_L12;
     }
-    __pyx_L9:;
+    __pyx_L12:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":850
  *             if (toskip == 0):
@@ -42266,16 +40197,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_t_13 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
       __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_6 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -42307,6 +40240,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)
  */
+        if (unlikely(((PyObject *)__pyx_v_nf) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_5 = PyNumber_Subtract(__pyx_v_toskip, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_na); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -42314,7 +40250,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
         __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_10);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_10));
         __Pyx_INCREF(__pyx_v_ni);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_ni);
         __Pyx_GIVEREF(__pyx_v_ni);
@@ -42325,7 +40261,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
         __pyx_t_6 = 0;
         __pyx_t_4 = 0;
         __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_4));
         PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_t_10));
@@ -42335,9 +40271,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
         __pyx_t_17 = PyList_Append(__pyx_v_nf, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       }
-      goto __pyx_L10;
+      goto __pyx_L13;
     }
-    __pyx_L10:;
+    __pyx_L13:;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -42348,7 +40284,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *             return self.advance(nf, res, fwords)
  *         else:
  */
-  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(((PyObject *)__pyx_v_nf) == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
+  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); 
   __pyx_t_15 = (__pyx_t_2 > 0);
   if (__pyx_t_15) {
 
@@ -42360,10 +40299,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *             return res
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_INCREF(((PyObject *)__pyx_v_nf));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_nf));
     __Pyx_GIVEREF(((PyObject *)__pyx_v_nf));
@@ -42380,7 +40319,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_r = __pyx_t_10;
     __pyx_t_10 = 0;
     goto __pyx_L0;
-    goto __pyx_L13;
+    goto __pyx_L16;
   }
   /*else*/ {
 
@@ -42396,7 +40335,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_r = __pyx_v_res;
     goto __pyx_L0;
   }
-  __pyx_L13:;
+  __pyx_L16:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -42424,9 +40363,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":859
+ *             return res
+ * 
+ *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
+ *         cdef unsigned alt_it
+ *         frontier = []
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_skip = 0;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_spanlen = 0;
@@ -42434,16 +40380,39 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_next_states = 0;
   PyObject *__pyx_v_reachable_buffer = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_frontier = NULL;
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_v_reachable = NULL;
+  PyObject *__pyx_v_nextreachable = NULL;
+  PyObject *__pyx_v_next_id = NULL;
+  PyObject *__pyx_v_jump = NULL;
+  Py_ssize_t __pyx_v_alt_id;
+  PyObject *__pyx_v_newel = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  Py_ssize_t __pyx_t_11;
+  Py_ssize_t __pyx_t_12;
+  int __pyx_t_13;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__skip,&__pyx_n_s__i,&__pyx_n_s__spanlen,&__pyx_n_s__pathlen,&__pyx_n_s__fwords,&__pyx_n_s__next_states,&__pyx_n_s__reachable_buffer,0};
+  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__skip,&__pyx_n_s__i,&__pyx_n_s__spanlen,&__pyx_n_s__pathlen,&__pyx_n_s__fwords,&__pyx_n_s__next_states,&__pyx_n_s__reachable_buffer,0};
     PyObject* values[7] = {0,0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
@@ -42455,43 +40424,50 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__skip)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__skip);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen);
+        if (likely(values[3])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
-        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
+        values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
+        if (likely(values[4])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
-        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states)) != 0)) kw_args--;
+        values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states);
+        if (likely(values[5])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  6:
-        if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer)) != 0)) kw_args--;
+        values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer);
+        if (likely(values[6])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 7) {
       goto __pyx_L5_argtuple_error;
@@ -42520,48 +40496,6 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_skip, __pyx_v_i, __pyx_v_spanlen, __pyx_v_pathlen, __pyx_v_fwords, __pyx_v_next_states, __pyx_v_reachable_buffer);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":859
- *             return res
- * 
- *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
- *         cdef unsigned alt_it
- *         frontier = []
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_skip, PyObject *__pyx_v_i, PyObject *__pyx_v_spanlen, PyObject *__pyx_v_pathlen, PyObject *__pyx_v_fwords, PyObject *__pyx_v_next_states, PyObject *__pyx_v_reachable_buffer) {
-  PyObject *__pyx_v_frontier = NULL;
-  PyObject *__pyx_v_key = NULL;
-  PyObject *__pyx_v_reachable = NULL;
-  PyObject *__pyx_v_nextreachable = NULL;
-  PyObject *__pyx_v_next_id = NULL;
-  PyObject *__pyx_v_jump = NULL;
-  PyObject *__pyx_v_alt_id = NULL;
-  PyObject *__pyx_v_newel = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  PyObject *(*__pyx_t_6)(PyObject *);
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  Py_ssize_t __pyx_t_11;
-  PyObject *(*__pyx_t_12)(PyObject *);
-  PyObject *__pyx_t_13 = NULL;
-  int __pyx_t_14;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":861
  *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):
@@ -42571,7 +40505,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *             return frontier
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_frontier = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -42590,7 +40524,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   __pyx_t_3 = PyObject_Length(__pyx_v_next_states); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -42608,9 +40543,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __Pyx_INCREF(((PyObject *)__pyx_v_frontier));
     __pyx_r = ((PyObject *)__pyx_v_frontier);
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":864
  *         if (i+spanlen+skip >= len(next_states)):
@@ -42620,7 +40555,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *         if (key in reachable_buffer):
  */
   __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_INCREF(__pyx_v_i);
   PyList_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -42641,7 +40576,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *             reachable = reachable_buffer[key]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_reachable = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
@@ -42652,7 +40587,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *             reachable = reachable_buffer[key]
  *         else:
  */
-  __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_key), __pyx_v_reachable_buffer, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = ((PySequence_Contains(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_5) {
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":867
@@ -42667,7 +40602,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __Pyx_DECREF(__pyx_v_reachable);
     __pyx_v_reachable = __pyx_t_1;
     __pyx_t_1 = 0;
-    goto __pyx_L4;
+    goto __pyx_L7;
   }
   /*else*/ {
 
@@ -42678,10 +40613,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
@@ -42708,7 +40643,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  */
     if (PyObject_SetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key), __pyx_v_reachable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":871
  *             reachable = self.reachable(fwords, i, spanlen)
@@ -42726,20 +40661,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_6 && PyList_CheckExact(__pyx_t_2)) {
+    if (PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_6 && PyTuple_CheckExact(__pyx_t_2)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
+    } else if (PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
     } else {
       __pyx_t_4 = __pyx_t_6(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
@@ -42774,20 +40701,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     }
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     for (;;) {
-      if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_1)) {
+      if (PyList_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
-      } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_1)) {
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
+      } else if (PyTuple_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
       } else {
         __pyx_t_4 = __pyx_t_8(__pyx_t_1);
         if (unlikely(!__pyx_t_4)) {
@@ -42810,10 +40729,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *                 if jump < skip:
  *                     continue
  */
-      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_fwords);
       __Pyx_GIVEREF(__pyx_v_fwords);
@@ -42838,7 +40757,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  */
-      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_10);
       __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       if (__pyx_t_5) {
@@ -42850,10 +40770,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  */
-        goto __pyx_L7_continue;
-        goto __pyx_L9;
+        goto __pyx_L10_continue;
+        goto __pyx_L12;
       }
-      __pyx_L9:;
+      __pyx_L12:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":876
  *                 if jump < skip:
@@ -42864,9 +40784,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  */
       __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -42884,54 +40805,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
         __Pyx_GOTREF(__pyx_t_4);
         __pyx_t_11 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
-        PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4);
-        __Pyx_GIVEREF(__pyx_t_4);
-        __pyx_t_4 = 0;
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-        if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
-          __pyx_t_9 = __pyx_t_4; __Pyx_INCREF(__pyx_t_9); __pyx_t_11 = 0;
-          __pyx_t_12 = NULL;
-        } else {
-          __pyx_t_11 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_12 = Py_TYPE(__pyx_t_9)->tp_iternext;
-        }
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        for (;;) {
-          if (!__pyx_t_12 && PyList_CheckExact(__pyx_t_9)) {
-            if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_9)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
-          } else if (!__pyx_t_12 && PyTuple_CheckExact(__pyx_t_9)) {
-            if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
-          } else {
-            __pyx_t_4 = __pyx_t_12(__pyx_t_9);
-            if (unlikely(!__pyx_t_4)) {
-              if (PyErr_Occurred()) {
-                if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              }
-              break;
-            }
-            __Pyx_GOTREF(__pyx_t_4);
-          }
-          __Pyx_XDECREF(__pyx_v_alt_id);
-          __pyx_v_alt_id = __pyx_t_4;
-          __pyx_t_4 = 0;
+        for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
+          __pyx_v_alt_id = __pyx_t_12;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":878
  *                 if pathlen+jump <= self.max_initial_size:
@@ -42942,19 +40817,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  */
           __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_10 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt_id); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_9, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_9 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_10 = PyObject_RichCompare(__pyx_t_4, __pyx_t_9, Py_NE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_13 = PyObject_RichCompare(__pyx_t_4, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
           if (__pyx_t_5) {
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":879
@@ -42964,22 +40840,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  */
-            __pyx_t_13 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_13);
-            __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromSsize_t(__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
+            __pyx_t_9 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_4));
             __Pyx_INCREF(__pyx_v_next_id);
-            PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_next_id);
             __Pyx_GIVEREF(__pyx_v_next_id);
-            __Pyx_INCREF(__pyx_v_alt_id);
-            PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_v_alt_id);
-            __Pyx_GIVEREF(__pyx_v_alt_id);
-            PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_13);
-            __Pyx_GIVEREF(__pyx_t_13);
-            __pyx_t_13 = 0;
-            __Pyx_XDECREF(((PyObject *)__pyx_v_newel));
-            __pyx_v_newel = __pyx_t_10;
+            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_10);
+            __Pyx_GIVEREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_9);
+            __Pyx_GIVEREF(__pyx_t_9);
             __pyx_t_10 = 0;
+            __pyx_t_9 = 0;
+            __Pyx_XDECREF(((PyObject *)__pyx_v_newel));
+            __pyx_v_newel = __pyx_t_4;
+            __pyx_t_4 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":880
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
@@ -42988,7 +40866,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier
  */
-            __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_newel), ((PyObject *)__pyx_v_frontier), Py_NE)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_frontier), ((PyObject *)__pyx_v_newel)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (__pyx_t_5) {
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":881
@@ -42998,33 +40876,37 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
  *         return frontier
  * 
  */
-              __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_13);
+              if (unlikely(((PyObject *)__pyx_v_frontier) == Py_None)) {
+                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+              }
+              __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_alt_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_9 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(((PyObject *)__pyx_t_10));
               __Pyx_INCREF(__pyx_v_next_id);
-              PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_v_next_id);
+              PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
               __Pyx_GIVEREF(__pyx_v_next_id);
-              __Pyx_INCREF(__pyx_v_alt_id);
-              PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_v_alt_id);
-              __Pyx_GIVEREF(__pyx_v_alt_id);
-              PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
-              __Pyx_GIVEREF(__pyx_t_10);
-              __pyx_t_10 = 0;
-              __pyx_t_14 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-              goto __pyx_L14;
+              PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_4);
+              __Pyx_GIVEREF(__pyx_t_4);
+              PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_9);
+              __Pyx_GIVEREF(__pyx_t_9);
+              __pyx_t_4 = 0;
+              __pyx_t_9 = 0;
+              __pyx_t_13 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_10)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+              goto __pyx_L17;
             }
-            __pyx_L14:;
-            goto __pyx_L13;
+            __pyx_L17:;
+            goto __pyx_L16;
           }
-          __pyx_L13:;
+          __pyx_L16:;
         }
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        goto __pyx_L10;
+        goto __pyx_L13;
       }
-      __pyx_L10:;
-      __pyx_L7_continue:;
+      __pyx_L13:;
+      __pyx_L10_continue:;
     }
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
@@ -43050,7 +40932,6 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
-  __Pyx_XDECREF(__pyx_t_13);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_all_nodes_isteps_away", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -43060,29 +40941,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   __Pyx_XDECREF(__pyx_v_nextreachable);
   __Pyx_XDECREF(__pyx_v_next_id);
   __Pyx_XDECREF(__pyx_v_jump);
-  __Pyx_XDECREF(__pyx_v_alt_id);
   __Pyx_XDECREF(__pyx_v_newel);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":884
+ *         return frontier
+ * 
+ *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
+ *         ret = []
+ *         if (ifrom >= len(fwords)):
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_dist = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_ret = NULL;
+  Py_ssize_t __pyx_v_alt_id;
+  PyObject *__pyx_v_ifromchild = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("reachable (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  Py_ssize_t __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_t_8;
+  Py_ssize_t __pyx_t_9;
+  PyObject *(*__pyx_t_10)(PyObject *);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
+  __Pyx_RefNannySetupContext("reachable");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -43090,23 +40992,26 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -43127,40 +41032,6 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_ifrom, __pyx_v_dist);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":884
- *         return frontier
- * 
- *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
- *         ret = []
- *         if (ifrom >= len(fwords)):
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_dist) {
-  PyObject *__pyx_v_ret = NULL;
-  PyObject *__pyx_v_alt_id = NULL;
-  PyObject *__pyx_v_ifromchild = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  PyObject *(*__pyx_t_5)(PyObject *);
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *__pyx_t_8 = NULL;
-  int __pyx_t_9;
-  Py_ssize_t __pyx_t_10;
-  PyObject *(*__pyx_t_11)(PyObject *);
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("reachable", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":885
  * 
@@ -43170,7 +41041,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  *             return ret
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_ret = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -43184,7 +41055,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   __pyx_t_2 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -43201,9 +41073,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
     __Pyx_INCREF(((PyObject *)__pyx_v_ret));
     __pyx_r = ((PyObject *)__pyx_v_ret);
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":888
  *         if (ifrom >= len(fwords)):
@@ -43216,54 +41088,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
-  __Pyx_GIVEREF(__pyx_t_3);
-  __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-    __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
-    __pyx_t_5 = NULL;
-  } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext;
-  }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (;;) {
-    if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_1)) {
-      if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_1)) {
-      if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else {
-      __pyx_t_3 = __pyx_t_5(__pyx_t_1);
-      if (unlikely(!__pyx_t_3)) {
-        if (PyErr_Occurred()) {
-          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        break;
-      }
-      __Pyx_GOTREF(__pyx_t_3);
-    }
-    __Pyx_XDECREF(__pyx_v_alt_id);
-    __pyx_v_alt_id = __pyx_t_3;
-    __pyx_t_3 = 0;
+  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_2; __pyx_t_5+=1) {
+    __pyx_v_alt_id = __pyx_t_5;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":889
  *             return ret
@@ -43274,19 +41100,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  */
     __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_6 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, __pyx_t_1, Py_EQ); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_4) {
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":890
@@ -43296,47 +41123,47 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  *             else:
  *                 if (dist==0):
  */
-      __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_8 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_8, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fwords);
       __Pyx_GIVEREF(__pyx_v_fwords);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_8);
-      __Pyx_GIVEREF(__pyx_t_8);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7);
+      __Pyx_GIVEREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_v_dist);
       PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_dist);
       __Pyx_GIVEREF(__pyx_v_dist);
-      __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_7 = 0;
+      __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
       __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_8);
-      __Pyx_GIVEREF(__pyx_t_8);
-      __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7);
+      __Pyx_GIVEREF(__pyx_t_7);
+      __pyx_t_7 = 0;
+      __pyx_t_7 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      goto __pyx_L6;
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L9;
     }
     /*else*/ {
 
@@ -43347,9 +41174,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)
  */
-      __pyx_t_8 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_7 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_4) {
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":893
@@ -43359,7 +41187,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  *                         ret.append(ifrom)
  *                 else:
  */
-        __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifrom, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_ret), __pyx_v_ifrom))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_4) {
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":894
@@ -43369,11 +41197,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  */
-          __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          goto __pyx_L8;
+          if (unlikely(((PyObject *)__pyx_v_ret) == Py_None)) {
+            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+          }
+          __pyx_t_8 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          goto __pyx_L11;
         }
-        __pyx_L8:;
-        goto __pyx_L7;
+        __pyx_L11:;
+        goto __pyx_L10;
       }
       /*else*/ {
 
@@ -43384,62 +41215,54 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)
  */
-        __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_7 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_7 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __pyx_t_3 = PyNumber_Subtract(__pyx_v_dist, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_1));
         __Pyx_INCREF(__pyx_v_fwords);
-        PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_fwords);
+        PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fwords);
         __Pyx_GIVEREF(__pyx_v_fwords);
-        PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7);
-        __Pyx_GIVEREF(__pyx_t_7);
-        PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_3);
+        PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_6);
+        __Pyx_GIVEREF(__pyx_t_6);
+        PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
-        __pyx_t_7 = 0;
+        __pyx_t_6 = 0;
         __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
         if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-          __pyx_t_6 = __pyx_t_3; __Pyx_INCREF(__pyx_t_6); __pyx_t_10 = 0;
-          __pyx_t_11 = NULL;
+          __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_9 = 0;
+          __pyx_t_10 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_6);
-          __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext;
+          __pyx_t_9 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_10 = Py_TYPE(__pyx_t_1)->tp_iternext;
         }
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         for (;;) {
-          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_6)) {
-            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_6)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
-          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_6)) {
-            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-            #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #else
-            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
+          if (PyList_CheckExact(__pyx_t_1)) {
+            if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_1)) break;
+            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++;
+          } else if (PyTuple_CheckExact(__pyx_t_1)) {
+            if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++;
           } else {
-            __pyx_t_3 = __pyx_t_11(__pyx_t_6);
+            __pyx_t_3 = __pyx_t_10(__pyx_t_1);
             if (unlikely(!__pyx_t_3)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
@@ -43460,7 +41283,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  *                             ret.append(ifromchild)
  * 
  */
-          __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifromchild, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_ret), __pyx_v_ifromchild))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_4) {
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":898
@@ -43470,18 +41293,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
  * 
  *         return ret
  */
-            __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            goto __pyx_L11;
+            if (unlikely(((PyObject *)__pyx_v_ret) == Py_None)) {
+              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+            }
+            __pyx_t_8 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            goto __pyx_L14;
           }
-          __pyx_L11:;
+          __pyx_L14:;
         }
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       }
-      __pyx_L7:;
+      __pyx_L10:;
     }
-    __pyx_L6:;
+    __pyx_L9:;
   }
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":900
  *                             ret.append(ifromchild)
@@ -43502,34 +41327,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_6);
   __Pyx_XDECREF(__pyx_t_7);
-  __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.reachable", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_v_ret);
-  __Pyx_XDECREF(__pyx_v_alt_id);
   __Pyx_XDECREF(__pyx_v_ifromchild);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":902
+ *         return ret
+ * 
+ *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
+ *         cdef unsigned alt_id
+ *         min = 1000
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_ito = 0;
-  PyObject *__pyx_r = 0;
+  unsigned int __pyx_v_alt_id;
+  PyObject *__pyx_v_min = NULL;
+  PyObject *__pyx_v_currmin = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("shortest (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  Py_ssize_t __pyx_t_3;
+  unsigned int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
+  __Pyx_RefNannySetupContext("shortest");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -43537,23 +41378,26 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito);
+        if (likely(values[2])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -43574,35 +41418,6 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_ifrom, __pyx_v_ito);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":902
- *         return ret
- * 
- *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
- *         cdef unsigned alt_id
- *         min = 1000
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_ito) {
-  unsigned int __pyx_v_alt_id;
-  PyObject *__pyx_v_min = NULL;
-  PyObject *__pyx_v_currmin = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  Py_ssize_t __pyx_t_3;
-  unsigned int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("shortest", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":904
  *     def shortest(self, fwords, ifrom, ito):
@@ -43621,7 +41436,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
  *             return min
  *         if (ifrom == ito):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
@@ -43637,9 +41453,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __Pyx_INCREF(__pyx_v_min);
     __pyx_r = __pyx_v_min;
     goto __pyx_L0;
-    goto __pyx_L3;
+    goto __pyx_L6;
   }
-  __pyx_L3:;
+  __pyx_L6:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":907
  *         if (ifrom > ito):
@@ -43648,7 +41464,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
@@ -43664,9 +41481,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __Pyx_INCREF(__pyx_int_0);
     __pyx_r = __pyx_int_0;
     goto __pyx_L0;
-    goto __pyx_L4;
+    goto __pyx_L7;
   }
-  __pyx_L4:;
+  __pyx_L7:;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":909
  *         if (ifrom == ito):
@@ -43689,7 +41506,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
@@ -43703,7 +41520,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
@@ -43738,7 +41555,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_5 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -43757,9 +41575,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
       __Pyx_DECREF(__pyx_v_currmin);
       __pyx_v_currmin = __pyx_t_1;
       __pyx_t_1 = 0;
-      goto __pyx_L7;
+      goto __pyx_L10;
     }
-    __pyx_L7:;
+    __pyx_L10:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":913
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
@@ -43768,7 +41586,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
  *                 min = currmin
  *         return min
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
@@ -43783,9 +41602,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
       __Pyx_INCREF(__pyx_v_currmin);
       __Pyx_DECREF(__pyx_v_min);
       __pyx_v_min = __pyx_v_currmin;
-      goto __pyx_L8;
+      goto __pyx_L11;
     }
-    __pyx_L8:;
+    __pyx_L11:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":915
@@ -43816,23 +41635,49 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":917
+ *         return min
+ * 
+ *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
+ *         result = []
+ *         candidate = [[curr_idx,0]]
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v__columns = 0;
   PyObject *__pyx_v_curr_idx = 0;
   PyObject *__pyx_v_min_dist = 0;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_v_result = NULL;
+  PyObject *__pyx_v_candidate = NULL;
+  PyObject *__pyx_v_curr = NULL;
+  PyObject *__pyx_v_curr_col = NULL;
+  PyObject *__pyx_v_alt = NULL;
+  PyObject *__pyx_v_next_id = NULL;
+  PyObject *__pyx_v_jump = NULL;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_next_states (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__min_dist,0};
+  __Pyx_RefNannySetupContext("get_next_states");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__min_dist,0};
     PyObject* values[3] = {0,0,0};
     values[2] = ((PyObject *)__pyx_int_2);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -43840,12 +41685,14 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s___columns)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s___columns);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -43856,7 +41703,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -43879,43 +41726,6 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v__columns, __pyx_v_curr_idx, __pyx_v_min_dist);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":917
- *         return min
- * 
- *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
- *         result = []
- *         candidate = [[curr_idx,0]]
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v__columns, PyObject *__pyx_v_curr_idx, PyObject *__pyx_v_min_dist) {
-  PyObject *__pyx_v_result = NULL;
-  PyObject *__pyx_v_candidate = NULL;
-  PyObject *__pyx_v_curr = NULL;
-  PyObject *__pyx_v_curr_col = NULL;
-  PyObject *__pyx_v_alt = NULL;
-  PyObject *__pyx_v_next_id = NULL;
-  PyObject *__pyx_v_jump = NULL;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  PyObject *(*__pyx_t_9)(PyObject *);
-  PyObject *__pyx_t_10 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_next_states", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":918
  * 
@@ -43925,7 +41735,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
@@ -43937,7 +41747,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *         while len(candidate) > 0:
  */
   __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(__pyx_v_curr_idx);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_curr_idx);
   __Pyx_GIVEREF(__pyx_v_curr_idx);
@@ -43945,7 +41755,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   PyList_SET_ITEM(__pyx_t_1, 1, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
   __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_t_1 = 0;
@@ -43960,7 +41770,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *             if curr[0] >= len(_columns):
  */
   while (1) {
-    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_v_candidate) == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); 
     __pyx_t_4 = (__pyx_t_3 > 0);
     if (!__pyx_t_4) break;
 
@@ -43989,7 +41802,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     __pyx_t_3 = PyObject_Length(__pyx_v__columns); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -44003,10 +41817,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  */
-      goto __pyx_L3_continue;
-      goto __pyx_L5;
+      goto __pyx_L6_continue;
+      goto __pyx_L8;
     }
-    __pyx_L5:;
+    __pyx_L8:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":925
  *             if curr[0] >= len(_columns):
@@ -44017,17 +41831,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  */
     __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_t_5, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_result), __pyx_t_5))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
       __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
         __Pyx_DECREF(__pyx_t_1);
-        __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -44046,13 +41862,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  */
+      if (unlikely(((PyObject *)__pyx_v_result) == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+      }
       __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_8 = PyList_Append(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L6;
+      goto __pyx_L9;
     }
-    __pyx_L6:;
+    __pyx_L9:;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":927
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
@@ -44086,20 +41905,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_t_9 = Py_TYPE(__pyx_t_5)->tp_iternext;
     }
     for (;;) {
-      if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_5)) {
+      if (PyList_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_5)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
-      } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_5)) {
+        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
+      } else if (PyTuple_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
       } else {
         __pyx_t_1 = __pyx_t_9(__pyx_t_5);
         if (unlikely(!__pyx_t_1)) {
@@ -44156,7 +41967,8 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __Pyx_GOTREF(__pyx_t_10);
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -44173,9 +41985,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
         __Pyx_INCREF(__pyx_int_0);
         __Pyx_DECREF(__pyx_v_jump);
         __pyx_v_jump = __pyx_int_0;
-        goto __pyx_L9;
+        goto __pyx_L12;
       }
-      __pyx_L9:;
+      __pyx_L12:;
 
       /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":933
  *                 if (alt[0] == EPSILON):
@@ -44184,19 +41996,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);
  */
-      __pyx_t_7 = (__Pyx_PySequence_Contains(__pyx_v_next_id, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_result), __pyx_v_next_id))); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_7) {
         __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
         if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
           __Pyx_DECREF(__pyx_t_1);
-          __pyx_t_10 = PyInt_FromLong((__pyx_v_self->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -44215,13 +42029,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *         return sorted(result);
  * 
  */
+        if (unlikely(((PyObject *)__pyx_v_candidate) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_1));
         __Pyx_INCREF(__pyx_v_next_id);
         PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_next_id);
         __Pyx_GIVEREF(__pyx_v_next_id);
@@ -44230,12 +42047,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
         __pyx_t_2 = 0;
         __pyx_t_8 = PyList_Append(__pyx_v_candidate, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-        goto __pyx_L10;
+        goto __pyx_L13;
       }
-      __pyx_L10:;
+      __pyx_L13:;
     }
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_L3_continue:;
+    __pyx_L6_continue:;
   }
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":935
@@ -44247,7 +42064,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
@@ -44279,43 +42096,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
-static char __pyx_doc_3_sa_23HieroCachingRuleFactory_22input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("input (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_22input(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_fwords));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1 = {__Pyx_NAMESTR("lambda1"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1, METH_NOARGS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("lambda1 (wrapper)", 0);
-  __pyx_r = __pyx_lambda_funcdef_lambda1(__pyx_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2 = {__Pyx_NAMESTR("lambda2"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, METH_NOARGS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("lambda2 (wrapper)", 0);
-  __pyx_r = __pyx_lambda_funcdef_lambda2(__pyx_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1097
  *                         if len(extracts) > 0:
@@ -44325,7 +42106,9 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2
  *                                 fcount[f] += count
  */
 
-static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self) {
+static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_lambda_methdef_lambda2 = {__Pyx_NAMESTR("lambda2"), (PyCFunction)__pyx_lambda_funcdef_lambda2, METH_NOARGS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -44334,12 +42117,13 @@ static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda2", 0);
+  __Pyx_RefNannySetupContext("lambda2");
+  __pyx_self = __pyx_self;
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyList_Type))));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)(&PyList_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyList_Type))));
@@ -44357,7 +42141,7 @@ static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda1.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.input.lambda1.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -44365,7 +42149,9 @@ static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self) {
+static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_lambda_methdef_lambda1 = {__Pyx_NAMESTR("lambda1"), (PyCFunction)__pyx_lambda_funcdef_lambda1, METH_NOARGS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -44374,14 +42160,15 @@ static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda1", 0);
+  __Pyx_RefNannySetupContext("lambda1");
+  __pyx_self = __pyx_self;
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda2, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -44399,7 +42186,7 @@ static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.input.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -44407,18 +42194,6 @@ static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3 = {__Pyx_NAMESTR("lambda3"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3, METH_O, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("lambda3 (wrapper)", 0);
-  __pyx_r = __pyx_lambda_funcdef_lambda3(__pyx_self, ((PyObject *)__pyx_v_x));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1103
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
@@ -44427,7 +42202,9 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObjec
  *                                     # count = len(locs) # Should be?
  */
 
-static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x) {
+static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x); /*proto*/
+static PyMethodDef __pyx_lambda_methdef_lambda3 = {__Pyx_NAMESTR("lambda3"), (PyCFunction)__pyx_lambda_funcdef_lambda3, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -44435,7 +42212,8 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda3", 0);
+  __Pyx_RefNannySetupContext("lambda3");
+  __pyx_self = __pyx_self;
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
@@ -44451,7 +42229,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.input.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -44467,48 +42245,40 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
  *         it looks up all of the rules that can be used to translate
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_11input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
+static char __pyx_doc_3_sa_23HieroCachingRuleFactory_11input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_11input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("input", 0);
+  __Pyx_RefNannySetupContext("input");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)__pyx_ptype_3_sa___pyx_scope_struct_8_input->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_8_input, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __Pyx_INCREF(__pyx_v_fwords);
   __pyx_cur_scope->__pyx_v_fwords = __pyx_v_fwords;
-  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
+  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
@@ -44532,16 +42302,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   PyObject *(*__pyx_t_20)(PyObject *);
   float __pyx_t_21;
   Py_ssize_t __pyx_t_22;
-  Py_ssize_t __pyx_t_23;
+  PyObject *(*__pyx_t_23)(PyObject *);
   Py_ssize_t __pyx_t_24;
-  Py_ssize_t __pyx_t_25;
+  int __pyx_t_25;
   int __pyx_t_26;
-  int __pyx_t_27;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
-    case 1: goto __pyx_L60_resume_from_yield;
+    case 1: goto __pyx_L64_resume_from_yield;
     default: /* CPython raises the right error here */
     __Pyx_RefNannyFinishContext();
     return NULL;
@@ -44575,7 +42344,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  */
-  __pyx_cur_scope->__pyx_v_self->extract_time = 0.0;
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time = 0.0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":951
  *         start_time = monitor_cpu()
@@ -44625,13 +42394,13 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
-  __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_self->rules->root);
-  __Pyx_DECREF(__pyx_cur_scope->__pyx_v_self->rules->root);
-  __pyx_cur_scope->__pyx_v_self->rules->root = __pyx_t_3;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root = __pyx_t_3;
   __pyx_t_3 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":958
@@ -44642,7 +42411,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *             for alt in range(0, len(fwords[i])):
  */
   __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
   __pyx_cur_scope->__pyx_v_frontier = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -44689,7 +42458,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -44703,6 +42473,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  * 
  *         xroot = None
  */
+        if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -44712,7 +42485,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_9 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __pyx_t_10 = PyTuple_New(7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_10);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_10));
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
@@ -44722,9 +42495,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_INCREF(__pyx_int_0);
         PyTuple_SET_ITEM(__pyx_t_10, 3, __pyx_int_0);
         __Pyx_GIVEREF(__pyx_int_0);
-        __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
-        PyTuple_SET_ITEM(__pyx_t_10, 4, __pyx_cur_scope->__pyx_v_self->rules->root);
-        __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+        __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+        PyTuple_SET_ITEM(__pyx_t_10, 4, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+        __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
         __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
         PyTuple_SET_ITEM(__pyx_t_10, 5, ((PyObject *)__pyx_empty_tuple));
         __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
@@ -44760,7 +42533,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]
  */
-  __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, 1);
+  __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, 1);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":966
  *         xroot = None
@@ -44771,9 +42544,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_t_10, __pyx_t_9, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = ((PySequence_Contains(__pyx_t_9, __pyx_t_10))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   if (__pyx_t_8) {
@@ -44785,7 +42558,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  */
-    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
@@ -44808,12 +42581,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
     __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
@@ -44829,7 +42602,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  */
-    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     if (__Pyx_SetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
@@ -44844,7 +42617,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                 if fwords[i][alt][0] != EPSILON:
  */
   __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  for (__pyx_t_4 = __pyx_cur_scope->__pyx_v_self->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
+  for (__pyx_t_4 = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
     /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":973
@@ -44878,7 +42651,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -44892,25 +42666,28 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  * 
  *         next_states = []
  */
-        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
+        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_12);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_12));
         PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         __pyx_t_7 = 0;
         __pyx_t_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_13);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
         PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_10);
@@ -44948,7 +42725,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  */
   __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_13));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
   __pyx_cur_scope->__pyx_v_next_states = __pyx_t_13;
   __pyx_t_13 = 0;
@@ -44971,14 +42748,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  * 
  *         while len(frontier) > 0:
  */
-    __pyx_t_13 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_next_states) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self, __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
     __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
     __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
@@ -45004,7 +42784,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  */
   while (1) {
-    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
+    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); 
     __pyx_t_8 = (__pyx_t_1 > 0);
     if (!__pyx_t_8) break;
 
@@ -45016,7 +42799,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                 word_id = fwords[i][alt][0]
  */
     __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_12);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_12));
     __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
@@ -45030,28 +42813,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]
  */
+    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_12 = ((PyObject *)__pyx_cur_scope->__pyx_v_frontier); __Pyx_INCREF(__pyx_t_12); __pyx_t_1 = 0;
     for (;;) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_12)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_12, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++;
       if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
         PyObject* sequence = __pyx_t_2;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        Py_ssize_t size = Py_SIZE(sequence);
-        #else
-        Py_ssize_t size = PySequence_Size(sequence);
-        #endif
-        if (unlikely(size != 7)) {
-          if (size > 7) __Pyx_RaiseTooManyValuesError(7);
-          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        #if CYTHON_COMPILING_IN_CPYTHON
         if (likely(PyTuple_CheckExact(sequence))) {
+          if (unlikely(PyTuple_GET_SIZE(sequence) != 7)) {
+            if (PyTuple_GET_SIZE(sequence) > 7) __Pyx_RaiseTooManyValuesError(7);
+            else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
           __pyx_t_13 = PyTuple_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
           __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
@@ -45060,6 +42836,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_14 = PyTuple_GET_ITEM(sequence, 5); 
           __pyx_t_15 = PyTuple_GET_ITEM(sequence, 6); 
         } else {
+          if (unlikely(PyList_GET_SIZE(sequence) != 7)) {
+            if (PyList_GET_SIZE(sequence) > 7) __Pyx_RaiseTooManyValuesError(7);
+            else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
           __pyx_t_13 = PyList_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
           __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
@@ -45075,36 +42856,34 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_INCREF(__pyx_t_3);
         __Pyx_INCREF(__pyx_t_14);
         __Pyx_INCREF(__pyx_t_15);
-        #else
-        Py_ssize_t i;
-        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
-        for (i=0; i < 7; i++) {
-          PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          *(temps[i]) = item;
-        }
-        #endif
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      } else
-      {
+      } else {
         Py_ssize_t index = -1;
-        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
         __pyx_t_16 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_16);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-        for (index=0; index < 7; index++) {
-          PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L21_unpacking_failed;
-          __Pyx_GOTREF(item);
-          *(temps[index]) = item;
-        }
+        index = 0; __pyx_t_13 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_13)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_13);
+        index = 1; __pyx_t_7 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_7)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_7);
+        index = 2; __pyx_t_9 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_9)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_9);
+        index = 3; __pyx_t_10 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_10);
+        index = 4; __pyx_t_3 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_3)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_3);
+        index = 5; __pyx_t_14 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_14)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_14);
+        index = 6; __pyx_t_15 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_15);
         if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 7) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_17 = NULL;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         goto __pyx_L22_unpacking_done;
         __pyx_L21_unpacking_failed:;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-        __pyx_t_17 = NULL;
-        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+        if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+        if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_L22_unpacking_done:;
       }
@@ -45189,7 +42968,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -45210,7 +42990,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_15 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_14);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -45256,6 +43037,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                     continue
  * 
  */
+          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
+            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+          }
           __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -45266,7 +43050,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_14);
           __Pyx_GIVEREF(__pyx_t_14);
           PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -45312,7 +43096,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                 arity = hiero_phrase.arity()
  */
       __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_word_id);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_word_id);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_word_id);
@@ -45333,7 +43117,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  * 
  */
       __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_15));
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
@@ -45380,7 +43164,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_15, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = ((PySequence_Contains(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
@@ -45472,7 +43256,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_3 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = ((PySequence_Contains(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           if (__pyx_t_8) {
 
@@ -45633,7 +43417,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         if arity > 0:
  */
           if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -45670,7 +43454,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_2 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->intersect(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->__pyx_vtab)->intersect(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -45705,7 +43489,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
@@ -45721,7 +43505,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_2));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
             PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_15);
@@ -45771,7 +43555,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_GOTREF(__pyx_t_9);
               if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
               __Pyx_GOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -45841,11 +43625,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  */
-          __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+          __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_suffix_link);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_suffix_link);
-          __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
-          __pyx_cur_scope->__pyx_v_suffix_link = __pyx_cur_scope->__pyx_v_self->rules->root;
+          __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+          __pyx_cur_scope->__pyx_v_suffix_link = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1051
  *                         # Search succeeded
@@ -45912,7 +43696,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                     node = new_node
  */
           if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -45955,7 +43739,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  */
-        __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
+        __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_nonterminals);
         if (__pyx_t_8) {
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1063
@@ -45981,7 +43765,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         if is_shadow_path:
  */
           __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, __pyx_t_18);
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1065
  *                         xcat_index = arity+1
@@ -46032,7 +43816,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  */
           __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
+          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, __pyx_t_18);
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1069
  *                             suffix_link_xcat_index = xcat_index-1
@@ -46076,7 +43860,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
@@ -46084,7 +43868,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
@@ -46093,7 +43877,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
 
@@ -46131,12 +43915,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  */
-          __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_t_10 = 0;
@@ -46176,7 +43960,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GOTREF(__pyx_t_3);
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_chunklen));
@@ -46213,7 +43997,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         extract_start = monitor_cpu()
  */
           __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
@@ -46263,7 +44047,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  */
             __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
@@ -46277,7 +44061,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  */
-            __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, __pyx_cur_scope->__pyx_v_self->fda->sent_id->arr);
+            __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda->sent_id->arr);
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1087
  * 
@@ -46289,7 +44073,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_3 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
             PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_t_3 = 0;
@@ -46309,7 +44093,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns
  */
-            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->extract(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->__pyx_vtab)->extract(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -46327,7 +44111,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_10 = PyList_New(0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
             if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_extract) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_extract)) {
               __pyx_t_9 = __pyx_cur_scope->__pyx_v_extract; __Pyx_INCREF(__pyx_t_9); __pyx_t_5 = 0;
               __pyx_t_20 = NULL;
@@ -46337,20 +44121,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_t_20 = Py_TYPE(__pyx_t_9)->tp_iternext;
             }
             for (;;) {
-              if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_9)) {
+              if (PyList_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_9)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #else
-                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
-              } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_9)) {
+                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++;
+              } else if (PyTuple_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #else
-                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
+                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++;
               } else {
                 __pyx_t_14 = __pyx_t_20(__pyx_t_9);
                 if (unlikely(!__pyx_t_14)) {
@@ -46368,19 +44144,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_cur_scope->__pyx_v_e = __pyx_t_14;
               __pyx_t_14 = 0;
               __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
               PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_cur_scope->__pyx_v_e);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loc);
               PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_cur_scope->__pyx_v_loc);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loc);
-              if (unlikely(__Pyx_PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (unlikely(PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
             }
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
             __Pyx_INCREF(((PyObject *)__pyx_t_10));
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
@@ -46440,7 +44216,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  */
-          __pyx_t_10 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
@@ -46448,9 +44224,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_10 = PyNumber_Subtract(__pyx_t_9, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_21 = __pyx_PyFloat_AsFloat(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_21 = __pyx_PyFloat_AsDouble(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_cur_scope->__pyx_v_self->extract_time = __pyx_t_21;
+          ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time = __pyx_t_21;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1095
  *                         extract_stop = monitor_cpu()
@@ -46459,7 +44235,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  */
-          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_extracts) == Py_None)) {
+            PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+          }
+          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); 
           __pyx_t_19 = (__pyx_t_5 > 0);
           if (__pyx_t_19) {
 
@@ -46490,10 +44269,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
             __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda1, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
             PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __pyx_t_10 = 0;
@@ -46514,43 +44293,36 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  */
+            if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_extracts) == Py_None)) {
+              PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+            }
             __pyx_t_10 = ((PyObject *)__pyx_cur_scope->__pyx_v_extracts); __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
             for (;;) {
               if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_3 = PySequence_ITEM(__pyx_t_10, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++;
               if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
                 PyObject* sequence = __pyx_t_3;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                Py_ssize_t size = Py_SIZE(sequence);
-                #else
-                Py_ssize_t size = PySequence_Size(sequence);
-                #endif
-                if (unlikely(size != 2)) {
-                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
-                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
+                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
                   __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
+                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
                   __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
                 }
                 __Pyx_INCREF(__pyx_t_9);
                 __Pyx_INCREF(__pyx_t_14);
-                #else
-                __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
                 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              } else
-              {
+              } else {
                 Py_ssize_t index = -1;
                 __pyx_t_15 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
@@ -46561,35 +44333,33 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_15); if (unlikely(!__pyx_t_14)) goto __pyx_L50_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_14);
                 if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_15), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 goto __pyx_L51_unpacking_done;
                 __pyx_L50_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                __pyx_t_17 = NULL;
-                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                 {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L51_unpacking_done:;
               }
               if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
                 PyObject* sequence = __pyx_t_9;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                Py_ssize_t size = Py_SIZE(sequence);
-                #else
-                Py_ssize_t size = PySequence_Size(sequence);
-                #endif
-                if (unlikely(size != 4)) {
-                  if (size > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
-                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
+                  if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
+                    if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
                   __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   __pyx_t_7 = PyTuple_GET_ITEM(sequence, 2); 
                   __pyx_t_13 = PyTuple_GET_ITEM(sequence, 3); 
                 } else {
+                  if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
+                    if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
+                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
                   __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   __pyx_t_7 = PyList_GET_ITEM(sequence, 2); 
@@ -46599,36 +44369,28 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(__pyx_t_2);
                 __Pyx_INCREF(__pyx_t_7);
                 __Pyx_INCREF(__pyx_t_13);
-                #else
-                Py_ssize_t i;
-                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
-                for (i=0; i < 4; i++) {
-                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  *(temps[i]) = item;
-                }
-                #endif
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              } else
-              {
+              } else {
                 Py_ssize_t index = -1;
-                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
                 __pyx_t_16 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
                 __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-                for (index=0; index < 4; index++) {
-                  PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L52_unpacking_failed;
-                  __Pyx_GOTREF(item);
-                  *(temps[index]) = item;
-                }
+                index = 0; __pyx_t_15 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_15);
+                index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_2)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_2);
+                index = 2; __pyx_t_7 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_7)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_7);
+                index = 3; __pyx_t_13 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_13)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_13);
                 if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
                 goto __pyx_L53_unpacking_done;
                 __pyx_L52_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-                __pyx_t_17 = NULL;
-                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                 {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L53_unpacking_done:;
               }
@@ -46705,32 +44467,90 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  */
-            __pyx_t_5 = 0;
-            if (unlikely(__pyx_cur_scope->__pyx_v_fphrases == Py_None)) {
-              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_fphrases, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_22), (&__pyx_t_18)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_fphrases, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_XDECREF(__pyx_t_10);
-            __pyx_t_10 = __pyx_t_9;
-            __pyx_t_9 = 0;
-            while (1) {
-              __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_10, __pyx_t_22, &__pyx_t_5, &__pyx_t_9, &__pyx_t_3, NULL, __pyx_t_18);
-              if (unlikely(__pyx_t_6 == 0)) break;
-              if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_9);
-              __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            if (PyList_CheckExact(__pyx_t_9) || PyTuple_CheckExact(__pyx_t_9)) {
+              __pyx_t_10 = __pyx_t_9; __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
+              __pyx_t_20 = NULL;
+            } else {
+              __pyx_t_5 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_10);
+              __pyx_t_20 = Py_TYPE(__pyx_t_10)->tp_iternext;
+            }
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            for (;;) {
+              if (PyList_CheckExact(__pyx_t_10)) {
+                if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
+                __pyx_t_9 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_9); __pyx_t_5++;
+              } else if (PyTuple_CheckExact(__pyx_t_10)) {
+                if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_10)) break;
+                __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_9); __pyx_t_5++;
+              } else {
+                __pyx_t_9 = __pyx_t_20(__pyx_t_10);
+                if (unlikely(!__pyx_t_9)) {
+                  if (PyErr_Occurred()) {
+                    if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  break;
+                }
+                __Pyx_GOTREF(__pyx_t_9);
+              }
+              if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
+                PyObject* sequence = __pyx_t_9;
+                if (likely(PyTuple_CheckExact(sequence))) {
+                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+                  __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
+                } else {
+                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
+                  __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
+                }
+                __Pyx_INCREF(__pyx_t_3);
+                __Pyx_INCREF(__pyx_t_14);
+                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              } else {
+                Py_ssize_t index = -1;
+                __pyx_t_13 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
+                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+                __pyx_t_17 = Py_TYPE(__pyx_t_13)->tp_iternext;
+                index = 0; __pyx_t_3 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L56_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_3);
+                index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_14)) goto __pyx_L56_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_14);
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                goto __pyx_L57_unpacking_done;
+                __pyx_L56_unpacking_failed:;
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_L57_unpacking_done:;
+              }
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_f);
-              __Pyx_GIVEREF(__pyx_t_9);
-              __pyx_cur_scope->__pyx_v_f = __pyx_t_9;
-              __pyx_t_9 = 0;
-              __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_elist);
-              __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_elist);
               __Pyx_GIVEREF(__pyx_t_3);
-              __pyx_cur_scope->__pyx_v_elist = __pyx_t_3;
+              __pyx_cur_scope->__pyx_v_f = __pyx_t_3;
               __pyx_t_3 = 0;
+              __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_elist);
+              __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_elist);
+              __Pyx_GIVEREF(__pyx_t_14);
+              __pyx_cur_scope->__pyx_v_elist = __pyx_t_14;
+              __pyx_t_14 = 0;
 
               /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1102
  *                                 fphrases[f][e][als].append(loc)
@@ -46739,32 +44559,90 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  */
-              __pyx_t_23 = 0;
-              if (unlikely(__pyx_cur_scope->__pyx_v_elist == Py_None)) {
-                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              }
-              __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_elist, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_24), (&__pyx_t_6)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_elist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              __Pyx_XDECREF(__pyx_t_3);
-              __pyx_t_3 = __pyx_t_9;
-              __pyx_t_9 = 0;
-              while (1) {
-                __pyx_t_4 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_24, &__pyx_t_23, &__pyx_t_9, &__pyx_t_14, NULL, __pyx_t_6);
-                if (unlikely(__pyx_t_4 == 0)) break;
-                if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_14);
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              if (PyList_CheckExact(__pyx_t_14) || PyTuple_CheckExact(__pyx_t_14)) {
+                __pyx_t_9 = __pyx_t_14; __Pyx_INCREF(__pyx_t_9); __pyx_t_22 = 0;
+                __pyx_t_23 = NULL;
+              } else {
+                __pyx_t_22 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_GOTREF(__pyx_t_14);
+                __pyx_t_23 = Py_TYPE(__pyx_t_9)->tp_iternext;
+              }
+              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+              for (;;) {
+                if (PyList_CheckExact(__pyx_t_9)) {
+                  if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_9)) break;
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_22); __Pyx_INCREF(__pyx_t_14); __pyx_t_22++;
+                } else if (PyTuple_CheckExact(__pyx_t_9)) {
+                  if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_22); __Pyx_INCREF(__pyx_t_14); __pyx_t_22++;
+                } else {
+                  __pyx_t_14 = __pyx_t_23(__pyx_t_9);
+                  if (unlikely(!__pyx_t_14)) {
+                    if (PyErr_Occurred()) {
+                      if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    break;
+                  }
+                  __Pyx_GOTREF(__pyx_t_14);
+                }
+                if ((likely(PyTuple_CheckExact(__pyx_t_14))) || (PyList_CheckExact(__pyx_t_14))) {
+                  PyObject* sequence = __pyx_t_14;
+                  if (likely(PyTuple_CheckExact(sequence))) {
+                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+                    __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
+                  } else {
+                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
+                    __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
+                  }
+                  __Pyx_INCREF(__pyx_t_3);
+                  __Pyx_INCREF(__pyx_t_13);
+                  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+                } else {
+                  Py_ssize_t index = -1;
+                  __pyx_t_7 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __Pyx_GOTREF(__pyx_t_7);
+                  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+                  __pyx_t_17 = Py_TYPE(__pyx_t_7)->tp_iternext;
+                  index = 0; __pyx_t_3 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L60_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_3);
+                  index = 1; __pyx_t_13 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_13)) goto __pyx_L60_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_13);
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+                  goto __pyx_L61_unpacking_done;
+                  __pyx_L60_unpacking_failed:;
+                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_L61_unpacking_done:;
+                }
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
-                __Pyx_GIVEREF(__pyx_t_9);
-                __pyx_cur_scope->__pyx_v_e = __pyx_t_9;
-                __pyx_t_9 = 0;
+                __Pyx_GIVEREF(__pyx_t_3);
+                __pyx_cur_scope->__pyx_v_e = __pyx_t_3;
+                __pyx_t_3 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alslist);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alslist);
-                __Pyx_GIVEREF(__pyx_t_14);
-                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_14;
-                __pyx_t_14 = 0;
+                __Pyx_GIVEREF(__pyx_t_13);
+                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_13;
+                __pyx_t_13 = 0;
 
                 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1103
  *                             for f, elist in fphrases.iteritems():
@@ -46775,78 +44653,71 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
                 __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
+                __pyx_t_13 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
-                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
-                __Pyx_GIVEREF(__pyx_t_9);
-                __pyx_t_9 = 0;
-                __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-                __pyx_t_13 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__key), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13);
+                __Pyx_GIVEREF(__pyx_t_13);
+                __pyx_t_13 = 0;
+                __pyx_t_13 = PyDict_New(); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+                __pyx_t_3 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda3, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
+                if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__key), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __pyx_t_3 = PyEval_CallObjectWithKeywords(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-                if ((likely(PyTuple_CheckExact(__pyx_t_13))) || (PyList_CheckExact(__pyx_t_13))) {
-                  PyObject* sequence = __pyx_t_13;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  Py_ssize_t size = Py_SIZE(sequence);
-                  #else
-                  Py_ssize_t size = PySequence_Size(sequence);
-                  #endif
-                  if (unlikely(size != 2)) {
-                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  #if CYTHON_COMPILING_IN_CPYTHON
+                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+                if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+                  PyObject* sequence = __pyx_t_3;
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
+                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    __pyx_t_13 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
+                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    __pyx_t_13 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
                   }
-                  __Pyx_INCREF(__pyx_t_9);
+                  __Pyx_INCREF(__pyx_t_13);
                   __Pyx_INCREF(__pyx_t_14);
-                  #else
-                  __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
-                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                } else
-                {
+                  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                } else {
                   Py_ssize_t index = -1;
-                  __pyx_t_7 = PyObject_GetIter(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_7 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_7);
-                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_7)->tp_iternext;
-                  index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_9)) goto __pyx_L58_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_9);
-                  index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_14)) goto __pyx_L58_unpacking_failed;
+                  index = 0; __pyx_t_13 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_13)) goto __pyx_L62_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_13);
+                  index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_14)) goto __pyx_L62_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_14);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  goto __pyx_L59_unpacking_done;
-                  __pyx_L58_unpacking_failed:;
+                  goto __pyx_L63_unpacking_done;
+                  __pyx_L62_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  __pyx_t_17 = NULL;
-                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_L59_unpacking_done:;
+                  __pyx_L63_unpacking_done:;
                 }
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alignment);
-                __Pyx_GIVEREF(__pyx_t_9);
-                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_9;
-                __pyx_t_9 = 0;
+                __Pyx_GIVEREF(__pyx_t_13);
+                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_13;
+                __pyx_t_13 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_max_locs);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_max_locs);
                 __Pyx_GIVEREF(__pyx_t_14);
@@ -46860,38 +44731,38 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                                     # count = len(locs) # Should be?
  *                                     count = len(max_locs) # Was
  */
-                __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_14 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__chain); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_14 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__chain); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_13 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_9 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+                PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_13);
+                __Pyx_GIVEREF(__pyx_t_13);
+                __pyx_t_13 = 0;
+                __pyx_t_13 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
-                __Pyx_GIVEREF(__pyx_t_9);
-                __pyx_t_9 = 0;
-                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-                __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+                __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+                PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_13);
+                __Pyx_GIVEREF(__pyx_t_13);
+                __pyx_t_13 = 0;
+                __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
-                __Pyx_GIVEREF(__pyx_t_9);
-                __pyx_t_9 = 0;
-                __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
-                __Pyx_GIVEREF(__pyx_t_9);
-                __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_9);
-                __pyx_t_9 = 0;
+                __Pyx_GIVEREF(__pyx_t_13);
+                __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_13);
+                __pyx_t_13 = 0;
 
                 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1106
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
@@ -46900,14 +44771,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  */
-                __pyx_t_25 = PyObject_Length(__pyx_cur_scope->__pyx_v_max_locs); if (unlikely(__pyx_t_25 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
+                __pyx_t_24 = PyObject_Length(__pyx_cur_scope->__pyx_v_max_locs); if (unlikely(__pyx_t_24 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyInt_FromSsize_t(__pyx_t_24); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
-                __Pyx_GIVEREF(__pyx_t_9);
-                __pyx_cur_scope->__pyx_v_count = __pyx_t_9;
-                __pyx_t_9 = 0;
+                __Pyx_GIVEREF(__pyx_t_13);
+                __pyx_cur_scope->__pyx_v_count = __pyx_t_13;
+                __pyx_t_13 = 0;
 
                 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1107
  *                                     # count = len(locs) # Should be?
@@ -46916,8 +44787,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                                                f, e, count, fcount[f], num_samples,
  *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  */
-                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_9);
+                __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
 
                 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1108
  *                                     count = len(max_locs) # Was
@@ -46926,8 +44797,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  *                                                ))
  */
-                __pyx_t_13 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
+                __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
                 __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
 
@@ -46946,7 +44817,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
                 __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_2);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7);
                 __Pyx_GIVEREF(__pyx_t_7);
                 PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_15);
@@ -46954,7 +44825,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_t_7 = 0;
                 __pyx_t_15 = 0;
                 __pyx_t_15 = PyTuple_New(10); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                 PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_f);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f);
@@ -46964,8 +44835,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_count);
                 PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_cur_scope->__pyx_v_count);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_count);
-                PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_13);
-                __Pyx_GIVEREF(__pyx_t_13);
+                PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_3);
+                __Pyx_GIVEREF(__pyx_t_3);
                 PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_14);
                 __Pyx_GIVEREF(__pyx_t_14);
                 PyTuple_SET_ITEM(__pyx_t_15, 5, ((PyObject *)__pyx_t_2));
@@ -46976,20 +44847,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
                 PyTuple_SET_ITEM(__pyx_t_15, 7, __pyx_cur_scope->__pyx_v_fwords);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
-                __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
-                PyTuple_SET_ITEM(__pyx_t_15, 8, ((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
-                __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
-                __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
-                PyTuple_SET_ITEM(__pyx_t_15, 9, ((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
-                __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
-                __pyx_t_13 = 0;
+                __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda));
+                PyTuple_SET_ITEM(__pyx_t_15, 8, ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda));
+                __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda));
+                __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->eda));
+                PyTuple_SET_ITEM(__pyx_t_15, 9, ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->eda));
+                __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->eda));
+                __pyx_t_3 = 0;
                 __pyx_t_14 = 0;
                 __pyx_t_2 = 0;
-                __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer->__pyx_vtab)->score(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
@@ -47005,10 +44876,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  */
-                __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_2);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_15);
                 __Pyx_GIVEREF(__pyx_t_15);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
@@ -47030,43 +44901,39 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_r = __pyx_t_15;
                 __pyx_t_15 = 0;
                 __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
-                __Pyx_XGIVEREF(__pyx_t_3);
-                __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
-                __pyx_cur_scope->__pyx_t_2 = __pyx_t_5;
-                __pyx_cur_scope->__pyx_t_3 = __pyx_t_6;
+                __pyx_cur_scope->__pyx_t_1 = __pyx_t_5;
+                __Pyx_XGIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_t_2 = __pyx_t_9;
                 __Pyx_XGIVEREF(__pyx_t_10);
-                __pyx_cur_scope->__pyx_t_4 = __pyx_t_10;
+                __pyx_cur_scope->__pyx_t_3 = __pyx_t_10;
                 __Pyx_XGIVEREF(__pyx_t_12);
-                __pyx_cur_scope->__pyx_t_5 = __pyx_t_12;
-                __pyx_cur_scope->__pyx_t_6 = __pyx_t_18;
-                __pyx_cur_scope->__pyx_t_7 = __pyx_t_22;
-                __pyx_cur_scope->__pyx_t_8 = __pyx_t_23;
-                __pyx_cur_scope->__pyx_t_9 = __pyx_t_24;
+                __pyx_cur_scope->__pyx_t_4 = __pyx_t_12;
+                __pyx_cur_scope->__pyx_t_5 = __pyx_t_20;
+                __pyx_cur_scope->__pyx_t_6 = __pyx_t_22;
+                __pyx_cur_scope->__pyx_t_7 = __pyx_t_23;
                 __Pyx_XGIVEREF(__pyx_r);
                 __Pyx_RefNannyFinishContext();
                 /* return from generator, yielding value */
-                __pyx_generator->resume_label = 1;
+                __pyx_cur_scope->__pyx_base.resume_label = 1;
                 return __pyx_r;
-                __pyx_L60_resume_from_yield:;
+                __pyx_L64_resume_from_yield:;
                 __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
-                __pyx_t_3 = __pyx_cur_scope->__pyx_t_1;
-                __pyx_cur_scope->__pyx_t_1 = 0;
-                __Pyx_XGOTREF(__pyx_t_3);
-                __pyx_t_5 = __pyx_cur_scope->__pyx_t_2;
-                __pyx_t_6 = __pyx_cur_scope->__pyx_t_3;
-                __pyx_t_10 = __pyx_cur_scope->__pyx_t_4;
-                __pyx_cur_scope->__pyx_t_4 = 0;
+                __pyx_t_5 = __pyx_cur_scope->__pyx_t_1;
+                __pyx_t_9 = __pyx_cur_scope->__pyx_t_2;
+                __pyx_cur_scope->__pyx_t_2 = 0;
+                __Pyx_XGOTREF(__pyx_t_9);
+                __pyx_t_10 = __pyx_cur_scope->__pyx_t_3;
+                __pyx_cur_scope->__pyx_t_3 = 0;
                 __Pyx_XGOTREF(__pyx_t_10);
-                __pyx_t_12 = __pyx_cur_scope->__pyx_t_5;
-                __pyx_cur_scope->__pyx_t_5 = 0;
+                __pyx_t_12 = __pyx_cur_scope->__pyx_t_4;
+                __pyx_cur_scope->__pyx_t_4 = 0;
                 __Pyx_XGOTREF(__pyx_t_12);
-                __pyx_t_18 = __pyx_cur_scope->__pyx_t_6;
-                __pyx_t_22 = __pyx_cur_scope->__pyx_t_7;
-                __pyx_t_23 = __pyx_cur_scope->__pyx_t_8;
-                __pyx_t_24 = __pyx_cur_scope->__pyx_t_9;
+                __pyx_t_20 = __pyx_cur_scope->__pyx_t_5;
+                __pyx_t_22 = __pyx_cur_scope->__pyx_t_6;
+                __pyx_t_23 = __pyx_cur_scope->__pyx_t_7;
                 if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             goto __pyx_L47;
@@ -47086,37 +44953,39 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  */
-      __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (__pyx_t_22 < __pyx_cur_scope->__pyx_v_self->max_length);
+      __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = (__pyx_t_5 < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_length);
       if (__pyx_t_19) {
         __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_3 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_22); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_15 = PyObject_RichCompare(__pyx_t_3, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_15 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_LT); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_15);
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
           __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_3 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_27 = __pyx_t_26;
+          __pyx_t_25 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_25 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_26 = __pyx_t_25;
         } else {
-          __pyx_t_27 = __pyx_t_8;
+          __pyx_t_26 = __pyx_t_8;
         }
-        __pyx_t_8 = __pyx_t_27;
+        __pyx_t_8 = __pyx_t_26;
       } else {
         __pyx_t_8 = __pyx_t_19;
       }
@@ -47129,17 +44998,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  */
-        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_10 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_10 = PyNumber_Add(__pyx_t_9, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __pyx_t_9 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_22 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_22; __pyx_t_18+=1) {
+        __pyx_t_5 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_alt_id = __pyx_t_18;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1115
@@ -47149,8 +45018,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  */
-          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
+            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+          }
+          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_15 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -47160,31 +45032,31 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyTuple_New(7); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
-          __Pyx_GIVEREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_15);
+          __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
+          __Pyx_GIVEREF(__pyx_t_9);
+          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_15);
           __Pyx_GIVEREF(__pyx_t_15);
-          PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_13, 3, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_node);
-          PyTuple_SET_ITEM(__pyx_t_9, 4, __pyx_cur_scope->__pyx_v_node);
+          PyTuple_SET_ITEM(__pyx_t_13, 4, __pyx_cur_scope->__pyx_v_node);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_node);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
-          PyTuple_SET_ITEM(__pyx_t_9, 5, __pyx_cur_scope->__pyx_v_phrase);
+          PyTuple_SET_ITEM(__pyx_t_13, 5, __pyx_cur_scope->__pyx_v_phrase);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          PyTuple_SET_ITEM(__pyx_t_9, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
+          PyTuple_SET_ITEM(__pyx_t_13, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          __pyx_t_3 = 0;
+          __pyx_t_9 = 0;
           __pyx_t_15 = 0;
           __pyx_t_10 = 0;
           __pyx_t_2 = 0;
-          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_9)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
         }
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1116
@@ -47215,9 +45087,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         xcat = sym_setindex(self.category, arity+1)
  */
           __pyx_cur_scope->__pyx_v_num_subpatterns = (__pyx_cur_scope->__pyx_v_num_subpatterns + 1);
-          goto __pyx_L64;
+          goto __pyx_L68;
         }
-        __pyx_L64:;
+        __pyx_L68:;
 
         /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1119
  *                     if not is_shadow_path:
@@ -47226,17 +45098,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]
  */
-        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = ((__pyx_t_22 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
+        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = ((__pyx_t_5 + 1) < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_length);
         if (__pyx_t_19) {
-          __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
+          __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_nonterminals);
           if (__pyx_t_8) {
-            __pyx_t_27 = (__pyx_cur_scope->__pyx_v_num_subpatterns < __pyx_cur_scope->__pyx_v_self->max_chunks);
-            __pyx_t_26 = __pyx_t_27;
+            __pyx_t_26 = (__pyx_cur_scope->__pyx_v_num_subpatterns < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_chunks);
+            __pyx_t_25 = __pyx_t_26;
           } else {
-            __pyx_t_26 = __pyx_t_8;
+            __pyx_t_25 = __pyx_t_8;
           }
-          __pyx_t_8 = __pyx_t_26;
+          __pyx_t_8 = __pyx_t_25;
         } else {
           __pyx_t_8 = __pyx_t_19;
         }
@@ -47249,7 +45121,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  */
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, (__pyx_cur_scope->__pyx_v_arity + 1));
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, (__pyx_cur_scope->__pyx_v_arity + 1));
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1121
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
@@ -47258,11 +45130,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_13);
+          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_13, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xnode);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_xnode);
           __Pyx_GIVEREF(__pyx_t_2);
@@ -47276,16 +45148,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_13);
           __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
           PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_9);
-          __Pyx_GIVEREF(__pyx_t_9);
+          PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_13);
+          __Pyx_GIVEREF(__pyx_t_13);
           __Pyx_INCREF(__pyx_int_1);
           PyList_SET_ITEM(__pyx_t_10, 2, __pyx_int_1);
           __Pyx_GIVEREF(__pyx_int_1);
@@ -47293,15 +45165,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           PyList_SET_ITEM(__pyx_t_10, 3, __pyx_cur_scope->__pyx_v_pathlen);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
           __pyx_t_2 = 0;
-          __pyx_t_9 = 0;
-          __pyx_t_9 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+          __pyx_t_13 = 0;
+          __pyx_t_13 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
-          __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
-          __pyx_cur_scope->__pyx_v_key = __pyx_t_9;
-          __pyx_t_9 = 0;
+          __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
+          __pyx_cur_scope->__pyx_v_key = __pyx_t_13;
+          __pyx_t_13 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1124
  *                         # I put spanlen=1 below
@@ -47310,13 +45182,13 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  */
-          __pyx_t_9 = PyList_New(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
-          __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
-          __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_9);
-          __pyx_t_9 = 0;
+          __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
+          __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_13);
+          __pyx_t_13 = 0;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1125
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
@@ -47325,7 +45197,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  */
-          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer) == Py_None)) {
+            PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+          }
+          __pyx_t_8 = ((PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1126
@@ -47335,14 +45210,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  */
-            __pyx_t_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
-            __Pyx_GIVEREF(__pyx_t_9);
-            __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_9;
-            __pyx_t_9 = 0;
-            goto __pyx_L66;
+            __Pyx_GIVEREF(__pyx_t_13);
+            __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_13;
+            __pyx_t_13 = 0;
+            goto __pyx_L70;
           }
           /*else*/ {
 
@@ -47353,14 +45228,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  */
-            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_124); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self, __pyx_n_s_124); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
+            __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_15 = PyTuple_New(7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
@@ -47382,9 +45257,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
             __pyx_t_10 = 0;
             __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
@@ -47401,7 +45276,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
             if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
-          __pyx_L66:;
+          __pyx_L70:;
 
           /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1131
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
@@ -47411,28 +45286,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *             frontier = new_frontier
  */
           if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes)) {
-            __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_22 = 0;
+            __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_5 = 0;
             __pyx_t_20 = NULL;
           } else {
-            __pyx_t_22 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_20 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
-            } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+            if (PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_15); __pyx_t_5++;
+            } else if (PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_15); __pyx_t_5++;
             } else {
               __pyx_t_15 = __pyx_t_20(__pyx_t_2);
               if (unlikely(!__pyx_t_15)) {
@@ -47446,70 +45313,62 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
               PyObject* sequence = __pyx_t_15;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              Py_ssize_t size = Py_SIZE(sequence);
-              #else
-              Py_ssize_t size = PySequence_Size(sequence);
-              #endif
-              if (unlikely(size != 3)) {
-                if (size > 3) __Pyx_RaiseTooManyValuesError(3);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              }
-              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
+                if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
+                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
+                __pyx_t_13 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
-                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2); 
+                __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
-                __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
+                if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
+                  if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
+                __pyx_t_13 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
-                __pyx_t_3 = PyList_GET_ITEM(sequence, 2); 
+                __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
               }
-              __Pyx_INCREF(__pyx_t_9);
+              __Pyx_INCREF(__pyx_t_13);
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_3);
-              #else
-              __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              __Pyx_INCREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-            } else
-            {
+            } else {
               Py_ssize_t index = -1;
               __pyx_t_14 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __pyx_t_17 = Py_TYPE(__pyx_t_14)->tp_iternext;
-              index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_9)) goto __pyx_L69_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_9);
-              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_10)) goto __pyx_L69_unpacking_failed;
+              index = 0; __pyx_t_13 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L73_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_13);
+              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_10)) goto __pyx_L73_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_3 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_3)) goto __pyx_L69_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_3);
+              index = 2; __pyx_t_9 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_9)) goto __pyx_L73_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_9);
               if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_14), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-              goto __pyx_L70_unpacking_done;
-              __pyx_L69_unpacking_failed:;
+              goto __pyx_L74_unpacking_done;
+              __pyx_L73_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-              __pyx_t_17 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
               {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_L70_unpacking_done:;
+              __pyx_L74_unpacking_done:;
             }
-            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_13); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
             __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __pyx_cur_scope->__pyx_v_i = __pyx_t_18;
             __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_pathlen);
-            __Pyx_GIVEREF(__pyx_t_3);
-            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __Pyx_GIVEREF(__pyx_t_9);
+            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_9;
+            __pyx_t_9 = 0;
 
             /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1132
  * 
@@ -47518,28 +45377,31 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *             frontier = new_frontier
  * 
  */
+            if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
+              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+            }
             __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
             __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_14);
-            PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
-            __Pyx_GIVEREF(__pyx_t_9);
-            __pyx_t_9 = 0;
-            __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+            PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13);
+            __Pyx_GIVEREF(__pyx_t_13);
+            __pyx_t_13 = 0;
+            __pyx_t_13 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
             __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
             __pyx_t_14 = PyTuple_New(7); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_14);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_14));
             PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_15);
             __Pyx_GIVEREF(__pyx_t_15);
-            PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_3);
-            __Pyx_GIVEREF(__pyx_t_3);
+            PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_9);
+            __Pyx_GIVEREF(__pyx_t_9);
             PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
@@ -47548,25 +45410,25 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_xnode);
             PyTuple_SET_ITEM(__pyx_t_14, 4, __pyx_cur_scope->__pyx_v_xnode);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_14, 5, __pyx_t_9);
-            __Pyx_GIVEREF(__pyx_t_9);
+            PyTuple_SET_ITEM(__pyx_t_14, 5, __pyx_t_13);
+            __Pyx_GIVEREF(__pyx_t_13);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
             PyTuple_SET_ITEM(__pyx_t_14, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
             __pyx_t_15 = 0;
-            __pyx_t_3 = 0;
-            __pyx_t_10 = 0;
             __pyx_t_9 = 0;
+            __pyx_t_10 = 0;
+            __pyx_t_13 = 0;
             __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_14)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L65;
+          goto __pyx_L69;
         }
-        __pyx_L65:;
-        goto __pyx_L61;
+        __pyx_L69:;
+        goto __pyx_L65;
       }
-      __pyx_L61:;
+      __pyx_L65:;
       __pyx_L19_continue:;
     }
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
@@ -47616,7 +45478,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_GOTREF(__pyx_t_14);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_12);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_12));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
   PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_125));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
@@ -47658,10 +45520,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __pyx_t_12 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-  __pyx_t_14 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_14 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_14);
   __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_126));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_126));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_126));
@@ -47673,7 +45535,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
@@ -47689,8 +45551,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_AddTraceback("input", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -47703,7 +45564,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                         int* f_links_low, int* f_links_high,
  */
 
-static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_f_low, PyObject *__pyx_v_f_high, int *__pyx_v_f_links_low, int *__pyx_v_f_links_high, int *__pyx_v_e_links_low, int *__pyx_v_e_links_high, int __pyx_v_e_in_low, int __pyx_v_e_in_high, int *__pyx_v_e_low, int *__pyx_v_e_high, int *__pyx_v_f_back_low, int *__pyx_v_f_back_high, int __pyx_v_f_sent_len, int __pyx_v_e_sent_len, int __pyx_v_max_f_len, int __pyx_v_max_e_len, int __pyx_v_min_fx_size, int __pyx_v_min_ex_size, int __pyx_v_max_new_x, int __pyx_v_allow_low_x, int __pyx_v_allow_high_x, int __pyx_v_allow_arbitrary_x, CYTHON_UNUSED int __pyx_v_write_log) {
+static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_f_low, PyObject *__pyx_v_f_high, int *__pyx_v_f_links_low, int *__pyx_v_f_links_high, int *__pyx_v_e_links_low, int *__pyx_v_e_links_high, int __pyx_v_e_in_low, int __pyx_v_e_in_high, int *__pyx_v_e_low, int *__pyx_v_e_high, int *__pyx_v_f_back_low, int *__pyx_v_f_back_high, int __pyx_v_f_sent_len, int __pyx_v_e_sent_len, int __pyx_v_max_f_len, int __pyx_v_max_e_len, int __pyx_v_min_fx_size, int __pyx_v_min_ex_size, int __pyx_v_max_new_x, int __pyx_v_allow_low_x, int __pyx_v_allow_high_x, int __pyx_v_allow_arbitrary_x, int __pyx_v_write_log) {
   int __pyx_v_e_low_prev;
   int __pyx_v_e_high_prev;
   int __pyx_v_f_low_prev;
@@ -47723,7 +45584,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("find_fixpoint", 0);
+  __Pyx_RefNannySetupContext("find_fixpoint");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1156
  *         cdef int e_low_prev, e_high_prev, f_low_prev, f_high_prev, new_x, new_low_x, new_high_x
@@ -48080,7 +45941,8 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
@@ -48191,7 +46053,8 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     if (__pyx_t_5) {
       __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -48360,7 +46223,8 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
@@ -48436,7 +46300,8 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -48666,7 +46531,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  *         cdef int i
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_in_low, int __pyx_v_in_high, int *__pyx_v_in_links_low, int *__pyx_v_in_links_high, int *__pyx_v_out_low, int *__pyx_v_out_high) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_in_low, int __pyx_v_in_high, int *__pyx_v_in_links_low, int *__pyx_v_in_links_high, int *__pyx_v_out_low, int *__pyx_v_out_high) {
   int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -48674,7 +46539,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("find_projection", 0);
+  __Pyx_RefNannySetupContext("find_projection");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1271
  *                         int* out_low, int* out_high):
@@ -48770,11 +46635,11 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
  *         new_len = arr_len[0] + data_len
  */
 
-static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_arr, int *__pyx_v_arr_len, int *__pyx_v_data, int __pyx_v_data_len) {
+static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_arr, int *__pyx_v_arr_len, int *__pyx_v_data, int __pyx_v_data_len) {
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("int_arr_extend", 0);
+  __Pyx_RefNannySetupContext("int_arr_extend");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1281
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):
@@ -48836,7 +46701,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  *                         int sent_id, int e_sent_len, int e_sent_start):
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_e_low, int __pyx_v_e_high, int *__pyx_v_e_gap_low, int *__pyx_v_e_gap_high, int *__pyx_v_e_links_low, int __pyx_v_num_gaps, CYTHON_UNUSED int __pyx_v_f_low, CYTHON_UNUSED int __pyx_v_f_high, CYTHON_UNUSED int *__pyx_v_f_gap_low, CYTHON_UNUSED int *__pyx_v_f_gap_high, CYTHON_UNUSED int *__pyx_v_f_links_low, CYTHON_UNUSED int __pyx_v_sent_id, int __pyx_v_e_sent_len, int __pyx_v_e_sent_start) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_e_low, int __pyx_v_e_high, int *__pyx_v_e_gap_low, int *__pyx_v_e_gap_high, int *__pyx_v_e_links_low, int __pyx_v_num_gaps, int __pyx_v_f_low, int __pyx_v_f_high, int *__pyx_v_f_gap_low, int *__pyx_v_f_gap_high, int *__pyx_v_f_links_low, int __pyx_v_sent_id, int __pyx_v_e_sent_len, int __pyx_v_e_sent_start) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -48872,7 +46737,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extract_phrases", 0);
+  __Pyx_RefNannySetupContext("extract_phrases");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1296
  *         cdef result
@@ -48882,7 +46747,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         e_gaps1 = <int*> malloc(0)
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_result = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
@@ -49600,7 +47465,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  */
     __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_XDECREF(((PyObject *)__pyx_v_indexes));
     __pyx_v_indexes = __pyx_t_1;
     __pyx_t_1 = 0;
@@ -49654,6 +47519,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  */
+        if (unlikely(((PyObject *)__pyx_v_indexes) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -49691,6 +47559,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  */
+        if (unlikely(((PyObject *)__pyx_v_indexes) == Py_None)) {
+          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+        }
         __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -49742,7 +47613,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         free(e_gaps1)
  */
       __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_INCREF(((PyObject *)__pyx_v_ephr_arr));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_ephr_arr));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_ephr_arr));
@@ -49750,7 +47621,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
       __Pyx_GIVEREF(__pyx_t_11);
       __Pyx_INCREF(((PyObject *)__pyx_v_indexes));
@@ -49820,7 +47691,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         cdef IntList ret = IntList()
  */
 
-static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_sent_links, int __pyx_v_num_links, PyObject *__pyx_v_findexes, PyObject *__pyx_v_eindexes) {
+static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_sent_links, int __pyx_v_num_links, PyObject *__pyx_v_findexes, PyObject *__pyx_v_eindexes) {
   unsigned int __pyx_v_i;
   struct __pyx_obj_3_sa_IntList *__pyx_v_ret = 0;
   PyObject *__pyx_v_s = NULL;
@@ -49838,7 +47709,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("create_alignments", 0);
+  __Pyx_RefNannySetupContext("create_alignments");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1393
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):
@@ -49883,7 +47754,8 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
  *                 continue
  *             idx = 0
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_4) {
@@ -49921,7 +47793,8 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     while (1) {
       __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -49937,7 +47810,8 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -49959,7 +47833,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
         __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_7));
         PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         __pyx_t_5 = 0;
@@ -50077,7 +47951,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_v_f_sent_end;
   int __pyx_v_e_sent_len;
   int __pyx_v_f_sent_len;
-  CYTHON_UNUSED int __pyx_v_e_word_count;
+  int __pyx_v_e_word_count;
   int __pyx_v_f_x_low;
   int __pyx_v_f_x_high;
   int __pyx_v_e_x_low;
@@ -50088,7 +47962,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   PyObject *__pyx_v_phrase_list = 0;
   struct __pyx_obj_3_sa_IntList *__pyx_v_fphr_arr = 0;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_fphr = 0;
-  CYTHON_UNUSED PyObject *__pyx_v_reason_for_failure = 0;
+  PyObject *__pyx_v_reason_for_failure = 0;
   PyObject *__pyx_v_sofar = NULL;
   PyObject *__pyx_v_als = NULL;
   PyObject *__pyx_v_al = NULL;
@@ -50129,7 +48003,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extract", 0);
+  __Pyx_RefNannySetupContext("extract");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1419
  *         cdef reason_for_failure
@@ -50160,7 +48034,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_v_extracts = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
@@ -50686,7 +48560,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  */
   __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __pyx_v_als = __pyx_t_2;
   __pyx_t_2 = 0;
 
@@ -50713,7 +48587,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_10);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
     PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
@@ -50731,6 +48605,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  */
+    if (unlikely(((PyObject *)__pyx_v_als) == Py_None)) {
+      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1485; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+    }
     __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
@@ -51497,7 +49374,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
             PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
@@ -51616,7 +49493,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
         __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->findexes1));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -51723,7 +49600,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  */
         __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
         __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_fphr_arr));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -51807,7 +49684,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
             __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
@@ -51845,20 +49722,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
+            if (PyList_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
-            } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
+            } else if (PyTuple_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
             } else {
               __pyx_t_15 = __pyx_t_16(__pyx_t_14);
               if (unlikely(!__pyx_t_15)) {
@@ -51872,33 +49741,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
               PyObject* sequence = __pyx_t_15;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              Py_ssize_t size = Py_SIZE(sequence);
-              #else
-              Py_ssize_t size = PySequence_Size(sequence);
-              #endif
-              if (unlikely(size != 2)) {
-                if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              }
-              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
+                if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                  if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
                 __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
               } else {
+                if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                  if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
                 __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
               }
               __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_2);
-              #else
-              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-            } else
-            {
+            } else {
               Py_ssize_t index = -1;
               __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
@@ -51909,13 +49772,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L61_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_2);
               if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               goto __pyx_L62_unpacking_done;
               __pyx_L61_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              __pyx_t_17 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
               {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L62_unpacking_done:;
             }
@@ -51952,7 +49814,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
             __Pyx_INCREF(((PyObject *)__pyx_v_als1));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als1));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_als1));
@@ -51960,7 +49822,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
+            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
             __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -52308,7 +50170,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -52415,7 +50277,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  */
               __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -52494,20 +50356,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_16 = Py_TYPE(__pyx_t_15)->tp_iternext;
               }
               for (;;) {
-                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_15)) {
+                if (PyList_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_15)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
-                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_15)) {
+                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
+                } else if (PyTuple_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
+                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
                 } else {
                   __pyx_t_1 = __pyx_t_16(__pyx_t_15);
                   if (unlikely(!__pyx_t_1)) {
@@ -52521,33 +50375,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
                   PyObject* sequence = __pyx_t_1;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  Py_ssize_t size = Py_SIZE(sequence);
-                  #else
-                  Py_ssize_t size = PySequence_Size(sequence);
-                  #endif
-                  if (unlikely(size != 2)) {
-                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
+                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_14 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
+                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_14 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_14);
                   __Pyx_INCREF(__pyx_t_2);
-                  #else
-                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-                } else
-                {
+                } else {
                   Py_ssize_t index = -1;
                   __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
@@ -52558,13 +50406,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L77_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L78_unpacking_done;
                   __pyx_L77_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  __pyx_t_17 = NULL;
-                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L78_unpacking_done:;
                 }
@@ -52601,7 +50448,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_1);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_1));
                 __Pyx_INCREF(((PyObject *)__pyx_v_als2));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_als2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als2));
@@ -52609,7 +50456,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
                 __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_1);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_1));
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -52935,7 +50782,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -53029,7 +50876,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  */
               __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -53108,20 +50955,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_16 = Py_TYPE(__pyx_t_1)->tp_iternext;
               }
               for (;;) {
-                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_1)) {
+                if (PyList_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_1)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
-                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_1)) {
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
+                } else if (PyTuple_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
+                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
                 } else {
                   __pyx_t_14 = __pyx_t_16(__pyx_t_1);
                   if (unlikely(!__pyx_t_14)) {
@@ -53135,33 +50974,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_14))) || (PyList_CheckExact(__pyx_t_14))) {
                   PyObject* sequence = __pyx_t_14;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  Py_ssize_t size = Py_SIZE(sequence);
-                  #else
-                  Py_ssize_t size = PySequence_Size(sequence);
-                  #endif
-                  if (unlikely(size != 2)) {
-                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
+                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
+                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_15);
                   __Pyx_INCREF(__pyx_t_2);
-                  #else
-                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                } else
-                {
+                } else {
                   Py_ssize_t index = -1;
                   __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
@@ -53172,13 +51005,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L92_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L93_unpacking_done;
                   __pyx_L92_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  __pyx_t_17 = NULL;
-                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L93_unpacking_done:;
                 }
@@ -53215,7 +51047,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
                 __Pyx_INCREF(((PyObject *)__pyx_v_als3));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_als3));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als3));
@@ -53223,7 +51055,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -53708,7 +51540,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_15);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_15));
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -53802,7 +51634,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  */
               __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_15);
+              __Pyx_GOTREF(((PyObject *)__pyx_t_15));
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -53881,20 +51713,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
               }
               for (;;) {
-                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
+                if (PyList_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
-                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
+                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
+                } else if (PyTuple_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #else
-                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
+                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
                 } else {
                   __pyx_t_15 = __pyx_t_16(__pyx_t_14);
                   if (unlikely(!__pyx_t_15)) {
@@ -53908,33 +51732,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
                   PyObject* sequence = __pyx_t_15;
-                  #if CYTHON_COMPILING_IN_CPYTHON
-                  Py_ssize_t size = Py_SIZE(sequence);
-                  #else
-                  Py_ssize_t size = PySequence_Size(sequence);
-                  #endif
-                  if (unlikely(size != 2)) {
-                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
+                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
+                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
                     __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_1);
                   __Pyx_INCREF(__pyx_t_2);
-                  #else
-                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                } else
-                {
+                } else {
                   Py_ssize_t index = -1;
                   __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
@@ -53945,13 +51763,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L110_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L111_unpacking_done;
                   __pyx_L110_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  __pyx_t_17 = NULL;
-                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L111_unpacking_done:;
                 }
@@ -53988,7 +51805,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
                 __Pyx_INCREF(((PyObject *)__pyx_v_als4));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als4));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als4));
@@ -53996,7 +51813,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -54168,20 +51985,6 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
-  __pyx_r = __pyx_pf_3_sa_13FeatureVector___cinit__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":7
  * 
  * cdef class FeatureVector:
@@ -54190,7 +51993,8 @@ static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyOb
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
  */
 
-static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
+static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -54199,7 +52003,10 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__", 0);
+  __Pyx_RefNannySetupContext("__cinit__");
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":8
  * cdef class FeatureVector:
@@ -54213,7 +52020,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__INCREMENT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -54224,9 +52031,9 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->names);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->names));
-  __pyx_v_self->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names));
+  ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":9
@@ -54241,7 +52048,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__INCREMENT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3);
@@ -54252,9 +52059,9 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
-  __Pyx_GOTREF(__pyx_v_self->values);
-  __Pyx_DECREF(((PyObject *)__pyx_v_self->values));
-  __pyx_v_self->values = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_3);
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values);
+  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values));
+  ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
   __pyx_r = 0;
@@ -54270,39 +52077,52 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   return __pyx_r;
 }
 
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":11
+ *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
+ * 
+ *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
+ *         self.names.append(name)
+ *         self.values.append(value)
+ */
+
+static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   unsigned int __pyx_v_name;
   float __pyx_v_value;
-  PyObject *__pyx_r = 0;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("set (wrapper)", 0);
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
+  __Pyx_RefNannySetupContext("set");
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__name)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__name);
+        if (likely(values[0])) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value);
+        if (likely(values[1])) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("set", 1, 2, 2, 1); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set") < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "set") < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -54311,7 +52131,7 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyOb
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
     __pyx_v_name = __Pyx_PyInt_AsUnsignedInt(values[0]); if (unlikely((__pyx_v_name == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_value = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_value == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_value = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_value == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -54321,28 +52141,6 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_13FeatureVector_2set(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self), __pyx_v_name, __pyx_v_value);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":11
- *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
- * 
- *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
- *         self.names.append(name)
- *         self.values.append(value)
- */
-
-static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set", 0);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":12
  * 
@@ -54353,7 +52151,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_Featur
  */
   __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->names), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -54367,7 +52165,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_Featur
  */
   __pyx_t_2 = PyFloat_FromDouble(__pyx_v_value); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->values), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -54384,18 +52182,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_Featur
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_13FeatureVector_4__iter__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
+static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
@@ -54405,45 +52192,36 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self)
  *         for i in range(self.names.len):
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_13FeatureVector_2__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_13FeatureVector_2__iter__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__", 0);
+  __Pyx_RefNannySetupContext("__iter__");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_9___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_9___iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_6generator5, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_3generator5;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.FeatureVector.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   unsigned int __pyx_t_2;
@@ -54452,8 +52230,8 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -54470,7 +52248,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  */
-  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->names->len;
+  __pyx_t_1 = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->names->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
@@ -54481,16 +52259,16 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
  * 
  *     def __str__(self):
  */
-    __pyx_t_3 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_self->names), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->names), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = PyBytes_FromString(((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_3_sa_FD->__pyx_vtab)->word(__pyx_v_3_sa_FD, __pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_self->values), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->values), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -54504,14 +52282,14 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
@@ -54520,23 +52298,11 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_13FeatureVector_7__str__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
  * 
@@ -54546,53 +52312,45 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
  * cdef class Scorer:
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str___genexpr(PyObject *__pyx_self) {
+static PyObject *__pyx_pf_3_sa_7__str___2genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_3_sa_7__str___2genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("genexpr", 0);
+  __Pyx_RefNannySetupContext("genexpr");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *) __pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)__pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_7__str___2generator8, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_cur_scope);
-    __Pyx_RefNannyFinishContext();
-    return (PyObject *) gen;
-  }
+  __pyx_self = __pyx_self;
+  __pyx_cur_scope->__pyx_base.resume_label = 0;
+  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7__str___3generator8;
+  __Pyx_GIVEREF(__pyx_cur_scope);
+  __Pyx_RefNannyFinishContext();
+  return (PyObject *) __pyx_cur_scope;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("_sa.FeatureVector.__str__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
 {
-  struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
   PyObject *(*__pyx_t_3)(PyObject *);
   PyObject *__pyx_t_4 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None", 0);
-  switch (__pyx_generator->resume_label) {
+  __Pyx_RefNannySetupContext("None");
+  switch (__pyx_cur_scope->__pyx_base.resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -54601,30 +52359,21 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  if (PyList_CheckExact(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) || PyTuple_CheckExact(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self))) {
-    __pyx_t_1 = ((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) {
+    __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -54652,7 +52401,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_generator->resume_label = 1;
+    __pyx_cur_scope->__pyx_base.resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -54663,7 +52412,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration);
+  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -54671,8 +52420,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __pyx_cur_scope->__pyx_base.resume_label = -1;
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -54685,7 +52433,8 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator8(__pyx_Genera
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -54695,15 +52444,15 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_Fe
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__", 0);
+  __Pyx_RefNannySetupContext("__str__");
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_10___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_10___str__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
+  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
@@ -54716,10 +52465,10 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_Fe
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_pf_3_sa_13FeatureVector_7__str___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __pyx_pf_3_sa_7__str___2genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -54746,22 +52495,6 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_Fe
   return __pyx_r;
 }
 
-/* Python wrapper */
-static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_models = 0;
-  int __pyx_r;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
-  __Pyx_INCREF(__pyx_args);
-  __pyx_v_models = __pyx_args;
-  __pyx_r = __pyx_pf_3_sa_6Scorer___init__(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self), __pyx_v_models);
-  __Pyx_XDECREF(__pyx_v_models);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":25
  * cdef class Scorer:
  *     cdef models
@@ -54770,7 +52503,9 @@ static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__p
  *         self.models = zip(names, models)
  */
 
-static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_self, PyObject *__pyx_v_models) {
+static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_models = 0;
   PyObject *__pyx_v_names = NULL;
   PyObject *__pyx_v_model = NULL;
   int __pyx_r;
@@ -54783,7 +52518,10 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__init__", 0);
+  __Pyx_RefNannySetupContext("__init__");
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
+  __Pyx_INCREF(__pyx_args);
+  __pyx_v_models = __pyx_args;
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":26
  *     cdef models
@@ -54793,15 +52531,14 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  if (unlikely(((PyObject *)__pyx_v_models) == Py_None)) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+  }
   __pyx_t_2 = ((PyObject *)__pyx_v_models); __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
   for (;;) {
     if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-    #if CYTHON_COMPILING_IN_CPYTHON
-    __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #else
-    __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    #endif
+    __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
     __Pyx_XDECREF(__pyx_v_model);
     __pyx_v_model = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -54811,7 +52548,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __pyx_t_4 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_3_sa_FD->__pyx_vtab)->index(__pyx_v_3_sa_FD, ((char *)__pyx_t_5))); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -54827,7 +52564,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
  *     cdef FeatureVector score(self, ctx):
  */
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_v_names));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_names));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_names));
@@ -54838,9 +52575,9 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(__pyx_v_self->models);
-  __Pyx_DECREF(__pyx_v_self->models);
-  __pyx_v_self->models = __pyx_t_2;
+  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models);
+  __Pyx_DECREF(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models);
+  ((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models = __pyx_t_2;
   __pyx_t_2 = 0;
 
   __pyx_r = 0;
@@ -54852,6 +52589,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   __Pyx_AddTraceback("_sa.Scorer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_models);
   __Pyx_XDECREF(__pyx_v_names);
   __Pyx_XDECREF(__pyx_v_model);
   __Pyx_RefNannyFinishContext();
@@ -54883,7 +52621,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("score", 0);
+  __Pyx_RefNannySetupContext("score");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":30
  * 
@@ -54913,20 +52651,12 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+    if (PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
-    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+    } else if (PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -54940,33 +52670,27 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
       PyObject* sequence = __pyx_t_4;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      Py_ssize_t size = Py_SIZE(sequence);
-      #else
-      Py_ssize_t size = PySequence_Size(sequence);
-      #endif
-      if (unlikely(size != 2)) {
-        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
+          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
       } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
+          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
-      #else
-      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    } else
-    {
+    } else {
       Py_ssize_t index = -1;
       __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
@@ -54977,13 +52701,12 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
       index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L6_unpacking_done;
       __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_8 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L6_unpacking_done:;
     }
@@ -55003,7 +52726,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_scores), __pyx_n_s__set); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     __Pyx_INCREF(__pyx_v_ctx);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_ctx);
     __Pyx_GIVEREF(__pyx_v_ctx);
@@ -55011,7 +52734,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     __Pyx_INCREF(__pyx_v_name);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_name);
     __Pyx_GIVEREF(__pyx_v_name);
@@ -55062,7 +52785,7 @@ static PyObject *__pyx_tp_new_3_sa_FloatList(PyTypeObject *t, PyObject *a, PyObj
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_FloatList *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_FloatList;
-  if (__pyx_pw_3_sa_9FloatList_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_9FloatList___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55073,7 +52796,7 @@ static void __pyx_tp_dealloc_3_sa_FloatList(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_9FloatList_3__dealloc__(o);
+    __pyx_pf_3_sa_9FloatList_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -55090,7 +52813,7 @@ static PyObject *__pyx_sq_item_3_sa_FloatList(PyObject *o, Py_ssize_t i) {
 
 static int __pyx_mp_ass_subscript_3_sa_FloatList(PyObject *o, PyObject *i, PyObject *v) {
   if (v) {
-    return __pyx_pw_3_sa_9FloatList_7__setitem__(o, i, v);
+    return __pyx_pf_3_sa_9FloatList_3__setitem__(o, i, v);
   }
   else {
     PyErr_Format(PyExc_NotImplementedError,
@@ -55100,9 +52823,9 @@ static int __pyx_mp_ass_subscript_3_sa_FloatList(PyObject *o, PyObject *i, PyObj
 }
 
 static PyMethodDef __pyx_methods_3_sa_FloatList[] = {
-  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pw_3_sa_9FloatList_11append, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pw_3_sa_9FloatList_13write, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pw_3_sa_9FloatList_15read, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pf_3_sa_9FloatList_5append, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pf_3_sa_9FloatList_6write, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pf_3_sa_9FloatList_7read, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55165,7 +52888,7 @@ static PyNumberMethods __pyx_tp_as_number_FloatList = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
-  __pyx_pw_3_sa_9FloatList_9__len__, /*sq_length*/
+  __pyx_pf_3_sa_9FloatList_4__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_FloatList, /*sq_item*/
@@ -55178,8 +52901,8 @@ static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_FloatList = {
-  __pyx_pw_3_sa_9FloatList_9__len__, /*mp_length*/
-  __pyx_pw_3_sa_9FloatList_5__getitem__, /*mp_subscript*/
+  __pyx_pf_3_sa_9FloatList_4__len__, /*mp_length*/
+  __pyx_pf_3_sa_9FloatList_2__getitem__, /*mp_subscript*/
   __pyx_mp_ass_subscript_3_sa_FloatList, /*mp_ass_subscript*/
 };
 
@@ -55267,7 +52990,7 @@ static PyObject *__pyx_tp_new_3_sa_IntList(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_IntList *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_IntList;
-  if (__pyx_pw_3_sa_7IntList_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_7IntList___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55278,7 +53001,7 @@ static void __pyx_tp_dealloc_3_sa_IntList(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_7IntList_15__dealloc__(o);
+    __pyx_pf_3_sa_7IntList_7__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -55295,7 +53018,7 @@ static PyObject *__pyx_sq_item_3_sa_IntList(PyObject *o, Py_ssize_t i) {
 
 static int __pyx_mp_ass_subscript_3_sa_IntList(PyObject *o, PyObject *i, PyObject *v) {
   if (v) {
-    return __pyx_pw_3_sa_7IntList_22__setitem__(o, i, v);
+    return __pyx_pf_3_sa_7IntList_11__setitem__(o, i, v);
   }
   else {
     PyErr_Format(PyExc_NotImplementedError,
@@ -55305,16 +53028,16 @@ static int __pyx_mp_ass_subscript_3_sa_IntList(PyObject *o, PyObject *i, PyObjec
 }
 
 static PyMethodDef __pyx_methods_3_sa_IntList[] = {
-  {__Pyx_NAMESTR("index"), (PyCFunction)__pyx_pw_3_sa_7IntList_5index, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("partition"), (PyCFunction)__pyx_pw_3_sa_7IntList_7partition, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("_doquicksort"), (PyCFunction)__pyx_pw_3_sa_7IntList_9_doquicksort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("sort"), (PyCFunction)__pyx_pw_3_sa_7IntList_11sort, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pw_3_sa_7IntList_13reset, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_size"), (PyCFunction)__pyx_pw_3_sa_7IntList_26get_size, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pw_3_sa_7IntList_28append, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("extend"), (PyCFunction)__pyx_pw_3_sa_7IntList_30extend, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pw_3_sa_7IntList_32write, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pw_3_sa_7IntList_34read, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("index"), (PyCFunction)__pyx_pf_3_sa_7IntList_2index, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("partition"), (PyCFunction)__pyx_pf_3_sa_7IntList_3partition, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("_doquicksort"), (PyCFunction)__pyx_pf_3_sa_7IntList_4_doquicksort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("sort"), (PyCFunction)__pyx_pf_3_sa_7IntList_5sort, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pf_3_sa_7IntList_6reset, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_size"), (PyCFunction)__pyx_pf_3_sa_7IntList_13get_size, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pf_3_sa_7IntList_14append, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("extend"), (PyCFunction)__pyx_pf_3_sa_7IntList_15extend, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pf_3_sa_7IntList_16write, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pf_3_sa_7IntList_17read, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55377,7 +53100,7 @@ static PyNumberMethods __pyx_tp_as_number_IntList = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_IntList = {
-  __pyx_pw_3_sa_7IntList_24__len__, /*sq_length*/
+  __pyx_pf_3_sa_7IntList_12__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_IntList, /*sq_item*/
@@ -55390,8 +53113,8 @@ static PySequenceMethods __pyx_tp_as_sequence_IntList = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_IntList = {
-  __pyx_pw_3_sa_7IntList_24__len__, /*mp_length*/
-  __pyx_pw_3_sa_7IntList_20__getitem__, /*mp_subscript*/
+  __pyx_pf_3_sa_7IntList_12__len__, /*mp_length*/
+  __pyx_pf_3_sa_7IntList_10__getitem__, /*mp_subscript*/
   __pyx_mp_ass_subscript_3_sa_IntList, /*mp_ass_subscript*/
 };
 
@@ -55436,7 +53159,7 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   &__pyx_tp_as_mapping_IntList, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pw_3_sa_7IntList_3__str__, /*tp_str*/
+  __pyx_pf_3_sa_7IntList_1__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_IntList, /*tp_as_buffer*/
@@ -55446,7 +53169,7 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pw_3_sa_7IntList_17__iter__, /*tp_iter*/
+  __pyx_pf_3_sa_7IntList_8__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_IntList, /*tp_methods*/
   0, /*tp_members*/
@@ -55472,14 +53195,14 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa_FeatureVector *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_FeatureVector *)o);
   p->names = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->values = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_13FeatureVector_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pf_3_sa_13FeatureVector___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55487,8 +53210,8 @@ static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, CYTHON_UNUSED
 
 static void __pyx_tp_dealloc_3_sa_FeatureVector(PyObject *o) {
   struct __pyx_obj_3_sa_FeatureVector *p = (struct __pyx_obj_3_sa_FeatureVector *)o;
-  Py_CLEAR(p->names);
-  Py_CLEAR(p->values);
+  Py_XDECREF(((PyObject *)p->names));
+  Py_XDECREF(((PyObject *)p->values));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -55517,7 +53240,7 @@ static int __pyx_tp_clear_3_sa_FeatureVector(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_FeatureVector[] = {
-  {__Pyx_NAMESTR("set"), (PyCFunction)__pyx_pw_3_sa_13FeatureVector_3set, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("set"), (PyCFunction)__pyx_pf_3_sa_13FeatureVector_1set, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55639,7 +53362,7 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   &__pyx_tp_as_mapping_FeatureVector, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pw_3_sa_13FeatureVector_8__str__, /*tp_str*/
+  __pyx_pf_3_sa_13FeatureVector_4__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_FeatureVector, /*tp_as_buffer*/
@@ -55649,7 +53372,7 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   __pyx_tp_clear_3_sa_FeatureVector, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pw_3_sa_13FeatureVector_5__iter__, /*tp_iter*/
+  __pyx_pf_3_sa_13FeatureVector_2__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_FeatureVector, /*tp_methods*/
   0, /*tp_members*/
@@ -55682,7 +53405,7 @@ static PyObject *__pyx_tp_new_3_sa_Phrase(PyTypeObject *t, PyObject *a, PyObject
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_Phrase *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Phrase;
-  if (__pyx_pw_3_sa_6Phrase_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_6Phrase___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55693,7 +53416,7 @@ static void __pyx_tp_dealloc_3_sa_Phrase(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_6Phrase_3__dealloc__(o);
+    __pyx_pf_3_sa_6Phrase_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -55708,19 +53431,19 @@ static PyObject *__pyx_sq_item_3_sa_Phrase(PyObject *o, Py_ssize_t i) {
   return r;
 }
 
-static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_6Phrase_5words_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_6Phrase_5words___get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Phrase[] = {
-  {__Pyx_NAMESTR("handle"), (PyCFunction)__pyx_pw_3_sa_6Phrase_7handle, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_3_sa_6Phrase_6handle)},
-  {__Pyx_NAMESTR("strhandle"), (PyCFunction)__pyx_pw_3_sa_6Phrase_9strhandle, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pw_3_sa_6Phrase_11arity, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getvarpos"), (PyCFunction)__pyx_pw_3_sa_6Phrase_13getvarpos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getvar"), (PyCFunction)__pyx_pw_3_sa_6Phrase_15getvar, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("clen"), (PyCFunction)__pyx_pw_3_sa_6Phrase_17clen, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getchunk"), (PyCFunction)__pyx_pw_3_sa_6Phrase_19getchunk, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("subst"), (PyCFunction)__pyx_pw_3_sa_6Phrase_32subst, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("handle"), (PyCFunction)__pyx_pf_3_sa_6Phrase_3handle, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_3_sa_6Phrase_3handle)},
+  {__Pyx_NAMESTR("strhandle"), (PyCFunction)__pyx_pf_3_sa_6Phrase_4strhandle, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pf_3_sa_6Phrase_5arity, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getvarpos"), (PyCFunction)__pyx_pf_3_sa_6Phrase_6getvarpos, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getvar"), (PyCFunction)__pyx_pf_3_sa_6Phrase_7getvar, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("clen"), (PyCFunction)__pyx_pf_3_sa_6Phrase_8clen, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getchunk"), (PyCFunction)__pyx_pf_3_sa_6Phrase_9getchunk, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("subst"), (PyCFunction)__pyx_pf_3_sa_6Phrase_16subst, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -55788,7 +53511,7 @@ static PyNumberMethods __pyx_tp_as_number_Phrase = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
-  __pyx_pw_3_sa_6Phrase_25__len__, /*sq_length*/
+  __pyx_pf_3_sa_6Phrase_12__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   __pyx_sq_item_3_sa_Phrase, /*sq_item*/
@@ -55801,8 +53524,8 @@ static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_Phrase = {
-  __pyx_pw_3_sa_6Phrase_25__len__, /*mp_length*/
-  __pyx_pw_3_sa_6Phrase_27__getitem__, /*mp_subscript*/
+  __pyx_pf_3_sa_6Phrase_12__len__, /*mp_length*/
+  __pyx_pf_3_sa_6Phrase_13__getitem__, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
@@ -55837,7 +53560,7 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   0, /*tp_getattr*/
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_pw_3_sa_6Phrase_21__cmp__, /*tp_compare*/
+  __pyx_pf_3_sa_6Phrase_10__cmp__, /*tp_compare*/
   #else
   0, /*reserved*/
   #endif
@@ -55845,9 +53568,9 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   &__pyx_tp_as_number_Phrase, /*tp_as_number*/
   &__pyx_tp_as_sequence_Phrase, /*tp_as_sequence*/
   &__pyx_tp_as_mapping_Phrase, /*tp_as_mapping*/
-  __pyx_pw_3_sa_6Phrase_23__hash__, /*tp_hash*/
+  __pyx_pf_3_sa_6Phrase_11__hash__, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pw_3_sa_6Phrase_5__str__, /*tp_str*/
+  __pyx_pf_3_sa_6Phrase_2__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Phrase, /*tp_as_buffer*/
@@ -55857,7 +53580,7 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pw_3_sa_6Phrase_29__iter__, /*tp_iter*/
+  __pyx_pf_3_sa_6Phrase_14__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_Phrase, /*tp_methods*/
   0, /*tp_members*/
@@ -55892,7 +53615,7 @@ static PyObject *__pyx_tp_new_3_sa_Rule(PyTypeObject *t, PyObject *a, PyObject *
   p->e = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
   p->scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   p->word_alignments = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_4Rule_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_4Rule___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -55900,10 +53623,10 @@ static PyObject *__pyx_tp_new_3_sa_Rule(PyTypeObject *t, PyObject *a, PyObject *
 
 static void __pyx_tp_dealloc_3_sa_Rule(PyObject *o) {
   struct __pyx_obj_3_sa_Rule *p = (struct __pyx_obj_3_sa_Rule *)o;
-  Py_CLEAR(p->f);
-  Py_CLEAR(p->e);
-  Py_CLEAR(p->scores);
-  Py_CLEAR(p->word_alignments);
+  Py_XDECREF(((PyObject *)p->f));
+  Py_XDECREF(((PyObject *)p->e));
+  Py_XDECREF(((PyObject *)p->scores));
+  Py_XDECREF(p->word_alignments);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -55943,18 +53666,18 @@ static int __pyx_tp_clear_3_sa_Rule(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_4Rule_1f_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_4Rule_1f___get__(o);
 }
 
-static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_4Rule_1e_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_4Rule_1e___get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Rule[] = {
-  {__Pyx_NAMESTR("fmerge"), (PyCFunction)__pyx_pw_3_sa_4Rule_7fmerge, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pw_3_sa_4Rule_9arity, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("alignments"), (PyCFunction)__pyx_pw_3_sa_4Rule_13alignments, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("fmerge"), (PyCFunction)__pyx_pf_3_sa_4Rule_3fmerge, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pf_3_sa_4Rule_4arity, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("alignments"), (PyCFunction)__pyx_pf_3_sa_4Rule_6alignments, METH_NOARGS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -56072,7 +53795,7 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
   0, /*tp_getattr*/
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_pw_3_sa_4Rule_5__cmp__, /*tp_compare*/
+  __pyx_pf_3_sa_4Rule_2__cmp__, /*tp_compare*/
   #else
   0, /*reserved*/
   #endif
@@ -56080,9 +53803,9 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
   &__pyx_tp_as_number_Rule, /*tp_as_number*/
   &__pyx_tp_as_sequence_Rule, /*tp_as_sequence*/
   &__pyx_tp_as_mapping_Rule, /*tp_as_mapping*/
-  __pyx_pw_3_sa_4Rule_3__hash__, /*tp_hash*/
+  __pyx_pf_3_sa_4Rule_1__hash__, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pw_3_sa_4Rule_11__str__, /*tp_str*/
+  __pyx_pf_3_sa_4Rule_5__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Rule, /*tp_as_buffer*/
@@ -56119,13 +53842,13 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
 };
 static struct __pyx_vtabstruct_3_sa_StringMap __pyx_vtable_3_sa_StringMap;
 
-static PyObject *__pyx_tp_new_3_sa_StringMap(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_StringMap(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa_StringMap *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_StringMap *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_StringMap;
-  if (__pyx_pw_3_sa_9StringMap_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pf_3_sa_9StringMap___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56136,7 +53859,7 @@ static void __pyx_tp_dealloc_3_sa_StringMap(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_9StringMap_3__dealloc__(o);
+    __pyx_pf_3_sa_9StringMap_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -56314,7 +54037,7 @@ static PyObject *__pyx_tp_new_3_sa_DataArray(PyTypeObject *t, PyObject *a, PyObj
   p->data = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_id = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_9DataArray_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_9DataArray___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56322,11 +54045,11 @@ static PyObject *__pyx_tp_new_3_sa_DataArray(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_DataArray(PyObject *o) {
   struct __pyx_obj_3_sa_DataArray *p = (struct __pyx_obj_3_sa_DataArray *)o;
-  Py_CLEAR(p->word2id);
-  Py_CLEAR(p->id2word);
-  Py_CLEAR(p->data);
-  Py_CLEAR(p->sent_id);
-  Py_CLEAR(p->sent_index);
+  Py_XDECREF(p->word2id);
+  Py_XDECREF(p->id2word);
+  Py_XDECREF(((PyObject *)p->data));
+  Py_XDECREF(((PyObject *)p->sent_id));
+  Py_XDECREF(((PyObject *)p->sent_index));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56373,19 +54096,20 @@ static int __pyx_tp_clear_3_sa_DataArray(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_DataArray[] = {
-  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_5get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pw_3_sa_9DataArray_7get_sentence, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pw_3_sa_9DataArray_9get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_11get_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pw_3_sa_9DataArray_13get_word, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_17read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pw_3_sa_9DataArray_19read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pw_3_sa_9DataArray_21read_text_data, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_23read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_25write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pw_3_sa_9DataArray_27write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9DataArray_29write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_data"), (PyCFunction)__pyx_pf_3_sa_9DataArray_2get_data, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pf_3_sa_9DataArray_3get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pf_3_sa_9DataArray_4get_sentence, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pf_3_sa_9DataArray_5get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pf_3_sa_9DataArray_6get_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pf_3_sa_9DataArray_7get_word, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_9DataArray_8write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_9DataArray_9read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pf_3_sa_9DataArray_10read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pf_3_sa_9DataArray_11read_text_data, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_9DataArray_12read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_9DataArray_13write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pf_3_sa_9DataArray_14write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_9DataArray_15write_enhanced, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -56448,7 +54172,7 @@ static PyNumberMethods __pyx_tp_as_number_DataArray = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
-  __pyx_pw_3_sa_9DataArray_3__len__, /*sq_length*/
+  __pyx_pf_3_sa_9DataArray_1__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
@@ -56461,7 +54185,7 @@ static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_DataArray = {
-  __pyx_pw_3_sa_9DataArray_3__len__, /*mp_length*/
+  __pyx_pf_3_sa_9DataArray_1__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -56552,7 +54276,7 @@ static PyObject *__pyx_tp_new_3_sa_Alignment(PyTypeObject *t, PyObject *a, PyObj
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Alignment;
   p->links = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_9Alignment_5__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_9Alignment_2__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56560,8 +54284,8 @@ static PyObject *__pyx_tp_new_3_sa_Alignment(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_Alignment(PyObject *o) {
   struct __pyx_obj_3_sa_Alignment *p = (struct __pyx_obj_3_sa_Alignment *)o;
-  Py_CLEAR(p->links);
-  Py_CLEAR(p->sent_index);
+  Py_XDECREF(((PyObject *)p->links));
+  Py_XDECREF(((PyObject *)p->sent_index));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56590,14 +54314,14 @@ static int __pyx_tp_clear_3_sa_Alignment(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Alignment[] = {
-  {__Pyx_NAMESTR("unlink"), (PyCFunction)__pyx_pw_3_sa_9Alignment_1unlink, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_unlink)},
-  {__Pyx_NAMESTR("get_sent_links"), (PyCFunction)__pyx_pw_3_sa_9Alignment_3get_sent_links, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9Alignment_7read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9Alignment_9read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9Alignment_11write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9Alignment_13write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9Alignment_15write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("alignment"), (PyCFunction)__pyx_pw_3_sa_9Alignment_17alignment, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_16alignment)},
+  {__Pyx_NAMESTR("unlink"), (PyCFunction)__pyx_pf_3_sa_9Alignment_unlink, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_unlink)},
+  {__Pyx_NAMESTR("get_sent_links"), (PyCFunction)__pyx_pf_3_sa_9Alignment_1get_sent_links, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_9Alignment_3read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_9Alignment_4read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_9Alignment_5write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_9Alignment_6write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_9Alignment_7write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("alignment"), (PyCFunction)__pyx_pf_3_sa_9Alignment_8alignment, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_8alignment)},
   {0, 0, 0, 0}
 };
 
@@ -56770,7 +54494,7 @@ static PyObject *__pyx_tp_new_3_sa_BiLex(PyTypeObject *t, PyObject *a, PyObject
   p->id2fword = Py_None; Py_INCREF(Py_None);
   p->eword2id = Py_None; Py_INCREF(Py_None);
   p->fword2id = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_5BiLex_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_5BiLex___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -56778,14 +54502,14 @@ static PyObject *__pyx_tp_new_3_sa_BiLex(PyTypeObject *t, PyObject *a, PyObject
 
 static void __pyx_tp_dealloc_3_sa_BiLex(PyObject *o) {
   struct __pyx_obj_3_sa_BiLex *p = (struct __pyx_obj_3_sa_BiLex *)o;
-  Py_CLEAR(p->col1);
-  Py_CLEAR(p->col2);
-  Py_CLEAR(p->f_index);
-  Py_CLEAR(p->e_index);
-  Py_CLEAR(p->id2eword);
-  Py_CLEAR(p->id2fword);
-  Py_CLEAR(p->eword2id);
-  Py_CLEAR(p->fword2id);
+  Py_XDECREF(((PyObject *)p->col1));
+  Py_XDECREF(((PyObject *)p->col2));
+  Py_XDECREF(((PyObject *)p->f_index));
+  Py_XDECREF(((PyObject *)p->e_index));
+  Py_XDECREF(p->id2eword);
+  Py_XDECREF(p->id2fword);
+  Py_XDECREF(p->eword2id);
+  Py_XDECREF(p->fword2id);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -56850,14 +54574,14 @@ static int __pyx_tp_clear_3_sa_BiLex(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BiLex[] = {
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_5BiLex_3write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_5BiLex_5read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_e_id"), (PyCFunction)__pyx_pw_3_sa_5BiLex_7get_e_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_f_id"), (PyCFunction)__pyx_pw_3_sa_5BiLex_9get_f_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_5BiLex_11read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_5BiLex_13write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_score"), (PyCFunction)__pyx_pw_3_sa_5BiLex_15get_score, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_5BiLex_17write_text, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_5BiLex_16write_text)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_5BiLex_1write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_5BiLex_2read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_e_id"), (PyCFunction)__pyx_pf_3_sa_5BiLex_3get_e_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_f_id"), (PyCFunction)__pyx_pf_3_sa_5BiLex_4get_f_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_5BiLex_5read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_5BiLex_6write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_score"), (PyCFunction)__pyx_pf_3_sa_5BiLex_7get_score, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_5BiLex_8write_text, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_5BiLex_8write_text)},
   {0, 0, 0, 0}
 };
 
@@ -57015,7 +54739,7 @@ static PyTypeObject __pyx_type_3_sa_BiLex = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_BitSetIterator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_BitSetIterator(PyTypeObject *t, PyObject *a, PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   return o;
@@ -57026,7 +54750,7 @@ static void __pyx_tp_dealloc_3_sa_BitSetIterator(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BitSetIterator[] = {
-  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pw_3_sa_14BitSetIterator_1__next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pf_3_sa_14BitSetIterator___next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -57159,7 +54883,7 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  __pyx_pw_3_sa_14BitSetIterator_1__next__, /*tp_iternext*/
+  __pyx_pf_3_sa_14BitSetIterator___next__, /*tp_iternext*/
   __pyx_methods_3_sa_BitSetIterator, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
@@ -57184,10 +54908,10 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_BitSet(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_BitSet(PyTypeObject *t, PyObject *a, PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  if (__pyx_pw_3_sa_6BitSet_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pf_3_sa_6BitSet___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57198,7 +54922,7 @@ static void __pyx_tp_dealloc_3_sa_BitSet(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_6BitSet_3__dealloc__(o);
+    __pyx_pf_3_sa_6BitSet_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -57207,10 +54931,10 @@ static void __pyx_tp_dealloc_3_sa_BitSet(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_BitSet[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_6BitSet_7insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pw_3_sa_6BitSet_9findsucc, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("min"), (PyCFunction)__pyx_pw_3_sa_6BitSet_13min, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("max"), (PyCFunction)__pyx_pw_3_sa_6BitSet_15max, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_6BitSet_3insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pf_3_sa_6BitSet_4findsucc, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("min"), (PyCFunction)__pyx_pf_3_sa_6BitSet_6min, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("max"), (PyCFunction)__pyx_pf_3_sa_6BitSet_7max, METH_NOARGS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -57273,20 +54997,20 @@ static PyNumberMethods __pyx_tp_as_number_BitSet = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_BitSet = {
-  __pyx_pw_3_sa_6BitSet_17__len__, /*sq_length*/
+  __pyx_pf_3_sa_6BitSet_8__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  __pyx_pw_3_sa_6BitSet_19__contains__, /*sq_contains*/
+  __pyx_pf_3_sa_6BitSet_9__contains__, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_BitSet = {
-  __pyx_pw_3_sa_6BitSet_17__len__, /*mp_length*/
+  __pyx_pf_3_sa_6BitSet_8__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -57332,7 +55056,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   &__pyx_tp_as_mapping_BitSet, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pw_3_sa_6BitSet_11__str__, /*tp_str*/
+  __pyx_pf_3_sa_6BitSet_5__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_BitSet, /*tp_as_buffer*/
@@ -57342,7 +55066,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pw_3_sa_6BitSet_5__iter__, /*tp_iter*/
+  __pyx_pf_3_sa_6BitSet_2__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_BitSet, /*tp_methods*/
   0, /*tp_members*/
@@ -57368,7 +55092,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_VEBIterator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_VEBIterator(PyTypeObject *t, PyObject *a, PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   return o;
@@ -57379,7 +55103,7 @@ static void __pyx_tp_dealloc_3_sa_VEBIterator(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_VEBIterator[] = {
-  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pw_3_sa_11VEBIterator_1__next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pf_3_sa_11VEBIterator___next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -57512,7 +55236,7 @@ static PyTypeObject __pyx_type_3_sa_VEBIterator = {
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  __pyx_pw_3_sa_11VEBIterator_1__next__, /*tp_iternext*/
+  __pyx_pf_3_sa_11VEBIterator___next__, /*tp_iternext*/
   __pyx_methods_3_sa_VEBIterator, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
@@ -57544,7 +55268,7 @@ static PyObject *__pyx_tp_new_3_sa_VEB(PyTypeObject *t, PyObject *a, PyObject *k
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_VEB *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_VEB;
-  if (__pyx_pw_3_sa_3VEB_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_3VEB___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57555,7 +55279,7 @@ static void __pyx_tp_dealloc_3_sa_VEB(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_3VEB_3__dealloc__(o);
+    __pyx_pf_3_sa_3VEB_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -57564,8 +55288,8 @@ static void __pyx_tp_dealloc_3_sa_VEB(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_VEB[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_3VEB_7insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pw_3_sa_3VEB_9findsucc, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_3VEB_3insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pf_3_sa_3VEB_4findsucc, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -57628,20 +55352,20 @@ static PyNumberMethods __pyx_tp_as_number_VEB = {
 };
 
 static PySequenceMethods __pyx_tp_as_sequence_VEB = {
-  __pyx_pw_3_sa_3VEB_11__len__, /*sq_length*/
+  __pyx_pf_3_sa_3VEB_5__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  __pyx_pw_3_sa_3VEB_13__contains__, /*sq_contains*/
+  __pyx_pf_3_sa_3VEB_6__contains__, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
 static PyMappingMethods __pyx_tp_as_mapping_VEB = {
-  __pyx_pw_3_sa_3VEB_11__len__, /*mp_length*/
+  __pyx_pf_3_sa_3VEB_5__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
@@ -57697,7 +55421,7 @@ static PyTypeObject __pyx_type_3_sa_VEB = {
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pw_3_sa_3VEB_5__iter__, /*tp_iter*/
+  __pyx_pf_3_sa_3VEB_2__iter__, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_3_sa_VEB, /*tp_methods*/
   0, /*tp_members*/
@@ -57730,7 +55454,7 @@ static PyObject *__pyx_tp_new_3_sa_LCP(PyTypeObject *t, PyObject *a, PyObject *k
   p = ((struct __pyx_obj_3_sa_LCP *)o);
   p->sa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
   p->lcp = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_3LCP_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_3LCP___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57738,8 +55462,8 @@ static PyObject *__pyx_tp_new_3_sa_LCP(PyTypeObject *t, PyObject *a, PyObject *k
 
 static void __pyx_tp_dealloc_3_sa_LCP(PyObject *o) {
   struct __pyx_obj_3_sa_LCP *p = (struct __pyx_obj_3_sa_LCP *)o;
-  Py_CLEAR(p->sa);
-  Py_CLEAR(p->lcp);
+  Py_XDECREF(((PyObject *)p->sa));
+  Py_XDECREF(((PyObject *)p->lcp));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -57768,7 +55492,7 @@ static int __pyx_tp_clear_3_sa_LCP(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_LCP[] = {
-  {__Pyx_NAMESTR("compute_stats"), (PyCFunction)__pyx_pw_3_sa_3LCP_3compute_stats, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_3LCP_2compute_stats)},
+  {__Pyx_NAMESTR("compute_stats"), (PyCFunction)__pyx_pf_3_sa_3LCP_1compute_stats, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_3LCP_1compute_stats)},
   {0, 0, 0, 0}
 };
 
@@ -57927,7 +55651,7 @@ static PyTypeObject __pyx_type_3_sa_LCP = {
 };
 static struct __pyx_vtabstruct_3_sa_Alphabet __pyx_vtable_3_sa_Alphabet;
 
-static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa_Alphabet *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -57936,7 +55660,7 @@ static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, CYTHON_UNUSED PyObj
   p->terminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
   p->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
   p->id2sym = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_8Alphabet_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pf_3_sa_8Alphabet___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -57948,14 +55672,14 @@ static void __pyx_tp_dealloc_3_sa_Alphabet(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_8Alphabet_3__dealloc__(o);
+    __pyx_pf_3_sa_8Alphabet_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
   }
-  Py_CLEAR(p->terminals);
-  Py_CLEAR(p->nonterminals);
-  Py_CLEAR(p->id2sym);
+  Py_XDECREF(((PyObject *)p->terminals));
+  Py_XDECREF(((PyObject *)p->nonterminals));
+  Py_XDECREF(((PyObject *)p->id2sym));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -57989,12 +55713,12 @@ static int __pyx_tp_clear_3_sa_Alphabet(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_8Alphabet_9terminals_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_8Alphabet_9terminals___get__(o);
 }
 
-static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_8Alphabet_12nonterminals___get__(o);
 }
 
 static PyMethodDef __pyx_methods_3_sa_Alphabet[] = {
@@ -58168,7 +55892,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieMap(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieMap *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_TrieMap;
-  if (__pyx_pw_3_sa_7TrieMap_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_7TrieMap___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -58179,7 +55903,7 @@ static void __pyx_tp_dealloc_3_sa_TrieMap(PyObject *o) {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
-    __pyx_pw_3_sa_7TrieMap_3__dealloc__(o);
+    __pyx_pf_3_sa_7TrieMap_1__dealloc__(o);
     if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
@@ -58188,9 +55912,9 @@ static void __pyx_tp_dealloc_3_sa_TrieMap(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_TrieMap[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_5insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("contains"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_7contains, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("toMap"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_9toMap, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_2insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("contains"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_3contains, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("toMap"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_4toMap, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -58357,7 +56081,7 @@ static PyObject *__pyx_tp_new_3_sa_Precomputation(PyTypeObject *t, PyObject *a,
   p->__pyx_vtab = __pyx_vtabptr_3_sa_Precomputation;
   p->precomputed_index = Py_None; Py_INCREF(Py_None);
   p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_14Precomputation_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_14Precomputation___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -58365,8 +56089,8 @@ static PyObject *__pyx_tp_new_3_sa_Precomputation(PyTypeObject *t, PyObject *a,
 
 static void __pyx_tp_dealloc_3_sa_Precomputation(PyObject *o) {
   struct __pyx_obj_3_sa_Precomputation *p = (struct __pyx_obj_3_sa_Precomputation *)o;
-  Py_CLEAR(p->precomputed_index);
-  Py_CLEAR(p->precomputed_collocations);
+  Py_XDECREF(p->precomputed_index);
+  Py_XDECREF(p->precomputed_collocations);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -58395,9 +56119,9 @@ static int __pyx_tp_clear_3_sa_Precomputation(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Precomputation[] = {
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_3read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_5write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_7precompute, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_1read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_2write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_3precompute, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -58565,7 +56289,7 @@ static PyObject *__pyx_tp_new_3_sa_SuffixArray(PyTypeObject *t, PyObject *a, PyO
   p->darray = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
   p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->ha = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_11SuffixArray_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_11SuffixArray___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -58573,9 +56297,9 @@ static PyObject *__pyx_tp_new_3_sa_SuffixArray(PyTypeObject *t, PyObject *a, PyO
 
 static void __pyx_tp_dealloc_3_sa_SuffixArray(PyObject *o) {
   struct __pyx_obj_3_sa_SuffixArray *p = (struct __pyx_obj_3_sa_SuffixArray *)o;
-  Py_CLEAR(p->darray);
-  Py_CLEAR(p->sa);
-  Py_CLEAR(p->ha);
+  Py_XDECREF(((PyObject *)p->darray));
+  Py_XDECREF(((PyObject *)p->sa));
+  Py_XDECREF(((PyObject *)p->ha));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -58617,16 +56341,16 @@ static PyObject *__pyx_sq_item_3_sa_SuffixArray(PyObject *o, Py_ssize_t i) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_SuffixArray[] = {
-  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_5get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_7get_sentence, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_9get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_11read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_10read_text)},
-  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_13q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_12q3sort)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_17read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_19write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_21write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_23lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_2get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_3get_sentence, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_4get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_5read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_5read_text)},
+  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_6q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_6q3sort)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_7write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_8read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_9write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_10write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_11lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -58703,7 +56427,7 @@ static PySequenceMethods __pyx_tp_as_sequence_SuffixArray = {
 
 static PyMappingMethods __pyx_tp_as_mapping_SuffixArray = {
   0, /*mp_length*/
-  __pyx_pw_3_sa_11SuffixArray_3__getitem__, /*mp_subscript*/
+  __pyx_pf_3_sa_11SuffixArray_1__getitem__, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
@@ -58784,13 +56508,13 @@ static PyTypeObject __pyx_type_3_sa_SuffixArray = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa_TrieNode *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieNode *)o);
   p->children = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_8TrieNode_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  if (__pyx_pf_3_sa_8TrieNode___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -58798,7 +56522,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, CYTHON_UNUSED PyObj
 
 static void __pyx_tp_dealloc_3_sa_TrieNode(PyObject *o) {
   struct __pyx_obj_3_sa_TrieNode *p = (struct __pyx_obj_3_sa_TrieNode *)o;
-  Py_CLEAR(p->children);
+  Py_XDECREF(p->children);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -58820,16 +56544,16 @@ static int __pyx_tp_clear_3_sa_TrieNode(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_8TrieNode_8children_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_8TrieNode_8children___get__(o);
 }
 
-static int __pyx_setprop_3_sa_8TrieNode_children(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_8TrieNode_children(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_8TrieNode_8children_3__set__(o, v);
+    return __pyx_pf_3_sa_8TrieNode_8children_1__set__(o, v);
   }
   else {
-    return __pyx_pw_3_sa_8TrieNode_8children_5__del__(o);
+    return __pyx_pf_3_sa_8TrieNode_8children_2__del__(o);
   }
 }
 
@@ -59004,7 +56728,7 @@ static PyObject *__pyx_tp_new_3_sa_ExtendedTrieNode(PyTypeObject *t, PyObject *a
   p->phrase = Py_None; Py_INCREF(Py_None);
   p->phrase_location = Py_None; Py_INCREF(Py_None);
   p->suffix_link = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_16ExtendedTrieNode___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -59012,9 +56736,9 @@ static PyObject *__pyx_tp_new_3_sa_ExtendedTrieNode(PyTypeObject *t, PyObject *a
 
 static void __pyx_tp_dealloc_3_sa_ExtendedTrieNode(PyObject *o) {
   struct __pyx_obj_3_sa_ExtendedTrieNode *p = (struct __pyx_obj_3_sa_ExtendedTrieNode *)o;
-  Py_CLEAR(p->phrase);
-  Py_CLEAR(p->phrase_location);
-  Py_CLEAR(p->suffix_link);
+  Py_XDECREF(p->phrase);
+  Py_XDECREF(p->phrase_location);
+  Py_XDECREF(p->suffix_link);
   __pyx_tp_dealloc_3_sa_TrieNode(o);
 }
 
@@ -59050,42 +56774,42 @@ static int __pyx_tp_clear_3_sa_ExtendedTrieNode(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(o, v);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(o, v);
   }
   else {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(o);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(o, v);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(o, v);
   }
   else {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(o);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(o);
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(o);
 }
 
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(o, v);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(o, v);
   }
   else {
-    return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(o);
+    return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(o);
   }
 }
 
@@ -59260,7 +56984,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieTable(PyTypeObject *t, PyObject *a, PyObj
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_TrieTable *)o);
   p->root = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_9TrieTable_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_9TrieTable___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -59268,7 +56992,7 @@ static PyObject *__pyx_tp_new_3_sa_TrieTable(PyTypeObject *t, PyObject *a, PyObj
 
 static void __pyx_tp_dealloc_3_sa_TrieTable(PyObject *o) {
   struct __pyx_obj_3_sa_TrieTable *p = (struct __pyx_obj_3_sa_TrieTable *)o;
-  Py_CLEAR(p->root);
+  Py_XDECREF(p->root);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -59290,13 +57014,13 @@ static int __pyx_tp_clear_3_sa_TrieTable(PyObject *o) {
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_9TrieTable_8extended_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_9TrieTable_8extended___get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_9TrieTable_8extended_3__set__(o, v);
+    return __pyx_pf_3_sa_9TrieTable_8extended_1__set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -59304,13 +57028,13 @@ static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, CYTH
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_9TrieTable_5count_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_9TrieTable_5count___get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_9TrieTable_5count_3__set__(o, v);
+    return __pyx_pf_3_sa_9TrieTable_5count_1__set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -59318,16 +57042,16 @@ static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, CYTHON_
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, CYTHON_UNUSED void *x) {
-  return __pyx_pw_3_sa_9TrieTable_4root_1__get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, void *x) {
+  return __pyx_pf_3_sa_9TrieTable_4root___get__(o);
 }
 
-static int __pyx_setprop_3_sa_9TrieTable_root(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+static int __pyx_setprop_3_sa_9TrieTable_root(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_pw_3_sa_9TrieTable_4root_3__set__(o, v);
+    return __pyx_pf_3_sa_9TrieTable_4root_1__set__(o, v);
   }
   else {
-    return __pyx_pw_3_sa_9TrieTable_4root_5__del__(o);
+    return __pyx_pf_3_sa_9TrieTable_4root_2__del__(o);
   }
 }
 
@@ -59504,7 +57228,7 @@ static PyObject *__pyx_tp_new_3_sa_PhraseLocation(PyTypeObject *t, PyObject *a,
   p = ((struct __pyx_obj_3_sa_PhraseLocation *)o);
   p->__pyx_vtab = __pyx_vtabptr_3_sa_PhraseLocation;
   p->arr = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_14PhraseLocation_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_14PhraseLocation___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -59512,7 +57236,7 @@ static PyObject *__pyx_tp_new_3_sa_PhraseLocation(PyTypeObject *t, PyObject *a,
 
 static void __pyx_tp_dealloc_3_sa_PhraseLocation(PyObject *o) {
   struct __pyx_obj_3_sa_PhraseLocation *p = (struct __pyx_obj_3_sa_PhraseLocation *)o;
-  Py_CLEAR(p->arr);
+  Py_XDECREF(((PyObject *)p->arr));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -59698,7 +57422,7 @@ static PyObject *__pyx_tp_new_3_sa_Sampler(PyTypeObject *t, PyObject *a, PyObjec
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa_Sampler *)o);
   p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_7Sampler_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_7Sampler___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -59706,7 +57430,7 @@ static PyObject *__pyx_tp_new_3_sa_Sampler(PyTypeObject *t, PyObject *a, PyObjec
 
 static void __pyx_tp_dealloc_3_sa_Sampler(PyObject *o) {
   struct __pyx_obj_3_sa_Sampler *p = (struct __pyx_obj_3_sa_Sampler *)o;
-  Py_CLEAR(p->sa);
+  Py_XDECREF(((PyObject *)p->sa));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -59729,7 +57453,7 @@ static int __pyx_tp_clear_3_sa_Sampler(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_Sampler[] = {
-  {__Pyx_NAMESTR("sample"), (PyCFunction)__pyx_pw_3_sa_7Sampler_3sample, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_7Sampler_2sample)},
+  {__Pyx_NAMESTR("sample"), (PyCFunction)__pyx_pf_3_sa_7Sampler_1sample, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_7Sampler_1sample)},
   {0, 0, 0, 0}
 };
 
@@ -59910,7 +57634,7 @@ static PyObject *__pyx_tp_new_3_sa_HieroCachingRuleFactory(PyTypeObject *t, PyOb
   p->fid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->findexes = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   p->findexes1 = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(o, a, k) < 0) {
+  if (__pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
@@ -59918,22 +57642,22 @@ static PyObject *__pyx_tp_new_3_sa_HieroCachingRuleFactory(PyTypeObject *t, PyOb
 
 static void __pyx_tp_dealloc_3_sa_HieroCachingRuleFactory(PyObject *o) {
   struct __pyx_obj_3_sa_HieroCachingRuleFactory *p = (struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o;
-  Py_CLEAR(p->rules);
-  Py_CLEAR(p->sampler);
-  Py_CLEAR(p->scorer);
-  Py_CLEAR(p->precomputed_index);
-  Py_CLEAR(p->precomputed_collocations);
-  Py_CLEAR(p->precompute_file);
-  Py_CLEAR(p->max_rank);
-  Py_CLEAR(p->prev_norm_prefix);
-  Py_CLEAR(p->fsa);
-  Py_CLEAR(p->fda);
-  Py_CLEAR(p->eda);
-  Py_CLEAR(p->alignment);
-  Py_CLEAR(p->eid2symid);
-  Py_CLEAR(p->fid2symid);
-  Py_CLEAR(p->findexes);
-  Py_CLEAR(p->findexes1);
+  Py_XDECREF(((PyObject *)p->rules));
+  Py_XDECREF(((PyObject *)p->sampler));
+  Py_XDECREF(((PyObject *)p->scorer));
+  Py_XDECREF(p->precomputed_index);
+  Py_XDECREF(p->precomputed_collocations);
+  Py_XDECREF(p->precompute_file);
+  Py_XDECREF(p->max_rank);
+  Py_XDECREF(p->prev_norm_prefix);
+  Py_XDECREF(((PyObject *)p->fsa));
+  Py_XDECREF(((PyObject *)p->fda));
+  Py_XDECREF(((PyObject *)p->eda));
+  Py_XDECREF(((PyObject *)p->alignment));
+  Py_XDECREF(((PyObject *)p->eid2symid));
+  Py_XDECREF(((PyObject *)p->fid2symid));
+  Py_XDECREF(((PyObject *)p->findexes));
+  Py_XDECREF(((PyObject *)p->findexes1));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -60046,17 +57770,17 @@ static int __pyx_tp_clear_3_sa_HieroCachingRuleFactory(PyObject *o) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_HieroCachingRuleFactory[] = {
-  {__Pyx_NAMESTR("configure"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_2configure)},
-  {__Pyx_NAMESTR("pattern2phrase"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("pattern2phrase_plus"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_precomputed_collocation"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("advance"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_all_nodes_isteps_away"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_23input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_22input)},
+  {__Pyx_NAMESTR("configure"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_1configure)},
+  {__Pyx_NAMESTR("pattern2phrase"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("pattern2phrase_plus"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_precomputed_collocation"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("advance"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_all_nodes_isteps_away"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_11input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_11input)},
   {0, 0, 0, 0}
 };
 
@@ -60215,7 +57939,7 @@ static PyTypeObject __pyx_type_3_sa_HieroCachingRuleFactory = {
 };
 static struct __pyx_vtabstruct_3_sa_Scorer __pyx_vtable_3_sa_Scorer;
 
-static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa_Scorer *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -60227,7 +57951,7 @@ static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, CYTHON_UNUSED PyObjec
 
 static void __pyx_tp_dealloc_3_sa_Scorer(PyObject *o) {
   struct __pyx_obj_3_sa_Scorer *p = (struct __pyx_obj_3_sa_Scorer *)o;
-  Py_CLEAR(p->models);
+  Py_XDECREF(p->models);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -60391,7 +58115,7 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  __pyx_pw_3_sa_6Scorer_1__init__, /*tp_init*/
+  __pyx_pf_3_sa_6Scorer___init__, /*tp_init*/
   0, /*tp_alloc*/
   __pyx_tp_new_3_sa_Scorer, /*tp_new*/
   0, /*tp_free*/
@@ -60407,10 +58131,220 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_Generator(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_Generator_object *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
+  p = ((struct __pyx_Generator_object *)o);
+  p->exc_type = 0;
+  p->exc_value = 0;
+  p->exc_traceback = 0;
+  return o;
+}
+
+static void __pyx_tp_dealloc_3_sa___pyx_Generator(PyObject *o) {
+  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
+  Py_XDECREF(p->exc_type);
+  Py_XDECREF(p->exc_value);
+  Py_XDECREF(p->exc_traceback);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_3_sa___pyx_Generator(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
+  if (p->exc_type) {
+    e = (*v)(p->exc_type, a); if (e) return e;
+  }
+  if (p->exc_value) {
+    e = (*v)(p->exc_value, a); if (e) return e;
+  }
+  if (p->exc_traceback) {
+    e = (*v)(p->exc_traceback, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_3_sa___pyx_Generator(PyObject *o) {
+  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
+  PyObject* tmp;
+  tmp = ((PyObject*)p->exc_type);
+  p->exc_type = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->exc_value);
+  p->exc_value = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->exc_traceback);
+  p->exc_traceback = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_3_sa___pyx_Generator[] = {
+  {__Pyx_NAMESTR("send"), (PyCFunction)__Pyx_Generator_Send, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("close"), (PyCFunction)__Pyx_Generator_Close, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("throw"), (PyCFunction)__Pyx_Generator_Throw, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number___pyx_Generator = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_divide*/
+  #endif
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_nonzero*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_coerce*/
+  #endif
+  0, /*nb_int*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_long*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*nb_float*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_oct*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_hex*/
+  #endif
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_inplace_divide*/
+  #endif
+  0, /*nb_inplace_remainder*/
+  0, /*nb_inplace_power*/
+  0, /*nb_inplace_lshift*/
+  0, /*nb_inplace_rshift*/
+  0, /*nb_inplace_and*/
+  0, /*nb_inplace_xor*/
+  0, /*nb_inplace_or*/
+  0, /*nb_floor_divide*/
+  0, /*nb_true_divide*/
+  0, /*nb_inplace_floor_divide*/
+  0, /*nb_inplace_true_divide*/
+  #if PY_VERSION_HEX >= 0x02050000
+  0, /*nb_index*/
+  #endif
+};
+
+static PySequenceMethods __pyx_tp_as_sequence___pyx_Generator = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  0, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping___pyx_Generator = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyBufferProcs __pyx_tp_as_buffer___pyx_Generator = {
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getreadbuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getwritebuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getsegcount*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getcharbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_getbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_releasebuffer*/
+  #endif
+};
+
+static PyTypeObject __pyx_Generator_type = {
+  PyVarObject_HEAD_INIT(0, 0)
+  __Pyx_NAMESTR("_sa.__pyx_Generator"), /*tp_name*/
+  sizeof(struct __pyx_Generator_object), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_3_sa___pyx_Generator, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  &__pyx_tp_as_number___pyx_Generator, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_Generator, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_Generator, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  &__pyx_tp_as_buffer___pyx_Generator, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_3_sa___pyx_Generator, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_Generator, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  PyObject_SelfIter, /*tp_iter*/
+  __Pyx_Generator_Next, /*tp_iternext*/
+  __pyx_methods_3_sa___pyx_Generator, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_3_sa___pyx_Generator, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p;
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+  if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o);
   p->__pyx_v_self = 0;
   return o;
@@ -60418,13 +58352,14 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct____iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -60434,8 +58369,9 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct____iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -60598,7 +58534,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct____iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -60609,7 +58545,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_1_read_bitext(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o;
-  Py_CLEAR(p->__pyx_v_fp);
+  Py_XDECREF(p->__pyx_v_fp);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -60789,9 +58725,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_1_read_bitext = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -60802,15 +58738,16 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_line);
-  Py_CLEAR(p->__pyx_t_0);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_line);
+  Py_XDECREF(p->__pyx_t_0);
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -60826,6 +58763,7 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -60996,9 +58934,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_2_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o);
   p->__pyx_v_ngram = 0;
@@ -61012,18 +58950,19 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObje
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
-  Py_CLEAR(p->__pyx_v_ngram);
-  Py_CLEAR(p->__pyx_v_ngram_start);
-  Py_CLEAR(p->__pyx_v_ngram_starts);
-  Py_CLEAR(p->__pyx_v_run_start);
-  Py_CLEAR(p->__pyx_v_self);
-  Py_CLEAR(p->__pyx_v_veb);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_v_ngram));
+  Py_XDECREF(((PyObject *)p->__pyx_v_ngram_start));
+  Py_XDECREF(((PyObject *)p->__pyx_v_ngram_starts));
+  Py_XDECREF(((PyObject *)p->__pyx_v_run_start));
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_XDECREF(((PyObject *)p->__pyx_v_veb));
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_ngram) {
     e = (*v)(p->__pyx_v_ngram, a); if (e) return e;
   }
@@ -61048,6 +58987,7 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_ngram);
   p->__pyx_v_ngram = ((PyObject*)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -61061,7 +59001,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
   p->__pyx_v_run_start = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_LCP *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_veb);
   p->__pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)Py_None); Py_INCREF(Py_None);
@@ -61227,9 +59167,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_3_compute_stats = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o);
   p->__pyx_v_self = 0;
@@ -61238,13 +59178,14 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_4___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_4___iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -61254,8 +59195,9 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_4___iter__(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_4___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -61418,7 +59360,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_4___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -61429,7 +59371,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_5___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -61446,7 +59388,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_5___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
   PyObject* tmp;
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Rule *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -61609,9 +59551,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_5___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -61622,15 +59564,16 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t,
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_a);
-  Py_CLEAR(p->__pyx_t_0);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_a);
+  Py_XDECREF(p->__pyx_t_0);
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -61646,6 +59589,7 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visi
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -61816,9 +59760,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_6_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o);
   p->__pyx_v_point = 0;
@@ -61829,15 +59773,16 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
-  Py_CLEAR(p->__pyx_v_point);
-  Py_CLEAR(p->__pyx_v_self);
-  Py_CLEAR(p->__pyx_t_0);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(p->__pyx_v_point);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_XDECREF(p->__pyx_t_0);
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_point) {
     e = (*v)(p->__pyx_v_point, a); if (e) return e;
   }
@@ -61853,11 +59798,12 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments(PyObject *o, v
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_point);
   p->__pyx_v_point = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Rule *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_t_0);
   p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
@@ -62023,9 +59969,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_7_alignments = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o);
   p->__pyx_v_alignment = 0;
@@ -62073,68 +60019,69 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, C
   p->__pyx_v_xcat_index = 0;
   p->__pyx_v_xnode = 0;
   p->__pyx_v_xroot = 0;
-  p->__pyx_t_1 = 0;
+  p->__pyx_t_2 = 0;
+  p->__pyx_t_3 = 0;
   p->__pyx_t_4 = 0;
-  p->__pyx_t_5 = 0;
   return o;
 }
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
-  Py_CLEAR(p->__pyx_v_alignment);
-  Py_CLEAR(p->__pyx_v_als);
-  Py_CLEAR(p->__pyx_v_alslist);
-  Py_CLEAR(p->__pyx_v_chunklen);
-  Py_CLEAR(p->__pyx_v_count);
-  Py_CLEAR(p->__pyx_v_e);
-  Py_CLEAR(p->__pyx_v_elist);
-  Py_CLEAR(p->__pyx_v_extract);
-  Py_CLEAR(p->__pyx_v_extract_start);
-  Py_CLEAR(p->__pyx_v_extract_stop);
-  Py_CLEAR(p->__pyx_v_extracts);
-  Py_CLEAR(p->__pyx_v_f);
-  Py_CLEAR(p->__pyx_v_fcount);
-  Py_CLEAR(p->__pyx_v_fphrases);
-  Py_CLEAR(p->__pyx_v_frontier);
-  Py_CLEAR(p->__pyx_v_frontier_nodes);
-  Py_CLEAR(p->__pyx_v_fwords);
-  Py_CLEAR(p->__pyx_v_hiero_phrase);
-  Py_CLEAR(p->__pyx_v_is_shadow_path);
-  Py_CLEAR(p->__pyx_v_key);
-  Py_CLEAR(p->__pyx_v_loc);
-  Py_CLEAR(p->__pyx_v_locs);
-  Py_CLEAR(p->__pyx_v_max_locs);
-  Py_CLEAR(p->__pyx_v_new_frontier);
-  Py_CLEAR(p->__pyx_v_new_node);
-  Py_CLEAR(p->__pyx_v_next_states);
-  Py_CLEAR(p->__pyx_v_node);
-  Py_CLEAR(p->__pyx_v_nodes_isteps_away_buffer);
-  Py_CLEAR(p->__pyx_v_pathlen);
-  Py_CLEAR(p->__pyx_v_phrase);
-  Py_CLEAR(p->__pyx_v_phrase_location);
-  Py_CLEAR(p->__pyx_v_prefix);
-  Py_CLEAR(p->__pyx_v_reachable_buffer);
-  Py_CLEAR(p->__pyx_v_sa_range);
-  Py_CLEAR(p->__pyx_v_sample);
-  Py_CLEAR(p->__pyx_v_scores);
-  Py_CLEAR(p->__pyx_v_self);
-  Py_CLEAR(p->__pyx_v_spanlen);
-  Py_CLEAR(p->__pyx_v_stop_time);
-  Py_CLEAR(p->__pyx_v_suffix_link);
-  Py_CLEAR(p->__pyx_v_suffix_link_xcat_index);
-  Py_CLEAR(p->__pyx_v_word_id);
-  Py_CLEAR(p->__pyx_v_xcat_index);
-  Py_CLEAR(p->__pyx_v_xnode);
-  Py_CLEAR(p->__pyx_v_xroot);
-  Py_CLEAR(p->__pyx_t_1);
-  Py_CLEAR(p->__pyx_t_4);
-  Py_CLEAR(p->__pyx_t_5);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(p->__pyx_v_alignment);
+  Py_XDECREF(p->__pyx_v_als);
+  Py_XDECREF(p->__pyx_v_alslist);
+  Py_XDECREF(((PyObject *)p->__pyx_v_chunklen));
+  Py_XDECREF(p->__pyx_v_count);
+  Py_XDECREF(p->__pyx_v_e);
+  Py_XDECREF(p->__pyx_v_elist);
+  Py_XDECREF(p->__pyx_v_extract);
+  Py_XDECREF(p->__pyx_v_extract_start);
+  Py_XDECREF(p->__pyx_v_extract_stop);
+  Py_XDECREF(((PyObject *)p->__pyx_v_extracts));
+  Py_XDECREF(p->__pyx_v_f);
+  Py_XDECREF(p->__pyx_v_fcount);
+  Py_XDECREF(p->__pyx_v_fphrases);
+  Py_XDECREF(((PyObject *)p->__pyx_v_frontier));
+  Py_XDECREF(p->__pyx_v_frontier_nodes);
+  Py_XDECREF(p->__pyx_v_fwords);
+  Py_XDECREF(((PyObject *)p->__pyx_v_hiero_phrase));
+  Py_XDECREF(p->__pyx_v_is_shadow_path);
+  Py_XDECREF(((PyObject *)p->__pyx_v_key));
+  Py_XDECREF(p->__pyx_v_loc);
+  Py_XDECREF(((PyObject *)p->__pyx_v_locs));
+  Py_XDECREF(p->__pyx_v_max_locs);
+  Py_XDECREF(((PyObject *)p->__pyx_v_new_frontier));
+  Py_XDECREF(p->__pyx_v_new_node);
+  Py_XDECREF(((PyObject *)p->__pyx_v_next_states));
+  Py_XDECREF(p->__pyx_v_node);
+  Py_XDECREF(((PyObject *)p->__pyx_v_nodes_isteps_away_buffer));
+  Py_XDECREF(p->__pyx_v_pathlen);
+  Py_XDECREF(p->__pyx_v_phrase);
+  Py_XDECREF(((PyObject *)p->__pyx_v_phrase_location));
+  Py_XDECREF(p->__pyx_v_prefix);
+  Py_XDECREF(((PyObject *)p->__pyx_v_reachable_buffer));
+  Py_XDECREF(p->__pyx_v_sa_range);
+  Py_XDECREF(((PyObject *)p->__pyx_v_sample));
+  Py_XDECREF(((PyObject *)p->__pyx_v_scores));
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_XDECREF(p->__pyx_v_spanlen);
+  Py_XDECREF(p->__pyx_v_stop_time);
+  Py_XDECREF(p->__pyx_v_suffix_link);
+  Py_XDECREF(p->__pyx_v_suffix_link_xcat_index);
+  Py_XDECREF(p->__pyx_v_word_id);
+  Py_XDECREF(p->__pyx_v_xcat_index);
+  Py_XDECREF(p->__pyx_v_xnode);
+  Py_XDECREF(p->__pyx_v_xroot);
+  Py_XDECREF(p->__pyx_t_2);
+  Py_XDECREF(p->__pyx_t_3);
+  Py_XDECREF(p->__pyx_t_4);
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_alignment) {
     e = (*v)(p->__pyx_v_alignment, a); if (e) return e;
   }
@@ -62270,21 +60217,22 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitp
   if (p->__pyx_v_xroot) {
     e = (*v)(p->__pyx_v_xroot, a); if (e) return e;
   }
-  if (p->__pyx_t_1) {
-    e = (*v)(p->__pyx_t_1, a); if (e) return e;
+  if (p->__pyx_t_2) {
+    e = (*v)(p->__pyx_t_2, a); if (e) return e;
+  }
+  if (p->__pyx_t_3) {
+    e = (*v)(p->__pyx_t_3, a); if (e) return e;
   }
   if (p->__pyx_t_4) {
     e = (*v)(p->__pyx_t_4, a); if (e) return e;
   }
-  if (p->__pyx_t_5) {
-    e = (*v)(p->__pyx_t_5, a); if (e) return e;
-  }
   return 0;
 }
 
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_alignment);
   p->__pyx_v_alignment = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -62394,7 +60342,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   p->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_spanlen);
   p->__pyx_v_spanlen = Py_None; Py_INCREF(Py_None);
@@ -62420,15 +60368,15 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   tmp = ((PyObject*)p->__pyx_v_xroot);
   p->__pyx_v_xroot = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_1);
-  p->__pyx_t_1 = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_t_2);
+  p->__pyx_t_2 = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_3);
+  p->__pyx_t_3 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_t_4);
   p->__pyx_t_4 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_5);
-  p->__pyx_t_5 = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
   return 0;
 }
 
@@ -62590,9 +60538,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_8_input = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o);
   p->__pyx_v_self = 0;
@@ -62601,13 +60549,14 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_9___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_9___iter__(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
@@ -62617,8 +60566,9 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_9___iter__(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_9___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -62781,7 +60731,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_9___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -62792,7 +60742,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_10___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -62809,7 +60759,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_10___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
   PyObject* tmp;
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
@@ -62972,9 +60922,9 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_10___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
   if (!o) return 0;
   p = ((struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o);
   p->__pyx_outer_scope = 0;
@@ -62985,15 +60935,16 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_feat);
-  Py_CLEAR(p->__pyx_t_0);
-  (*Py_TYPE(o)->tp_free)(o);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_feat);
+  Py_XDECREF(p->__pyx_t_0);
+  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
 }
 
 static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
+  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -63009,6 +60960,7 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr(PyObject *o, vis
 static int __pyx_tp_clear_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
   PyObject* tmp;
+  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
   p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -63231,11 +61183,9 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_133, __pyx_k_133, sizeof(__pyx_k_133), 0, 0, 1, 0},
   {&__pyx_kp_s_134, __pyx_k_134, sizeof(__pyx_k_134), 0, 0, 1, 0},
   {&__pyx_kp_s_135, __pyx_k_135, sizeof(__pyx_k_135), 0, 0, 1, 0},
+  {&__pyx_kp_s_136, __pyx_k_136, sizeof(__pyx_k_136), 0, 0, 1, 0},
   {&__pyx_kp_s_138, __pyx_k_138, sizeof(__pyx_k_138), 0, 0, 1, 0},
-  {&__pyx_kp_s_139, __pyx_k_139, sizeof(__pyx_k_139), 0, 0, 1, 0},
   {&__pyx_kp_s_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 0, 1, 0},
-  {&__pyx_kp_s_143, __pyx_k_143, sizeof(__pyx_k_143), 0, 0, 1, 0},
-  {&__pyx_kp_s_144, __pyx_k_144, sizeof(__pyx_k_144), 0, 0, 1, 0},
   {&__pyx_kp_s_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 1, 0},
   {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
   {&__pyx_kp_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 0},
@@ -63483,7 +61433,7 @@ static int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_IndexError = __Pyx_GetName(__pyx_b, __pyx_n_s__IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_TypeError = __Pyx_GetName(__pyx_b, __pyx_n_s__TypeError); if (!__pyx_builtin_TypeError) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_enumerate = __Pyx_GetName(__pyx_b, __pyx_n_s__enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_enumerate = __Pyx_GetName(__pyx_b, __pyx_n_s__enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_map = __Pyx_GetName(__pyx_b, __pyx_n_s__map); if (!__pyx_builtin_map) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_Exception = __Pyx_GetName(__pyx_b, __pyx_n_s__Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_zip = __Pyx_GetName(__pyx_b, __pyx_n_s__zip); if (!__pyx_builtin_zip) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -63498,7 +61448,7 @@ static int __Pyx_InitCachedBuiltins(void) {
 
 static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
+  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants");
 
   /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
@@ -63508,7 +61458,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.sent_index = IntList(1000,1000)
  */
   __pyx_k_tuple_10 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_10);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_10));
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -63525,7 +61475,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.use_sent_id = use_sent_id
  */
   __pyx_k_tuple_11 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_11);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_11));
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_11, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -63542,7 +61492,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if from_binary:
  */
   __pyx_k_tuple_12 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_12);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_12));
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_12, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -63551,29 +61501,29 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":65
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-  __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_15);
+  __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_15));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             for w_id in self.data:
  *                 if w_id > 1:
  */
-  __pyx_k_tuple_16 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_16);
+  __pyx_k_tuple_16 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_16));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63585,15 +61535,15 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
  *             self.read_text_data(fp)
  * 
  */
-  __pyx_k_tuple_17 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_17);
+  __pyx_k_tuple_17 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_17));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63605,29 +61555,29 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
  *             self.read_text_data(data)
  * 
  */
-  __pyx_k_tuple_19 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_19);
+  __pyx_k_tuple_19 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_19));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_18));
   PyTuple_SET_ITEM(__pyx_k_tuple_19, 0, ((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_19));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":75
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
  *             data = (line.split(' ||| ')[side] for line in fp)
  *             self.read_text_data(data)
  */
-  __pyx_k_tuple_20 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_20);
+  __pyx_k_tuple_20 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_20));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_20, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63639,70 +61589,70 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_20));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":143
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  */
-  __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_22);
+  __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_22));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_22, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_22));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  */
-  __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_23);
+  __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_23));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_23, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_23));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  */
-  __pyx_k_tuple_24 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_24);
+  __pyx_k_tuple_24 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_24));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_24, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_24));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def write_enhanced(self, char* filename):
  */
-  __pyx_k_tuple_26 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_26)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_26);
+  __pyx_k_tuple_26 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_26)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_26));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_26, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_26));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":158
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.write_enhanced_handle(self, f)
  */
-  __pyx_k_tuple_28 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_28);
+  __pyx_k_tuple_28 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_28));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_28, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63722,7 +61672,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if from_binary:
  */
   __pyx_k_tuple_29 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_29)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_29);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_29));
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_29, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -63739,7 +61689,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.read_binary(from_binary)
  */
   __pyx_k_tuple_30 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_30)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_30);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_30));
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_30, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -63756,7 +61706,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.sent_index.append(len(self.links))
  */
   __pyx_k_tuple_32 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_32)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_32);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_32));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_31));
   PyTuple_SET_ITEM(__pyx_k_tuple_32, 0, ((PyObject *)__pyx_kp_s_31));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_31));
@@ -63770,7 +61720,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 self.sent_index.append(len(self.links))
  */
   __pyx_k_tuple_33 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_33)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_33);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_33));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_33, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63790,7 +61740,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d-%d " % self.unlink(link))
  */
   __pyx_k_tuple_34 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_34)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_34);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_34));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_34, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -63804,7 +61754,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     def write_binary(self, char* filename):
  */
   __pyx_k_tuple_36 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_36)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_36);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_36));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_36, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -63818,7 +61768,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for i, link in enumerate(self.links):
  */
   __pyx_k_tuple_37 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_37)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_37);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_37));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_37, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63838,7 +61788,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % i)
  */
   __pyx_k_tuple_38 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_38)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_38);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_38));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_38, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -63852,7 +61802,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     def alignment(self, i):
  */
   __pyx_k_tuple_39 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_39)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_39);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_39));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_39, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -63866,7 +61816,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for link in self.links:
  */
   __pyx_k_tuple_40 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_40)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_40);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_40));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_40, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63886,7 +61836,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 (fword, eword, score1, score2) = line.split()
  */
   __pyx_k_tuple_43 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_43)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_43);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_43));
   __Pyx_INCREF(__pyx_int_0);
   PyTuple_SET_ITEM(__pyx_k_tuple_43, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
@@ -63900,7 +61850,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for line in f:
  */
   __pyx_k_tuple_44 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_44)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_44);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_44));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_44, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -63920,7 +61870,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             return
  */
   __pyx_k_tuple_47 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_47)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_47);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_47));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_46));
   PyTuple_SET_ITEM(__pyx_k_tuple_47, 0, ((PyObject *)__pyx_kp_s_46));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_46));
@@ -63934,7 +61884,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %f %f " % (i, s1, s2))
  */
   __pyx_k_tuple_49 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_49)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_49);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_49));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_49, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -63948,7 +61898,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %s " % (i, w))
  */
   __pyx_k_tuple_51 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_51)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_51);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_51));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_51, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -63962,7 +61912,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %s " % (i, w))
  */
   __pyx_k_tuple_53 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_53)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_53);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_53));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_53, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -63976,7 +61926,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_54 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_54)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_54);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_54));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_54, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -63990,7 +61940,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % i)
  */
   __pyx_k_tuple_55 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_55)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_55);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_55));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_55, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -64010,7 +61960,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             f_id = 0
  */
   __pyx_k_tuple_57 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_57)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_57);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_57));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_57, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -64030,7 +61980,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         n = self.sa.sa.len
  */
   __pyx_k_tuple_61 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_61)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_61);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_61));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_60));
   PyTuple_SET_ITEM(__pyx_k_tuple_61, 0, ((PyObject *)__pyx_kp_s_60));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_60));
@@ -64044,7 +61994,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     def compute_stats(self, int max_n):
  */
   __pyx_k_tuple_63 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_63)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_63);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_63));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_62));
   PyTuple_SET_ITEM(__pyx_k_tuple_63, 0, ((PyObject *)__pyx_kp_s_62));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_62));
@@ -64058,7 +62008,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_73 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_73)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_73);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_73));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_72));
   PyTuple_SET_ITEM(__pyx_k_tuple_73, 0, ((PyObject *)__pyx_kp_s_72));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_72));
@@ -64072,7 +62022,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         for i from 0 <= i < N:
  */
   __pyx_k_tuple_75 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_75)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_75);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_75));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_74));
   PyTuple_SET_ITEM(__pyx_k_tuple_75, 0, ((PyObject *)__pyx_kp_s_74));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_74));
@@ -64086,7 +62036,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         ptr1 = 0
  */
   __pyx_k_tuple_77 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_77)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_77);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_77));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_76));
   PyTuple_SET_ITEM(__pyx_k_tuple_77, 0, ((PyObject *)__pyx_kp_s_76));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_76));
@@ -64100,7 +62050,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_79 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_79)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_79);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_79));
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_79, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
@@ -64114,7 +62064,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_80 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_80)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_80);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_80));
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_80, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
@@ -64128,7 +62078,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  */
   __pyx_k_tuple_81 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_81)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_81);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_81));
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_81, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
@@ -64142,7 +62092,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_82 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_82)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_82);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_82));
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_82, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
@@ -64156,7 +62106,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             j = isa.arr[i]
  */
   __pyx_k_tuple_94 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_94)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_94);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_94));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_93));
   PyTuple_SET_ITEM(__pyx_k_tuple_94, 0, ((PyObject *)__pyx_kp_s_93));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_93));
@@ -64170,7 +62120,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % w_i)
  */
   __pyx_k_tuple_97 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_97)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_97);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_97));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_97, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -64184,7 +62134,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
   __pyx_k_tuple_98 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_98)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_98);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_98));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_98, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
@@ -64198,7 +62148,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for a_i in self.sa:
  */
   __pyx_k_tuple_99 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_99)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_99);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_99));
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_99, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -64218,7 +62168,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     def sample(self, PhraseLocation phrase_location):
  */
   __pyx_k_tuple_103 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_103)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_103);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_103));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_102));
   PyTuple_SET_ITEM(__pyx_k_tuple_103, 0, ((PyObject *)__pyx_kp_s_102));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_102));
@@ -64232,7 +62182,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_108 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_108)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_108);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_108));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_107));
   PyTuple_SET_ITEM(__pyx_k_tuple_108, 0, ((PyObject *)__pyx_kp_s_107));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_107));
@@ -64246,30 +62196,12 @@ static int __Pyx_InitCachedConstants(void) {
  *                 if lookup_required:
  */
   __pyx_k_tuple_123 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_123)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_123);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_123));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_122));
   PyTuple_SET_ITEM(__pyx_k_tuple_123, 0, ((PyObject *)__pyx_kp_s_122));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_122));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_123));
 
-  /* "_sa.pyx":9
- *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
- * 
- * def gzip_or_text(char* filename):             # <<<<<<<<<<<<<<
- *     if filename.endswith('.gz'):
- *         return gzip.GzipFile(filename)
- */
-  __pyx_k_tuple_136 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_136)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_136);
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 0, ((PyObject *)__pyx_n_s__filename));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 1, ((PyObject *)__pyx_n_s__filename));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_136));
-  __pyx_k_codeobj_137 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_136, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_138, __pyx_n_s__gzip_or_text, 9, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_137)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
   /* "_sa.pyx":15
  *         return open(filename)
  * 
@@ -64277,29 +62209,12 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  * include "float_list.pxi"
  */
-  __pyx_k_tuple_140 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_140)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_140);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_139));
-  PyTuple_SET_ITEM(__pyx_k_tuple_140, 0, ((PyObject *)__pyx_kp_s_139));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_139));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_140));
-
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
- *     return ALPHABET.setindex(sym, id)
- * 
- * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
- *     return ALPHABET.fromstring(string, terminal)
- */
-  __pyx_k_tuple_141 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_141)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_141);
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__string));
-  PyTuple_SET_ITEM(__pyx_k_tuple_141, 0, ((PyObject *)__pyx_n_s__string));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__string));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__terminal));
-  PyTuple_SET_ITEM(__pyx_k_tuple_141, 1, ((PyObject *)__pyx_n_s__terminal));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__terminal));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_141));
-  __pyx_k_codeobj_142 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_141, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_143, __pyx_n_s__sym_fromstring, 104, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_142)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_137 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_137)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_137));
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_136));
+  PyTuple_SET_ITEM(__pyx_k_tuple_137, 0, ((PyObject *)__pyx_kp_s_136));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_136));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_137));
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -64308,6 +62223,9 @@ static int __Pyx_InitCachedConstants(void) {
 }
 
 static int __Pyx_InitGlobals(void) {
+  #if PY_VERSION_HEX < 0x02040000
+  if (unlikely(__Pyx_Py23SetsImport() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
   if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
@@ -64346,18 +62264,12 @@ PyMODINIT_FUNC PyInit__sa(void)
           Py_FatalError("failed to import 'refnanny' module");
   }
   #endif
-  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__sa(void)", 0);
+  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__sa(void)");
   if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #ifdef __Pyx_CyFunction_USED
-  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #endif
-  #ifdef __Pyx_FusedFunction_USED
-  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #endif
-  #ifdef __Pyx_Generator_USED
-  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #ifdef __pyx_binding_PyCFunctionType_USED
+  if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   /*--- Library function declarations ---*/
   /*--- Threads initialization code ---*/
@@ -64368,15 +62280,16 @@ PyMODINIT_FUNC PyInit__sa(void)
   #endif
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_sa"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
+  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_sa"), __pyx_methods, 0, 0, PYTHON_API_VERSION);
   #else
   __pyx_m = PyModule_Create(&__pyx_moduledef);
   #endif
-  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #if CYTHON_COMPILING_IN_PYPY
-  Py_INCREF(__pyx_b);
+  if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  #if PY_MAJOR_VERSION < 3
+  Py_INCREF(__pyx_m);
   #endif
+  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
+  if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   /*--- Initialize various global constants etc. ---*/
   if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -64513,10 +62426,10 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetAttrString(__pyx_m, "Precomputation", (PyObject *)&__pyx_type_3_sa_Precomputation) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Precomputation = &__pyx_type_3_sa_Precomputation;
   __pyx_vtabptr_3_sa_SuffixArray = &__pyx_vtable_3_sa_SuffixArray;
-  __pyx_vtable_3_sa_SuffixArray.__pyx___search_high = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_high;
-  __pyx_vtable_3_sa_SuffixArray.__pyx___search_low = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_low;
-  __pyx_vtable_3_sa_SuffixArray.__pyx___get_range = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int))__pyx_f_3_sa_11SuffixArray___get_range;
-  __pyx_vtable_3_sa_SuffixArray.__pyx___lookup_helper = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___lookup_helper;
+  __pyx_vtable_3_sa_SuffixArray.__search_high = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_high;
+  __pyx_vtable_3_sa_SuffixArray.__search_low = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_low;
+  __pyx_vtable_3_sa_SuffixArray.__get_range = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int))__pyx_f_3_sa_11SuffixArray___get_range;
+  __pyx_vtable_3_sa_SuffixArray.__lookup_helper = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___lookup_helper;
   if (PyType_Ready(&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetVtable(__pyx_type_3_sa_SuffixArray.tp_dict, __pyx_vtabptr_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "SuffixArray", (PyObject *)&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -64566,28 +62479,39 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetVtable(__pyx_type_3_sa_Scorer.tp_dict, __pyx_vtabptr_3_sa_Scorer) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "Scorer", (PyObject *)&__pyx_type_3_sa_Scorer) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Scorer = &__pyx_type_3_sa_Scorer;
+  if (PyType_Ready(&__pyx_Generator_type) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_Generator = &__pyx_Generator_type;
+  __pyx_type_3_sa___pyx_scope_struct____iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct____iter__) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct____iter__ = &__pyx_type_3_sa___pyx_scope_struct____iter__;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_1_read_bitext) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_1_read_bitext) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = &__pyx_type_3_sa___pyx_scope_struct_1_read_bitext;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_3_sa___pyx_scope_struct_2_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = &__pyx_type_3_sa___pyx_scope_struct_2_genexpr;
+  __pyx_type_3_sa___pyx_scope_struct_3_compute_stats.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_3_compute_stats) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats = &__pyx_type_3_sa___pyx_scope_struct_3_compute_stats;
+  __pyx_type_3_sa___pyx_scope_struct_4___iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_4___iter__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_4___iter__ = &__pyx_type_3_sa___pyx_scope_struct_4___iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_5___str__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_5___str__ = &__pyx_type_3_sa___pyx_scope_struct_5___str__;
+  __pyx_type_3_sa___pyx_scope_struct_6_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_6_genexpr) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_6_genexpr = &__pyx_type_3_sa___pyx_scope_struct_6_genexpr;
+  __pyx_type_3_sa___pyx_scope_struct_7_alignments.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_7_alignments) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_7_alignments = &__pyx_type_3_sa___pyx_scope_struct_7_alignments;
+  __pyx_type_3_sa___pyx_scope_struct_8_input.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_8_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_8_input = &__pyx_type_3_sa___pyx_scope_struct_8_input;
+  __pyx_type_3_sa___pyx_scope_struct_9___iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_9___iter__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_9___iter__ = &__pyx_type_3_sa___pyx_scope_struct_9___iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_10___str__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_10___str__ = &__pyx_type_3_sa___pyx_scope_struct_10___str__;
+  __pyx_type_3_sa___pyx_scope_struct_11_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_11_genexpr) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_11_genexpr = &__pyx_type_3_sa___pyx_scope_struct_11_genexpr;
   /*--- Type import code ---*/
@@ -64635,7 +62559,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  *     if filename.endswith('.gz'):
  *         return gzip.GzipFile(filename)
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_1gzip_or_text, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_gzip_or_text, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gzip_or_text, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -64652,7 +62576,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__getLogger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_140), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_137), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__logger, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -64737,7 +62661,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
  *     return ALPHABET.fromstring(string, terminal)
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_3sym_fromstring, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_1sym_fromstring, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sym_fromstring, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -64774,7 +62698,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  * FeatureContext = namedtuple('FeatureContext',
  */
   __pyx_t_1 = PyList_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__defaultdict));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__defaultdict));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__defaultdict));
@@ -64787,27 +62711,15 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__collections), ((PyObject *)__pyx_t_1), -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__defaultdict);
-  if (__pyx_t_1 == NULL) {
-    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__defaultdict);
-    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__defaultdict, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Counter);
-  if (__pyx_t_1 == NULL) {
-    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__Counter);
-    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Counter); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__Counter, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__namedtuple);
-  if (__pyx_t_1 == NULL) {
-    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__namedtuple);
-    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__namedtuple, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -64831,7 +62743,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  *      'paircount',
  */
   __pyx_t_1 = PyList_New(10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__fphrase));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__fphrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fphrase));
@@ -64863,7 +62775,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   PyList_SET_ITEM(__pyx_t_1, 9, ((PyObject *)__pyx_n_s__e_text));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__e_text));
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__FeatureContext));
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_n_s__FeatureContext));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__FeatureContext));
@@ -64916,10 +62828,10 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_3 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_144));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_144));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_144));
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_138));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_138));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_138));
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -65008,6 +62920,7 @@ PyMODINIT_FUNC PyInit__sa(void)
 }
 
 /* Runtime support code */
+
 #if CYTHON_REFNANNY
 static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
     PyObject *m = NULL, *p = NULL;
@@ -65039,6 +62952,92 @@ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
     return result;
 }
 
+static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
+                                         Py_ssize_t end, int direction)
+{
+    const char* self_ptr = PyBytes_AS_STRING(self);
+    Py_ssize_t self_len = PyBytes_GET_SIZE(self);
+    const char* sub_ptr;
+    Py_ssize_t sub_len;
+    int retval;
+
+#if PY_VERSION_HEX >= 0x02060000
+    Py_buffer view;
+    view.obj = NULL;
+#endif
+
+    if ( PyBytes_Check(arg) ) {
+        sub_ptr = PyBytes_AS_STRING(arg);
+        sub_len = PyBytes_GET_SIZE(arg);
+    }
+#if PY_MAJOR_VERSION < 3
+    // Python 2.x allows mixing unicode and str
+    else if ( PyUnicode_Check(arg) ) {
+        return PyUnicode_Tailmatch(self, arg, start, end, direction);
+    }
+#endif
+    else {
+#if PY_VERSION_HEX < 0x02060000
+        if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
+            return -1;
+#else
+        if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
+            return -1;
+        sub_ptr = (const char*) view.buf;
+        sub_len = view.len;
+#endif
+    }
+
+    if (end > self_len)
+        end = self_len;
+    else if (end < 0)
+        end += self_len;
+    if (end < 0)
+        end = 0;
+    if (start < 0)
+        start += self_len;
+    if (start < 0)
+        start = 0;
+
+    if (direction > 0) {
+        /* endswith */
+        if (end-sub_len > start)
+            start = end - sub_len;
+    }
+
+    if (start + sub_len <= end)
+        retval = !memcmp(self_ptr+start, sub_ptr, sub_len);
+    else
+        retval = 0;
+
+#if PY_VERSION_HEX >= 0x02060000
+    if (view.obj)
+        PyBuffer_Release(&view);
+#endif
+
+    return retval;
+}
+
+static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
+                                   Py_ssize_t end, int direction)
+{
+    if (unlikely(PyTuple_Check(substr))) {
+        int result;
+        Py_ssize_t i;
+        for (i = 0; i < PyTuple_GET_SIZE(substr); i++) {
+            result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
+                                                   start, end, direction);
+            if (result) {
+                return result;
+            }
+        }
+        return 0;
+    }
+
+    return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
+}
+
+
 static void __Pyx_RaiseDoubleKeywordsError(
     const char* func_name,
     PyObject* kw_name)
@@ -65048,7 +63047,7 @@ static void __Pyx_RaiseDoubleKeywordsError(
         "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
         #else
         "%s() got multiple values for keyword argument '%s'", func_name,
-        PyString_AsString(kw_name));
+        PyString_AS_STRING(kw_name));
         #endif
 }
 
@@ -65064,77 +63063,55 @@ static int __Pyx_ParseOptionalKeywords(
     Py_ssize_t pos = 0;
     PyObject*** name;
     PyObject*** first_kw_arg = argnames + num_pos_args;
+
     while (PyDict_Next(kwds, &pos, &key, &value)) {
         name = first_kw_arg;
         while (*name && (**name != key)) name++;
         if (*name) {
             values[name-argnames] = value;
-            continue;
-        }
-        name = first_kw_arg;
-        #if PY_MAJOR_VERSION < 3
-        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
-            while (*name) {
-                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
-                        && _PyString_Eq(**name, key)) {
-                    values[name-argnames] = value;
-                    break;
-                }
-                name++;
-            }
-            if (*name) continue;
-            else {
-                PyObject*** argname = argnames;
-                while (argname != first_kw_arg) {
-                    if ((**argname == key) || (
-                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
-                             && _PyString_Eq(**argname, key))) {
-                        goto arg_passed_twice;
-                    }
-                    argname++;
+        } else {
+            #if PY_MAJOR_VERSION < 3
+            if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) {
+            #else
+            if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) {
+            #endif
+                goto invalid_keyword_type;
+            } else {
+                for (name = first_kw_arg; *name; name++) {
+                    #if PY_MAJOR_VERSION >= 3
+                    if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
+                        PyUnicode_Compare(**name, key) == 0) break;
+                    #else
+                    if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
+                        _PyString_Eq(**name, key)) break;
+                    #endif
                 }
-            }
-        } else
-        #endif
-        if (likely(PyUnicode_Check(key))) {
-            while (*name) {
-                int cmp = (**name == key) ? 0 :
-                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
-                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
-                #endif
-                    PyUnicode_Compare(**name, key);
-                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
-                if (cmp == 0) {
+                if (*name) {
                     values[name-argnames] = value;
-                    break;
-                }
-                name++;
-            }
-            if (*name) continue;
-            else {
-                PyObject*** argname = argnames;
-                while (argname != first_kw_arg) {
-                    int cmp = (**argname == key) ? 0 :
-                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
-                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
-                    #endif
-                        PyUnicode_Compare(**argname, key);
-                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
-                    if (cmp == 0) goto arg_passed_twice;
-                    argname++;
+                } else {
+                    /* unexpected keyword found */
+                    for (name=argnames; name != first_kw_arg; name++) {
+                        if (**name == key) goto arg_passed_twice;
+                        #if PY_MAJOR_VERSION >= 3
+                        if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
+                            PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice;
+                        #else
+                        if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
+                            _PyString_Eq(**name, key)) goto arg_passed_twice;
+                        #endif
+                    }
+                    if (kwds2) {
+                        if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
+                    } else {
+                        goto invalid_keyword;
+                    }
                 }
             }
-        } else
-            goto invalid_keyword_type;
-        if (kwds2) {
-            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
-        } else {
-            goto invalid_keyword;
         }
     }
     return 0;
 arg_passed_twice:
-    __Pyx_RaiseDoubleKeywordsError(function_name, key);
+    __Pyx_RaiseDoubleKeywordsError(function_name, **name);
     goto bad;
 invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
@@ -65162,6 +63139,7 @@ static void __Pyx_RaiseArgtupleInvalid(
 {
     Py_ssize_t num_expected;
     const char *more_or_less;
+
     if (num_found < num_min) {
         num_expected = num_min;
         more_or_less = "at least";
@@ -65173,15 +63151,15 @@ static void __Pyx_RaiseArgtupleInvalid(
         more_or_less = "exactly";
     }
     PyErr_Format(PyExc_TypeError,
-                 "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)",
+                 "%s() takes %s %"PY_FORMAT_SIZE_T"d positional argument%s (%"PY_FORMAT_SIZE_T"d given)",
                  func_name, more_or_less, num_expected,
                  (num_expected == 1) ? "" : "s", num_found);
 }
 
 static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
+
     tmp_type = tstate->curexc_type;
     tmp_value = tstate->curexc_value;
     tmp_tb = tstate->curexc_traceback;
@@ -65191,60 +63169,55 @@ static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyOb
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
-#else
-    PyErr_Restore(type, value, tb);
-#endif
 }
+
 static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->curexc_type;
     *value = tstate->curexc_value;
     *tb = tstate->curexc_traceback;
+
     tstate->curexc_type = 0;
     tstate->curexc_value = 0;
     tstate->curexc_traceback = 0;
-#else
-    PyErr_Fetch(type, value, tb);
-#endif
 }
 
+
 #if PY_MAJOR_VERSION < 3
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
-                        CYTHON_UNUSED PyObject *cause) {
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
+    /* cause is unused */
     Py_XINCREF(type);
-    if (!value || value == Py_None)
-        value = NULL;
-    else
+    Py_XINCREF(value);
+    Py_XINCREF(tb);
+    /* First, check the traceback argument, replacing None with NULL. */
+    if (tb == Py_None) {
+        Py_DECREF(tb);
+        tb = 0;
+    }
+    else if (tb != NULL && !PyTraceBack_Check(tb)) {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: arg 3 must be a traceback or None");
+        goto raise_error;
+    }
+    /* Next, replace a missing value with None */
+    if (value == NULL) {
+        value = Py_None;
         Py_INCREF(value);
-    if (!tb || tb == Py_None)
-        tb = NULL;
-    else {
-        Py_INCREF(tb);
-        if (!PyTraceBack_Check(tb)) {
-            PyErr_SetString(PyExc_TypeError,
-                "raise: arg 3 must be a traceback or None");
-            goto raise_error;
-        }
     }
     #if PY_VERSION_HEX < 0x02050000
-    if (PyClass_Check(type)) {
+    if (!PyClass_Check(type))
     #else
-    if (PyType_Check(type)) {
+    if (!PyType_Check(type))
     #endif
-#if CYTHON_COMPILING_IN_PYPY
-        if (!value) {
-            Py_INCREF(Py_None);
-            value = Py_None;
-        }
-#endif
-        PyErr_NormalizeException(&type, &value, &tb);
-    } else {
-        if (value) {
+    {
+        /* Raising an instance.  The value should be a dummy. */
+        if (value != Py_None) {
             PyErr_SetString(PyExc_TypeError,
                 "instance exception may not have a separate value");
             goto raise_error;
         }
+        /* Normalize to raise <class>, <instance> */
+        Py_DECREF(value);
         value = type;
         #if PY_VERSION_HEX < 0x02050000
             if (PyInstance_Check(type)) {
@@ -65267,6 +63240,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
             }
         #endif
     }
+
     __Pyx_ErrRestore(type, value, tb);
     return;
 raise_error:
@@ -65275,9 +63249,10 @@ raise_error:
     Py_XDECREF(tb);
     return;
 }
+
 #else /* Python 3+ */
+
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
-    PyObject* owned_instance = NULL;
     if (tb == Py_None) {
         tb = 0;
     } else if (tb && !PyTraceBack_Check(tb)) {
@@ -65287,6 +63262,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
     }
     if (value == Py_None)
         value = 0;
+
     if (PyExceptionInstance_Check(type)) {
         if (value) {
             PyErr_SetString(PyExc_TypeError,
@@ -65295,36 +63271,13 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
         }
         value = type;
         type = (PyObject*) Py_TYPE(value);
-    } else if (PyExceptionClass_Check(type)) {
-        PyObject *args;
-        if (!value)
-            args = PyTuple_New(0);
-        else if (PyTuple_Check(value)) {
-            Py_INCREF(value);
-            args = value;
-        }
-        else
-            args = PyTuple_Pack(1, value);
-        if (!args)
-            goto bad;
-        owned_instance = PyEval_CallObject(type, args);
-        Py_DECREF(args);
-        if (!owned_instance)
-            goto bad;
-        value = owned_instance;
-        if (!PyExceptionInstance_Check(value)) {
-            PyErr_Format(PyExc_TypeError,
-                         "calling %R should have returned an instance of "
-                         "BaseException, not %R",
-                         type, Py_TYPE(value));
-            goto bad;
-        }
-    } else {
+    } else if (!PyExceptionClass_Check(type)) {
         PyErr_SetString(PyExc_TypeError,
             "raise: exception class must be a subclass of BaseException");
         goto bad;
     }
-    if (cause && cause != Py_None) {
+
+    if (cause) {
         PyObject *fixed_cause;
         if (PyExceptionClass_Check(cause)) {
             fixed_cause = PyObject_CallObject(cause, NULL);
@@ -65341,9 +63294,14 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
                             "BaseException");
             goto bad;
         }
+        if (!value) {
+            value = PyObject_CallObject(type, NULL);
+        }
         PyException_SetCause(value, fixed_cause);
     }
+
     PyErr_SetObject(type, value);
+
     if (tb) {
         PyThreadState *tstate = PyThreadState_GET();
         PyObject* tmp_tb = tstate->curexc_traceback;
@@ -65353,8 +63311,8 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             Py_XDECREF(tmp_tb);
         }
     }
+
 bad:
-    Py_XDECREF(owned_instance);
     return;
 }
 #endif
@@ -65378,17 +63336,13 @@ static CYTHON_INLINE int __Pyx_CheckKeywordStrings(
 {
     PyObject* key = 0;
     Py_ssize_t pos = 0;
-#if CPYTHON_COMPILING_IN_PYPY
-    if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0))
-        goto invalid_keyword;
-    return 1;
-#else
     while (PyDict_Next(kwdict, &pos, &key, 0)) {
         #if PY_MAJOR_VERSION < 3
         if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key)))
+        #else
+        if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key)))
         #endif
-            if (unlikely(!PyUnicode_Check(key)))
-                goto invalid_keyword_type;
+            goto invalid_keyword_type;
     }
     if ((!kw_allowed) && unlikely(key))
         goto invalid_keyword;
@@ -65397,7 +63351,6 @@ invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
         "%s() keywords must be strings", function_name);
     return 0;
-#endif
 invalid_keyword:
     PyErr_Format(PyExc_TypeError,
     #if PY_MAJOR_VERSION < 3
@@ -65410,9 +63363,9 @@ invalid_keyword:
     return 0;
 }
 
+
 static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *local_type, *local_value, *local_tb;
-#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
     local_type = tstate->curexc_type;
@@ -65421,27 +63374,19 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->curexc_type = 0;
     tstate->curexc_value = 0;
     tstate->curexc_traceback = 0;
-#else
-    PyErr_Fetch(&local_type, &local_value, &local_tb);
-#endif
     PyErr_NormalizeException(&local_type, &local_value, &local_tb);
-#if CYTHON_COMPILING_IN_CPYTHON
     if (unlikely(tstate->curexc_type))
-#else
-    if (unlikely(PyErr_Occurred()))
-#endif
         goto bad;
     #if PY_MAJOR_VERSION >= 3
     if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
         goto bad;
     #endif
-    Py_INCREF(local_type);
-    Py_INCREF(local_value);
-    Py_INCREF(local_tb);
     *type = local_type;
     *value = local_value;
     *tb = local_tb;
-#if CYTHON_COMPILING_IN_CPYTHON
+    Py_INCREF(local_type);
+    Py_INCREF(local_value);
+    Py_INCREF(local_tb);
     tmp_type = tstate->exc_type;
     tmp_value = tstate->exc_value;
     tmp_tb = tstate->exc_traceback;
@@ -65449,13 +63394,10 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->exc_value = local_value;
     tstate->exc_traceback = local_tb;
     /* Make sure tstate is in a consistent state when we XDECREF
-       these objects (DECREF may run arbitrary code). */
+       these objects (XDECREF may run arbitrary code). */
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
-#else
-    PyErr_SetExcInfo(local_type, local_value, local_tb);
-#endif
     return 0;
 bad:
     *type = 0;
@@ -65467,6 +63409,7 @@ bad:
     return -1;
 }
 
+
 static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
     PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
 }
@@ -65484,40 +63427,23 @@ static CYTHON_INLINE long __Pyx_mod_long(long a, long b) {
     return r;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
+static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
     PyErr_Format(PyExc_ValueError,
-                 "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected);
+                 "need more than %"PY_FORMAT_SIZE_T"d value%s to unpack",
+                 index, (index == 1) ? "" : "s");
 }
 
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
     PyErr_Format(PyExc_ValueError,
-                 "need more than %" CYTHON_FORMAT_SSIZE_T "d value%s to unpack",
-                 index, (index == 1) ? "" : "s");
+                 "too many values to unpack (expected %"PY_FORMAT_SIZE_T"d)", expected);
 }
 
-static CYTHON_INLINE int __Pyx_IterFinish(void) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    PyThreadState *tstate = PyThreadState_GET();
-    PyObject* exc_type = tstate->curexc_type;
-    if (unlikely(exc_type)) {
-        if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) {
-            PyObject *exc_value, *exc_tb;
-            exc_value = tstate->curexc_value;
-            exc_tb = tstate->curexc_traceback;
-            tstate->curexc_type = 0;
-            tstate->curexc_value = 0;
-            tstate->curexc_traceback = 0;
-            Py_DECREF(exc_type);
-            Py_XDECREF(exc_value);
-            Py_XDECREF(exc_tb);
-            return 0;
-        } else {
-            return -1;
-        }
-    }
-    return 0;
-#else
-    if (unlikely(PyErr_Occurred())) {
+static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
+    if (unlikely(retval)) {
+        Py_DECREF(retval);
+        __Pyx_RaiseTooManyValuesError(expected);
+        return -1;
+    } else if (PyErr_Occurred()) {
         if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) {
             PyErr_Clear();
             return 0;
@@ -65526,25 +63452,11 @@ static CYTHON_INLINE int __Pyx_IterFinish(void) {
         }
     }
     return 0;
-#endif
 }
 
-static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
-    if (unlikely(retval)) {
-        Py_DECREF(retval);
-        __Pyx_RaiseTooManyValuesError(expected);
-        return -1;
-    } else {
-        return __Pyx_IterFinish();
-    }
-    return 0;
-}
 
 static double __Pyx__PyObject_AsDouble(PyObject* obj) {
     PyObject* float_value;
-#if CYTHON_COMPILING_IN_PYPY
-    float_value = PyNumber_Float(obj);
-#else
     if (Py_TYPE(obj)->tp_as_number && Py_TYPE(obj)->tp_as_number->nb_float) {
         return PyFloat_AsDouble(obj);
     } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) {
@@ -65561,7 +63473,6 @@ static double __Pyx__PyObject_AsDouble(PyObject* obj) {
         PyTuple_SET_ITEM(args, 0, 0);
         Py_DECREF(args);
     }
-#endif
     if (likely(float_value)) {
         double value = PyFloat_AS_DOUBLE(float_value);
         Py_DECREF(float_value);
@@ -65595,158 +63506,8 @@ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed
     return 0;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
-}
-
-static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
-    if (t == Py_None) {
-      __Pyx_RaiseNoneNotIterableError();
-    } else if (PyTuple_GET_SIZE(t) < index) {
-      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
-    } else {
-      __Pyx_RaiseTooManyValuesError(index);
-    }
-}
-
-static CYTHON_INLINE int __Pyx_unpack_tuple2(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2,
-                                             int is_tuple, int has_known_size, int decref_tuple) {
-    Py_ssize_t index;
-    PyObject *value1 = NULL, *value2 = NULL, *iter = NULL;
-    if (!is_tuple && unlikely(!PyTuple_Check(tuple))) {
-        iternextfunc iternext;
-        iter = PyObject_GetIter(tuple);
-        if (unlikely(!iter)) goto bad;
-        if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; }
-        iternext = Py_TYPE(iter)->tp_iternext;
-        value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; }
-        value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; }
-        if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad;
-        Py_DECREF(iter);
-    } else {
-        if (!has_known_size && unlikely(PyTuple_GET_SIZE(tuple) != 2)) {
-            __Pyx_UnpackTupleError(tuple, 2);
-            goto bad;
-        }
-#if CYTHON_COMPILING_IN_PYPY
-        value1 = PySequence_ITEM(tuple, 0);
-        if (unlikely(!value1)) goto bad;
-        value2 = PySequence_ITEM(tuple, 1);
-        if (unlikely(!value2)) goto bad;
-#else
-        value1 = PyTuple_GET_ITEM(tuple, 0);
-        value2 = PyTuple_GET_ITEM(tuple, 1);
-        Py_INCREF(value1);
-        Py_INCREF(value2);
-#endif
-        if (decref_tuple) { Py_DECREF(tuple); }
-    }
-    *pvalue1 = value1;
-    *pvalue2 = value2;
-    return 0;
-unpacking_failed:
-    if (!has_known_size && __Pyx_IterFinish() == 0)
-        __Pyx_RaiseNeedMoreValuesError(index);
-bad:
-    Py_XDECREF(iter);
-    Py_XDECREF(value1);
-    Py_XDECREF(value2);
-    if (decref_tuple) { Py_XDECREF(tuple); }
-    return -1;
-}
-
-static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name,
-                                                   Py_ssize_t* p_orig_length, int* p_source_is_dict) {
-    is_dict = is_dict || likely(PyDict_CheckExact(iterable));
-    *p_source_is_dict = is_dict;
-#if !CYTHON_COMPILING_IN_PYPY
-    if (is_dict) {
-        *p_orig_length = PyDict_Size(iterable);
-        Py_INCREF(iterable);
-        return iterable;
-    }
-#endif
-    *p_orig_length = 0;
-    if (method_name) {
-        PyObject* iter;
-        iterable = PyObject_CallMethodObjArgs(iterable, method_name, NULL);
-        if (!iterable)
-            return NULL;
-#if !CYTHON_COMPILING_IN_PYPY
-        if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable))
-            return iterable;
-#endif
-        iter = PyObject_GetIter(iterable);
-        Py_DECREF(iterable);
-        return iter;
-    }
-    return PyObject_GetIter(iterable);
-}
-static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* iter_obj, Py_ssize_t orig_length, Py_ssize_t* ppos,
-                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) {
-    PyObject* next_item;
-#if !CYTHON_COMPILING_IN_PYPY
-    if (source_is_dict) {
-        PyObject *key, *value;
-        if (unlikely(orig_length != PyDict_Size(iter_obj))) {
-            PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration");
-            return -1;
-        }
-        if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) {
-            return 0;
-        }
-        if (pitem) {
-            PyObject* tuple = PyTuple_New(2);
-            if (unlikely(!tuple)) {
-                return -1;
-            }
-            Py_INCREF(key);
-            Py_INCREF(value);
-            PyTuple_SET_ITEM(tuple, 0, key);
-            PyTuple_SET_ITEM(tuple, 1, value);
-            *pitem = tuple;
-        } else {
-            if (pkey) {
-                Py_INCREF(key);
-                *pkey = key;
-            }
-            if (pvalue) {
-                Py_INCREF(value);
-                *pvalue = value;
-            }
-        }
-        return 1;
-    } else if (PyTuple_CheckExact(iter_obj)) {
-        Py_ssize_t pos = *ppos;
-        if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0;
-        *ppos = pos + 1;
-        next_item = PyTuple_GET_ITEM(iter_obj, pos);
-        Py_INCREF(next_item);
-    } else if (PyList_CheckExact(iter_obj)) {
-        Py_ssize_t pos = *ppos;
-        if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0;
-        *ppos = pos + 1;
-        next_item = PyList_GET_ITEM(iter_obj, pos);
-        Py_INCREF(next_item);
-    } else
-#endif
-    {
-        next_item = PyIter_Next(iter_obj);
-        if (unlikely(!next_item)) {
-            return __Pyx_IterFinish();
-        }
-    }
-    if (pitem) {
-        *pitem = next_item;
-    } else if (pkey && pvalue) {
-        if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1))
-            return -1;
-    } else if (pkey) {
-        *pkey = next_item;
-    } else {
-        *pvalue = next_item;
-    }
-    return 1;
+static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is unsubscriptable");
 }
 
 static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
@@ -65757,7 +63518,6 @@ static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
 }
 
 static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->exc_type;
     *value = tstate->exc_value;
@@ -65765,12 +63525,9 @@ static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value,
     Py_XINCREF(*type);
     Py_XINCREF(*value);
     Py_XINCREF(*tb);
-#else
-    PyErr_GetExcInfo(type, value, tb);
-#endif
 }
+
 static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
     tmp_type = tstate->exc_type;
@@ -65782,9 +63539,6 @@ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb)
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
-#else
-    PyErr_SetExcInfo(type, value, tb);
-#endif
 }
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {
@@ -65813,33 +63567,12 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {
         goto bad;
     #if PY_VERSION_HEX >= 0x02050000
     {
-        #if PY_MAJOR_VERSION >= 3
-        if (level == -1) {
-            if (strchr(__Pyx_MODULE_NAME, '.')) {
-                /* try package relative import first */
-                PyObject *py_level = PyInt_FromLong(1);
-                if (!py_level)
-                    goto bad;
-                module = PyObject_CallFunctionObjArgs(py_import,
-                    name, global_dict, empty_dict, list, py_level, NULL);
-                Py_DECREF(py_level);
-                if (!module) {
-                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
-                        goto bad;
-                    PyErr_Clear();
-                }
-            }
-            level = 0; /* try absolute import on failure */
-        }
-        #endif
-        if (!module) {
-            PyObject *py_level = PyInt_FromLong(level);
-            if (!py_level)
-                goto bad;
-            module = PyObject_CallFunctionObjArgs(py_import,
-                name, global_dict, empty_dict, list, py_level, NULL);
-            Py_DECREF(py_level);
-        }
+        PyObject *py_level = PyInt_FromLong(level);
+        if (!py_level)
+            goto bad;
+        module = PyObject_CallFunctionObjArgs(py_import,
+            name, global_dict, empty_dict, list, py_level, NULL);
+        Py_DECREF(py_level);
     }
     #else
     if (level>0) {
@@ -65856,422 +63589,106 @@ bad:
     return module;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) {
-#if PY_MAJOR_VERSION < 3
-    PyErr_Format(PyExc_ImportError, "cannot import name %.230s",
-                 PyString_AsString(name));
-#else
-    PyErr_Format(PyExc_ImportError, "cannot import name %S", name);
-#endif
-}
-
-static PyObject *
-__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure)
-{
-    if (op->func_doc == NULL && op->func.m_ml->ml_doc) {
-#if PY_MAJOR_VERSION >= 3
-        op->func_doc = PyUnicode_FromString(op->func.m_ml->ml_doc);
-#else
-        op->func_doc = PyString_FromString(op->func.m_ml->ml_doc);
-#endif
-    }
-    if (op->func_doc == 0) {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    Py_INCREF(op->func_doc);
-    return op->func_doc;
-}
-static int
-__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value)
-{
-    PyObject *tmp = op->func_doc;
-    if (value == NULL)
-        op->func_doc = Py_None; /* Mark as deleted */
-    else
-        op->func_doc = value;
-    Py_INCREF(op->func_doc);
-    Py_XDECREF(tmp);
-    return 0;
-}
-static PyObject *
-__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op)
-{
-    if (op->func_name == NULL) {
-#if PY_MAJOR_VERSION >= 3
-        op->func_name = PyUnicode_InternFromString(op->func.m_ml->ml_name);
-#else
-        op->func_name = PyString_InternFromString(op->func.m_ml->ml_name);
-#endif
-    }
-    Py_INCREF(op->func_name);
-    return op->func_name;
-}
-static int
-__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value)
-{
-    PyObject *tmp;
-#if PY_MAJOR_VERSION >= 3
-    if (value == NULL || !PyUnicode_Check(value)) {
-#else
-    if (value == NULL || !PyString_Check(value)) {
-#endif
-        PyErr_SetString(PyExc_TypeError,
-                        "__name__ must be set to a string object");
-        return -1;
-    }
-    tmp = op->func_name;
-    Py_INCREF(value);
-    op->func_name = value;
-    Py_XDECREF(tmp);
-    return 0;
-}
-static PyObject *
-__Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure)
-{
-    PyObject *self;
-    self = m->func_closure;
-    if (self == NULL)
-        self = Py_None;
-    Py_INCREF(self);
-    return self;
-}
-static PyObject *
-__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op)
-{
-    if (op->func_dict == NULL) {
-        op->func_dict = PyDict_New();
-        if (op->func_dict == NULL)
-            return NULL;
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
+    if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
+        return (equals == Py_EQ);
+    } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
+        if (PyBytes_GET_SIZE(s1) != PyBytes_GET_SIZE(s2)) {
+            return (equals == Py_NE);
+        } else if (PyBytes_GET_SIZE(s1) == 1) {
+            if (equals == Py_EQ)
+                return (PyBytes_AS_STRING(s1)[0] == PyBytes_AS_STRING(s2)[0]);
+            else
+                return (PyBytes_AS_STRING(s1)[0] != PyBytes_AS_STRING(s2)[0]);
+        } else {
+            int result = memcmp(PyBytes_AS_STRING(s1), PyBytes_AS_STRING(s2), (size_t)PyBytes_GET_SIZE(s1));
+            return (equals == Py_EQ) ? (result == 0) : (result != 0);
+        }
+    } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
+        return (equals == Py_NE);
+    } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
+        return (equals == Py_NE);
+    } else {
+        int result;
+        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
+        if (!py_result)
+            return -1;
+        result = __Pyx_PyObject_IsTrue(py_result);
+        Py_DECREF(py_result);
+        return result;
     }
-    Py_INCREF(op->func_dict);
-    return op->func_dict;
 }
-static int
-__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value)
-{
-    PyObject *tmp;
-    if (value == NULL) {
-        PyErr_SetString(PyExc_TypeError,
-               "function's dictionary may not be deleted");
-        return -1;
-    }
-    if (!PyDict_Check(value)) {
-        PyErr_SetString(PyExc_TypeError,
-               "setting function's dictionary to a non-dict");
-        return -1;
-    }
-    tmp = op->func_dict;
-    Py_INCREF(value);
-    op->func_dict = value;
-    Py_XDECREF(tmp);
-    return 0;
-}
-static PyObject *
-__Pyx_CyFunction_get_globals(CYTHON_UNUSED __pyx_CyFunctionObject *op)
-{
-    PyObject* dict = PyModule_GetDict(__pyx_m);
-    Py_XINCREF(dict);
-    return dict;
-}
-static PyObject *
-__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op)
-{
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-static PyObject *
-__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op)
-{
-    PyObject* result = (op->func_code) ? op->func_code : Py_None;
-    Py_INCREF(result);
-    return result;
-}
-static PyObject *
-__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op)
-{
-    if (op->defaults_tuple) {
-        Py_INCREF(op->defaults_tuple);
-        return op->defaults_tuple;
-    }
-    if (op->defaults_getter) {
-        PyObject *res = op->defaults_getter((PyObject *) op);
-        if (res) {
-            Py_INCREF(res);
-            op->defaults_tuple = res;
+
+static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
+    if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
+        return (equals == Py_EQ);
+    } else if (PyUnicode_CheckExact(s1) & PyUnicode_CheckExact(s2)) {
+        if (PyUnicode_GET_SIZE(s1) != PyUnicode_GET_SIZE(s2)) {
+            return (equals == Py_NE);
+        } else if (PyUnicode_GET_SIZE(s1) == 1) {
+            if (equals == Py_EQ)
+                return (PyUnicode_AS_UNICODE(s1)[0] == PyUnicode_AS_UNICODE(s2)[0]);
+            else
+                return (PyUnicode_AS_UNICODE(s1)[0] != PyUnicode_AS_UNICODE(s2)[0]);
+        } else {
+            int result = PyUnicode_Compare(s1, s2);
+            if ((result == -1) && unlikely(PyErr_Occurred()))
+                return -1;
+            return (equals == Py_EQ) ? (result == 0) : (result != 0);
         }
-        return res;
+    } else if ((s1 == Py_None) & PyUnicode_CheckExact(s2)) {
+        return (equals == Py_NE);
+    } else if ((s2 == Py_None) & PyUnicode_CheckExact(s1)) {
+        return (equals == Py_NE);
+    } else {
+        int result;
+        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
+        if (!py_result)
+            return -1;
+        result = __Pyx_PyObject_IsTrue(py_result);
+        Py_DECREF(py_result);
+        return result;
     }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-static PyGetSetDef __pyx_CyFunction_getsets[] = {
-    {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
-    {(char *) "__doc__",  (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
-    {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
-    {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
-    {(char *) "__self__", (getter)__Pyx_CyFunction_get_self, 0, 0, 0},
-    {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
-    {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
-    {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
-    {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
-    {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
-    {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
-    {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
-    {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
-    {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, 0, 0, 0},
-    {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, 0, 0, 0},
-    {0, 0, 0, 0, 0}
-};
-#ifndef PY_WRITE_RESTRICTED /* < Py2.5 */
-#define PY_WRITE_RESTRICTED WRITE_RESTRICTED
-#endif
-static PyMemberDef __pyx_CyFunction_members[] = {
-    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CyFunctionObject, func.m_module), PY_WRITE_RESTRICTED, 0},
-    {0, 0, 0,  0, 0}
-};
-static PyObject *
-__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args)
-{
-#if PY_MAJOR_VERSION >= 3
-    return PyUnicode_FromString(m->func.m_ml->ml_name);
-#else
-    return PyString_FromString(m->func.m_ml->ml_name);
-#endif
 }
-static PyMethodDef __pyx_CyFunction_methods[] = {
-    {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0},
-    {0, 0, 0, 0}
-};
-static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags,
-                                      PyObject *closure, PyObject *module, PyObject* code) {
-    __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type);
+
+
+static PyObject *__pyx_binding_PyCFunctionType_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) {
+    __pyx_binding_PyCFunctionType_object *op = PyObject_GC_New(__pyx_binding_PyCFunctionType_object, __pyx_binding_PyCFunctionType);
     if (op == NULL)
         return NULL;
-    op->flags = flags;
-    op->func_weakreflist = NULL;
     op->func.m_ml = ml;
-    op->func.m_self = (PyObject *) op;
-    Py_XINCREF(closure);
-    op->func_closure = closure;
+    Py_XINCREF(self);
+    op->func.m_self = self;
     Py_XINCREF(module);
     op->func.m_module = module;
-    op->func_dict = NULL;
-    op->func_name = NULL;
-    op->func_doc = NULL;
-    op->func_classobj = NULL;
-    Py_XINCREF(code);
-    op->func_code = code;
-    op->defaults_pyobjects = 0;
-    op->defaults = NULL;
-    op->defaults_tuple = NULL;
-    op->defaults_getter = NULL;
     PyObject_GC_Track(op);
-    return (PyObject *) op;
-}
-static int
-__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
-{
-    Py_CLEAR(m->func_closure);
-    Py_CLEAR(m->func.m_module);
-    Py_CLEAR(m->func_dict);
-    Py_CLEAR(m->func_name);
-    Py_CLEAR(m->func_doc);
-    Py_CLEAR(m->func_code);
-    Py_CLEAR(m->func_classobj);
-    Py_CLEAR(m->defaults_tuple);
-    if (m->defaults) {
-        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
-        int i;
-        for (i = 0; i < m->defaults_pyobjects; i++)
-            Py_XDECREF(pydefaults[i]);
-        PyMem_Free(m->defaults);
-        m->defaults = NULL;
-    }
-    return 0;
+    return (PyObject *)op;
 }
-static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
-{
+
+static void __pyx_binding_PyCFunctionType_dealloc(__pyx_binding_PyCFunctionType_object *m) {
     PyObject_GC_UnTrack(m);
-    if (m->func_weakreflist != NULL)
-        PyObject_ClearWeakRefs((PyObject *) m);
-    __Pyx_CyFunction_clear(m);
+    Py_XDECREF(m->func.m_self);
+    Py_XDECREF(m->func.m_module);
     PyObject_GC_Del(m);
 }
-static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg)
-{
-    Py_VISIT(m->func_closure);
-    Py_VISIT(m->func.m_module);
-    Py_VISIT(m->func_dict);
-    Py_VISIT(m->func_name);
-    Py_VISIT(m->func_doc);
-    Py_VISIT(m->func_code);
-    Py_VISIT(m->func_classobj);
-    Py_VISIT(m->defaults_tuple);
-    if (m->defaults) {
-        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
-        int i;
-        for (i = 0; i < m->defaults_pyobjects; i++)
-            Py_VISIT(pydefaults[i]);
-    }
-    return 0;
-}
-static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
-{
-    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
-    if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
-        Py_INCREF(func);
-        return func;
-    }
-    if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
-        if (type == NULL)
-            type = (PyObject *)(Py_TYPE(obj));
-        return PyMethod_New(func,
-                            type, (PyObject *)(Py_TYPE(type)));
-    }
+
+static PyObject *__pyx_binding_PyCFunctionType_descr_get(PyObject *func, PyObject *obj, PyObject *type) {
     if (obj == Py_None)
-        obj = NULL;
+            obj = NULL;
     return PyMethod_New(func, obj, type);
 }
-static PyObject*
-__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op)
-{
-    PyObject *func_name = __Pyx_CyFunction_get_name(op);
-#if PY_MAJOR_VERSION >= 3
-    return PyUnicode_FromFormat("<cyfunction %U at %p>",
-                                func_name, (void *)op);
-#else
-    return PyString_FromFormat("<cyfunction %s at %p>",
-                               PyString_AsString(func_name), (void *)op);
-#endif
-}
-#if CYTHON_COMPILING_IN_PYPY
-static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
-    PyCFunctionObject* f = (PyCFunctionObject*)func;
-    PyCFunction meth = PyCFunction_GET_FUNCTION(func);
-    PyObject *self = PyCFunction_GET_SELF(func);
-    Py_ssize_t size;
-    switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
-    case METH_VARARGS:
-        if (likely(kw == NULL) || PyDict_Size(kw) == 0)
-            return (*meth)(self, arg);
-        break;
-    case METH_VARARGS | METH_KEYWORDS:
-        return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
-    case METH_NOARGS:
-        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
-            size = PyTuple_GET_SIZE(arg);
-            if (size == 0)
-                return (*meth)(self, NULL);
-            PyErr_Format(PyExc_TypeError,
-                "%.200s() takes no arguments (%zd given)",
-                f->m_ml->ml_name, size);
-            return NULL;
-        }
-        break;
-    case METH_O:
-        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
-            size = PyTuple_GET_SIZE(arg);
-            if (size == 1)
-                return (*meth)(self, PyTuple_GET_ITEM(arg, 0));
-            PyErr_Format(PyExc_TypeError,
-                "%.200s() takes exactly one argument (%zd given)",
-                f->m_ml->ml_name, size);
-            return NULL;
-        }
-        break;
-    default:
-        PyErr_SetString(PyExc_SystemError, "Bad call flags in "
-                        "__Pyx_CyFunction_Call. METH_OLDARGS is no "
-                        "longer supported!");
-        return NULL;
-    }
-    PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
-                 f->m_ml->ml_name);
-    return NULL;
-}
-#else
-static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
-	return PyCFunction_Call(func, arg, kw);
-}
-#endif
-static PyTypeObject __pyx_CyFunctionType_type = {
-    PyVarObject_HEAD_INIT(0, 0)
-    __Pyx_NAMESTR("cython_function_or_method"), /*tp_name*/
-    sizeof(__pyx_CyFunctionObject),   /*tp_basicsize*/
-    0,                                  /*tp_itemsize*/
-    (destructor) __Pyx_CyFunction_dealloc, /*tp_dealloc*/
-    0,                                  /*tp_print*/
-    0,                                  /*tp_getattr*/
-    0,                                  /*tp_setattr*/
-#if PY_MAJOR_VERSION < 3
-    0,                                  /*tp_compare*/
-#else
-    0,                                  /*reserved*/
-#endif
-    (reprfunc) __Pyx_CyFunction_repr,   /*tp_repr*/
-    0,                                  /*tp_as_number*/
-    0,                                  /*tp_as_sequence*/
-    0,                                  /*tp_as_mapping*/
-    0,                                  /*tp_hash*/
-    __Pyx_CyFunction_Call,              /*tp_call*/
-    0,                                  /*tp_str*/
-    0,                                  /*tp_getattro*/
-    0,                                  /*tp_setattro*/
-    0,                                  /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
-    0,                                  /*tp_doc*/
-    (traverseproc) __Pyx_CyFunction_traverse,   /*tp_traverse*/
-    (inquiry) __Pyx_CyFunction_clear,   /*tp_clear*/
-    0,                                  /*tp_richcompare*/
-    offsetof(__pyx_CyFunctionObject, func_weakreflist), /* tp_weaklistoffse */
-    0,                                  /*tp_iter*/
-    0,                                  /*tp_iternext*/
-    __pyx_CyFunction_methods,           /*tp_methods*/
-    __pyx_CyFunction_members,           /*tp_members*/
-    __pyx_CyFunction_getsets,           /*tp_getset*/
-    0,                                  /*tp_base*/
-    0,                                  /*tp_dict*/
-    __Pyx_CyFunction_descr_get,         /*tp_descr_get*/
-    0,                                  /*tp_descr_set*/
-    offsetof(__pyx_CyFunctionObject, func_dict),/*tp_dictoffset*/
-    0,                                  /*tp_init*/
-    0,                                  /*tp_alloc*/
-    0,                                  /*tp_new*/
-    0,                                  /*tp_free*/
-    0,                                  /*tp_is_gc*/
-    0,                                  /*tp_bases*/
-    0,                                  /*tp_mro*/
-    0,                                  /*tp_cache*/
-    0,                                  /*tp_subclasses*/
-    0,                                  /*tp_weaklist*/
-    0,                                  /*tp_del*/
-#if PY_VERSION_HEX >= 0x02060000
-    0,                                  /*tp_version_tag*/
-#endif
-};
-static int __Pyx_CyFunction_init(void) {
-#if !CYTHON_COMPILING_IN_PYPY
-    __pyx_CyFunctionType_type.tp_call = PyCFunction_Call;
-#endif
-    if (PyType_Ready(&__pyx_CyFunctionType_type) < 0)
+
+static int __pyx_binding_PyCFunctionType_init(void) {
+    __pyx_binding_PyCFunctionType_type = PyCFunction_Type;
+    __pyx_binding_PyCFunctionType_type.tp_name = __Pyx_NAMESTR("cython_binding_builtin_function_or_method");
+    __pyx_binding_PyCFunctionType_type.tp_dealloc = (destructor)__pyx_binding_PyCFunctionType_dealloc;
+    __pyx_binding_PyCFunctionType_type.tp_descr_get = __pyx_binding_PyCFunctionType_descr_get;
+    if (PyType_Ready(&__pyx_binding_PyCFunctionType_type) < 0) {
         return -1;
-    __pyx_CyFunctionType = &__pyx_CyFunctionType_type;
+    }
+    __pyx_binding_PyCFunctionType = &__pyx_binding_PyCFunctionType_type;
     return 0;
-}
-static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) {
-    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
-    m->defaults = PyMem_Malloc(size);
-    if (!m->defaults)
-        return PyErr_NoMemory();
-    memset(m->defaults, 0, sizeof(size));
-    m->defaults_pyobjects = pyobjects;
-    return m->defaults;
-}
-static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) {
-    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
-    m->defaults_tuple = tuple;
-    Py_INCREF(tuple);
+
 }
 
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
@@ -66674,8 +64091,8 @@ static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject*
     }
 }
 
-static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
-                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename) {
+static void __Pyx_WriteUnraisable(const char *name, int clineno,
+                                  int lineno, const char *filename) {
     PyObject *old_exc, *old_val, *old_tb;
     PyObject *ctx;
     __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
@@ -66695,522 +64112,125 @@ static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
 
 static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *tmp_type, *tmp_value, *tmp_tb;
-#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
+
     tmp_type = tstate->exc_type;
     tmp_value = tstate->exc_value;
     tmp_tb = tstate->exc_traceback;
+
     tstate->exc_type = *type;
     tstate->exc_value = *value;
     tstate->exc_traceback = *tb;
-#else
-    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
-    PyErr_SetExcInfo(*type, *value, *tb);
-#endif
+
     *type = tmp_type;
     *value = tmp_value;
     *tb = tmp_tb;
 }
 
-static PyObject *__Pyx_Generator_Next(PyObject *self);
-static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
-static PyObject *__Pyx_Generator_Close(PyObject *self);
-static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args);
-static PyTypeObject *__pyx_GeneratorType = 0;
-#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
-#define __Pyx_Generator_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
-#if 1 || PY_VERSION_HEX < 0x030300B0
-static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
-    PyObject *et, *ev, *tb;
-    PyObject *value = NULL;
-    __Pyx_ErrFetch(&et, &ev, &tb);
-    if (!et) {
-        Py_XDECREF(tb);
-        Py_XDECREF(ev);
-        Py_INCREF(Py_None);
-        *pvalue = Py_None;
-        return 0;
-    }
-    if (unlikely(et != PyExc_StopIteration) &&
-            unlikely(!PyErr_GivenExceptionMatches(et, PyExc_StopIteration))) {
-        __Pyx_ErrRestore(et, ev, tb);
-        return -1;
-    }
-    if (likely(et == PyExc_StopIteration)) {
-        if (likely(!ev) || !PyObject_IsInstance(ev, PyExc_StopIteration)) {
-            if (!ev) {
-                Py_INCREF(Py_None);
-                ev = Py_None;
-            }
-            Py_XDECREF(tb);
-            Py_DECREF(et);
-            *pvalue = ev;
-            return 0;
-        }
-    }
-    PyErr_NormalizeException(&et, &ev, &tb);
-    if (unlikely(!PyObject_IsInstance(ev, PyExc_StopIteration))) {
-        __Pyx_ErrRestore(et, ev, tb);
-        return -1;
-    }
-    Py_XDECREF(tb);
-    Py_DECREF(et);
-#if PY_VERSION_HEX >= 0x030300A0
-    value = ((PyStopIterationObject *)ev)->value;
-    Py_INCREF(value);
-    Py_DECREF(ev);
-#else
-    {
-        PyObject* args = PyObject_GetAttrString(ev, "args");
-        Py_DECREF(ev);
-        if (likely(args)) {
-            value = PyObject_GetItem(args, 0);
-            Py_DECREF(args);
-        }
-        if (unlikely(!value)) {
-            __Pyx_ErrRestore(NULL, NULL, NULL);
-            Py_INCREF(Py_None);
-            value = Py_None;
-        }
-    }
-#endif
-    *pvalue = value;
-    return 0;
-}
-#endif
-static CYTHON_INLINE
-void __Pyx_Generator_ExceptionClear(__pyx_GeneratorObject *self) {
-    PyObject *exc_type = self->exc_type;
-    PyObject *exc_value = self->exc_value;
-    PyObject *exc_traceback = self->exc_traceback;
+static CYTHON_INLINE void __Pyx_Generator_ExceptionClear(struct __pyx_Generator_object *self)
+{
+    Py_XDECREF(self->exc_type);
+    Py_XDECREF(self->exc_value);
+    Py_XDECREF(self->exc_traceback);
+
     self->exc_type = NULL;
     self->exc_value = NULL;
     self->exc_traceback = NULL;
-    Py_XDECREF(exc_type);
-    Py_XDECREF(exc_value);
-    Py_XDECREF(exc_traceback);
 }
-static CYTHON_INLINE
-int __Pyx_Generator_CheckRunning(__pyx_GeneratorObject *gen) {
-    if (unlikely(gen->is_running)) {
+
+static CYTHON_INLINE PyObject *__Pyx_Generator_SendEx(struct __pyx_Generator_object *self, PyObject *value)
+{
+    PyObject *retval;
+
+    if (self->is_running) {
         PyErr_SetString(PyExc_ValueError,
                         "generator already executing");
-        return 1;
+        return NULL;
     }
-    return 0;
-}
-static CYTHON_INLINE
-PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value) {
-    PyObject *retval;
-    assert(!self->is_running);
-    if (unlikely(self->resume_label == 0)) {
-        if (unlikely(value && value != Py_None)) {
+
+    if (self->resume_label == 0) {
+        if (value && value != Py_None) {
             PyErr_SetString(PyExc_TypeError,
                             "can't send non-None value to a "
                             "just-started generator");
             return NULL;
         }
     }
-    if (unlikely(self->resume_label == -1)) {
+
+    if (self->resume_label == -1) {
         PyErr_SetNone(PyExc_StopIteration);
         return NULL;
     }
-    if (value) {
-#if CYTHON_COMPILING_IN_PYPY
-#else
-        /* Generators always return to their most recent caller, not
-         * necessarily their creator. */
-        if (self->exc_traceback) {
-            PyThreadState *tstate = PyThreadState_GET();
-            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
-            PyFrameObject *f = tb->tb_frame;
-            Py_XINCREF(tstate->frame);
-            assert(f->f_back == NULL);
-            f->f_back = tstate->frame;
-        }
-#endif
-        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
-                            &self->exc_traceback);
-    } else {
+
+
+    if (value)
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback);
+    else
         __Pyx_Generator_ExceptionClear(self);
-    }
+
     self->is_running = 1;
     retval = self->body((PyObject *) self, value);
     self->is_running = 0;
-    if (retval) {
-        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
-                            &self->exc_traceback);
-#if CYTHON_COMPILING_IN_PYPY
-#else
-        /* Don't keep the reference to f_back any longer than necessary.  It
-         * may keep a chain of frames alive or it could create a reference
-         * cycle. */
-        if (self->exc_traceback) {
-            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
-            PyFrameObject *f = tb->tb_frame;
-            Py_CLEAR(f->f_back);
-        }
-#endif
-    } else {
+
+    if (retval)
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback);
+    else
         __Pyx_Generator_ExceptionClear(self);
-    }
+
     return retval;
 }
-static CYTHON_INLINE
-PyObject *__Pyx_Generator_FinishDelegation(__pyx_GeneratorObject *gen) {
-    PyObject *ret;
-    PyObject *val = NULL;
-    __Pyx_Generator_Undelegate(gen);
-    __Pyx_PyGen_FetchStopIterationValue(&val);
-    ret = __Pyx_Generator_SendEx(gen, val);
-    Py_XDECREF(val);
-    return ret;
-}
-static PyObject *__Pyx_Generator_Next(PyObject *self) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
-    PyObject *yf = gen->yieldfrom;
-    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
-        return NULL;
-    if (yf) {
-        PyObject *ret;
-        gen->is_running = 1;
-        ret = Py_TYPE(yf)->tp_iternext(yf);
-        gen->is_running = 0;
-        if (likely(ret)) {
-            return ret;
-        }
-        return __Pyx_Generator_FinishDelegation(gen);
-    }
-    return __Pyx_Generator_SendEx(gen, Py_None);
+
+static PyObject *__Pyx_Generator_Next(PyObject *self)
+{
+    return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, Py_None);
 }
-static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
-    PyObject *yf = gen->yieldfrom;
-    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
-        return NULL;
-    if (yf) {
-        PyObject *ret;
-        gen->is_running = 1;
-        if (__Pyx_Generator_CheckExact(yf)) {
-            ret = __Pyx_Generator_Send(yf, value);
-        } else {
-            if (value == Py_None)
-                ret = PyIter_Next(yf);
-            else
-                ret = PyObject_CallMethod(yf, (char*)"send", (char*)"O", value);
-        }
-        gen->is_running = 0;
-        if (likely(ret)) {
-            return ret;
-        }
-        return __Pyx_Generator_FinishDelegation(gen);
-    }
-    return __Pyx_Generator_SendEx(gen, value);
-}
-static int __Pyx_Generator_CloseIter(__pyx_GeneratorObject *gen, PyObject *yf) {
-    PyObject *retval = NULL;
-    int err = 0;
-    if (__Pyx_Generator_CheckExact(yf)) {
-        retval = __Pyx_Generator_Close(yf);
-        if (!retval)
-            return -1;
-    } else {
-        PyObject *meth;
-        gen->is_running = 1;
-        meth = PyObject_GetAttrString(yf, "close");
-        if (unlikely(!meth)) {
-            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
-                PyErr_WriteUnraisable(yf);
-            }
-            PyErr_Clear();
-        } else {
-            retval = PyObject_CallFunction(meth, NULL);
-            Py_DECREF(meth);
-            if (!retval)
-                err = -1;
-        }
-        gen->is_running = 0;
-    }
-    Py_XDECREF(retval);
-    return err;
-}
-static PyObject *__Pyx_Generator_Close(PyObject *self) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
-    PyObject *retval, *raised_exception;
-    PyObject *yf = gen->yieldfrom;
-    int err = 0;
-    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
-        return NULL;
-    if (yf) {
-        Py_INCREF(yf);
-        err = __Pyx_Generator_CloseIter(gen, yf);
-        __Pyx_Generator_Undelegate(gen);
-        Py_DECREF(yf);
-    }
-    if (err == 0)
+
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value)
+{
+    return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, value);
+}
+
+static PyObject *__Pyx_Generator_Close(PyObject *self)
+{
+    struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
+    PyObject *retval;
 #if PY_VERSION_HEX < 0x02050000
-        PyErr_SetNone(PyExc_StopIteration);
+    PyErr_SetNone(PyExc_StopIteration);
 #else
-        PyErr_SetNone(PyExc_GeneratorExit);
+    PyErr_SetNone(PyExc_GeneratorExit);
 #endif
-    retval = __Pyx_Generator_SendEx(gen, NULL);
+    retval = __Pyx_Generator_SendEx(generator, NULL);
     if (retval) {
         Py_DECREF(retval);
         PyErr_SetString(PyExc_RuntimeError,
                         "generator ignored GeneratorExit");
         return NULL;
     }
-    raised_exception = PyErr_Occurred();
-    if (!raised_exception
-        || raised_exception == PyExc_StopIteration
-#if PY_VERSION_HEX >= 0x02050000
-        || raised_exception == PyExc_GeneratorExit
-        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
+#if PY_VERSION_HEX < 0x02050000
+    if (PyErr_ExceptionMatches(PyExc_StopIteration))
+#else
+    if (PyErr_ExceptionMatches(PyExc_StopIteration)
+        || PyErr_ExceptionMatches(PyExc_GeneratorExit))
 #endif
-        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
     {
-        if (raised_exception) PyErr_Clear();      /* ignore these errors */
+        PyErr_Clear();          /* ignore these errors */
         Py_INCREF(Py_None);
         return Py_None;
     }
     return NULL;
 }
-static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+
+static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args, CYTHON_UNUSED PyObject *kwds)
+{
+    struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
     PyObject *typ;
     PyObject *tb = NULL;
     PyObject *val = NULL;
-    PyObject *yf = gen->yieldfrom;
+
     if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
         return NULL;
-    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
-        return NULL;
-    if (yf) {
-        PyObject *ret;
-        Py_INCREF(yf);
-#if PY_VERSION_HEX >= 0x02050000
-        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
-            int err = __Pyx_Generator_CloseIter(gen, yf);
-            Py_DECREF(yf);
-            __Pyx_Generator_Undelegate(gen);
-            if (err < 0)
-                return __Pyx_Generator_SendEx(gen, NULL);
-            goto throw_here;
-        }
-#endif
-        gen->is_running = 1;
-        if (__Pyx_Generator_CheckExact(yf)) {
-            ret = __Pyx_Generator_Throw(yf, args);
-        } else {
-            PyObject *meth = PyObject_GetAttrString(yf, "throw");
-            if (unlikely(!meth)) {
-                Py_DECREF(yf);
-                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
-                    gen->is_running = 0;
-                    return NULL;
-                }
-                PyErr_Clear();
-                __Pyx_Generator_Undelegate(gen);
-                gen->is_running = 0;
-                goto throw_here;
-            }
-            ret = PyObject_CallObject(meth, args);
-            Py_DECREF(meth);
-        }
-        gen->is_running = 0;
-        Py_DECREF(yf);
-        if (!ret) {
-            ret = __Pyx_Generator_FinishDelegation(gen);
-        }
-        return ret;
-    }
-throw_here:
     __Pyx_Raise(typ, val, tb, NULL);
-    return __Pyx_Generator_SendEx(gen, NULL);
-}
-static int __Pyx_Generator_traverse(PyObject *self, visitproc visit, void *arg) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
-    Py_VISIT(gen->closure);
-    Py_VISIT(gen->classobj);
-    Py_VISIT(gen->yieldfrom);
-    Py_VISIT(gen->exc_type);
-    Py_VISIT(gen->exc_value);
-    Py_VISIT(gen->exc_traceback);
-    return 0;
-}
-static int __Pyx_Generator_clear(PyObject *self) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
-    Py_CLEAR(gen->closure);
-    Py_CLEAR(gen->classobj);
-    Py_CLEAR(gen->yieldfrom);
-    Py_CLEAR(gen->exc_type);
-    Py_CLEAR(gen->exc_value);
-    Py_CLEAR(gen->exc_traceback);
-    return 0;
-}
-static void __Pyx_Generator_dealloc(PyObject *self) {
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
-    PyObject_GC_UnTrack(gen);
-    if (gen->gi_weakreflist != NULL)
-        PyObject_ClearWeakRefs(self);
-    PyObject_GC_Track(self);
-    if (gen->resume_label > 0) {
-        Py_TYPE(gen)->tp_del(self);
-        if (self->ob_refcnt > 0)
-            return;                     /* resurrected.  :( */
-    }
-    PyObject_GC_UnTrack(self);
-    __Pyx_Generator_clear(self);
-    PyObject_GC_Del(gen);
-}
-static void __Pyx_Generator_del(PyObject *self) {
-    PyObject *res;
-    PyObject *error_type, *error_value, *error_traceback;
-    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
-    if (gen->resume_label <= 0)
-        return ;
-    assert(self->ob_refcnt == 0);
-    self->ob_refcnt = 1;
-    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
-    res = __Pyx_Generator_Close(self);
-    if (res == NULL)
-        PyErr_WriteUnraisable(self);
-    else
-        Py_DECREF(res);
-    __Pyx_ErrRestore(error_type, error_value, error_traceback);
-    /* Undo the temporary resurrection; can't use DECREF here, it would
-     * cause a recursive call.
-     */
-    assert(self->ob_refcnt > 0);
-    if (--self->ob_refcnt == 0)
-        return; /* this is the normal path out */
-    /* close() resurrected it!  Make it look like the original Py_DECREF
-     * never happened.
-     */
-    {
-        Py_ssize_t refcnt = self->ob_refcnt;
-        _Py_NewReference(self);
-        self->ob_refcnt = refcnt;
-    }
-#if CYTHON_COMPILING_FOR_CPYTHON
-    assert(PyType_IS_GC(self->ob_type) &&
-           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
-    /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
-     * we need to undo that. */
-    _Py_DEC_REFTOTAL;
-#endif
-    /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
-     * chain, so no more to do there.
-     * If COUNT_ALLOCS, the original decref bumped tp_frees, and
-     * _Py_NewReference bumped tp_allocs:  both of those need to be
-     * undone.
-     */
-#ifdef COUNT_ALLOCS
-    --Py_TYPE(self)->tp_frees;
-    --Py_TYPE(self)->tp_allocs;
-#endif
-}
-static PyMemberDef __pyx_Generator_memberlist[] = {
-    {(char *) "gi_running",
-#if PY_VERSION_HEX >= 0x02060000
-     T_BOOL,
-#else
-     T_BYTE,
-#endif
-     offsetof(__pyx_GeneratorObject, is_running),
-     READONLY,
-     NULL},
-    {0, 0, 0, 0, 0}
-};
-static PyMethodDef __pyx_Generator_methods[] = {
-    {__Pyx_NAMESTR("send"), (PyCFunction) __Pyx_Generator_Send, METH_O, 0},
-    {__Pyx_NAMESTR("throw"), (PyCFunction) __Pyx_Generator_Throw, METH_VARARGS, 0},
-    {__Pyx_NAMESTR("close"), (PyCFunction) __Pyx_Generator_Close, METH_NOARGS, 0},
-    {0, 0, 0, 0}
-};
-static PyTypeObject __pyx_GeneratorType_type = {
-    PyVarObject_HEAD_INIT(0, 0)
-    __Pyx_NAMESTR("generator"),         /*tp_name*/
-    sizeof(__pyx_GeneratorObject),      /*tp_basicsize*/
-    0,                                  /*tp_itemsize*/
-    (destructor) __Pyx_Generator_dealloc,/*tp_dealloc*/
-    0,                                  /*tp_print*/
-    0,                                  /*tp_getattr*/
-    0,                                  /*tp_setattr*/
-#if PY_MAJOR_VERSION < 3
-    0,                                  /*tp_compare*/
-#else
-    0,                                  /*reserved*/
-#endif
-    0,                                   /*tp_repr*/
-    0,                                  /*tp_as_number*/
-    0,                                  /*tp_as_sequence*/
-    0,                                  /*tp_as_mapping*/
-    0,                                  /*tp_hash*/
-    0,                                  /*tp_call*/
-    0,                                  /*tp_str*/
-    0,                                  /*tp_getattro*/
-    0,                                  /*tp_setattro*/
-    0,                                  /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
-    0,                                  /*tp_doc*/
-    (traverseproc) __Pyx_Generator_traverse,   /*tp_traverse*/
-    0,                                  /*tp_clear*/
-    0,                                  /*tp_richcompare*/
-    offsetof(__pyx_GeneratorObject, gi_weakreflist), /* tp_weaklistoffse */
-    0,                                  /*tp_iter*/
-    (iternextfunc) __Pyx_Generator_Next, /*tp_iternext*/
-    __pyx_Generator_methods,            /*tp_methods*/
-    __pyx_Generator_memberlist,         /*tp_members*/
-    0,                                  /*tp_getset*/
-    0,                                  /*tp_base*/
-    0,                                  /*tp_dict*/
-    0,                                  /*tp_descr_get*/
-    0,                                  /*tp_descr_set*/
-    0,                                  /*tp_dictoffset*/
-    0,                                  /*tp_init*/
-    0,                                  /*tp_alloc*/
-    0,                                  /*tp_new*/
-    0,                                  /*tp_free*/
-    0,                                  /*tp_is_gc*/
-    0,                                  /*tp_bases*/
-    0,                                  /*tp_mro*/
-    0,                                  /*tp_cache*/
-    0,                                  /*tp_subclasses*/
-    0,                                  /*tp_weaklist*/
-    __Pyx_Generator_del,                /*tp_del*/
-#if PY_VERSION_HEX >= 0x02060000
-    0,                                  /*tp_version_tag*/
-#endif
-};
-static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
-                                                  PyObject *closure) {
-    __pyx_GeneratorObject *gen =
-        PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType_type);
-    if (gen == NULL)
-        return NULL;
-    gen->body = body;
-    gen->closure = closure;
-    Py_XINCREF(closure);
-    gen->is_running = 0;
-    gen->resume_label = 0;
-    gen->classobj = NULL;
-    gen->yieldfrom = NULL;
-    gen->exc_type = NULL;
-    gen->exc_value = NULL;
-    gen->exc_traceback = NULL;
-    gen->gi_weakreflist = NULL;
-    PyObject_GC_Track(gen);
-    return gen;
-}
-static int __pyx_Generator_init(void) {
-    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
-    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
-    if (PyType_Ready(&__pyx_GeneratorType_type)) {
-        return -1;
-    }
-    __pyx_GeneratorType = &__pyx_GeneratorType_type;
-    return 0;
+    return __Pyx_Generator_SendEx(generator, NULL);
 }
 
 static int __Pyx_check_binary_version(void) {
@@ -67239,6 +64259,7 @@ static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *s
         void (*fp)(void);
         void *p;
     } tmp;
+
     d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__");
     if (!d) {
         PyErr_Clear();
@@ -67285,105 +64306,29 @@ bad:
     return -1;
 }
 
-static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
-    int start = 0, mid = 0, end = count - 1;
-    if (end >= 0 && code_line > entries[end].code_line) {
-        return count;
-    }
-    while (start < end) {
-        mid = (start + end) / 2;
-        if (code_line < entries[mid].code_line) {
-            end = mid;
-        } else if (code_line > entries[mid].code_line) {
-             start = mid + 1;
-        } else {
-            return mid;
-        }
-    }
-    if (code_line <= entries[mid].code_line) {
-        return mid;
-    } else {
-        return mid + 1;
-    }
-}
-static PyCodeObject *__pyx_find_code_object(int code_line) {
-    PyCodeObject* code_object;
-    int pos;
-    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
-        return NULL;
-    }
-    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
-    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
-        return NULL;
-    }
-    code_object = __pyx_code_cache.entries[pos].code_object;
-    Py_INCREF(code_object);
-    return code_object;
-}
-static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
-    int pos, i;
-    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
-    if (unlikely(!code_line)) {
-        return;
-    }
-    if (unlikely(!entries)) {
-        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
-        if (likely(entries)) {
-            __pyx_code_cache.entries = entries;
-            __pyx_code_cache.max_count = 64;
-            __pyx_code_cache.count = 1;
-            entries[0].code_line = code_line;
-            entries[0].code_object = code_object;
-            Py_INCREF(code_object);
-        }
-        return;
-    }
-    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
-    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
-        PyCodeObject* tmp = entries[pos].code_object;
-        entries[pos].code_object = code_object;
-        Py_DECREF(tmp);
-        return;
-    }
-    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
-        int new_max = __pyx_code_cache.max_count + 64;
-        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
-            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));
-        if (unlikely(!entries)) {
-            return;
-        }
-        __pyx_code_cache.entries = entries;
-        __pyx_code_cache.max_count = new_max;
-    }
-    for (i=__pyx_code_cache.count; i>pos; i--) {
-        entries[i] = entries[i-1];
-    }
-    entries[pos].code_line = code_line;
-    entries[pos].code_object = code_object;
-    __pyx_code_cache.count++;
-    Py_INCREF(code_object);
-}
-
 #include "compile.h"
 #include "frameobject.h"
 #include "traceback.h"
-static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
-            const char *funcname, int c_line,
-            int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
+
+static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
+                               int __pyx_lineno, const char *__pyx_filename) {
     PyObject *py_srcfile = 0;
     PyObject *py_funcname = 0;
+    PyObject *py_globals = 0;
+    PyCodeObject *py_code = 0;
+    PyFrameObject *py_frame = 0;
+
     #if PY_MAJOR_VERSION < 3
-    py_srcfile = PyString_FromString(filename);
+    py_srcfile = PyString_FromString(__pyx_filename);
     #else
-    py_srcfile = PyUnicode_FromString(filename);
+    py_srcfile = PyUnicode_FromString(__pyx_filename);
     #endif
     if (!py_srcfile) goto bad;
-    if (c_line) {
+    if (__pyx_clineno) {
         #if PY_MAJOR_VERSION < 3
-        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
         #else
-        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
         #endif
     }
     else {
@@ -67394,45 +64339,28 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
         #endif
     }
     if (!py_funcname) goto bad;
-    py_code = __Pyx_PyCode_New(
+    py_globals = PyModule_GetDict(__pyx_m);
+    if (!py_globals) goto bad;
+    py_code = PyCode_New(
         0,            /*int argcount,*/
+        #if PY_MAJOR_VERSION >= 3
         0,            /*int kwonlyargcount,*/
+        #endif
         0,            /*int nlocals,*/
         0,            /*int stacksize,*/
         0,            /*int flags,*/
         __pyx_empty_bytes, /*PyObject *code,*/
-        __pyx_empty_tuple, /*PyObject *consts,*/
-        __pyx_empty_tuple, /*PyObject *names,*/
-        __pyx_empty_tuple, /*PyObject *varnames,*/
-        __pyx_empty_tuple, /*PyObject *freevars,*/
-        __pyx_empty_tuple, /*PyObject *cellvars,*/
+        __pyx_empty_tuple,  /*PyObject *consts,*/
+        __pyx_empty_tuple,  /*PyObject *names,*/
+        __pyx_empty_tuple,  /*PyObject *varnames,*/
+        __pyx_empty_tuple,  /*PyObject *freevars,*/
+        __pyx_empty_tuple,  /*PyObject *cellvars,*/
         py_srcfile,   /*PyObject *filename,*/
         py_funcname,  /*PyObject *name,*/
-        py_line,      /*int firstlineno,*/
+        __pyx_lineno,   /*int firstlineno,*/
         __pyx_empty_bytes  /*PyObject *lnotab*/
     );
-    Py_DECREF(py_srcfile);
-    Py_DECREF(py_funcname);
-    return py_code;
-bad:
-    Py_XDECREF(py_srcfile);
-    Py_XDECREF(py_funcname);
-    return NULL;
-}
-static void __Pyx_AddTraceback(const char *funcname, int c_line,
-                               int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
-    PyObject *py_globals = 0;
-    PyFrameObject *py_frame = 0;
-    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
-    if (!py_code) {
-        py_code = __Pyx_CreateCodeObjectForTraceback(
-            funcname, c_line, py_line, filename);
-        if (!py_code) goto bad;
-        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
-    }
-    py_globals = PyModule_GetDict(__pyx_m);
-    if (!py_globals) goto bad;
+    if (!py_code) goto bad;
     py_frame = PyFrame_New(
         PyThreadState_GET(), /*PyThreadState *tstate,*/
         py_code,             /*PyCodeObject *code,*/
@@ -67440,9 +64368,11 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line,
         0                    /*PyObject *locals*/
     );
     if (!py_frame) goto bad;
-    py_frame->f_lineno = py_line;
+    py_frame->f_lineno = __pyx_lineno;
     PyTraceBack_Here(py_frame);
 bad:
+    Py_XDECREF(py_srcfile);
+    Py_XDECREF(py_funcname);
     Py_XDECREF(py_code);
     Py_XDECREF(py_frame);
 }
@@ -67477,7 +64407,6 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     return 0;
 }
 
-
 /* Type Conversion Functions */
 
 static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
diff --git a/python/src/sa/data_array.pxi b/python/src/sa/data_array.pxi
index 2626ce0f..ce2d3a79 100644
--- a/python/src/sa/data_array.pxi
+++ b/python/src/sa/data_array.pxi
@@ -32,6 +32,9 @@ cdef class DataArray:
     def __len__(self):
         return len(self.data)
 
+    def get_data(self):
+        return self.data
+
     def get_sentence_id(self, i):
         return self.sent_id.arr[i]
 
-- 
cgit v1.2.3


From af8b109ad49222bc56527e5e75b8267134233bd4 Mon Sep 17 00:00:00 2001
From: Victor Chahuneau <vchahune@cs.cmu.edu>
Date: Thu, 6 Sep 2012 11:17:00 +0100
Subject: [cdec.sa] Make list of word ids <-> sentence string mapping easy

---
 python/pkg/cdec/sa/__init__.py  |     2 +-
 python/pkg/cdec/sa/extractor.py |     5 +-
 python/src/sa/_sa.c             | 31343 ++++++++++++++++++++++----------------
 python/src/sa/sym.pxi           |    13 +-
 4 files changed, 18588 insertions(+), 12775 deletions(-)

(limited to 'python/src/sa')

diff --git a/python/pkg/cdec/sa/__init__.py b/python/pkg/cdec/sa/__init__.py
index cc532fb9..d4b94484 100644
--- a/python/pkg/cdec/sa/__init__.py
+++ b/python/pkg/cdec/sa/__init__.py
@@ -1,4 +1,4 @@
-from cdec.sa._sa import sym_fromstring,\
+from cdec.sa._sa import make_lattice, decode_lattice, decode_sentence,\
         SuffixArray, DataArray, LCP, Precomputation, Alignment, BiLex,\
         HieroCachingRuleFactory, Sampler, Scorer
 from cdec.sa.extractor import GrammarExtractor
diff --git a/python/pkg/cdec/sa/extractor.py b/python/pkg/cdec/sa/extractor.py
index 940544fb..94392c30 100644
--- a/python/pkg/cdec/sa/extractor.py
+++ b/python/pkg/cdec/sa/extractor.py
@@ -75,7 +75,6 @@ class GrammarExtractor:
     def grammar(self, sentence):
         if isinstance(sentence, unicode):
             sentence = sentence.encode('utf8')
-        cnet = chain(('<s>',), sentence.split(), ('</s>',))
-        cnet = (cdec.sa.sym_fromstring(word, terminal=True) for word in cnet)
-        cnet = tuple(((word, None, 1), ) for word in cnet)
+        words = chain(('<s>',), sentence.split(), ('</s>',))
+        cnet = cdec.sa.make_lattice(words)
         return self.factory.input(cnet)
diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index c85a54e7..68205b2e 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,16 +1,16 @@
-/* Generated by Cython 0.15.1 on Thu Sep  6 05:37:20 2012 */
+/* Generated by Cython 0.17 on Thu Sep  6 11:14:53 2012 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
+#elif PY_VERSION_HEX < 0x02040000
+    #error Cython requires Python 2.4+.
 #else
-
 #include <stddef.h> /* For offsetof */
 #ifndef offsetof
 #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
 #endif
-
 #if !defined(WIN32) && !defined(MS_WINDOWS)
   #ifndef __stdcall
     #define __stdcall
@@ -22,36 +22,44 @@
     #define __fastcall
   #endif
 #endif
-
 #ifndef DL_IMPORT
   #define DL_IMPORT(t) t
 #endif
 #ifndef DL_EXPORT
   #define DL_EXPORT(t) t
 #endif
-
 #ifndef PY_LONG_LONG
   #define PY_LONG_LONG LONG_LONG
 #endif
-
-#if PY_VERSION_HEX < 0x02040000
-  #define METH_COEXIST 0
-  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
-  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)
+#ifndef Py_HUGE_VAL
+  #define Py_HUGE_VAL HUGE_VAL
+#endif
+#ifdef PYPY_VERSION
+#define CYTHON_COMPILING_IN_PYPY 1
+#define CYTHON_COMPILING_IN_CPYTHON 0
+#else
+#define CYTHON_COMPILING_IN_PYPY 0
+#define CYTHON_COMPILING_IN_CPYTHON 1
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   typedef int Py_ssize_t;
   #define PY_SSIZE_T_MAX INT_MAX
   #define PY_SSIZE_T_MIN INT_MIN
   #define PY_FORMAT_SIZE_T ""
+  #define CYTHON_FORMAT_SSIZE_T ""
   #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
   #define PyInt_AsSsize_t(o)   __Pyx_PyInt_AsInt(o)
-  #define PyNumber_Index(o)    PyNumber_Int(o)
-  #define PyIndex_Check(o)     PyNumber_Check(o)
+  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \
+                                (PyErr_Format(PyExc_TypeError, \
+                                              "expected index value, got %.200s", Py_TYPE(o)->tp_name), \
+                                 (PyObject*)0))
+  #define PyIndex_Check(o)     (PyNumber_Check(o) && !PyFloat_Check(o) && !PyComplex_Check(o))
   #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
+  #define __PYX_BUILD_PY_SSIZE_T "i"
+#else
+  #define __PYX_BUILD_PY_SSIZE_T "n"
+  #define CYTHON_FORMAT_SSIZE_T "z"
 #endif
-
 #if PY_VERSION_HEX < 0x02060000
   #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
   #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
@@ -59,7 +67,6 @@
   #define PyVarObject_HEAD_INIT(type, size) \
           PyObject_HEAD_INIT(type) size,
   #define PyType_Modified(t)
-
   typedef struct {
      void *buf;
      PyObject *obj;
@@ -73,7 +80,6 @@
      Py_ssize_t *suboffsets;
      void *internal;
   } Py_buffer;
-
   #define PyBUF_SIMPLE 0
   #define PyBUF_WRITABLE 0x0001
   #define PyBUF_FORMAT 0x0004
@@ -83,24 +89,44 @@
   #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
   #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
   #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
-
+  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)
+  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)
+  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
+  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
 #endif
-
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
+  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
+          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
+  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
+          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+#endif
+#if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6
+  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict")
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define Py_TPFLAGS_CHECKTYPES 0
   #define Py_TPFLAGS_HAVE_INDEX 0
 #endif
-
 #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
-
+#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
+  #define CYTHON_PEP393_ENABLED 1
+  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \
+                                              0 : _PyUnicode_Ready((PyObject *)(op)))
+  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
+  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
+  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
+#else
+  #define CYTHON_PEP393_ENABLED 0
+  #define __Pyx_PyUnicode_READY(op)       (0)
+  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
+  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
+  #define __Pyx_PyUnicode_READ(k, d, i)   ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
+#endif
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
   #define PyStringObject               PyUnicodeObject
@@ -108,7 +134,6 @@
   #define PyString_Check               PyUnicode_Check
   #define PyString_CheckExact          PyUnicode_CheckExact
 #endif
-
 #if PY_VERSION_HEX < 0x02060000
   #define PyBytesObject                PyStringObject
   #define PyBytes_Type                 PyString_Type
@@ -127,7 +152,6 @@
   #define PyBytes_Concat               PyString_Concat
   #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
 #endif
-
 #if PY_VERSION_HEX < 0x02060000
   #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
   #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
@@ -135,9 +159,7 @@
 #ifndef PySet_CheckExact
   #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
 #endif
-
 #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
-
 #if PY_MAJOR_VERSION >= 3
   #define PyIntObject                  PyLongObject
   #define PyInt_Type                   PyLong_Type
@@ -154,11 +176,9 @@
   #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
   #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define PyBoolObject                 PyLongObject
 #endif
-
 #if PY_VERSION_HEX < 0x03020000
   typedef long Py_hash_t;
   #define __Pyx_PyInt_FromHash_t PyInt_FromLong
@@ -167,16 +187,6 @@
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
   #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
 #endif
-
-
-#if PY_MAJOR_VERSION >= 3
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
-#else
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
-#endif
-
 #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)
   #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)
   #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)
@@ -195,11 +205,9 @@
         (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \
             (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1)))
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
@@ -209,7 +217,6 @@
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
   #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_NAMESTR(n) ((char *)(n))
   #define __Pyx_DOCSTR(n)  ((char *)(n))
@@ -218,6 +225,15 @@
   #define __Pyx_DOCSTR(n)  (n)
 #endif
 
+
+#if PY_MAJOR_VERSION >= 3
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
+#else
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
+#endif
+
 #ifndef __PYX_EXTERN_C
   #ifdef __cplusplus
     #define __PYX_EXTERN_C extern "C"
@@ -267,7 +283,7 @@
 #   else
 #     define CYTHON_UNUSED
 #   endif
-# elif defined(__ICC) || defined(__INTEL_COMPILER)
+# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
 #   define CYTHON_UNUSED __attribute__ ((__unused__))
 # else
 #   define CYTHON_UNUSED
@@ -291,8 +307,12 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
 static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 
+#if CYTHON_COMPILING_IN_CPYTHON
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
-
+#else
+#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
+#endif
+#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
 
 #ifdef __GNUC__
   /* Test for GCC > 2.95 */
@@ -336,18 +356,11 @@ static const char *__pyx_f[] = {
   "str_map.pxi",
 };
 
-static PyObject *__Pyx_Generator_Next(PyObject *self);
-static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
-static PyObject *__Pyx_Generator_Close(PyObject *self);
-static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args, CYTHON_UNUSED PyObject *kwds);
-
-typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
-
 /*--- Type declarations ---*/
 struct __pyx_obj_3_sa_HieroCachingRuleFactory;
-struct __pyx_Generator_object;
-struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__;
+struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence;
 struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats;
+struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr;
 struct __pyx_obj_3_sa_IntList;
 struct __pyx_obj_3_sa_VEBIterator;
 struct __pyx_obj_3_sa_BiLex;
@@ -355,32 +368,38 @@ struct __pyx_obj_3_sa_VEB;
 struct __pyx_obj_3_sa_LCP;
 struct __pyx_obj_3_sa_DataArray;
 struct __pyx_obj_3_sa_BitSetIterator;
+struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments;
 struct __pyx_obj_3_sa_Precomputation;
-struct __pyx_obj_3_sa___pyx_scope_struct_8_input;
 struct __pyx_obj_3_sa_SuffixArray;
 struct __pyx_obj_3_sa_Alphabet;
 struct __pyx_obj_3_sa_Rule;
 struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr;
 struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr;
 struct __pyx_obj_3_sa_PhraseLocation;
-struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr;
-struct __pyx_obj_3_sa___pyx_scope_struct_10___str__;
+struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__;
 struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext;
 struct __pyx_obj_3_sa_FeatureVector;
-struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments;
+struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice;
 struct __pyx_obj_3_sa_Scorer;
 struct __pyx_obj_3_sa_Alignment;
-struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__;
 struct __pyx_obj_3_sa_BitSet;
 struct __pyx_obj_3_sa_Sampler;
 struct __pyx_obj_3_sa_StringMap;
+struct __pyx_obj_3_sa___pyx_scope_struct_17___str__;
 struct __pyx_obj_3_sa_TrieNode;
 struct __pyx_obj_3_sa_ExtendedTrieNode;
 struct __pyx_obj_3_sa_TrieMap;
+struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr;
+struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice;
+struct __pyx_obj_3_sa___pyx_scope_struct_12___str__;
+struct __pyx_obj_3_sa___pyx_scope_struct_15_input;
+struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr;
 struct __pyx_obj_3_sa_Phrase;
 struct __pyx_obj_3_sa___pyx_scope_struct____iter__;
 struct __pyx_obj_3_sa_TrieTable;
-struct __pyx_obj_3_sa___pyx_scope_struct_5___str__;
+struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__;
+struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr;
+struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr;
 struct __pyx_obj_3_sa_FloatList;
 struct __pyx_t_3_sa__node;
 struct __pyx_t_3_sa__BitSet;
@@ -390,7 +409,7 @@ struct __pyx_t_3_sa__Trie_Node;
 struct __pyx_t_3_sa_match_node;
 struct __pyx_t_3_sa_Matching;
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":9
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef struct _node:             # <<<<<<<<<<<<<<
@@ -404,7 +423,7 @@ struct __pyx_t_3_sa__node {
   int val;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":30
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":30
  * _init_lower_mask()
  * 
  * cdef struct _BitSet:             # <<<<<<<<<<<<<<
@@ -418,7 +437,7 @@ struct __pyx_t_3_sa__BitSet {
   int size;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":168
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":168
  *     return result
  * 
  * cdef struct _VEB:             # <<<<<<<<<<<<<<
@@ -435,7 +454,7 @@ struct __pyx_t_3_sa__VEB {
   void **bottom;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":10
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":10
  * cdef struct _Trie_Node    # forward decl
  * 
  * cdef struct _Trie_Edge:             # <<<<<<<<<<<<<<
@@ -449,7 +468,7 @@ struct __pyx_t_3_sa__Trie_Edge {
   struct __pyx_t_3_sa__Trie_Edge *smaller;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":8
  * from libc.string cimport memset, memcpy
  * 
  * cdef struct _Trie_Node    # forward decl             # <<<<<<<<<<<<<<
@@ -462,7 +481,7 @@ struct __pyx_t_3_sa__Trie_Node {
   int arr_len;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":64
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":64
  * 
  * # linked list structure for storing matches in BaselineRuleFactory
  * cdef struct match_node:             # <<<<<<<<<<<<<<
@@ -474,7 +493,7 @@ struct __pyx_t_3_sa_match_node {
   struct __pyx_t_3_sa_match_node *next;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":160
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":160
  * 
  * # struct used to encapsulate a single matching
  * cdef struct Matching:             # <<<<<<<<<<<<<<
@@ -489,7 +508,7 @@ struct __pyx_t_3_sa_Matching {
   int size;
 };
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":216
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":216
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -538,40 +557,19 @@ struct __pyx_obj_3_sa_HieroCachingRuleFactory {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
- *         free(self.arr)
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":115
+ *             for arc in node for node in lattice)
  * 
- *     def __iter__(self):             # <<<<<<<<<<<<<<
- *         cdef int i
- *         for i in range(self.len):
+ * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
+ *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
  */
-struct __pyx_Generator_object {
+struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence {
   PyObject_HEAD
-  __pyx_generator_body_t body;
-  int is_running;
-  int resume_label;
-  PyObject *exc_type;
-  PyObject *exc_value;
-  PyObject *exc_traceback;
-};
-
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
- *         return self.syms[i]
- * 
- *     def __iter__(self):             # <<<<<<<<<<<<<<
- *         cdef int i
- *         for i from 0 <= i < self.n:
- */
-struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ {
-  struct __pyx_Generator_object __pyx_base;
-  int __pyx_v_i;
-  PyObject *__pyx_v_self;
-  int __pyx_t_0;
+  PyObject *__pyx_v_lattice;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":36
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
  * 
  *     def compute_stats(self, int max_n):             # <<<<<<<<<<<<<<
@@ -579,7 +577,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ {
  *         particular, the frequency associated with each word is
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   int __pyx_v_N;
   int __pyx_v_freq;
   int __pyx_v_h;
@@ -595,13 +593,30 @@ struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
   PyObject *__pyx_v_ngram_starts;
   int __pyx_v_rs;
   struct __pyx_obj_3_sa_IntList *__pyx_v_run_start;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_LCP *__pyx_v_self;
   int __pyx_v_valid;
   struct __pyx_obj_3_sa_VEB *__pyx_v_veb;
   int __pyx_t_0;
 };
 
 
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
+ * 
+ *     def __str__(self):
+ *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
+ * 
+ * cdef class Scorer:
+ */
+struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr {
+  PyObject_HEAD
+  struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *__pyx_outer_scope;
+  PyObject *__pyx_v_feat;
+  PyObject *__pyx_t_0;
+  Py_ssize_t __pyx_t_1;
+  PyObject *(*__pyx_t_2)(PyObject *);
+};
+
+
 /* "_sa.pxd":12
  *     cdef void read_handle(self, FILE* f)
  * 
@@ -619,7 +634,7 @@ struct __pyx_obj_3_sa_IntList {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":340
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":340
  * 
  * 
  * cdef class VEBIterator:             # <<<<<<<<<<<<<<
@@ -633,7 +648,7 @@ struct __pyx_obj_3_sa_VEBIterator {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":47
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":47
  * 
  * 
  * cdef class BiLex:             # <<<<<<<<<<<<<<
@@ -654,7 +669,7 @@ struct __pyx_obj_3_sa_BiLex {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":354
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":354
  * 
  * 
  * cdef class VEB:             # <<<<<<<<<<<<<<
@@ -668,7 +683,7 @@ struct __pyx_obj_3_sa_VEB {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":5
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":5
  * as k most frequent n-grams"""
  * 
  * cdef class LCP:             # <<<<<<<<<<<<<<
@@ -682,7 +697,7 @@ struct __pyx_obj_3_sa_LCP {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":9
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
@@ -701,7 +716,7 @@ struct __pyx_obj_3_sa_DataArray {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":100
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":100
  * 
  * 
  * cdef class BitSetIterator:             # <<<<<<<<<<<<<<
@@ -715,7 +730,24 @@ struct __pyx_obj_3_sa_BitSetIterator {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":188
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":190
+ *         return ' ||| '.join(fields)
+ * 
+ *     def alignments(self):             # <<<<<<<<<<<<<<
+ *         for point in self.word_alignments:
+ *             yield point/65536, point%65536
+ */
+struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments {
+  PyObject_HEAD
+  PyObject *__pyx_v_point;
+  struct __pyx_obj_3_sa_Rule *__pyx_v_self;
+  PyObject *__pyx_t_0;
+  Py_ssize_t __pyx_t_1;
+  PyObject *(*__pyx_t_2)(PyObject *);
+};
+
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":188
  * 
  * 
  * cdef class Precomputation:             # <<<<<<<<<<<<<<
@@ -736,89 +768,7 @@ struct __pyx_obj_3_sa_Precomputation {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":937
- *         return sorted(result);
- * 
- *     def input(self, fwords):             # <<<<<<<<<<<<<<
- *         '''When this function is called on the RuleFactory,
- *         it looks up all of the rules that can be used to translate
- */
-struct __pyx_obj_3_sa___pyx_scope_struct_8_input {
-  struct __pyx_Generator_object __pyx_base;
-  PyObject *__pyx_v_alignment;
-  PyObject *__pyx_v_als;
-  PyObject *__pyx_v_alslist;
-  int __pyx_v_alt;
-  int __pyx_v_alt_id;
-  int __pyx_v_arity;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_chunklen;
-  PyObject *__pyx_v_count;
-  PyObject *__pyx_v_e;
-  PyObject *__pyx_v_elist;
-  PyObject *__pyx_v_extract;
-  PyObject *__pyx_v_extract_start;
-  PyObject *__pyx_v_extract_stop;
-  PyObject *__pyx_v_extracts;
-  PyObject *__pyx_v_f;
-  PyObject *__pyx_v_fcount;
-  int __pyx_v_flen;
-  PyObject *__pyx_v_fphrases;
-  PyObject *__pyx_v_frontier;
-  PyObject *__pyx_v_frontier_nodes;
-  PyObject *__pyx_v_fwords;
-  struct __pyx_obj_3_sa_Phrase *__pyx_v_hiero_phrase;
-  long __pyx_v_hit;
-  int __pyx_v_i;
-  PyObject *__pyx_v_is_shadow_path;
-  int __pyx_v_j;
-  int __pyx_v_k;
-  PyObject *__pyx_v_key;
-  PyObject *__pyx_v_loc;
-  PyObject *__pyx_v_locs;
-  int __pyx_v_lookup_required;
-  struct __pyx_t_3_sa_Matching __pyx_v_matching;
-  PyObject *__pyx_v_max_locs;
-  PyObject *__pyx_v_new_frontier;
-  PyObject *__pyx_v_new_node;
-  PyObject *__pyx_v_next_states;
-  PyObject *__pyx_v_node;
-  PyObject *__pyx_v_nodes_isteps_away_buffer;
-  int __pyx_v_nualt;
-  int __pyx_v_num_samples;
-  int __pyx_v_num_subpatterns;
-  PyObject *__pyx_v_pathlen;
-  PyObject *__pyx_v_phrase;
-  struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location;
-  PyObject *__pyx_v_prefix;
-  PyObject *__pyx_v_reachable_buffer;
-  PyObject *__pyx_v_sa_range;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_sample;
-  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_scores;
-  PyObject *__pyx_v_self;
-  PyObject *__pyx_v_spanlen;
-  float __pyx_v_start_time;
-  PyObject *__pyx_v_stop_time;
-  PyObject *__pyx_v_suffix_link;
-  int __pyx_v_suffix_link_xcat;
-  PyObject *__pyx_v_suffix_link_xcat_index;
-  PyObject *__pyx_v_word_id;
-  int __pyx_v_x1;
-  int __pyx_v_xcat;
-  PyObject *__pyx_v_xcat_index;
-  PyObject *__pyx_v_xnode;
-  PyObject *__pyx_v_xroot;
-  Py_ssize_t __pyx_t_0;
-  Py_ssize_t __pyx_t_1;
-  PyObject *__pyx_t_2;
-  PyObject *__pyx_t_3;
-  PyObject *__pyx_t_4;
-  PyObject *(*__pyx_t_5)(PyObject *);
-  Py_ssize_t __pyx_t_6;
-  PyObject *(*__pyx_t_7)(PyObject *);
-};
-
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":6
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":6
  * from libc.stdio cimport FILE, fclose, fopen
  * 
  * cdef class SuffixArray:             # <<<<<<<<<<<<<<
@@ -834,7 +784,7 @@ struct __pyx_obj_3_sa_SuffixArray {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":7
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":7
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1
  * 
  * cdef class Alphabet:             # <<<<<<<<<<<<<<
@@ -870,24 +820,24 @@ struct __pyx_obj_3_sa_Rule {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
- *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
- *         if self.word_alignments is not None:
- *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
- *         return ' ||| '.join(fields)
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":109
+ * def make_lattice(words):
+ *     word_ids = (sym_fromstring(word, True) for word in words)
+ *     return tuple(((word, None, 1), ) for word in word_ids)             # <<<<<<<<<<<<<<
  * 
+ * def decode_lattice(lattice):
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
-  struct __pyx_Generator_object __pyx_base;
-  struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *__pyx_outer_scope;
-  PyObject *__pyx_v_a;
+  PyObject_HEAD
+  struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *__pyx_outer_scope;
+  PyObject *__pyx_v_word;
   PyObject *__pyx_t_0;
   Py_ssize_t __pyx_t_1;
   PyObject *(*__pyx_t_2)(PyObject *);
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -895,7 +845,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
  * 
  */
 struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_outer_scope;
   PyObject *__pyx_v_line;
   PyObject *__pyx_t_0;
@@ -904,7 +854,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":72
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":72
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -923,37 +873,23 @@ struct __pyx_obj_3_sa_PhraseLocation {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
- * 
- *     def __str__(self):
- *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
- * 
- * cdef class Scorer:
- */
-struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr {
-  struct __pyx_Generator_object __pyx_base;
-  struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *__pyx_outer_scope;
-  PyObject *__pyx_v_feat;
-  PyObject *__pyx_t_0;
-  Py_ssize_t __pyx_t_1;
-  PyObject *(*__pyx_t_2)(PyObject *);
-};
-
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":20
- *             yield (FD.word(self.names[i]), self.values[i])
- * 
- *     def __str__(self):             # <<<<<<<<<<<<<<
- *         return ' '.join('%s=%s' % feat for feat in self)
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":15
+ *         self.values.append(value)
  * 
+ *     def __iter__(self):             # <<<<<<<<<<<<<<
+ *         cdef unsigned i
+ *         for i in range(self.names.len):
  */
-struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ {
+struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ {
   PyObject_HEAD
-  PyObject *__pyx_v_self;
+  unsigned int __pyx_v_i;
+  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self;
+  int __pyx_t_0;
+  unsigned int __pyx_t_1;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -981,24 +917,20 @@ struct __pyx_obj_3_sa_FeatureVector {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":190
- *         return ' ||| '.join(fields)
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":111
+ *     return tuple(((word, None, 1), ) for word in word_ids)
  * 
- *     def alignments(self):             # <<<<<<<<<<<<<<
- *         for point in self.word_alignments:
- *             yield point/65536, point%65536
+ * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc
+ *             for arc in node for node in lattice)
  */
-struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments {
-  struct __pyx_Generator_object __pyx_base;
-  PyObject *__pyx_v_point;
-  PyObject *__pyx_v_self;
-  PyObject *__pyx_t_0;
-  Py_ssize_t __pyx_t_1;
-  PyObject *(*__pyx_t_2)(PyObject *);
+struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice {
+  PyObject_HEAD
+  PyObject *__pyx_v_lattice;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":23
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":23
  *         return ' '.join('%s=%s' % feat for feat in self)
  * 
  * cdef class Scorer:             # <<<<<<<<<<<<<<
@@ -1012,7 +944,7 @@ struct __pyx_obj_3_sa_Scorer {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":8
  * # May need to revisit if things get really tight, though.
  * 
  * cdef class Alignment:             # <<<<<<<<<<<<<<
@@ -1027,23 +959,7 @@ struct __pyx_obj_3_sa_Alignment {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":15
- *         self.values.append(value)
- * 
- *     def __iter__(self):             # <<<<<<<<<<<<<<
- *         cdef unsigned i
- *         for i in range(self.names.len):
- */
-struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ {
-  struct __pyx_Generator_object __pyx_base;
-  unsigned int __pyx_v_i;
-  PyObject *__pyx_v_self;
-  int __pyx_t_0;
-  unsigned int __pyx_t_1;
-};
-
-
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":118
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":118
  * # (entirely C-implemented) _BitSet struct.
  * # Very slow; use only for debugging
  * cdef class BitSet:             # <<<<<<<<<<<<<<
@@ -1056,7 +972,7 @@ struct __pyx_obj_3_sa_BitSet {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":94
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":94
  * 
  * 
  * cdef class Sampler:             # <<<<<<<<<<<<<<
@@ -1070,7 +986,7 @@ struct __pyx_obj_3_sa_Sampler {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":8
  *     char* stringmap_word(StrMap *vocab, int i)
  * 
  * cdef class StringMap:             # <<<<<<<<<<<<<<
@@ -1084,7 +1000,20 @@ struct __pyx_obj_3_sa_StringMap {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":34
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":20
+ *             yield (FD.word(self.names[i]), self.values[i])
+ * 
+ *     def __str__(self):             # <<<<<<<<<<<<<<
+ *         return ' '.join('%s=%s' % feat for feat in self)
+ * 
+ */
+struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ {
+  PyObject_HEAD
+  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self;
+};
+
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":34
  * cdef int EPSILON = sym_fromstring('*EPS*', True)
  * 
  * cdef class TrieNode:             # <<<<<<<<<<<<<<
@@ -1097,7 +1026,7 @@ struct __pyx_obj_3_sa_TrieNode {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":40
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":40
  *         self.children = {}
  * 
  * cdef class ExtendedTrieNode(TrieNode):             # <<<<<<<<<<<<<<
@@ -1112,7 +1041,7 @@ struct __pyx_obj_3_sa_ExtendedTrieNode {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":109
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":109
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)
  * 
  * cdef class TrieMap:             # <<<<<<<<<<<<<<
@@ -1127,6 +1056,161 @@ struct __pyx_obj_3_sa_TrieMap {
 };
 
 
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":112
+ * 
+ * def decode_lattice(lattice):
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
+ *             for arc in node for node in lattice)
+ * 
+ */
+struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr {
+  PyObject_HEAD
+  struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *__pyx_outer_scope;
+  PyObject *__pyx_v_arc;
+  PyObject *__pyx_v_dist;
+  PyObject *__pyx_v_node;
+  PyObject *__pyx_v_sym;
+  PyObject *__pyx_v_weight;
+  PyObject *__pyx_t_0;
+  Py_ssize_t __pyx_t_1;
+  PyObject *(*__pyx_t_2)(PyObject *);
+  PyObject *__pyx_t_3;
+  PyObject *__pyx_t_4;
+  Py_ssize_t __pyx_t_5;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+};
+
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":107
+ *     return ALPHABET.fromstring(string, terminal)
+ * 
+ * def make_lattice(words):             # <<<<<<<<<<<<<<
+ *     word_ids = (sym_fromstring(word, True) for word in words)
+ *     return tuple(((word, None, 1), ) for word in word_ids)
+ */
+struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice {
+  PyObject_HEAD
+  PyObject *__pyx_v_word_ids;
+  PyObject *__pyx_v_words;
+};
+
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":183
+ *         return self.f.arity()
+ * 
+ *     def __str__(self):             # <<<<<<<<<<<<<<
+ *         cdef unsigned i
+ *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
+ */
+struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ {
+  PyObject_HEAD
+  struct __pyx_obj_3_sa_Rule *__pyx_v_self;
+};
+
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":937
+ *         return sorted(result);
+ * 
+ *     def input(self, fwords):             # <<<<<<<<<<<<<<
+ *         '''When this function is called on the RuleFactory,
+ *         it looks up all of the rules that can be used to translate
+ */
+struct __pyx_obj_3_sa___pyx_scope_struct_15_input {
+  PyObject_HEAD
+  PyObject *__pyx_v_alignment;
+  PyObject *__pyx_v_als;
+  PyObject *__pyx_v_alslist;
+  int __pyx_v_alt;
+  int __pyx_v_alt_id;
+  int __pyx_v_arity;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_chunklen;
+  PyObject *__pyx_v_count;
+  PyObject *__pyx_v_e;
+  PyObject *__pyx_v_elist;
+  PyObject *__pyx_v_extract;
+  PyObject *__pyx_v_extract_start;
+  PyObject *__pyx_v_extract_stop;
+  PyObject *__pyx_v_extracts;
+  PyObject *__pyx_v_f;
+  PyObject *__pyx_v_fcount;
+  int __pyx_v_flen;
+  PyObject *__pyx_v_fphrases;
+  PyObject *__pyx_v_frontier;
+  PyObject *__pyx_v_frontier_nodes;
+  PyObject *__pyx_v_fwords;
+  struct __pyx_obj_3_sa_Phrase *__pyx_v_hiero_phrase;
+  long __pyx_v_hit;
+  int __pyx_v_i;
+  PyObject *__pyx_v_is_shadow_path;
+  int __pyx_v_j;
+  int __pyx_v_k;
+  PyObject *__pyx_v_key;
+  PyObject *__pyx_v_loc;
+  PyObject *__pyx_v_locs;
+  int __pyx_v_lookup_required;
+  struct __pyx_t_3_sa_Matching __pyx_v_matching;
+  PyObject *__pyx_v_max_locs;
+  PyObject *__pyx_v_new_frontier;
+  PyObject *__pyx_v_new_node;
+  PyObject *__pyx_v_next_states;
+  PyObject *__pyx_v_node;
+  PyObject *__pyx_v_nodes_isteps_away_buffer;
+  int __pyx_v_nualt;
+  int __pyx_v_num_samples;
+  int __pyx_v_num_subpatterns;
+  PyObject *__pyx_v_pathlen;
+  PyObject *__pyx_v_phrase;
+  struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location;
+  PyObject *__pyx_v_prefix;
+  PyObject *__pyx_v_reachable_buffer;
+  PyObject *__pyx_v_sa_range;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_sample;
+  struct __pyx_obj_3_sa_FeatureVector *__pyx_v_scores;
+  struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self;
+  PyObject *__pyx_v_spanlen;
+  float __pyx_v_start_time;
+  PyObject *__pyx_v_stop_time;
+  PyObject *__pyx_v_suffix_link;
+  int __pyx_v_suffix_link_xcat;
+  PyObject *__pyx_v_suffix_link_xcat_index;
+  PyObject *__pyx_v_word_id;
+  int __pyx_v_x1;
+  int __pyx_v_xcat;
+  PyObject *__pyx_v_xcat_index;
+  PyObject *__pyx_v_xnode;
+  PyObject *__pyx_v_xroot;
+  Py_ssize_t __pyx_t_0;
+  PyObject *__pyx_t_1;
+  Py_ssize_t __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4;
+  PyObject *__pyx_t_5;
+  int __pyx_t_6;
+  Py_ssize_t __pyx_t_7;
+  Py_ssize_t __pyx_t_8;
+  Py_ssize_t __pyx_t_9;
+};
+
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
+ *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
+ *         if self.word_alignments is not None:
+ *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
+ *         return ' ||| '.join(fields)
+ * 
+ */
+struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr {
+  PyObject_HEAD
+  struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *__pyx_outer_scope;
+  PyObject *__pyx_v_a;
+  PyObject *__pyx_t_0;
+  Py_ssize_t __pyx_t_1;
+  PyObject *(*__pyx_t_2)(PyObject *);
+};
+
+
 /* "_sa.pxd":29
  *     cdef FloatList values
  * 
@@ -1144,7 +1228,7 @@ struct __pyx_obj_3_sa_Phrase {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -1152,15 +1236,15 @@ struct __pyx_obj_3_sa_Phrase {
  *         for i in range(self.len):
  */
 struct __pyx_obj_3_sa___pyx_scope_struct____iter__ {
-  struct __pyx_Generator_object __pyx_base;
+  PyObject_HEAD
   int __pyx_v_i;
-  PyObject *__pyx_v_self;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_self;
   int __pyx_t_0;
   int __pyx_t_1;
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":51
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":51
  * 
  * 
  * cdef class TrieTable:             # <<<<<<<<<<<<<<
@@ -1175,16 +1259,51 @@ struct __pyx_obj_3_sa_TrieTable {
 };
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":183
- *         return self.f.arity()
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":141
+ *         return self.syms[i]
  * 
- *     def __str__(self):             # <<<<<<<<<<<<<<
- *         cdef unsigned i
- *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
+ *     def __iter__(self):             # <<<<<<<<<<<<<<
+ *         cdef int i
+ *         for i from 0 <= i < self.n:
  */
-struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ {
+struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ {
   PyObject_HEAD
-  PyObject *__pyx_v_self;
+  int __pyx_v_i;
+  struct __pyx_obj_3_sa_Phrase *__pyx_v_self;
+  int __pyx_t_0;
+};
+
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":108
+ * 
+ * def make_lattice(words):
+ *     word_ids = (sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
+ *     return tuple(((word, None, 1), ) for word in word_ids)
+ * 
+ */
+struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr {
+  PyObject_HEAD
+  struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *__pyx_outer_scope;
+  PyObject *__pyx_v_word;
+  PyObject *__pyx_t_0;
+  Py_ssize_t __pyx_t_1;
+  PyObject *(*__pyx_t_2)(PyObject *);
+};
+
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":116
+ * 
+ * def decode_sentence(lattice):
+ *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)             # <<<<<<<<<<<<<<
+ */
+struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr {
+  PyObject_HEAD
+  struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *__pyx_outer_scope;
+  PyObject *__pyx_v__;
+  PyObject *__pyx_v_sym;
+  PyObject *__pyx_t_0;
+  Py_ssize_t __pyx_t_1;
+  PyObject *(*__pyx_t_2)(PyObject *);
 };
 
 
@@ -1206,7 +1325,7 @@ struct __pyx_obj_3_sa_FloatList {
 
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":8
  *     char* stringmap_word(StrMap *vocab, int i)
  * 
  * cdef class StringMap:             # <<<<<<<<<<<<<<
@@ -1221,7 +1340,7 @@ struct __pyx_vtabstruct_3_sa_StringMap {
 static struct __pyx_vtabstruct_3_sa_StringMap *__pyx_vtabptr_3_sa_StringMap;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":9
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
@@ -1236,7 +1355,7 @@ struct __pyx_vtabstruct_3_sa_DataArray {
 static struct __pyx_vtabstruct_3_sa_DataArray *__pyx_vtabptr_3_sa_DataArray;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":109
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":109
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)
  * 
  * cdef class TrieMap:             # <<<<<<<<<<<<<<
@@ -1251,7 +1370,7 @@ struct __pyx_vtabstruct_3_sa_TrieMap {
 static struct __pyx_vtabstruct_3_sa_TrieMap *__pyx_vtabptr_3_sa_TrieMap;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":8
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":8
  * # May need to revisit if things get really tight, though.
  * 
  * cdef class Alignment:             # <<<<<<<<<<<<<<
@@ -1267,7 +1386,7 @@ struct __pyx_vtabstruct_3_sa_Alignment {
 static struct __pyx_vtabstruct_3_sa_Alignment *__pyx_vtabptr_3_sa_Alignment;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":47
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":47
  * 
  * 
  * cdef class BiLex:             # <<<<<<<<<<<<<<
@@ -1286,7 +1405,7 @@ struct __pyx_vtabstruct_3_sa_BiLex {
 static struct __pyx_vtabstruct_3_sa_BiLex *__pyx_vtabptr_3_sa_BiLex;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":9
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":9
  * from libc.string cimport memset, memcpy
  * 
  * cdef class IntList:             # <<<<<<<<<<<<<<
@@ -1306,7 +1425,7 @@ struct __pyx_vtabstruct_3_sa_IntList {
 static struct __pyx_vtabstruct_3_sa_IntList *__pyx_vtabptr_3_sa_IntList;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":4
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":4
  * from libc.string cimport strsep, strcpy, strlen
  * 
  * cdef class Phrase:             # <<<<<<<<<<<<<<
@@ -1321,7 +1440,7 @@ struct __pyx_vtabstruct_3_sa_Phrase {
 static struct __pyx_vtabstruct_3_sa_Phrase *__pyx_vtabptr_3_sa_Phrase;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":72
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":72
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -1335,7 +1454,7 @@ struct __pyx_vtabstruct_3_sa_PhraseLocation {
 static struct __pyx_vtabstruct_3_sa_PhraseLocation *__pyx_vtabptr_3_sa_PhraseLocation;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":188
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":188
  * 
  * 
  * cdef class Precomputation:             # <<<<<<<<<<<<<<
@@ -1350,7 +1469,7 @@ struct __pyx_vtabstruct_3_sa_Precomputation {
 static struct __pyx_vtabstruct_3_sa_Precomputation *__pyx_vtabptr_3_sa_Precomputation;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":23
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":23
  *         return ' '.join('%s=%s' % feat for feat in self)
  * 
  * cdef class Scorer:             # <<<<<<<<<<<<<<
@@ -1364,7 +1483,7 @@ struct __pyx_vtabstruct_3_sa_Scorer {
 static struct __pyx_vtabstruct_3_sa_Scorer *__pyx_vtabptr_3_sa_Scorer;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":9
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":9
  * from libc.string cimport memset, strcpy, strlen
  * 
  * cdef class FloatList:             # <<<<<<<<<<<<<<
@@ -1380,7 +1499,7 @@ struct __pyx_vtabstruct_3_sa_FloatList {
 static struct __pyx_vtabstruct_3_sa_FloatList *__pyx_vtabptr_3_sa_FloatList;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":354
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":354
  * 
  * 
  * cdef class VEB:             # <<<<<<<<<<<<<<
@@ -1396,7 +1515,7 @@ struct __pyx_vtabstruct_3_sa_VEB {
 static struct __pyx_vtabstruct_3_sa_VEB *__pyx_vtabptr_3_sa_VEB;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":7
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":7
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1
  * 
  * cdef class Alphabet:             # <<<<<<<<<<<<<<
@@ -1419,7 +1538,7 @@ struct __pyx_vtabstruct_3_sa_Alphabet {
 static struct __pyx_vtabstruct_3_sa_Alphabet *__pyx_vtabptr_3_sa_Alphabet;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":216
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":216
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -1447,7 +1566,7 @@ struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory {
 static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *__pyx_vtabptr_3_sa_HieroCachingRuleFactory;
 
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":6
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":6
  * from libc.stdio cimport FILE, fclose, fopen
  * 
  * cdef class SuffixArray:             # <<<<<<<<<<<<<<
@@ -1456,17 +1575,15 @@ static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *__pyx_vtabptr_3_sa_
  */
 
 struct __pyx_vtabstruct_3_sa_SuffixArray {
-  int (*__search_high)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
-  int (*__search_low)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
-  PyObject *(*__get_range)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int);
-  PyObject *(*__lookup_helper)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  int (*__pyx___search_high)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  int (*__pyx___search_low)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
+  PyObject *(*__pyx___get_range)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int);
+  PyObject *(*__pyx___lookup_helper)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int);
 };
 static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
-
 #ifndef CYTHON_REFNANNY
   #define CYTHON_REFNANNY 0
 #endif
-
 #if CYTHON_REFNANNY
   typedef struct {
     void (*INCREF)(void*, PyObject*, int);
@@ -1479,8 +1596,21 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/
   #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
-  #define __Pyx_RefNannySetupContext(name)           __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
-  #define __Pyx_RefNannyFinishContext()           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
+#ifdef WITH_THREAD
+  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
+          if (acquire_gil) { \
+              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \
+              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
+              PyGILState_Release(__pyx_gilstate_save); \
+          } else { \
+              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
+          }
+#else
+  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
+          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
+#endif
+  #define __Pyx_RefNannyFinishContext() \
+          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
   #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
@@ -1491,7 +1621,7 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
 #else
   #define __Pyx_RefNannyDeclarations
-  #define __Pyx_RefNannySetupContext(name)
+  #define __Pyx_RefNannySetupContext(name, acquire_gil)
   #define __Pyx_RefNannyFinishContext()
   #define __Pyx_INCREF(r) Py_INCREF(r)
   #define __Pyx_DECREF(r) Py_DECREF(r)
@@ -1502,16 +1632,97 @@ static struct __pyx_vtabstruct_3_sa_SuffixArray *__pyx_vtabptr_3_sa_SuffixArray;
   #define __Pyx_XGOTREF(r)
   #define __Pyx_XGIVEREF(r)
 #endif /* CYTHON_REFNANNY */
+#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
+#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
 
 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
 
-static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
-                                   Py_ssize_t end, int direction);
+static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
+                                         Py_ssize_t end, int direction)
+{
+    const char* self_ptr = PyBytes_AS_STRING(self);
+    Py_ssize_t self_len = PyBytes_GET_SIZE(self);
+    const char* sub_ptr;
+    Py_ssize_t sub_len;
+    int retval;
+#if PY_VERSION_HEX >= 0x02060000
+    Py_buffer view;
+    view.obj = NULL;
+#endif
+    if ( PyBytes_Check(arg) ) {
+        sub_ptr = PyBytes_AS_STRING(arg);
+        sub_len = PyBytes_GET_SIZE(arg);
+    }
+#if PY_MAJOR_VERSION < 3
+    else if ( PyUnicode_Check(arg) ) {
+        return PyUnicode_Tailmatch(self, arg, start, end, direction);
+    }
+#endif
+    else {
+#if PY_VERSION_HEX < 0x02060000
+        if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
+            return -1;
+#else
+        if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
+            return -1;
+        sub_ptr = (const char*) view.buf;
+        sub_len = view.len;
+#endif
+    }
+    if (end > self_len)
+        end = self_len;
+    else if (end < 0)
+        end += self_len;
+    if (end < 0)
+        end = 0;
+    if (start < 0)
+        start += self_len;
+    if (start < 0)
+        start = 0;
+    if (direction > 0) {
+        if (end-sub_len > start)
+            start = end - sub_len;
+    }
+    if (start + sub_len <= end)
+        retval = !memcmp(self_ptr+start, sub_ptr, sub_len);
+    else
+        retval = 0;
+#if PY_VERSION_HEX >= 0x02060000
+    if (view.obj)
+        PyBuffer_Release(&view);
+#endif
+    return retval;
+}
+static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
+                                   Py_ssize_t end, int direction)
+{
+    if (unlikely(PyTuple_Check(substr))) {
+        Py_ssize_t i, count = PyTuple_GET_SIZE(substr);
+        for (i = 0; i < count; i++) {
+            int result;
+#if CYTHON_COMPILING_IN_CPYTHON
+            result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
+                                                   start, end, direction);
+#else
+            PyObject* sub = PySequence_GetItem(substr, i);
+            if (unlikely(!sub)) return -1;
+            result = __Pyx_PyBytes_SingleTailmatch(self, sub, start, end, direction);
+            Py_DECREF(sub);
+#endif
+            if (result) {
+                return result;
+            }
+        }
+        return 0;
+    }
+    return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
+}
 
-static void __Pyx_RaiseDoubleKeywordsError(
-    const char* func_name, PyObject* kw_name); /*proto*/
+static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/
 
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
+    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
+    const char* function_name); /*proto*/
 
 static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
     Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
@@ -1523,9 +1734,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
 
 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
 
-static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict,
-    const char* function_name, int kw_allowed); /*proto*/
-
+static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /*proto*/
 
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
     PyObject *r;
@@ -1534,86 +1743,96 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j
     Py_DECREF(j);
     return r;
 }
-
-
 #define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_List_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) {
-    if (likely(o != Py_None)) {
-        if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-            PyObject *r = PyList_GET_ITEM(o, i);
-            Py_INCREF(r);
-            return r;
-        }
-        else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
-            PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
-            Py_INCREF(r);
-            return r;
-        }
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        PyObject *r = PyList_GET_ITEM(o, i);
+        Py_INCREF(r);
+        return r;
+    }
+    else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
+        PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
+        Py_INCREF(r);
+        return r;
     }
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    return PySequence_GetItem(o, i);
+#endif
 }
-
 #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_Tuple_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) {
-    if (likely(o != Py_None)) {
-        if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, i);
-            Py_INCREF(r);
-            return r;
-        }
-        else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
-            PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
-            Py_INCREF(r);
-            return r;
-        }
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        PyObject *r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
+        return r;
+    }
+    else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
+        PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
+        Py_INCREF(r);
+        return r;
     }
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    return PySequence_GetItem(o, i);
+#endif
 }
-
-
 #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_GetItemInt_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
-
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
-    PyObject *r;
-    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-        r = PyList_GET_ITEM(o, i);
-        Py_INCREF(r);
-    }
-    else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-        r = PyTuple_GET_ITEM(o, i);
-        Py_INCREF(r);
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (PyList_CheckExact(o)) {
+        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
+        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
+            PyObject *r = PyList_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
     }
-    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
-        r = PySequence_GetItem(o, i);
+    else if (PyTuple_CheckExact(o)) {
+        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
+        if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
+            PyObject *r = PyTuple_GET_ITEM(o, n);
+            Py_INCREF(r);
+            return r;
+        }
+    } else {  /* inlined PySequence_GetItem() */
+        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
+        if (likely(m && m->sq_item)) {
+            if (unlikely(i < 0) && likely(m->sq_length)) {
+                Py_ssize_t l = m->sq_length(o);
+                if (unlikely(l < 0)) return NULL;
+                i += l;
+            }
+            return m->sq_item(o, i);
+        }
     }
-    else {
-        r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+    if (PySequence_Check(o)) {
+        return PySequence_GetItem(o, i);
     }
-    return r;
+#endif
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
 }
 
-static CYTHON_INLINE int __Pyx_NegateNonNeg(int b) { 
-    return unlikely(b < 0) ? b : !b; 
-}
-static CYTHON_INLINE PyObject* __Pyx_PyBoolOrNull_FromLong(long b) {
-    return unlikely(b < 0) ? NULL : __Pyx_PyBool_FromLong(b);
+static CYTHON_INLINE int __Pyx_PySequence_Contains(PyObject* item, PyObject* seq, int eq) {
+    int result = PySequence_Contains(seq, item);
+    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
 }
 
 static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
     if (likely(PyList_CheckExact(L))) {
-        if (PyList_Append(L, x) < 0) return NULL;
+        if (unlikely(PyList_Append(L, x) < 0)) return NULL;
         Py_INCREF(Py_None);
         return Py_None; /* this is just to have an accurate signature */
-    }
-    else {
+    } else {
         PyObject *r, *m;
         m = __Pyx_GetAttrString(L, "append");
         if (!m) return NULL;
@@ -1631,16 +1850,17 @@ static CYTHON_INLINE long __Pyx_div_long(long, long); /* proto */
 
 static CYTHON_INLINE long __Pyx_mod_long(long, long); /* proto */
 
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
+
 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
+static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/
 
 static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/
 
 #define __Pyx_SetItemInt(o, i, v, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                     __Pyx_SetItemInt_Fast(o, i, v) : \
                                                     __Pyx_SetItemInt_Generic(o, to_py_func(i), v))
-
 static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
     int r;
     if (!j) return -1;
@@ -1648,130 +1868,126 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyOb
     Py_DECREF(j);
     return r;
 }
-
 static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v) {
-    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-        Py_INCREF(v);
-        Py_DECREF(PyList_GET_ITEM(o, i));
-        PyList_SET_ITEM(o, i, v);
-        return 1;
+#if CYTHON_COMPILING_IN_CPYTHON
+    if (PyList_CheckExact(o)) {
+        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
+        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
+            PyObject* old = PyList_GET_ITEM(o, n);
+            Py_INCREF(v);
+            PyList_SET_ITEM(o, n, v);
+            Py_DECREF(old);
+            return 1;
+        }
+    } else {  /* inlined PySequence_SetItem() */
+        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
+        if (likely(m && m->sq_ass_item)) {
+            if (unlikely(i < 0) && likely(m->sq_length)) {
+                Py_ssize_t l = m->sq_length(o);
+                if (unlikely(l < 0)) return -1;
+                i += l;
+            }
+            return m->sq_ass_item(o, i, v);
+        }
     }
-    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0)))
+#else
+#if CYTHON_COMPILING_IN_PYPY
+    if (PySequence_Check(o) && !PyDict_Check(o)) {
+#else
+    if (PySequence_Check(o)) {
+#endif
         return PySequence_SetItem(o, i, v);
-    else {
-        PyObject *j = PyInt_FromSsize_t(i);
-        return __Pyx_SetItemInt_Generic(o, j, v);
     }
+#endif
+    return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v);
 }
 
 static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */
-
+#if CYTHON_COMPILING_IN_PYPY
+#define __Pyx_PyObject_AsDouble(obj) \
+(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \
+ likely(PyInt_CheckExact(obj)) ? \
+ PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
+#else
 #define __Pyx_PyObject_AsDouble(obj) \
-    ((likely(PyFloat_CheckExact(obj))) ? \
-     PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
+((likely(PyFloat_CheckExact(obj))) ? \
+ PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
+#endif
 
 static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);
 
 static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact); /*proto*/
 
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
+    PyListObject* L = (PyListObject*) list;
+    Py_ssize_t len = Py_SIZE(list);
+    if (likely(L->allocated > len)) {
+        Py_INCREF(x);
+        PyList_SET_ITEM(list, len, x);
+        Py_SIZE(list) = len+1;
+        return 0;
+    }
+    return PyList_Append(list, x);
+}
+#else
+#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
+#endif
+
+static CYTHON_INLINE int __Pyx_PyDict_Contains(PyObject* item, PyObject* dict, int eq) {
+    int result = PyDict_Contains(dict, item);
+    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
+}
+
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
+
+static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
+
+static CYTHON_INLINE int __Pyx_unpack_tuple2(PyObject* tuple, PyObject** value1, PyObject** value2,
+                                             int is_tuple, int has_known_size, int decref_tuple);
+
+static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name,
+                                                   Py_ssize_t* p_orig_length, int* p_is_dict);
+static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos,
+                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict);
+
 #if PY_VERSION_HEX < 0x02050000
 #ifndef PyAnySet_CheckExact
-
 #define PyAnySet_CheckExact(ob) \
     ((ob)->ob_type == &PySet_Type || \
      (ob)->ob_type == &PyFrozenSet_Type)
-
 #define PySet_New(iterable) \
     PyObject_CallFunctionObjArgs((PyObject *)&PySet_Type, (iterable), NULL)
-
 #define Pyx_PyFrozenSet_New(iterable) \
     PyObject_CallFunctionObjArgs((PyObject *)&PyFrozenSet_Type, (iterable), NULL)
-
 #define PySet_Size(anyset) \
     PyObject_Size((anyset))
-
 #define PySet_Contains(anyset, key) \
     PySequence_Contains((anyset), (key))
-
 #define PySet_Pop(set) \
     PyObject_CallMethod(set, (char *)"pop", NULL)
-
 static CYTHON_INLINE int PySet_Clear(PyObject *set) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"clear", NULL);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
-
 static CYTHON_INLINE int PySet_Discard(PyObject *set, PyObject *key) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"discard", (char *)"O", key);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
-
 static CYTHON_INLINE int PySet_Add(PyObject *set, PyObject *key) {
     PyObject *ret = PyObject_CallMethod(set, (char *)"add", (char *)"O", key);
     if (!ret) return -1;
     Py_DECREF(ret); return 0;
 }
-
 #endif /* PyAnySet_CheckExact (<= Py2.4) */
-
-#if PY_VERSION_HEX < 0x02040000
-#ifndef Py_SETOBJECT_H
-#define Py_SETOBJECT_H
-
-static PyTypeObject *__Pyx_PySet_Type = NULL;
-static PyTypeObject *__Pyx_PyFrozenSet_Type = NULL;
-
-#define PySet_Type (*__Pyx_PySet_Type)
-#define PyFrozenSet_Type (*__Pyx_PyFrozenSet_Type)
-
-#define PyAnySet_Check(ob) \
-    (PyAnySet_CheckExact(ob) || \
-     PyType_IsSubtype((ob)->ob_type, &PySet_Type) || \
-     PyType_IsSubtype((ob)->ob_type, &PyFrozenSet_Type))
-
-#define PyFrozenSet_CheckExact(ob) ((ob)->ob_type == &PyFrozenSet_Type)
-
-static int __Pyx_Py23SetsImport(void) {
-    PyObject *sets=0, *Set=0, *ImmutableSet=0;
-
-    sets = PyImport_ImportModule((char *)"sets");
-    if (!sets) goto bad;
-    Set = PyObject_GetAttrString(sets, (char *)"Set");
-    if (!Set) goto bad;
-    ImmutableSet = PyObject_GetAttrString(sets, (char *)"ImmutableSet");
-    if (!ImmutableSet) goto bad;
-    Py_DECREF(sets);
-
-    __Pyx_PySet_Type       = (PyTypeObject*) Set;
-    __Pyx_PyFrozenSet_Type = (PyTypeObject*) ImmutableSet;
-
-    return 0;
-
- bad:
-    Py_XDECREF(sets);
-    Py_XDECREF(Set);
-    Py_XDECREF(ImmutableSet);
-    return -1;
-}
-
-#else
-static int __Pyx_Py23SetsImport(void) { return 0; }
-#endif /* !Py_SETOBJECT_H */
-#endif /* < Py2.4  */
 #endif /* < Py2.5  */
 
-static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void);
-
 #if PY_MAJOR_VERSION >= 3
 static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
     PyObject *value;
-    if (unlikely(d == Py_None)) {
-        __Pyx_RaiseNoneIndexingError();
-        return NULL;
-    }
     value = PyDict_GetItemWithError(d, key);
     if (unlikely(!value)) {
         if (!PyErr_Occurred())
@@ -1790,10 +2006,9 @@ static CYTHON_INLINE int __Pyx_div_int(int, int); /* proto */
 #define UNARY_NEG_WOULD_OVERFLOW(x)            (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
 
 static CYTHON_INLINE PyObject* __Pyx_PyObject_Pop(PyObject* L) {
-#if PY_VERSION_HEX >= 0x02040000
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02040000
     if (likely(PyList_CheckExact(L))
-            /* Check that both the size is positive and no reallocation shrinking needs to be done. */
-            && likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
+        && likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
         Py_SIZE(L) -= 1;
         return PyList_GET_ITEM(L, PyList_GET_SIZE(L));
     }
@@ -1811,31 +2026,49 @@ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb);
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/
 
-#include <string.h>
-
-static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
-
-static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
-
-#if PY_MAJOR_VERSION >= 3
-#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
-#else
-#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
-#endif
-
-#define __pyx_binding_PyCFunctionType_USED 1
-
+static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name);
+
+#define __Pyx_CyFunction_USED 1
+#include <structmember.h>
+#define __Pyx_CYFUNCTION_STATICMETHOD  0x01
+#define __Pyx_CYFUNCTION_CLASSMETHOD   0x02
+#define __Pyx_CYFUNCTION_CCLASS        0x04
+#define __Pyx_CyFunction_GetClosure(f) \
+    (((__pyx_CyFunctionObject *) (f))->func_closure)
+#define __Pyx_CyFunction_GetClassObj(f) \
+    (((__pyx_CyFunctionObject *) (f))->func_classobj)
+#define __Pyx_CyFunction_Defaults(type, f) \
+    ((type *)(((__pyx_CyFunctionObject *) (f))->defaults))
+#define __Pyx_CyFunction_SetDefaultsGetter(f, g) \
+    ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g)
 typedef struct {
     PyCFunctionObject func;
-} __pyx_binding_PyCFunctionType_object;
-
-static PyTypeObject __pyx_binding_PyCFunctionType_type;
-static PyTypeObject *__pyx_binding_PyCFunctionType = NULL;
-
-static PyObject *__pyx_binding_PyCFunctionType_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module); /* proto */
-#define __pyx_binding_PyCFunctionType_New(ml, self) __pyx_binding_PyCFunctionType_NewEx(ml, self, NULL)
-
-static int __pyx_binding_PyCFunctionType_init(void); /* proto */
+    int flags;
+    PyObject *func_dict;
+    PyObject *func_weakreflist;
+    PyObject *func_name;
+    PyObject *func_doc;
+    PyObject *func_code;
+    PyObject *func_closure;
+    PyObject *func_classobj; /* No-args super() class cell */
+    void *defaults;
+    int defaults_pyobjects;
+    PyObject *defaults_tuple; /* Const defaults tuple */
+    PyObject *(*defaults_getter)(PyObject *);
+} __pyx_CyFunctionObject;
+static PyTypeObject *__pyx_CyFunctionType = 0;
+#define __Pyx_CyFunction_NewEx(ml, flags, self, module, code) \
+    __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, self, module, code)
+static PyObject *__Pyx_CyFunction_New(PyTypeObject *,
+                                      PyMethodDef *ml, int flags,
+                                      PyObject *self, PyObject *module,
+                                      PyObject* code);
+static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m,
+                                                         size_t size,
+                                                         int pyobjects);
+static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m,
+                                                            PyObject *tuple);
+static int __Pyx_CyFunction_init(void);
 
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
 
@@ -1874,17 +2107,59 @@ static void __Pyx_WriteUnraisable(const char *name, int clineno,
 
 static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
 
+#define __Pyx_Generator_USED
+#include <structmember.h>
+#include <frameobject.h>
+typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
+typedef struct {
+    PyObject_HEAD
+    __pyx_generator_body_t body;
+    PyObject *closure;
+    PyObject *exc_type;
+    PyObject *exc_value;
+    PyObject *exc_traceback;
+    PyObject *gi_weakreflist;
+    PyObject *classobj;
+    PyObject *yieldfrom;
+    int resume_label;
+    char is_running;  // using T_BOOL for property below requires char value
+} __pyx_GeneratorObject;
+static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                                  PyObject *closure);
+static int __pyx_Generator_init(void);
+static int __Pyx_Generator_clear(PyObject* self);
+#if 1 || PY_VERSION_HEX < 0x030300B0
+static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
+#else
+#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
+#endif
+
 static int __Pyx_check_binary_version(void);
 
 static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/
 
 static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
 
-static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
-                               int __pyx_lineno, const char *__pyx_filename); /*proto*/
+typedef struct {
+    int code_line;
+    PyCodeObject* code_object;
+} __Pyx_CodeObjectCacheEntry;
+struct __Pyx_CodeObjectCache {
+    int count;
+    int max_count;
+    __Pyx_CodeObjectCacheEntry* entries;
+};
+static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
+static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
+static PyCodeObject *__pyx_find_code_object(int code_line);
+static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
+
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+                               int py_line, const char *filename); /*proto*/
 
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
 
+
 /* Module declarations from 'libc.stdio' */
 
 /* Module declarations from 'libc.stdlib' */
@@ -1919,19 +2194,25 @@ static PyTypeObject *__pyx_ptype_3_sa_PhraseLocation = 0;
 static PyTypeObject *__pyx_ptype_3_sa_Sampler = 0;
 static PyTypeObject *__pyx_ptype_3_sa_HieroCachingRuleFactory = 0;
 static PyTypeObject *__pyx_ptype_3_sa_Scorer = 0;
-static PyTypeObject *__pyx_ptype_3_sa___pyx_Generator = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct____iter__ = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats = 0;
-static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_4___iter__ = 0;
-static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_5___str__ = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_4_make_lattice = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_5_genexpr = 0;
 static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr = 0;
-static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_7_alignments = 0;
-static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_8_input = 0;
-static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_9___iter__ = 0;
-static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_10___str__ = 0;
-static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_7_decode_lattice = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_8_genexpr = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_9_decode_sentence = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_10_genexpr = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_11___iter__ = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_12___str__ = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_13_genexpr = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_14_alignments = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_15_input = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_16___iter__ = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_17___str__ = 0;
+static PyTypeObject *__pyx_ptype_3_sa___pyx_scope_struct_18_genexpr = 0;
 static int __pyx_v_3_sa_MIN_BOTTOM_SIZE;
 static int __pyx_v_3_sa_MIN_BOTTOM_BITS;
 static int __pyx_v_3_sa_LOWER_MASK[32];
@@ -1944,7 +2225,6 @@ static int __pyx_v_3_sa_BAEZA_YATES;
 static int __pyx_v_3_sa_EPSILON;
 static struct __pyx_obj_3_sa_StringMap *__pyx_v_3_sa_FD = 0;
 static char *__pyx_f_3_sa_sym_tostring(int); /*proto*/
-static char *__pyx_f_3_sa_sym_tocat(int); /*proto*/
 static int __pyx_f_3_sa_sym_isvar(int); /*proto*/
 static int __pyx_f_3_sa_sym_getindex(int); /*proto*/
 static float __pyx_f_3_sa_monitor_cpu(void); /*proto*/
@@ -1963,13 +2243,13 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *); /*proto*/
 static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *, int); /*proto*/
 static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *, int); /*proto*/
 static int __pyx_f_3_sa_sym_setindex(int, int); /*proto*/
+static int __pyx_f_3_sa_sym_fromstring(char *, int); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void); /*proto*/
 static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int); /*proto*/
 static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *); /*proto*/
 static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
-static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_Node *, int *, int); /*proto*/
 static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3_sa__Trie_Node *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *, PyObject *, PyObject *, int); /*proto*/
 static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *, PyObject *, PyObject *, int); /*proto*/
@@ -1994,6 +2274,199 @@ static PyObject *__pyx_builtin_StopIteration;
 static PyObject *__pyx_builtin_cmp;
 static PyObject *__pyx_builtin_sorted;
 static PyObject *__pyx_builtin_max;
+static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_filename); /* proto */
+static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len); /* proto */
+static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, float __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_16__iter__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_index); /* proto */
+static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_25get_size(struct __pyx_obj_3_sa_IntList *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_4get_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_10get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_12get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_14get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_24read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_26write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id); /* proto */
+static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_from_text, PyObject *__pyx_v_from_data, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_earray, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_alignment); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_eword); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword, PyObject *__pyx_v_eword, PyObject *__pyx_v_col); /* proto */
+static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBIterator *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_size); /* proto */
+static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa); /* proto */
+static PyObject *__pyx_pf_3_sa_3LCP_2compute_stats(struct __pyx_obj_3_sa_LCP *__pyx_v_self, int __pyx_v_max_n); /* proto */
+static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_12make_lattice_genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_12make_lattice_3genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_2make_lattice(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_words); /* proto */
+static PyObject *__pyx_pf_3_sa_14decode_lattice_genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4decode_lattice(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_lattice); /* proto */
+static PyObject *__pyx_pf_3_sa_15decode_sentence_genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6decode_sentence(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_lattice); /* proto */
+static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_words); /* proto */
+static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_k); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_ci); /* proto */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
+#endif
+static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_28__iter__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_children); /* proto */
+static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, int __pyx_v_lhs, struct __pyx_obj_3_sa_Phrase *__pyx_v_f, struct __pyx_obj_3_sa_Phrase *__pyx_v_e, PyObject *__pyx_v_scores, PyObject *__pyx_v_word_alignments); /* proto */
+static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Rule *__pyx_v_other); /* proto */
+#endif
+static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Phrase *__pyx_v_f); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_7__str___genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_12alignments(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, int __pyx_v_alphabet_size); /* proto */
+static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_flag); /* proto */
+static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_from_stats, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_precompute_rank, PyObject *__pyx_v_precompute_secondary_rank, PyObject *__pyx_v_max_length, PyObject *__pyx_v_max_nonterminals, PyObject *__pyx_v_train_max_initial_size, PyObject *__pyx_v_train_min_gap_size); /* proto */
+static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray); /* proto */
+static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high); /* proto */
+static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_8TrieNode_8children_4__del__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_phrase, PyObject *__pyx_v_phrase_location, PyObject *__pyx_v_suffix_link); /* proto */
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_extended); /* proto */
+static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_4root_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sa_low, int __pyx_v_sa_high, int __pyx_v_arr_low, int __pyx_v_arr_high, PyObject *__pyx_v_arr, int __pyx_v_num_subpatterns); /* proto */
+static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, int __pyx_v_sample_size, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray); /* proto */
+static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location); /* proto */
+static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment, float __pyx_v_by_slack_factor, char *__pyx_v_category, PyObject *__pyx_v_max_chunks, unsigned int __pyx_v_max_initial_size, unsigned int __pyx_v_max_length, unsigned int __pyx_v_max_nonterminals, PyObject *__pyx_v_max_target_chunks, PyObject *__pyx_v_max_target_length, unsigned int __pyx_v_min_gap_size, PyObject *__pyx_v_precompute_file, unsigned int __pyx_v_precompute_secondary_rank, unsigned int __pyx_v_precompute_rank, int __pyx_v_require_aligned_terminal, int __pyx_v_require_aligned_chunks, unsigned int __pyx_v_train_max_initial_size, unsigned int __pyx_v_train_min_gap_size, int __pyx_v_tight_phrases, int __pyx_v_use_baeza_yates, int __pyx_v_use_collocations, int __pyx_v_use_index); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray, struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray, struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler, struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_phrase); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_frontier, PyObject *__pyx_v_res, PyObject *__pyx_v_fwords); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_skip, PyObject *__pyx_v_i, PyObject *__pyx_v_spanlen, PyObject *__pyx_v_pathlen, PyObject *__pyx_v_fwords, PyObject *__pyx_v_next_states, PyObject *__pyx_v_reachable_buffer); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_dist); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_ito); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v__columns, PyObject *__pyx_v_curr_idx, PyObject *__pyx_v_min_dist); /* proto */
+static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords); /* proto */
+static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str___genexpr(PyObject *__pyx_self); /* proto */
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_self, PyObject *__pyx_v_models); /* proto */
 static char __pyx_k_1[] = ".gz";
 static char __pyx_k_2[] = "Requested index %d of %d-length FloatList";
 static char __pyx_k_3[] = "IntList[";
@@ -2088,8 +2561,10 @@ static char __pyx_k_132[] = "Subphrase [%d, %d] failed integrity check";
 static char __pyx_k_133[] = "Didn't extract anything from [%d, %d] -> [%d, %d]";
 static char __pyx_k_134[] = "Unable to extract basic phrase";
 static char __pyx_k_135[] = "%s=%s";
-static char __pyx_k_136[] = "cdec.sa";
-static char __pyx_k_138[] = "*EPS*";
+static char __pyx_k_138[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/_sa.pyx";
+static char __pyx_k_139[] = "cdec.sa";
+static char __pyx_k_143[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi";
+static char __pyx_k_148[] = "*EPS*";
 static char __pyx_k__gc[] = "gc";
 static char __pyx_k__sa[] = "sa";
 static char __pyx_k___sa[] = "_sa";
@@ -2161,7 +2636,6 @@ static char __pyx_k__scorer[] = "scorer";
 static char __pyx_k__scores[] = "scores";
 static char __pyx_k__sorted[] = "sorted";
 static char __pyx_k__source[] = "source";
-static char __pyx_k__string[] = "string";
 static char __pyx_k__unlink[] = "unlink";
 static char __pyx_k__Counter[] = "Counter";
 static char __pyx_k__advance[] = "advance";
@@ -2171,6 +2645,8 @@ static char __pyx_k__edarray[] = "edarray";
 static char __pyx_k__ephrase[] = "ephrase";
 static char __pyx_k__fphrase[] = "fphrase";
 static char __pyx_k__fsarray[] = "fsarray";
+static char __pyx_k__genexpr[] = "genexpr";
+static char __pyx_k__lattice[] = "lattice";
 static char __pyx_k__logging[] = "logging";
 static char __pyx_k__matches[] = "matches";
 static char __pyx_k__pathlen[] = "pathlen";
@@ -2199,7 +2675,7 @@ static char __pyx_k__resource[] = "resource";
 static char __pyx_k__ru_stime[] = "ru_stime";
 static char __pyx_k__ru_utime[] = "ru_utime";
 static char __pyx_k__shortest[] = "shortest";
-static char __pyx_k__terminal[] = "terminal";
+static char __pyx_k__word_ids[] = "word_ids";
 static char __pyx_k__Exception[] = "Exception";
 static char __pyx_k__INCREMENT[] = "INCREMENT";
 static char __pyx_k__TypeError[] = "TypeError";
@@ -2245,6 +2721,7 @@ static char __pyx_k__use_sent_id[] = "use_sent_id";
 static char __pyx_k___doquicksort[] = "_doquicksort";
 static char __pyx_k__get_sentence[] = "get_sentence";
 static char __pyx_k__gzip_or_text[] = "gzip_or_text";
+static char __pyx_k__make_lattice[] = "make_lattice";
 static char __pyx_k__min_gap_size[] = "min_gap_size";
 static char __pyx_k__StopIteration[] = "StopIteration";
 static char __pyx_k__alphabet_size[] = "alphabet_size";
@@ -2252,10 +2729,11 @@ static char __pyx_k__fsample_count[] = "fsample_count";
 static char __pyx_k__test_sentence[] = "test_sentence";
 static char __pyx_k__tight_phrases[] = "tight_phrases";
 static char __pyx_k__FeatureContext[] = "FeatureContext";
+static char __pyx_k__decode_lattice[] = "decode_lattice";
 static char __pyx_k__pattern2phrase[] = "pattern2phrase";
 static char __pyx_k__read_text_data[] = "read_text_data";
-static char __pyx_k__sym_fromstring[] = "sym_fromstring";
 static char __pyx_k__by_slack_factor[] = "by_slack_factor";
+static char __pyx_k__decode_sentence[] = "decode_sentence";
 static char __pyx_k__get_next_states[] = "get_next_states";
 static char __pyx_k__get_sentence_id[] = "get_sentence_id";
 static char __pyx_k__num_subpatterns[] = "num_subpatterns";
@@ -2306,9 +2784,10 @@ static PyObject *__pyx_kp_s_132;
 static PyObject *__pyx_kp_s_133;
 static PyObject *__pyx_kp_s_134;
 static PyObject *__pyx_kp_s_135;
-static PyObject *__pyx_kp_s_136;
 static PyObject *__pyx_kp_s_138;
+static PyObject *__pyx_kp_s_139;
 static PyObject *__pyx_kp_s_14;
+static PyObject *__pyx_kp_s_143;
 static PyObject *__pyx_kp_s_18;
 static PyObject *__pyx_kp_s_2;
 static PyObject *__pyx_kp_s_21;
@@ -2400,6 +2879,8 @@ static PyObject *__pyx_n_s__collect;
 static PyObject *__pyx_n_s__collections;
 static PyObject *__pyx_n_s__curr_idx;
 static PyObject *__pyx_n_s__debug;
+static PyObject *__pyx_n_s__decode_lattice;
+static PyObject *__pyx_n_s__decode_sentence;
 static PyObject *__pyx_n_s__defaultdict;
 static PyObject *__pyx_n_s__dist;
 static PyObject *__pyx_n_s__e;
@@ -2427,6 +2908,7 @@ static PyObject *__pyx_n_s__fsarray;
 static PyObject *__pyx_n_s__fword;
 static PyObject *__pyx_n_s__fwords;
 static PyObject *__pyx_n_s__gc;
+static PyObject *__pyx_n_s__genexpr;
 static PyObject *__pyx_n_s__getLogger;
 static PyObject *__pyx_n_s__get_e_id;
 static PyObject *__pyx_n_s__get_f_id;
@@ -2457,11 +2939,13 @@ static PyObject *__pyx_n_s__ito;
 static PyObject *__pyx_n_s__j;
 static PyObject *__pyx_n_s__join;
 static PyObject *__pyx_n_s__key;
+static PyObject *__pyx_n_s__lattice;
 static PyObject *__pyx_n_s__lhs;
 static PyObject *__pyx_n_s__logger;
 static PyObject *__pyx_n_s__logging;
 static PyObject *__pyx_n_s__lookup;
 static PyObject *__pyx_n_s__low;
+static PyObject *__pyx_n_s__make_lattice;
 static PyObject *__pyx_n_s__map;
 static PyObject *__pyx_n_s__matches;
 static PyObject *__pyx_n_s__max;
@@ -2527,10 +3011,7 @@ static PyObject *__pyx_n_s__split;
 static PyObject *__pyx_n_s__start;
 static PyObject *__pyx_n_s__stats;
 static PyObject *__pyx_n_s__stop;
-static PyObject *__pyx_n_s__string;
 static PyObject *__pyx_n_s__suffix_link;
-static PyObject *__pyx_n_s__sym_fromstring;
-static PyObject *__pyx_n_s__terminal;
 static PyObject *__pyx_n_s__test_sentence;
 static PyObject *__pyx_n_s__tight_phrases;
 static PyObject *__pyx_n_s__toMap;
@@ -2545,6 +3026,7 @@ static PyObject *__pyx_n_s__w;
 static PyObject *__pyx_n_s__warn;
 static PyObject *__pyx_n_s__word;
 static PyObject *__pyx_n_s__word_alignments;
+static PyObject *__pyx_n_s__word_ids;
 static PyObject *__pyx_n_s__words;
 static PyObject *__pyx_n_s__write;
 static PyObject *__pyx_n_s__write_text;
@@ -2609,7 +3091,15 @@ static PyObject *__pyx_k_tuple_99;
 static PyObject *__pyx_k_tuple_103;
 static PyObject *__pyx_k_tuple_108;
 static PyObject *__pyx_k_tuple_123;
-static PyObject *__pyx_k_tuple_137;
+static PyObject *__pyx_k_tuple_136;
+static PyObject *__pyx_k_tuple_140;
+static PyObject *__pyx_k_tuple_141;
+static PyObject *__pyx_k_tuple_144;
+static PyObject *__pyx_k_tuple_146;
+static PyObject *__pyx_k_codeobj_137;
+static PyObject *__pyx_k_codeobj_142;
+static PyObject *__pyx_k_codeobj_145;
+static PyObject *__pyx_k_codeobj_147;
 
 /* "_sa.pyx":5
  * import gzip
@@ -2630,7 +3120,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("monitor_cpu");
+  __Pyx_RefNannySetupContext("monitor_cpu", 0);
 
   /* "_sa.pyx":6
  * 
@@ -2650,7 +3140,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -2680,7 +3170,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   __pyx_t_4 = 0;
@@ -2695,7 +3185,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_r = __pyx_t_5;
   goto __pyx_L0;
@@ -2714,6 +3204,28 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_1gzip_or_text = {__Pyx_NAMESTR("gzip_or_text"), (PyCFunction)__pyx_pw_3_sa_1gzip_or_text, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_1gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("gzip_or_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.gzip_or_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_gzip_or_text(__pyx_self, ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "_sa.pyx":9
  *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
  * 
@@ -2722,10 +3234,7 @@ static float __pyx_f_3_sa_monitor_cpu(void) {
  *         return gzip.GzipFile(filename)
  */
 
-static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_gzip_or_text = {__Pyx_NAMESTR("gzip_or_text"), (PyCFunction)__pyx_pf_3_sa_gzip_or_text, METH_O, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_gzip_or_text(CYTHON_UNUSED PyObject *__pyx_self, char *__pyx_v_filename) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2735,17 +3244,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("gzip_or_text");
-  __pyx_self = __pyx_self;
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.gzip_or_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("gzip_or_text", 0);
 
   /* "_sa.pyx":10
  * 
@@ -2776,7 +3275,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -2787,7 +3286,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
@@ -2802,7 +3301,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -2813,7 +3312,7 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
     __pyx_t_1 = 0;
     goto __pyx_L0;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -2829,32 +3328,22 @@ static PyObject *__pyx_pf_3_sa_gzip_or_text(PyObject *__pyx_self, PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":11
- * cdef class FloatList:
- * 
- *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
- *         if initial_len > size:
- *             size = initial_len
- */
-
-static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -2862,7 +3351,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
@@ -2880,7 +3369,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -2915,8 +3404,26 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList___cinit__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_size, __pyx_v_increment, __pyx_v_initial_len);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":12
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":11
+ * cdef class FloatList:
+ * 
+ *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
+ *         if initial_len > size:
+ *             size = initial_len
+ */
+
+static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":12
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:             # <<<<<<<<<<<<<<
@@ -2926,7 +3433,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = (__pyx_v_initial_len > __pyx_v_size);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":13
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":13
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:
  *             size = initial_len             # <<<<<<<<<<<<<<
@@ -2934,61 +3441,70 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.increment = increment
  */
     __pyx_v_size = __pyx_v_initial_len;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":14
  *         if initial_len > size:
  *             size = initial_len
  *         self.size = size             # <<<<<<<<<<<<<<
  *         self.increment = increment
  *         self.len = initial_len
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size = __pyx_v_size;
+  __pyx_v_self->size = __pyx_v_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":15
  *             size = initial_len
  *         self.size = size
  *         self.increment = increment             # <<<<<<<<<<<<<<
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->increment = __pyx_v_increment;
+  __pyx_v_self->increment = __pyx_v_increment;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":16
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":16
  *         self.size = size
  *         self.increment = increment
  *         self.len = initial_len             # <<<<<<<<<<<<<<
  *         self.arr = <float*> malloc(size*sizeof(float))
  *         memset(self.arr, 0, initial_len*sizeof(float))
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len = __pyx_v_initial_len;
+  __pyx_v_self->len = __pyx_v_initial_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":17
  *         self.increment = increment
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))             # <<<<<<<<<<<<<<
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
+  __pyx_v_self->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":18
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))
  *         memset(self.arr, 0, initial_len*sizeof(float))             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  memset(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr, 0, (__pyx_v_initial_len * (sizeof(float))));
+  memset(__pyx_v_self->arr, 0, (__pyx_v_initial_len * (sizeof(float))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":20
+/* Python wrapper */
+static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_9FloatList_2__dealloc__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -2996,24 +3512,34 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":21
  * 
  *     def __dealloc__(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, i):
  */
-  free(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr);
+  free(__pyx_v_self->arr);
+
+  __Pyx_RefNannyFinishContext();
+}
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9FloatList_4__getitem__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((PyObject *)__pyx_v_i));
   __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":23
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":23
  *         free(self.arr)
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -3021,8 +3547,7 @@ static void __pyx_pf_3_sa_9FloatList_1__dealloc__(PyObject *__pyx_v_self) {
  *         if i<0:
  */
 
-static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_v_j = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -3035,9 +3560,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":24
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":24
  * 
  *     def __getitem__(self, i):
  *         j = i             # <<<<<<<<<<<<<<
@@ -3047,27 +3572,26 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
   __Pyx_INCREF(__pyx_v_i);
   __pyx_v_j = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":25
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":25
  *     def __getitem__(self, i):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":26
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":26
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  */
-    __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
@@ -3075,26 +3599,24 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
     __Pyx_DECREF(__pyx_v_j);
     __pyx_v_j = __pyx_t_3;
     __pyx_t_3 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":27
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         return self.arr[j]
  */
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_j, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (!__pyx_t_2) {
-    __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_j, __pyx_t_3, Py_GE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_j, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3104,17 +3626,17 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
   }
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":28
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":28
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))             # <<<<<<<<<<<<<<
  *         return self.arr[j]
  * 
  */
-    __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_i);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_i);
     __Pyx_GIVEREF(__pyx_v_i);
@@ -3125,7 +3647,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -3135,11 +3657,11 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
     __Pyx_Raise(__pyx_t_1, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L4;
   }
-  __pyx_L6:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":29
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":29
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         return self.arr[j]             # <<<<<<<<<<<<<<
@@ -3148,7 +3670,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_j); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr[__pyx_t_6])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->arr[__pyx_t_6])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3168,7 +3690,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_2__getitem__(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":31
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":31
  *         return self.arr[j]
  * 
  *     cdef void set(self, int i, float v):             # <<<<<<<<<<<<<<
@@ -3188,9 +3710,9 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set");
+  __Pyx_RefNannySetupContext("set", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":32
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":32
  * 
  *     cdef void set(self, int i, float v):
  *         j = i             # <<<<<<<<<<<<<<
@@ -3199,7 +3721,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
  */
   __pyx_v_j = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":33
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":33
  *     cdef void set(self, int i, float v):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -3209,7 +3731,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   __pyx_t_1 = (__pyx_v_i < 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":34
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":34
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -3221,7 +3743,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":35
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":35
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -3237,7 +3759,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":36
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":36
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))             # <<<<<<<<<<<<<<
@@ -3249,7 +3771,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
     __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -3260,7 +3782,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -3274,7 +3796,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":37
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":37
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         self.arr[j] = v             # <<<<<<<<<<<<<<
@@ -3293,7 +3815,18 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":39
+/* Python wrapper */
+static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9FloatList_6__setitem__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((PyObject *)__pyx_v_i), ((PyObject *)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":39
  *         self.arr[j] = v
  * 
  *     def __setitem__(self, i, val):             # <<<<<<<<<<<<<<
@@ -3301,8 +3834,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
  * 
  */
 
-static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
-static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -3310,9 +3842,9 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setitem__");
+  __Pyx_RefNannySetupContext("__setitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":40
  * 
  *     def __setitem__(self, i, val):
  *         self.set(i, val)             # <<<<<<<<<<<<<<
@@ -3320,8 +3852,8 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
  *     def __len__(self):
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = __pyx_PyFloat_AsDouble(__pyx_v_val); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->set(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_t_1, __pyx_t_2);
+  __pyx_t_2 = __pyx_PyFloat_AsFloat(__pyx_v_val); if (unlikely((__pyx_t_2 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->set(__pyx_v_self, __pyx_t_1, __pyx_t_2);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -3333,7 +3865,18 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":42
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9FloatList_8__len__(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":42
  *         self.set(i, val)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -3341,20 +3884,19 @@ static int __pyx_pf_3_sa_9FloatList_3__setitem__(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatList *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":43
  * 
  *     def __len__(self):
  *         return self.len             # <<<<<<<<<<<<<<
  * 
  *     def append(self, float val):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len;
+  __pyx_r = __pyx_v_self->len;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -3363,26 +3905,15 @@ static Py_ssize_t __pyx_pf_3_sa_9FloatList_4__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":45
- *         return self.len
- * 
- *     def append(self, float val):             # <<<<<<<<<<<<<<
- *         if self.len == self.size:
- *             self.size = self.size + self.increment
- */
-
-static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
   float __pyx_v_val;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("append");
+  __Pyx_RefNannySetupContext("append (wrapper)", 0);
   assert(__pyx_arg_val); {
-    __pyx_v_val = __pyx_PyFloat_AsDouble(__pyx_arg_val); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_val = __pyx_PyFloat_AsFloat(__pyx_arg_val); if (unlikely((__pyx_v_val == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -3390,55 +3921,73 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList_10append(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((float)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":46
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":45
+ *         return self.len
+ * 
+ *     def append(self, float val):             # <<<<<<<<<<<<<<
+ *         if self.len == self.size:
+ *             self.size = self.size + self.increment
+ */
+
+static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, float __pyx_v_val) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("append", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":46
  * 
  *     def append(self, float val):
  *         if self.len == self.size:             # <<<<<<<<<<<<<<
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len == ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size);
+  __pyx_t_1 = (__pyx_v_self->len == __pyx_v_self->size);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":47
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":47
  *     def append(self, float val):
  *         if self.len == self.size:
  *             self.size = self.size + self.increment             # <<<<<<<<<<<<<<
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val
  */
-    ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size + ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->increment);
+    __pyx_v_self->size = (__pyx_v_self->size + __pyx_v_self->increment);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":48
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":48
  *         if self.len == self.size:
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))             # <<<<<<<<<<<<<<
  *         self.arr[self.len] = val
  *         self.len = self.len + 1
  */
-    ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr = ((float *)realloc(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr, (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->size * (sizeof(float)))));
-    goto __pyx_L5;
+    __pyx_v_self->arr = ((float *)realloc(__pyx_v_self->arr, (__pyx_v_self->size * (sizeof(float)))));
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":49
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":49
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val             # <<<<<<<<<<<<<<
  *         self.len = self.len + 1
  * 
  */
-  (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->arr[((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len]) = __pyx_v_val;
+  (__pyx_v_self->arr[__pyx_v_self->len]) = __pyx_v_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":50
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":50
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val
  *         self.len = self.len + 1             # <<<<<<<<<<<<<<
  * 
  *     cdef void write_handle(self, FILE* f):
  */
-  ((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len = (((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->len + 1);
+  __pyx_v_self->len = (__pyx_v_self->len + 1);
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -3446,7 +3995,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":52
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":52
  *         self.len = self.len + 1
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -3456,9 +4005,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_5append(PyObject *__pyx_v_self, PyObje
 
 static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_handle");
+  __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":53
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":53
  * 
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(float), 1, f)             # <<<<<<<<<<<<<<
@@ -3467,7 +4016,7 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
  */
   fwrite((&__pyx_v_self->len), (sizeof(float)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":54
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(float), 1, f)
  *         fwrite(self.arr, sizeof(float), self.len, f)             # <<<<<<<<<<<<<<
@@ -3479,24 +4028,13 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":56
- *         fwrite(self.arr, sizeof(float), self.len, f)
- * 
- *     def write(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write");
+  __Pyx_RefNannySetupContext("write (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -3506,8 +4044,26 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList_12write(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":58
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":56
+ *         fwrite(self.arr, sizeof(float), self.len, f)
+ * 
+ *     def write(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":58
  *     def write(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -3516,16 +4072,16 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":59
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":59
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":60
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -3540,7 +4096,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":62
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":62
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -3550,9 +4106,9 @@ static PyObject *__pyx_pf_3_sa_9FloatList_6write(PyObject *__pyx_v_self, PyObjec
 
 static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_handle");
+  __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":63
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":63
  * 
  *     cdef void read_handle(self, FILE* f):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -3561,7 +4117,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   free(__pyx_v_self->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":64
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":64
  *     cdef void read_handle(self, FILE* f):
  *         free(self.arr)
  *         fread(&(self.len), sizeof(float), 1, f)             # <<<<<<<<<<<<<<
@@ -3570,7 +4126,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   fread((&__pyx_v_self->len), (sizeof(float)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":65
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":65
  *         free(self.arr)
  *         fread(&(self.len), sizeof(float), 1, f)
  *         self.arr = <float*> malloc(self.len * sizeof(float))             # <<<<<<<<<<<<<<
@@ -3579,7 +4135,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   __pyx_v_self->arr = ((float *)malloc((__pyx_v_self->len * (sizeof(float)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":66
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":66
  *         fread(&(self.len), sizeof(float), 1, f)
  *         self.arr = <float*> malloc(self.len * sizeof(float))
  *         self.size = self.len             # <<<<<<<<<<<<<<
@@ -3588,7 +4144,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   __pyx_v_self->size = __pyx_v_self->len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":67
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":67
  *         self.arr = <float*> malloc(self.len * sizeof(float))
  *         self.size = self.len
  *         fread(self.arr, sizeof(float), self.len, f)             # <<<<<<<<<<<<<<
@@ -3600,24 +4156,13 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":69
- *         fread(self.arr, sizeof(float), self.len, f)
- * 
- *     def read(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read");
+  __Pyx_RefNannySetupContext("read (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -3627,8 +4172,26 @@ static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9FloatList_14read(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":71
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":69
+ *         fread(self.arr, sizeof(float), self.len, f)
+ * 
+ *     def read(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":71
  *     def read(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -3637,15 +4200,15 @@ static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":72
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_FloatList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":73
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":73
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -3658,32 +4221,22 @@ static PyObject *__pyx_pf_3_sa_9FloatList_7read(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":11
- * cdef class IntList:
- * 
- *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
- *         if initial_len > size:
- *             size = initial_len
- */
-
-static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -3691,7 +4244,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
@@ -3709,7 +4262,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3744,8 +4297,26 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList___cinit__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_size, __pyx_v_increment, __pyx_v_initial_len);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":12
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":11
+ * cdef class IntList:
+ * 
+ *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
+ *         if initial_len > size:
+ *             size = initial_len
+ */
+
+static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_size, int __pyx_v_increment, int __pyx_v_initial_len) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":12
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:             # <<<<<<<<<<<<<<
@@ -3755,7 +4326,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
   __pyx_t_1 = (__pyx_v_initial_len > __pyx_v_size);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":13
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":13
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:
  *             size = initial_len             # <<<<<<<<<<<<<<
@@ -3763,61 +4334,72 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         self.increment = increment
  */
     __pyx_v_size = __pyx_v_initial_len;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":14
  *         if initial_len > size:
  *             size = initial_len
  *         self.size = size             # <<<<<<<<<<<<<<
  *         self.increment = increment
  *         self.len = initial_len
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size = __pyx_v_size;
+  __pyx_v_self->size = __pyx_v_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":15
  *             size = initial_len
  *         self.size = size
  *         self.increment = increment             # <<<<<<<<<<<<<<
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->increment = __pyx_v_increment;
+  __pyx_v_self->increment = __pyx_v_increment;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":16
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":16
  *         self.size = size
  *         self.increment = increment
  *         self.len = initial_len             # <<<<<<<<<<<<<<
  *         self.arr = <int*> malloc(size*sizeof(int))
  *         memset(self.arr, 0, initial_len*sizeof(int))
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len = __pyx_v_initial_len;
+  __pyx_v_self->len = __pyx_v_initial_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":17
  *         self.increment = increment
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))             # <<<<<<<<<<<<<<
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
+  __pyx_v_self->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":18
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))
  *         memset(self.arr, 0, initial_len*sizeof(int))             # <<<<<<<<<<<<<<
  * 
  *     def __str__(self):
  */
-  memset(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr, 0, (__pyx_v_initial_len * (sizeof(int))));
+  memset(__pyx_v_self->arr, 0, (__pyx_v_initial_len * (sizeof(int))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":20
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_2__str__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -3825,8 +4407,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         ret = "IntList["
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_v_ret = NULL;
   int __pyx_v_idx;
   PyObject *__pyx_r = NULL;
@@ -3839,9 +4420,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":22
  *     def __str__(self):
  *         cdef unsigned i
  *         ret = "IntList["             # <<<<<<<<<<<<<<
@@ -3851,18 +4432,18 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_3));
   __pyx_v_ret = ((PyObject *)__pyx_kp_s_3);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":23
  *         cdef unsigned i
  *         ret = "IntList["
  *         for idx in range(self.size):             # <<<<<<<<<<<<<<
  *             if idx>0:
  *                 ret += ","
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size;
+  __pyx_t_1 = __pyx_v_self->size;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_idx = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":24
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":24
  *         ret = "IntList["
  *         for idx in range(self.size):
  *             if idx>0:             # <<<<<<<<<<<<<<
@@ -3872,7 +4453,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
     __pyx_t_3 = (__pyx_v_idx > 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":25
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":25
  *         for idx in range(self.size):
  *             if idx>0:
  *                 ret += ","             # <<<<<<<<<<<<<<
@@ -3884,21 +4465,21 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
       __Pyx_DECREF(__pyx_v_ret);
       __pyx_v_ret = __pyx_t_4;
       __pyx_t_4 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":26
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":26
  *             if idx>0:
  *                 ret += ","
  *             ret += str(self.arr[idx])             # <<<<<<<<<<<<<<
  *         ret += "]"
  *         ret += "len="
  */
-    __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_idx])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_idx])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
@@ -3913,7 +4494,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
     __pyx_t_5 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":27
  *                 ret += ","
  *             ret += str(self.arr[idx])
  *         ret += "]"             # <<<<<<<<<<<<<<
@@ -3926,7 +4507,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   __pyx_v_ret = __pyx_t_5;
   __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":28
  *             ret += str(self.arr[idx])
  *         ret += "]"
  *         ret += "len="             # <<<<<<<<<<<<<<
@@ -3939,14 +4520,14 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   __pyx_v_ret = __pyx_t_5;
   __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":29
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":29
  *         ret += "]"
  *         ret += "len="
  *         ret += self.len             # <<<<<<<<<<<<<<
  *         return ret
  * 
  */
-  __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_ret, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
@@ -3955,7 +4536,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   __pyx_v_ret = __pyx_t_4;
   __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":30
  *         ret += "len="
  *         ret += self.len
  *         return ret             # <<<<<<<<<<<<<<
@@ -3981,7 +4562,18 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":32
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("index (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_4index(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":32
  *         return ret
  * 
  *     def index(self, val):             # <<<<<<<<<<<<<<
@@ -3989,8 +4581,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_1__str__(PyObject *__pyx_v_self) {
  *         for i in range(self.len):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject *__pyx_v_val) {
+static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_val) {
   unsigned int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -4002,36 +4593,35 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("index");
+  __Pyx_RefNannySetupContext("index", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":34
  *     def index(self, val):
  *         cdef unsigned i
  *         for i in range(self.len):             # <<<<<<<<<<<<<<
  *             if self.arr[i] == val:
  *                 return i
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len;
+  __pyx_t_1 = __pyx_v_self->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":35
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":35
  *         cdef unsigned i
  *         for i in range(self.len):
  *             if self.arr[i] == val:             # <<<<<<<<<<<<<<
  *                 return i
  *         return IndexError
  */
-    __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_val, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_val, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":36
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":36
  *         for i in range(self.len):
  *             if self.arr[i] == val:
  *                 return i             # <<<<<<<<<<<<<<
@@ -4044,12 +4634,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
       __pyx_r = __pyx_t_4;
       __pyx_t_4 = 0;
       goto __pyx_L0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":37
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":37
  *             if self.arr[i] == val:
  *                 return i
  *         return IndexError             # <<<<<<<<<<<<<<
@@ -4074,60 +4664,39 @@ static PyObject *__pyx_pf_3_sa_7IntList_2index(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":39
- *         return IndexError
- * 
- *     def partition(self,start,end):             # <<<<<<<<<<<<<<
- *         pivot = self.arr[end]
- *         bottom = start-1
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_end = 0;
-  PyObject *__pyx_v_pivot = NULL;
-  PyObject *__pyx_v_bottom = NULL;
-  PyObject *__pyx_v_top = NULL;
-  long __pyx_v_done;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  Py_ssize_t __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
-  __Pyx_RefNannySetupContext("partition");
+  __Pyx_RefNannySetupContext("partition (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("partition", 1, 2, 2, 1); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "partition") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "partition") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -4146,8 +4715,38 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_6partition(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_start, __pyx_v_end);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":39
+ *         return IndexError
+ * 
+ *     def partition(self,start,end):             # <<<<<<<<<<<<<<
+ *         pivot = self.arr[end]
+ *         bottom = start-1
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end) {
+  PyObject *__pyx_v_pivot = NULL;
+  PyObject *__pyx_v_bottom = NULL;
+  PyObject *__pyx_v_top = NULL;
+  long __pyx_v_done;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  Py_ssize_t __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  Py_ssize_t __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("partition", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":40
  * 
  *     def partition(self,start,end):
  *         pivot = self.arr[end]             # <<<<<<<<<<<<<<
@@ -4155,12 +4754,12 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *         top = end
  */
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_end); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_pivot = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":41
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":41
  *     def partition(self,start,end):
  *         pivot = self.arr[end]
  *         bottom = start-1             # <<<<<<<<<<<<<<
@@ -4172,7 +4771,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
   __pyx_v_bottom = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":42
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":42
  *         pivot = self.arr[end]
  *         bottom = start-1
  *         top = end             # <<<<<<<<<<<<<<
@@ -4182,7 +4781,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
   __Pyx_INCREF(__pyx_v_end);
   __pyx_v_top = __pyx_v_end;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":43
  *         bottom = start-1
  *         top = end
  *         done = 0             # <<<<<<<<<<<<<<
@@ -4191,7 +4790,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
   __pyx_v_done = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":44
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":44
  *         top = end
  *         done = 0
  *         while not done:             # <<<<<<<<<<<<<<
@@ -4202,7 +4801,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
     __pyx_t_3 = (!__pyx_v_done);
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":45
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":45
  *         done = 0
  *         while not done:
  *             while not done:             # <<<<<<<<<<<<<<
@@ -4213,7 +4812,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
       __pyx_t_3 = (!__pyx_v_done);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":46
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":46
  *         while not done:
  *             while not done:
  *                 bottom += 1             # <<<<<<<<<<<<<<
@@ -4226,20 +4825,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
       __pyx_v_bottom = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":47
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":47
  *             while not done:
  *                 bottom += 1
  *                 if bottom == top:             # <<<<<<<<<<<<<<
  *                     done = 1
  *                     break
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_bottom, __pyx_v_top, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_bottom, __pyx_v_top, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":48
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":48
  *                 bottom += 1
  *                 if bottom == top:
  *                     done = 1             # <<<<<<<<<<<<<<
@@ -4248,19 +4846,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
         __pyx_v_done = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":49
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":49
  *                 if bottom == top:
  *                     done = 1
  *                     break             # <<<<<<<<<<<<<<
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]
  */
-        goto __pyx_L9_break;
-        goto __pyx_L10;
+        goto __pyx_L6_break;
+        goto __pyx_L7;
       }
-      __pyx_L10:;
+      __pyx_L7:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":50
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":50
  *                     done = 1
  *                     break
  *                 if self.arr[bottom] > pivot:             # <<<<<<<<<<<<<<
@@ -4268,16 +4866,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *                     break
  */
       __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_pivot, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_pivot, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":51
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":51
  *                     break
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]             # <<<<<<<<<<<<<<
@@ -4286,23 +4883,23 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
         __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_5]) = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]);
+        (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":52
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":52
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]
  *                     break             # <<<<<<<<<<<<<<
  *             while not done:
  *                 top -= 1
  */
-        goto __pyx_L9_break;
-        goto __pyx_L11;
+        goto __pyx_L6_break;
+        goto __pyx_L8;
       }
-      __pyx_L11:;
+      __pyx_L8:;
     }
-    __pyx_L9_break:;
+    __pyx_L6_break:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":53
  *                     self.arr[top] = self.arr[bottom]
  *                     break
  *             while not done:             # <<<<<<<<<<<<<<
@@ -4313,7 +4910,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
       __pyx_t_3 = (!__pyx_v_done);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":54
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":54
  *                     break
  *             while not done:
  *                 top -= 1             # <<<<<<<<<<<<<<
@@ -4326,20 +4923,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
       __pyx_v_top = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":55
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":55
  *             while not done:
  *                 top -= 1
  *                 if top == bottom:             # <<<<<<<<<<<<<<
  *                     done = 1
  *                     break
  */
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_top, __pyx_v_bottom, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_top, __pyx_v_bottom, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":56
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":56
  *                 top -= 1
  *                 if top == bottom:
  *                     done = 1             # <<<<<<<<<<<<<<
@@ -4348,19 +4944,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
         __pyx_v_done = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":57
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":57
  *                 if top == bottom:
  *                     done = 1
  *                     break             # <<<<<<<<<<<<<<
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]
  */
-        goto __pyx_L13_break;
-        goto __pyx_L14;
+        goto __pyx_L10_break;
+        goto __pyx_L11;
       }
-      __pyx_L14:;
+      __pyx_L11:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":58
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":58
  *                     done = 1
  *                     break
  *                 if self.arr[top] < pivot:             # <<<<<<<<<<<<<<
@@ -4368,16 +4964,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  *                     break
  */
       __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong((__pyx_v_self->arr[__pyx_t_1])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pivot, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_4, __pyx_v_pivot, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":59
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":59
  *                     break
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]             # <<<<<<<<<<<<<<
@@ -4386,24 +4981,24 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
         __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_5]) = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]);
+        (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":60
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":60
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]
  *                     break             # <<<<<<<<<<<<<<
  *         self.arr[top] = pivot
  *         return top
  */
-        goto __pyx_L13_break;
-        goto __pyx_L15;
+        goto __pyx_L10_break;
+        goto __pyx_L12;
       }
-      __pyx_L15:;
+      __pyx_L12:;
     }
-    __pyx_L13_break:;
+    __pyx_L10_break:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":61
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":61
  *                     self.arr[bottom] = self.arr[top]
  *                     break
  *         self.arr[top] = pivot             # <<<<<<<<<<<<<<
@@ -4412,9 +5007,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
  */
   __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_pivot); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_t_1]) = __pyx_t_6;
+  (__pyx_v_self->arr[__pyx_t_1]) = __pyx_t_6;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":62
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":62
  *                     break
  *         self.arr[top] = pivot
  *         return top             # <<<<<<<<<<<<<<
@@ -4442,55 +5037,39 @@ static PyObject *__pyx_pf_3_sa_7IntList_3partition(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":64
- *         return top
- * 
- *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
- *         if start < end:
- *             split = self.partition(start,end)
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_end = 0;
-  PyObject *__pyx_v_split = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
-  __Pyx_RefNannySetupContext("_doquicksort");
+  __Pyx_RefNannySetupContext("_doquicksort (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__end)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("_doquicksort", 1, 2, 2, 1); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_doquicksort") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_doquicksort") < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -4509,31 +5088,55 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_8_doquicksort(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_start, __pyx_v_end);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":65
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":64
+ *         return top
+ * 
+ *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
+ *         if start < end:
+ *             split = self.partition(start,end)
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_end) {
+  PyObject *__pyx_v_split = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("_doquicksort", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":65
  * 
  *     def _doquicksort(self,start,end):
  *         if start < end:             # <<<<<<<<<<<<<<
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_start, __pyx_v_end, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_start, __pyx_v_end, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":66
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":66
  *     def _doquicksort(self,start,end):
  *         if start < end:
  *             split = self.partition(start,end)             # <<<<<<<<<<<<<<
  *             self._doquicksort(start,split-1)
  *             self._doquicksort(split+1,end)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__partition); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__partition); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_start);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_start);
     __Pyx_GIVEREF(__pyx_v_start);
@@ -4547,19 +5150,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
     __pyx_v_split = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":67
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":67
  *         if start < end:
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)             # <<<<<<<<<<<<<<
  *             self._doquicksort(split+1,end)
  *         else:
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyNumber_Subtract(__pyx_v_split, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_start);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_start);
     __Pyx_GIVEREF(__pyx_v_start);
@@ -4572,19 +5175,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":68
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":68
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)
  *             self._doquicksort(split+1,end)             # <<<<<<<<<<<<<<
  *         else:
  *             return
  */
-    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_1 = PyNumber_Add(__pyx_v_split, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_end);
@@ -4596,11 +5199,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":70
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":70
  *             self._doquicksort(split+1,end)
  *         else:
  *             return             # <<<<<<<<<<<<<<
@@ -4611,7 +5214,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -4628,7 +5231,18 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":72
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("sort (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_10sort(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":72
  *             return
  * 
  *     def sort(self):             # <<<<<<<<<<<<<<
@@ -4636,8 +5250,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4_doquicksort(PyObject *__pyx_v_self, Py
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -4646,21 +5259,21 @@ static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNU
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sort");
+  __Pyx_RefNannySetupContext("sort", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":73
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":73
  * 
  *     def sort(self):
  *         self._doquicksort(0,self.len-1)             # <<<<<<<<<<<<<<
  * 
  *     def reset(self):
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___doquicksort); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->len - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(__pyx_int_0);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
@@ -4687,7 +5300,18 @@ static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNU
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":75
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("reset (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_12reset(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":75
  *         self._doquicksort(0,self.len-1)
  * 
  *     def reset(self):             # <<<<<<<<<<<<<<
@@ -4695,20 +5319,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_5sort(PyObject *__pyx_v_self, CYTHON_UNU
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("reset");
+  __Pyx_RefNannySetupContext("reset", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":76
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":76
  * 
  *     def reset(self):
  *         self.len = 0             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len = 0;
+  __pyx_v_self->len = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -4716,7 +5339,16 @@ static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":78
+/* Python wrapper */
+static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_7IntList_14__dealloc__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":78
  *         self.len = 0
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -4724,25 +5356,35 @@ static PyObject *__pyx_pf_3_sa_7IntList_6reset(PyObject *__pyx_v_self, CYTHON_UN
  * 
  */
 
-static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_7IntList_7__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":79
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":79
  * 
  *     def __dealloc__(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
  * 
  *     def __iter__(self):
  */
-  free(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr);
+  free(__pyx_v_self->arr);
+
+  __Pyx_RefNannyFinishContext();
+}
+static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_16__iter__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
   __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -4750,43 +5392,52 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
  *         for i in range(self.len):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_8__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_8__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_7IntList_16__iter__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__iter__", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)__pyx_ptype_3_sa___pyx_scope_struct____iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct____iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7IntList_9generator;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_7IntList_18generator, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.IntList.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -4796,25 +5447,25 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":83
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":83
  *     def __iter__(self):
  *         cdef int i
  *         for i in range(self.len):             # <<<<<<<<<<<<<<
  *             yield self.arr[i]
  * 
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_cur_scope->__pyx_v_self)->len;
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":84
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":84
  *         cdef int i
  *         for i in range(self.len):
  *             yield self.arr[i]             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, index):
  */
-    __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_cur_scope->__pyx_v_self)->arr[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->arr[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
@@ -4823,26 +5474,38 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":86
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_19__getitem__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_index));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":86
  *             yield self.arr[i]
  * 
  *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
@@ -4850,8 +5513,7 @@ static PyObject *__pyx_gb_3_sa_7IntList_9generator(struct __pyx_obj_3_sa___pyx_s
  *         if isinstance(index, int):
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_index) {
+static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_index) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -4871,9 +5533,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":88
  *     def __getitem__(self, index):
  *         cdef int i, j, k
  *         if isinstance(index, int):             # <<<<<<<<<<<<<<
@@ -4886,7 +5548,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":89
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":89
  *         cdef int i, j, k
  *         if isinstance(index, int):
  *             j = index             # <<<<<<<<<<<<<<
@@ -4896,7 +5558,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_index); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_j = __pyx_t_3;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":90
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":90
  *         if isinstance(index, int):
  *             j = index
  *             if j < 0:             # <<<<<<<<<<<<<<
@@ -4906,19 +5568,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_2 = (__pyx_v_j < 0);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":91
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":91
  *             j = index
  *             if j < 0:
  *                 j = self.len + j             # <<<<<<<<<<<<<<
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  */
-      __pyx_v_j = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_j);
-      goto __pyx_L6;
+      __pyx_v_j = (__pyx_v_self->len + __pyx_v_j);
+      goto __pyx_L4;
     }
-    __pyx_L6:;
+    __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":92
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":92
  *             if j < 0:
  *                 j = self.len + j
  *             if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -4927,24 +5589,24 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  */
     __pyx_t_2 = (__pyx_v_j < 0);
     if (!__pyx_t_2) {
-      __pyx_t_4 = (__pyx_v_j >= ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
+      __pyx_t_4 = (__pyx_v_j >= __pyx_v_self->len);
       __pyx_t_5 = __pyx_t_4;
     } else {
       __pyx_t_5 = __pyx_t_2;
     }
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":93
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":93
  *                 j = self.len + j
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))             # <<<<<<<<<<<<<<
  *             return self.arr[j]
  *         elif isinstance(index, slice):
  */
-      __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+      __Pyx_GOTREF(__pyx_t_6);
       __Pyx_INCREF(__pyx_v_index);
       PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_index);
       __Pyx_GIVEREF(__pyx_v_index);
@@ -4955,7 +5617,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_GOTREF(((PyObject *)__pyx_t_1));
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
       __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+      __Pyx_GOTREF(__pyx_t_6);
       PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_1));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
       __pyx_t_1 = 0;
@@ -4965,11 +5627,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_Raise(__pyx_t_1, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       {__pyx_filename = __pyx_f[2]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":94
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":94
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  *             return self.arr[j]             # <<<<<<<<<<<<<<
@@ -4977,15 +5639,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  *             i = index.start
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_j])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_j])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":95
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":95
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  *             return self.arr[j]
  *         elif isinstance(index, slice):             # <<<<<<<<<<<<<<
@@ -4998,7 +5660,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":96
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":96
  *             return self.arr[j]
  *         elif isinstance(index, slice):
  *             i = index.start             # <<<<<<<<<<<<<<
@@ -5011,7 +5673,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_v_i = __pyx_t_3;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":97
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":97
  *         elif isinstance(index, slice):
  *             i = index.start
  *             j = index.stop             # <<<<<<<<<<<<<<
@@ -5024,7 +5686,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_v_j = __pyx_t_3;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":98
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":98
  *             i = index.start
  *             j = index.stop
  *             if i < 0:             # <<<<<<<<<<<<<<
@@ -5034,19 +5696,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_5 = (__pyx_v_i < 0);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":99
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":99
  *             j = index.stop
  *             if i < 0:
  *                 i = self.len + i             # <<<<<<<<<<<<<<
  *             if j < 0:
  *                 j = self.len + j
  */
-      __pyx_v_i = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_i);
-      goto __pyx_L8;
+      __pyx_v_i = (__pyx_v_self->len + __pyx_v_i);
+      goto __pyx_L6;
     }
-    __pyx_L8:;
+    __pyx_L6:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":100
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":100
  *             if i < 0:
  *                 i = self.len + i
  *             if j < 0:             # <<<<<<<<<<<<<<
@@ -5056,19 +5718,19 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_5 = (__pyx_v_j < 0);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":101
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":101
  *                 i = self.len + i
  *             if j < 0:
  *                 j = self.len + j             # <<<<<<<<<<<<<<
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  */
-      __pyx_v_j = (((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len + __pyx_v_j);
-      goto __pyx_L9;
+      __pyx_v_j = (__pyx_v_self->len + __pyx_v_j);
+      goto __pyx_L7;
     }
-    __pyx_L9:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":102
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":102
  *             if j < 0:
  *                 j = self.len + j
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:             # <<<<<<<<<<<<<<
@@ -5077,11 +5739,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
  */
     __pyx_t_5 = (__pyx_v_i < 0);
     if (!__pyx_t_5) {
-      __pyx_t_2 = (__pyx_v_i >= ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
+      __pyx_t_2 = (__pyx_v_i >= __pyx_v_self->len);
       if (!__pyx_t_2) {
         __pyx_t_4 = (__pyx_v_j < 0);
         if (!__pyx_t_4) {
-          __pyx_t_7 = (__pyx_v_j > ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len);
+          __pyx_t_7 = (__pyx_v_j > __pyx_v_self->len);
           __pyx_t_8 = __pyx_t_7;
         } else {
           __pyx_t_8 = __pyx_t_4;
@@ -5096,7 +5758,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     }
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":103
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":103
  *                 j = self.len + j
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))             # <<<<<<<<<<<<<<
@@ -5107,10 +5769,10 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_6 = PyObject_GetAttr(__pyx_v_index, __pyx_n_s__stop); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_9 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+      __Pyx_GOTREF(__pyx_t_10);
       PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_6);
@@ -5124,7 +5786,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_GOTREF(((PyObject *)__pyx_t_9));
       __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
       __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+      __Pyx_GOTREF(__pyx_t_10);
       PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
       __pyx_t_9 = 0;
@@ -5134,11 +5796,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __Pyx_Raise(__pyx_t_9, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       {__pyx_filename = __pyx_f[2]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L10;
+      goto __pyx_L8;
     }
-    __pyx_L10:;
+    __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":104
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":104
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  *             result = ()             # <<<<<<<<<<<<<<
@@ -5148,7 +5810,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
     __pyx_v_result = __pyx_empty_tuple;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":105
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  *             result = ()
  *             for k from i <= k < j:             # <<<<<<<<<<<<<<
@@ -5158,17 +5820,17 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_3 = __pyx_v_j;
     for (__pyx_v_k = __pyx_v_i; __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":106
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":106
  *             result = ()
  *             for k from i <= k < j:
  *                 result = result + (self.arr[k],)             # <<<<<<<<<<<<<<
  *             return result
  *         else:
  */
-      __pyx_t_9 = PyInt_FromLong((((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->arr[__pyx_v_k])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong((__pyx_v_self->arr[__pyx_v_k])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+      __Pyx_GOTREF(__pyx_t_10);
       PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_9);
       __Pyx_GIVEREF(__pyx_t_9);
       __pyx_t_9 = 0;
@@ -5180,7 +5842,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
       __pyx_t_9 = 0;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":107
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":107
  *             for k from i <= k < j:
  *                 result = result + (self.arr[k],)
  *             return result             # <<<<<<<<<<<<<<
@@ -5191,11 +5853,11 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_INCREF(((PyObject *)__pyx_v_result));
     __pyx_r = ((PyObject *)__pyx_v_result);
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":109
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":109
  *             return result
  *         else:
  *             raise TypeError("Illegal key type %s for IntList" % type(index))             # <<<<<<<<<<<<<<
@@ -5205,7 +5867,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_9), ((PyObject *)Py_TYPE(__pyx_v_index))); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_9));
     __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+    __Pyx_GOTREF(__pyx_t_10);
     PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
     __pyx_t_9 = 0;
@@ -5216,7 +5878,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -5234,7 +5896,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10__getitem__(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":111
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":111
  *             raise TypeError("Illegal key type %s for IntList" % type(index))
  * 
  *     cdef void set(self, int i, int val):             # <<<<<<<<<<<<<<
@@ -5254,9 +5916,9 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set");
+  __Pyx_RefNannySetupContext("set", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":112
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":112
  * 
  *     cdef void set(self, int i, int val):
  *         j = i             # <<<<<<<<<<<<<<
@@ -5265,7 +5927,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
  */
   __pyx_v_j = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":113
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":113
  *     cdef void set(self, int i, int val):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -5275,7 +5937,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   __pyx_t_1 = (__pyx_v_i < 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":114
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":114
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -5287,7 +5949,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":115
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":115
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -5303,7 +5965,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":116
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":116
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length IntList" % (i, self.len))             # <<<<<<<<<<<<<<
@@ -5315,7 +5977,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
     __pyx_t_5 = PyInt_FromLong(__pyx_v_self->len); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -5326,7 +5988,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -5340,7 +6002,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":117
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":117
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length IntList" % (i, self.len))
  *         self.arr[j] = val             # <<<<<<<<<<<<<<
@@ -5359,7 +6021,18 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":119
+/* Python wrapper */
+static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
+static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__setitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_21__setitem__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_i), ((PyObject *)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":119
  *         self.arr[j] = val
  * 
  *     def __setitem__(self, i, val):             # <<<<<<<<<<<<<<
@@ -5367,8 +6040,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
  * 
  */
 
-static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val); /*proto*/
-static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
+static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_i, PyObject *__pyx_v_val) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -5376,9 +6048,9 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__setitem__");
+  __Pyx_RefNannySetupContext("__setitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":120
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":120
  * 
  *     def __setitem__(self, i, val):
  *         self.set(i, val)             # <<<<<<<<<<<<<<
@@ -5387,7 +6059,7 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_v_val); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->set(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_t_1, __pyx_t_2);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->set(__pyx_v_self, __pyx_t_1, __pyx_t_2);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -5399,7 +6071,18 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":122
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_23__len__(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":122
  *         self.set(i, val)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -5407,20 +6090,19 @@ static int __pyx_pf_3_sa_7IntList_11__setitem__(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":123
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":123
  * 
  *     def __len__(self):
  *         return self.len             # <<<<<<<<<<<<<<
  * 
  *     def get_size(self):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->len;
+  __pyx_r = __pyx_v_self->len;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -5429,7 +6111,18 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":125
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_26get_size(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_26get_size(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_size (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_25get_size(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":125
  *         return self.len
  * 
  *     def get_size(self):             # <<<<<<<<<<<<<<
@@ -5437,17 +6130,16 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_12__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_13get_size(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_13get_size(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_7IntList_25get_size(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_size");
+  __Pyx_RefNannySetupContext("get_size", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":126
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":126
  * 
  *     def get_size(self):
  *         return self.size             # <<<<<<<<<<<<<<
@@ -5455,7 +6147,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_13get_size(PyObject *__pyx_v_self, CYTHO
  *     def append(self, int val):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -5473,23 +6165,13 @@ static PyObject *__pyx_pf_3_sa_7IntList_13get_size(PyObject *__pyx_v_self, CYTHO
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":128
- *         return self.size
- * 
- *     def append(self, int val):             # <<<<<<<<<<<<<<
- *         self._append(val)
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObject *__pyx_arg_val) {
   int __pyx_v_val;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("append");
+  __Pyx_RefNannySetupContext("append (wrapper)", 0);
   assert(__pyx_arg_val); {
     __pyx_v_val = __Pyx_PyInt_AsInt(__pyx_arg_val); if (unlikely((__pyx_v_val == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -5499,15 +6181,32 @@ static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_27append(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((int)__pyx_v_val));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":129
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":128
+ *         return self.size
+ * 
+ *     def append(self, int val):             # <<<<<<<<<<<<<<
+ *         self._append(val)
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("append", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":129
  * 
  *     def append(self, int val):
  *         self._append(val)             # <<<<<<<<<<<<<<
  * 
  *     cdef void _append(self, int val):
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->_append(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_val);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->_append(__pyx_v_self, __pyx_v_val);
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_XGIVEREF(__pyx_r);
@@ -5515,7 +6214,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":131
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":131
  *         self._append(val)
  * 
  *     cdef void _append(self, int val):             # <<<<<<<<<<<<<<
@@ -5526,9 +6225,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_14append(PyObject *__pyx_v_self, PyObjec
 static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int __pyx_v_val) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("_append");
+  __Pyx_RefNannySetupContext("_append", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":132
  * 
  *     cdef void _append(self, int val):
  *         if self.len == self.size:             # <<<<<<<<<<<<<<
@@ -5538,7 +6237,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   __pyx_t_1 = (__pyx_v_self->len == __pyx_v_self->size);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":133
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":133
  *     cdef void _append(self, int val):
  *         if self.len == self.size:
  *             self.size = self.size + self.increment             # <<<<<<<<<<<<<<
@@ -5547,7 +6246,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  */
     __pyx_v_self->size = (__pyx_v_self->size + __pyx_v_self->increment);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":134
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":134
  *         if self.len == self.size:
  *             self.size = self.size + self.increment
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))             # <<<<<<<<<<<<<<
@@ -5559,7 +6258,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":135
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":135
  *             self.size = self.size + self.increment
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         self.arr[self.len] = val             # <<<<<<<<<<<<<<
@@ -5568,7 +6267,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  */
   (__pyx_v_self->arr[__pyx_v_self->len]) = __pyx_v_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":136
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         self.arr[self.len] = val
  *         self.len = self.len + 1             # <<<<<<<<<<<<<<
@@ -5580,7 +6279,18 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":138
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("extend (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7IntList_29extend(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((PyObject *)__pyx_v_other));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":138
  *         self.len = self.len + 1
  * 
  *     def extend(self, other):             # <<<<<<<<<<<<<<
@@ -5588,17 +6298,16 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, PyObject *__pyx_v_other) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extend");
+  __Pyx_RefNannySetupContext("extend", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":139
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":139
  * 
  *     def extend(self, other):
  *         self._extend(other)             # <<<<<<<<<<<<<<
@@ -5608,7 +6317,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObjec
   if (!(likely(((__pyx_v_other) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_other, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = __pyx_v_other;
   __Pyx_INCREF(__pyx_t_1);
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->_extend(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1));
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->_extend(__pyx_v_self, ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1));
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -5623,7 +6332,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":141
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":141
  *         self._extend(other)
  * 
  *     cdef void _extend(self, IntList other):             # <<<<<<<<<<<<<<
@@ -5633,9 +6342,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_15extend(PyObject *__pyx_v_self, PyObjec
 
 static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v_self, struct __pyx_obj_3_sa_IntList *__pyx_v_other) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_extend");
+  __Pyx_RefNannySetupContext("_extend", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":142
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":142
  * 
  *     cdef void _extend(self, IntList other):
  *         self._extend_arr(other.arr, other.len)             # <<<<<<<<<<<<<<
@@ -5647,7 +6356,7 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":144
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":144
  *         self._extend_arr(other.arr, other.len)
  * 
  *     cdef void _extend_arr(self, int* other, int other_len):             # <<<<<<<<<<<<<<
@@ -5658,9 +6367,9 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
 static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__pyx_v_self, int *__pyx_v_other, int __pyx_v_other_len) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("_extend_arr");
+  __Pyx_RefNannySetupContext("_extend_arr", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":145
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":145
  * 
  *     cdef void _extend_arr(self, int* other, int other_len):
  *         if self.size < self.len + other_len:             # <<<<<<<<<<<<<<
@@ -5670,7 +6379,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   __pyx_t_1 = (__pyx_v_self->size < (__pyx_v_self->len + __pyx_v_other_len));
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":146
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":146
  *     cdef void _extend_arr(self, int* other, int other_len):
  *         if self.size < self.len + other_len:
  *             self.size = self.len + other_len             # <<<<<<<<<<<<<<
@@ -5679,7 +6388,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
  */
     __pyx_v_self->size = (__pyx_v_self->len + __pyx_v_other_len);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":147
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":147
  *         if self.size < self.len + other_len:
  *             self.size = self.len + other_len
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))             # <<<<<<<<<<<<<<
@@ -5691,7 +6400,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":148
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":148
  *             self.size = self.len + other_len
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         memcpy(self.arr+self.len, other, other_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -5700,7 +6409,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
  */
   memcpy((__pyx_v_self->arr + __pyx_v_self->len), __pyx_v_other, (__pyx_v_other_len * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":149
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":149
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         memcpy(self.arr+self.len, other, other_len*sizeof(int))
  *         self.len = self.len + other_len             # <<<<<<<<<<<<<<
@@ -5712,7 +6421,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":151
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":151
  *         self.len = self.len + other_len
  * 
  *     cdef void _clear(self):             # <<<<<<<<<<<<<<
@@ -5722,9 +6431,9 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
 
 static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_clear");
+  __Pyx_RefNannySetupContext("_clear", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":152
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":152
  * 
  *     cdef void _clear(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -5733,7 +6442,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   free(__pyx_v_self->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":153
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":153
  *     cdef void _clear(self):
  *         free(self.arr)
  *         self.len = 0             # <<<<<<<<<<<<<<
@@ -5742,7 +6451,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   __pyx_v_self->len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":154
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":154
  *         free(self.arr)
  *         self.len = 0
  *         self.size = 0             # <<<<<<<<<<<<<<
@@ -5751,7 +6460,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   __pyx_v_self->size = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":155
  *         self.len = 0
  *         self.size = 0
  *         self.arr = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -5763,7 +6472,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":157
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":157
  *         self.arr = <int*> malloc(0)
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -5773,9 +6482,9 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
 
 static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("write_handle");
+  __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":158
  * 
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -5784,7 +6493,7 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
  */
   fwrite((&__pyx_v_self->len), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":159
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":159
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(int), 1, f)
  *         fwrite(self.arr, sizeof(int), self.len, f)             # <<<<<<<<<<<<<<
@@ -5796,24 +6505,13 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":161
- *         fwrite(self.arr, sizeof(int), self.len, f)
- * 
- *     def write(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write");
+  __Pyx_RefNannySetupContext("write (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -5823,8 +6521,26 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_31write(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":161
+ *         fwrite(self.arr, sizeof(int), self.len, f)
+ * 
+ *     def write(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":163
+static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":163
  *     def write(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -5833,16 +6549,16 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":164
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":164
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":165
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":165
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -5857,7 +6573,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":167
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":167
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -5867,9 +6583,9 @@ static PyObject *__pyx_pf_3_sa_7IntList_16write(PyObject *__pyx_v_self, PyObject
 
 static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__pyx_v_self, FILE *__pyx_v_f) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("read_handle");
+  __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":168
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":168
  * 
  *     cdef void read_handle(self, FILE* f):
  *         (self.arr)             # <<<<<<<<<<<<<<
@@ -5878,7 +6594,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":169
  *     cdef void read_handle(self, FILE* f):
  *         (self.arr)
  *         fread(&(self.len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -5887,7 +6603,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   fread((&__pyx_v_self->len), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":170
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":170
  *         (self.arr)
  *         fread(&(self.len), sizeof(int), 1, f)
  *         self.arr = <int*> malloc(self.len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -5896,7 +6612,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->arr = ((int *)malloc((__pyx_v_self->len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":171
  *         fread(&(self.len), sizeof(int), 1, f)
  *         self.arr = <int*> malloc(self.len * sizeof(int))
  *         self.size = self.len             # <<<<<<<<<<<<<<
@@ -5905,7 +6621,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->size = __pyx_v_self->len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":172
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":172
  *         self.arr = <int*> malloc(self.len * sizeof(int))
  *         self.size = self.len
  *         fread(self.arr, sizeof(int), self.len, f)             # <<<<<<<<<<<<<<
@@ -5917,24 +6633,13 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":174
- *         fread(self.arr, sizeof(int), self.len, f)
- * 
- *     def read(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read");
+  __Pyx_RefNannySetupContext("read (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -5944,8 +6649,26 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7IntList_33read(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":174
+ *         fread(self.arr, sizeof(int), self.len, f)
+ * 
+ *     def read(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":176
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":176
  *     def read(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -5954,15 +6677,15 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":177
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":177
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_IntList *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_IntList *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":178
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":178
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -5975,7 +6698,21 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":13
+/* Python wrapper */
+static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_9StringMap___cinit__(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":13
  *     cdef int index(self, char *s)
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -5983,30 +6720,35 @@ static PyObject *__pyx_pf_3_sa_7IntList_17read(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":14
  * 
  *     def __cinit__(self):
  *         self.vocab = stringmap_new()             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self)->vocab = stringmap_new();
+  __pyx_v_self->vocab = stringmap_new();
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":16
+/* Python wrapper */
+static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_9StringMap_2__dealloc__(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":16
  *         self.vocab = stringmap_new()
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -6014,24 +6756,23 @@ static int __pyx_pf_3_sa_9StringMap___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":17
  * 
  *     def __dealloc__(self):
  *         stringmap_delete(self.vocab)             # <<<<<<<<<<<<<<
  * 
  *     cdef char *word(self, int i):
  */
-  stringmap_delete(((struct __pyx_obj_3_sa_StringMap *)__pyx_v_self)->vocab);
+  stringmap_delete(__pyx_v_self->vocab);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":19
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":19
  *         stringmap_delete(self.vocab)
  * 
  *     cdef char *word(self, int i):             # <<<<<<<<<<<<<<
@@ -6042,9 +6783,9 @@ static void __pyx_pf_3_sa_9StringMap_1__dealloc__(PyObject *__pyx_v_self) {
 static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx_v_self, int __pyx_v_i) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("word");
+  __Pyx_RefNannySetupContext("word", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":20
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":20
  * 
  *     cdef char *word(self, int i):
  *         return stringmap_word(self.vocab, i)             # <<<<<<<<<<<<<<
@@ -6060,7 +6801,7 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":22
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":22
  *         return stringmap_word(self.vocab, i)
  * 
  *     cdef int index(self, char *s):             # <<<<<<<<<<<<<<
@@ -6070,9 +6811,9 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
 static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_v_self, char *__pyx_v_s) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("index");
+  __Pyx_RefNannySetupContext("index", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":23
  * 
  *     cdef int index(self, char *s):
  *         return stringmap_index(self.vocab, s)             # <<<<<<<<<<<<<<
@@ -6086,40 +6827,34 @@ static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":17
- *     cdef bint use_sent_id
- * 
- *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
- *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
- *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
- */
-
-static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_v_use_sent_id;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  long __pyx_t_5;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
     PyObject* values[4] = {0,0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":17
+ *     cdef bint use_sent_id
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
+ *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
+ *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -6128,7 +6863,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -6151,7 +6886,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -6180,8 +6915,25 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray___cinit__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text, __pyx_v_side, __pyx_v_use_sent_id);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  long __pyx_t_5;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":18
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}             # <<<<<<<<<<<<<<
@@ -6193,12 +6945,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__END_OF_FILE), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__END_OF_LINE), __pyx_int_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id);
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->word2id);
+  __Pyx_DECREF(__pyx_v_self->word2id);
+  __pyx_v_self->word2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":19
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":19
  *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]             # <<<<<<<<<<<<<<
@@ -6206,7 +6958,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
  *         self.sent_id = IntList(1000,1000)
  */
   __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__END_OF_FILE));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__END_OF_FILE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__END_OF_FILE));
@@ -6214,12 +6966,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   PyList_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_n_s__END_OF_LINE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__END_OF_LINE));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word);
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->id2word);
+  __Pyx_DECREF(__pyx_v_self->id2word);
+  __pyx_v_self->id2word = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":20
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -6229,12 +6981,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data));
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->data);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->data));
+  __pyx_v_self->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":21
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -6244,12 +6996,12 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_11), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id));
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sent_id);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_id));
+  __pyx_v_self->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":22
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -6259,21 +7011,21 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_12), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index));
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sent_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
+  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":23
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  *         self.use_sent_id = use_sent_id             # <<<<<<<<<<<<<<
  *         if from_binary:
  *             self.read_binary(from_binary)
  */
-  ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id = __pyx_v_use_sent_id;
+  __pyx_v_self->use_sent_id = __pyx_v_use_sent_id;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":24
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":24
  *         self.sent_index = IntList(1000,1000)
  *         self.use_sent_id = use_sent_id
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -6283,17 +7035,17 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":25
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":25
  *         self.use_sent_id = use_sent_id
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_text:
  *             if side:
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -6302,10 +7054,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":26
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -6315,7 +7067,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":27
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":27
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             if side:             # <<<<<<<<<<<<<<
@@ -6325,16 +7077,18 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_side); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":28
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":28
  *         elif from_text:
  *             if side:
  *                 self.read_bitext(from_text, (0 if side == 'source' else 1))             # <<<<<<<<<<<<<<
  *             else:
  *                 self.read_text(from_text)
  */
-      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_bitext); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_bitext); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = __Pyx_PyString_Equals(__pyx_v_side, ((PyObject *)__pyx_n_s__source), Py_EQ); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_side, ((PyObject *)__pyx_n_s__source), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_2) {
         __pyx_t_5 = 0;
       } else {
@@ -6343,7 +7097,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
       __pyx_t_3 = PyInt_FromLong(__pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(__pyx_v_from_text);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
       __Pyx_GIVEREF(__pyx_v_from_text);
@@ -6355,21 +7109,21 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L7;
+      goto __pyx_L4;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":30
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":30
  *                 self.read_bitext(from_text, (0 if side == 'source' else 1))
  *             else:
  *                 self.read_text(from_text)             # <<<<<<<<<<<<<<
  * 
  *     def __len__(self):
  */
-      __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(__pyx_v_from_text);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
       __Pyx_GIVEREF(__pyx_v_from_text);
@@ -6379,10 +7133,10 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     }
-    __pyx_L7:;
-    goto __pyx_L6;
+    __pyx_L4:;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -6397,7 +7151,18 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":32
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_2__len__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":32
  *                 self.read_text(from_text)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -6405,8 +7170,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(PyObject *__pyx_v_self, PyObject *
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -6414,16 +7178,16 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":33
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":33
  * 
  *     def __len__(self):
  *         return len(self.data)             # <<<<<<<<<<<<<<
  * 
  *     def get_data(self):
  */
-  __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->data);
   __Pyx_INCREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -6441,7 +7205,18 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":35
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_5get_data(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_5get_data(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_data (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_4get_data(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":35
  *         return len(self.data)
  * 
  *     def get_data(self):             # <<<<<<<<<<<<<<
@@ -6449,13 +7224,12 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_1__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_2get_data(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_2get_data(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_9DataArray_4get_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_data");
+  __Pyx_RefNannySetupContext("get_data", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":36
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":36
  * 
  *     def get_data(self):
  *         return self.data             # <<<<<<<<<<<<<<
@@ -6463,8 +7237,8 @@ static PyObject *__pyx_pf_3_sa_9DataArray_2get_data(PyObject *__pyx_v_self, CYTH
  *     def get_sentence_id(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->data));
+  __pyx_r = ((PyObject *)__pyx_v_self->data);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -6474,7 +7248,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_2get_data(PyObject *__pyx_v_self, CYTH
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":38
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_6get_sentence_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":38
  *         return self.data
  * 
  *     def get_sentence_id(self, i):             # <<<<<<<<<<<<<<
@@ -6482,8 +7267,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_2get_data(PyObject *__pyx_v_self, CYTH
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_3get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_3get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -6491,9 +7275,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3get_sentence_id(PyObject *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_id");
+  __Pyx_RefNannySetupContext("get_sentence_id", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":39
  * 
  *     def get_sentence_id(self, i):
  *         return self.sent_id.arr[i]             # <<<<<<<<<<<<<<
@@ -6502,7 +7286,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3get_sentence_id(PyObject *__pyx_v_sel
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -6520,7 +7304,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3get_sentence_id(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":41
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_8get_sentence(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":41
  *         return self.sent_id.arr[i]
  * 
  *     def get_sentence(self, i):             # <<<<<<<<<<<<<<
@@ -6528,8 +7323,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_3get_sentence_id(PyObject *__pyx_v_sel
  *         sent = []
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_sent = NULL;
@@ -6543,10 +7337,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence");
+  __Pyx_RefNannySetupContext("get_sentence", 0);
   __Pyx_INCREF(__pyx_v_i);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":43
  *     def get_sentence(self, i):
  *         cdef int j, start, stop
  *         sent = []             # <<<<<<<<<<<<<<
@@ -6554,11 +7348,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self,
  *         stop = self.sent_index.arr[i+1]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_sent = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":44
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":44
  *         cdef int j, start, stop
  *         sent = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
@@ -6566,9 +7360,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self,
  *         for i from start <= i < stop:
  */
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":45
  *         sent = []
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
@@ -6579,9 +7373,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_stop = (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_stop = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":46
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -6596,25 +7390,22 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self,
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":47
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":47
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])             # <<<<<<<<<<<<<<
  *         return sent
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_sent) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = __Pyx_GetItemInt(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_self->id2word, (__pyx_v_self->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyList_Append(__pyx_v_sent, __pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":46
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -6627,7 +7418,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self,
   __pyx_v_i = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":48
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":48
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])
  *         return sent             # <<<<<<<<<<<<<<
@@ -6653,7 +7444,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":50
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_11get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_11get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence_position (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_10get_sentence_position(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":50
  *         return sent
  * 
  *     def get_sentence_position(self, loc):             # <<<<<<<<<<<<<<
@@ -6661,8 +7463,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence(PyObject *__pyx_v_self,
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_5get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_5get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_9DataArray_10get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -6671,9 +7472,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_sentence_position(PyObject *__pyx
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_position");
+  __Pyx_RefNannySetupContext("get_sentence_position", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":51
  * 
  *     def get_sentence_position(self, loc):
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]             # <<<<<<<<<<<<<<
@@ -6682,7 +7483,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_sentence_position(PyObject *__pyx
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index->arr[(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_index->arr[(__pyx_v_self->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyNumber_Subtract(__pyx_v_loc, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
@@ -6704,7 +7505,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_sentence_position(PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":53
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_13get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_13get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_12get_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_word));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":53
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]
  * 
  *     def get_id(self, word):             # <<<<<<<<<<<<<<
@@ -6712,8 +7524,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_5get_sentence_position(PyObject *__pyx
  *             self.word2id[word] = len(self.id2word)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_6get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_6get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
+static PyObject *__pyx_pf_3_sa_9DataArray_12get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -6723,50 +7534,50 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_id(PyObject *__pyx_v_self, PyObje
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_id");
+  __Pyx_RefNannySetupContext("get_id", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":54
  * 
  *     def get_id(self, word):
  *         if not word in self.word2id:             # <<<<<<<<<<<<<<
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  */
-  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (!__pyx_t_1);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":55
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":55
  *     def get_id(self, word):
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
  *             self.id2word.append(word)
  *         return self.word2id[word]
  */
-    __pyx_t_3 = ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word;
+    __pyx_t_3 = __pyx_v_self->id2word;
     __Pyx_INCREF(__pyx_t_3);
     __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (PyObject_SetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_self->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":56
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":56
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
  *         return self.word2id[word]
  * 
  */
-    __pyx_t_3 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Append(__pyx_v_self->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":57
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *         return self.word2id[word]             # <<<<<<<<<<<<<<
@@ -6774,7 +7585,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_id(PyObject *__pyx_v_self, PyObje
  *     def get_word(self, id):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_3 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -6792,7 +7603,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_id(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":59
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_15get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_15get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_word (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_14get_word(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_id));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":59
  *         return self.word2id[word]
  * 
  *     def get_word(self, id):             # <<<<<<<<<<<<<<
@@ -6800,17 +7622,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_id(PyObject *__pyx_v_self, PyObje
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_7get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_7get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
+static PyObject *__pyx_pf_3_sa_9DataArray_14get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_word");
+  __Pyx_RefNannySetupContext("get_word", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def get_word(self, id):
  *         return self.id2word[id]             # <<<<<<<<<<<<<<
@@ -6818,7 +7639,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7get_word(PyObject *__pyx_v_self, PyOb
  *     def write_text(self, char* filename):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetItem(__pyx_v_self->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -6836,7 +7657,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7get_word(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":62
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_16write_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":62
  *         return self.id2word[id]
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -6844,9 +7686,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_7get_word(PyObject *__pyx_v_self, PyOb
  *             for w_id in self.data:
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_w_id = NULL;
   PyObject *__pyx_r = NULL;
@@ -6857,10 +7697,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, Py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  int __pyx_t_9;
-  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
+  int __pyx_t_10;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
   PyObject *__pyx_t_13 = NULL;
@@ -6868,18 +7708,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -6890,7 +7721,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, Py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -6902,153 +7733,160 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":64
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":64
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             for w_id in self.data:             # <<<<<<<<<<<<<<
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->data)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->data))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_w_id);
-            __pyx_v_w_id = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_w_id = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":65
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
  *         with open(filename, "w") as f:
  *             for w_id in self.data:
  *                 if w_id > 1:             # <<<<<<<<<<<<<<
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  */
-            __pyx_t_2 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            if (__pyx_t_9) {
+            __pyx_t_1 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            if (__pyx_t_10) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":66
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":66
  *             for w_id in self.data:
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))             # <<<<<<<<<<<<<<
  *                 if w_id == 1:
  *                     f.write("\n")
  */
-              __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_1);
+              __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_word); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_word); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_v_w_id);
               PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_w_id);
               __Pyx_GIVEREF(__pyx_v_w_id);
-              __pyx_t_12 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(((PyObject *)__pyx_t_11));
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_12);
               PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
               __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
               __pyx_t_11 = 0;
-              __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-              goto __pyx_L19;
+              goto __pyx_L18;
             }
-            __pyx_L19:;
+            __pyx_L18:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":67
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":67
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:             # <<<<<<<<<<<<<<
  *                     f.write("\n")
  * 
  */
-            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            if (__pyx_t_9) {
+            if (__pyx_t_10) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              goto __pyx_L20;
+              goto __pyx_L19;
             }
-            __pyx_L20:;
+            __pyx_L19:;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
-        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7057,75 +7895,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, Py
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_12);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
-          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
+          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __pyx_t_14 = (!__pyx_t_9);
+          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_14 = (!__pyx_t_10);
           if (__pyx_t_14) {
-            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_12);
             __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_12, __pyx_t_11);
-            __pyx_t_1 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_ErrRestore(__pyx_t_4, __pyx_t_12, __pyx_t_11);
+            __pyx_t_4 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7133,7 +7971,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
@@ -7146,7 +7984,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":70
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_19read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_19read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_18read_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":70
  *                     f.write("\n")
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -7154,9 +8013,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8write_text(PyObject *__pyx_v_self, Py
  *             self.read_text_data(fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_fp = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -7174,18 +8031,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7198,7 +8046,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyO
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -7208,12 +8056,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyO
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -7221,39 +8069,40 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyO
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_fp = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_v_fp = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:
  *             self.read_text_data(fp)             # <<<<<<<<<<<<<<
  * 
  *     def read_bitext(self, char* filename, int side):
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_INCREF(__pyx_v_fp);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fp);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fp);
           __Pyx_GIVEREF(__pyx_v_fp);
-          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7262,57 +8111,57 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyO
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_3, __pyx_t_2);
-            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L19;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L18;
           }
-          __pyx_L19:;
+          __pyx_L18:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L16_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -7326,11 +8175,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyO
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L20;
-    __pyx_L5_error:;
+    goto __pyx_L19;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L20:;
+    __pyx_L19:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7348,9 +8197,65 @@ static PyObject *__pyx_pf_3_sa_9DataArray_9read_text(PyObject *__pyx_v_self, PyO
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_21read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_21read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  char *__pyx_v_filename;
+  int __pyx_v_side;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_bitext (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_20read_bitext(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -7358,37 +8263,45 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11read_bitext_genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_11read_bitext_genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self) {
   struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("genexpr");
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_2_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)__pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *) __pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  __pyx_self = __pyx_self;
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_11read_bitext_1generator6;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_9DataArray_11read_bitext_2generator6, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.DataArray.read_bitext.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
@@ -7396,8 +8309,8 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -7406,7 +8319,8 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
     __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
@@ -7415,12 +8329,20 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -7454,7 +8376,7 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -7465,7 +8387,7 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -7474,12 +8396,13 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -7487,10 +8410,8 @@ static PyObject *__pyx_gb_3_sa_11read_bitext_1generator6(struct __pyx_obj_3_sa__
  *             data = (line.split(' ||| ')[side] for line in fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_cur_scope;
-  char *__pyx_v_filename;
   PyObject *__pyx_v_data = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -7508,60 +8429,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
-  __Pyx_RefNannySetupContext("read_bitext");
+  __Pyx_RefNannySetupContext("read_bitext", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  {
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-    }
-    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_cur_scope->__pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_cur_scope->__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __pyx_cur_scope->__pyx_v_side = __pyx_v_side;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":75
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":75
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7574,7 +8451,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self,
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -7584,12 +8461,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self,
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L6_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -7597,52 +8474,53 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self,
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_cur_scope->__pyx_v_fp = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_cur_scope->__pyx_v_fp = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
  *             self.read_text_data(data)
  * 
  */
-          __pyx_t_2 = __pyx_pf_3_sa_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_v_data = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_t_1 = __pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_v_data = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":77
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":77
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)
  *             self.read_text_data(data)             # <<<<<<<<<<<<<<
  * 
  *     def read_text_data(self, data):
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
           __Pyx_INCREF(__pyx_v_data);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_data);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_data);
           __Pyx_GIVEREF(__pyx_v_data);
-          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L10_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L17_try_end;
-        __pyx_L10_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":75
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":75
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -7650,58 +8528,58 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self,
  *             self.read_text_data(data)
  */
         /*except:*/ {
-          __Pyx_AddTraceback("_sa.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_3, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
-            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_3, __pyx_t_2);
-            __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L12_except_error;}
-            goto __pyx_L20;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
+            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L18;
           }
-          __pyx_L20:;
+          __pyx_L18:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L11_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L12_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L11_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L17_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -7715,11 +8593,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self,
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L21;
-    __pyx_L6_error:;
+    goto __pyx_L19;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L21:;
+    __pyx_L19:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -7739,7 +8617,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":79
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_23read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_23read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text_data (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_22read_text_data(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_data));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":79
  *             self.read_text_data(data)
  * 
  *     def read_text_data(self, data):             # <<<<<<<<<<<<<<
@@ -7747,8 +8636,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10read_bitext(PyObject *__pyx_v_self,
  *         for line_num, line in enumerate(data):
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
+static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data) {
   int __pyx_v_word_count;
   PyObject *__pyx_v_line_num = NULL;
   PyObject *__pyx_v_line = NULL;
@@ -7768,9 +8656,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text_data");
+  __Pyx_RefNannySetupContext("read_text_data", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":80
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":80
  * 
  *     def read_text_data(self, data):
  *         cdef int word_count = 0             # <<<<<<<<<<<<<<
@@ -7779,7 +8667,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
  */
   __pyx_v_word_count = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":81
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":81
  *     def read_text_data(self, data):
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):             # <<<<<<<<<<<<<<
@@ -7797,12 +8685,20 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
@@ -7826,7 +8722,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":82
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":82
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
@@ -7835,12 +8731,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
  */
     __pyx_t_5 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":83
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":83
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)
  *             for word in line.split():             # <<<<<<<<<<<<<<
@@ -7862,12 +8758,20 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
     }
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_6)) {
+      if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
-        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
-      } else if (PyTuple_CheckExact(__pyx_t_6)) {
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
         __pyx_t_5 = __pyx_t_8(__pyx_t_6);
         if (unlikely(!__pyx_t_5)) {
@@ -7883,17 +8787,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
       __pyx_v_word = __pyx_t_5;
       __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":84
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":84
  *             self.sent_index.append(word_count)
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))             # <<<<<<<<<<<<<<
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  */
-      __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+      __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_word);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_word);
       __Pyx_GIVEREF(__pyx_v_word);
@@ -7901,35 +8805,35 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":85
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":85
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:             # <<<<<<<<<<<<<<
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  */
-      if (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id) {
+      if (__pyx_v_self->use_sent_id) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":86
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":86
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *                 word_count = word_count + 1
  *             self.data.append(1)
  */
-        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        goto __pyx_L9;
+        goto __pyx_L7;
       }
-      __pyx_L9:;
+      __pyx_L7:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":87
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":87
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -7940,41 +8844,41 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
     }
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":88
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":88
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  *             self.data.append(1)             # <<<<<<<<<<<<<<
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  */
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":89
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":89
  *                 word_count = word_count + 1
  *             self.data.append(1)
  *             if self.use_sent_id:             # <<<<<<<<<<<<<<
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  */
-    if (((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->use_sent_id) {
+    if (__pyx_v_self->use_sent_id) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":90
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":90
  *             self.data.append(1)
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *             word_count = word_count + 1
  *         self.data.append(0)
  */
-      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L10;
+      goto __pyx_L8;
     }
-    __pyx_L10:;
+    __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":91
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":91
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -7986,18 +8890,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":92
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":92
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  *         self.data.append(0)             # <<<<<<<<<<<<<<
  *         self.sent_index.append(word_count)
  * 
  */
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":93
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":93
  *             word_count = word_count + 1
  *         self.data.append(0)
  *         self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
@@ -8006,7 +8910,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
  */
   __pyx_t_1 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -8031,24 +8935,13 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_text_data(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":96
- * 
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_9DataArray_12read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_12read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_25read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_25read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -8058,8 +8951,26 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12read_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_24read_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":98
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":96
+ * 
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_24read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":98
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -8068,16 +8979,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12read_binary(PyObject *__pyx_v_self,
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":99
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":99
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":100
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":100
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -8092,7 +9003,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12read_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":102
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":102
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -8103,7 +9014,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12read_binary(PyObject *__pyx_v_self,
 static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, FILE *__pyx_v_f) {
   int __pyx_v_num_words;
   int __pyx_v_word_len;
-  unsigned int __pyx_v_i;
+  CYTHON_UNUSED unsigned int __pyx_v_i;
   char *__pyx_v_word;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -8115,9 +9026,9 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_handle");
+  __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":107
  *         cdef char* word
  * 
  *         self.data.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8126,7 +9037,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->read_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":108
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":108
  * 
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8135,7 +9046,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":109
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":109
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8144,7 +9055,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->read_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":110
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":110
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8153,7 +9064,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":111
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":111
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):             # <<<<<<<<<<<<<<
@@ -8164,7 +9075,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":112
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":112
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8173,7 +9084,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":113
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":113
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -8182,7 +9093,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":114
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":114
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -8191,7 +9102,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":115
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":115
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
@@ -8210,7 +9121,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":116
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":116
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
@@ -8224,7 +9135,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":117
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":117
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -8234,7 +9145,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     free(__pyx_v_word);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":118
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":118
  *             self.id2word.append(word)
  *             free(word)
  *         if len(self.sent_id) == 0:             # <<<<<<<<<<<<<<
@@ -8248,7 +9159,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __pyx_t_6 = (__pyx_t_4 == 0);
   if (__pyx_t_6) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":119
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":119
  *             free(word)
  *         if len(self.sent_id) == 0:
  *             self.use_sent_id = False             # <<<<<<<<<<<<<<
@@ -8260,7 +9171,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":121
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":121
  *             self.use_sent_id = False
  *         else:
  *             self.use_sent_id = True             # <<<<<<<<<<<<<<
@@ -8280,7 +9191,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":123
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":123
  *             self.use_sent_id = True
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -8302,9 +9213,9 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_handle");
+  __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":127
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":127
  *         cdef int num_words
  * 
  *         self.data.write_handle(f)             # <<<<<<<<<<<<<<
@@ -8313,7 +9224,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->write_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":128
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":128
  * 
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -8322,7 +9233,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":129
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":129
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)             # <<<<<<<<<<<<<<
@@ -8331,7 +9242,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->write_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":130
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":130
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2             # <<<<<<<<<<<<<<
@@ -8344,7 +9255,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_num_words = (__pyx_t_2 - 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":131
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":131
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8353,7 +9264,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":132
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:             # <<<<<<<<<<<<<<
@@ -8372,12 +9283,20 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_3)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_3)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_1 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_1)) {
@@ -8393,7 +9312,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_v_word = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":133
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":133
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
@@ -8403,7 +9322,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":134
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":134
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -8412,7 +9331,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":135
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":135
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -8434,24 +9353,13 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":137
- *             fwrite(<char *>word, sizeof(char), word_len, f)
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9DataArray_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_27write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_27write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -8461,8 +9369,26 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_26write_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":139
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":137
+ *             fwrite(<char *>word, sizeof(char), word_len, f)
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_26write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":139
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -8471,16 +9397,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_binary(PyObject *__pyx_v_self,
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":140
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":140
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":141
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":141
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -8495,7 +9421,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":143
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced_handle (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_28write_enhanced_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_f));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
  *         fclose(f)
  * 
  *     def write_enhanced_handle(self, f):             # <<<<<<<<<<<<<<
@@ -8503,8 +9440,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_13write_binary(PyObject *__pyx_v_self,
  *             f.write("%d " %i)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f) {
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_word = NULL;
   PyObject *__pyx_r = NULL;
@@ -8518,30 +9454,38 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced_handle");
+  __Pyx_RefNannySetupContext("write_enhanced_handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":144
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":144
  * 
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data))) {
-    __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self->data)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->data))) {
+    __pyx_t_1 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -8557,7 +9501,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
     __pyx_v_i = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":145
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":145
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -8569,7 +9513,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
     __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
@@ -8581,7 +9525,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -8595,28 +9539,36 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":147
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":147
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_index:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index))) {
-    __pyx_t_5 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_index))) {
+    __pyx_t_5 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_3 = Py_TYPE(__pyx_t_5)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_5)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_5)) break;
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_5)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_1 = __pyx_t_3(__pyx_t_5);
       if (unlikely(!__pyx_t_1)) {
@@ -8632,7 +9584,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":148
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":148
  *         f.write("\n")
  *         for i in self.sent_index:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -8644,7 +9596,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
     __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_6));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
     __pyx_t_6 = 0;
@@ -8656,7 +9608,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
   }
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -8670,28 +9622,36 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":150
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":150
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_id:             # <<<<<<<<<<<<<<
  *             f.write("%d " %i)
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id))) {
-    __pyx_t_6 = ((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_id)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_id))) {
+    __pyx_t_6 = ((PyObject *)__pyx_v_self->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_3 = Py_TYPE(__pyx_t_6)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_6)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_6)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_6)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_6);
       if (unlikely(!__pyx_t_5)) {
@@ -8707,7 +9667,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
     __pyx_v_i = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":151
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":151
  *         f.write("\n")
  *         for i in self.sent_id:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -8719,7 +9679,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
     __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
     __pyx_t_4 = 0;
@@ -8731,7 +9691,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
   }
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -8745,28 +9705,36 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":153
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":153
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for word in self.id2word:             # <<<<<<<<<<<<<<
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")
  */
-  if (PyList_CheckExact(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word)) {
-    __pyx_t_4 = ((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
+  if (PyList_CheckExact(__pyx_v_self->id2word) || PyTuple_CheckExact(__pyx_v_self->id2word)) {
+    __pyx_t_4 = __pyx_v_self->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_self->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_4)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_4)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_6 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_6)) {
@@ -8782,7 +9750,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
     __pyx_v_word = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":154
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":154
  *         f.write("\n")
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))             # <<<<<<<<<<<<<<
@@ -8791,10 +9759,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
  */
     __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self)->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_word);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_word);
     __Pyx_GIVEREF(__pyx_v_word);
@@ -8805,7 +9773,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
@@ -8817,7 +9785,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -8848,7 +9816,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":157
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_31write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_31write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9DataArray_30write_enhanced(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":157
  *         f.write("\n")
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -8856,9 +9845,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_enhanced_handle(PyObject *__py
  *             self.write_enhanced_handle(self, f)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -8876,18 +9863,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":158
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -8897,7 +9875,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_sel
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -8909,53 +9887,54 @@ static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_sel
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":159
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":159
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.write_enhanced_handle(self, f)             # <<<<<<<<<<<<<<
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s_27); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          __Pyx_INCREF(__pyx_v_self);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self);
-          __Pyx_GIVEREF(__pyx_v_self);
+          __Pyx_INCREF(((PyObject *)__pyx_v_self));
+          PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
           __Pyx_INCREF(__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":158
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":158
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -8963,75 +9942,75 @@ static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_sel
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_7);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-          __Pyx_INCREF(__pyx_t_7);
-          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7);
-          __Pyx_GIVEREF(__pyx_t_7);
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __pyx_t_10 = PyObject_Call(__pyx_t_3, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
-            __Pyx_GIVEREF(__pyx_t_7);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_7, __pyx_t_2, __pyx_t_1);
-            __pyx_t_7 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L19;
+            __Pyx_GIVEREF(__pyx_t_4);
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_4);
+            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_4 = 0; 
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L18;
           }
-          __pyx_L19:;
+          __pyx_L18:;
           __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L20;
-    __pyx_L5_error:;
+    goto __pyx_L19;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L20:;
+    __pyx_L19:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -9039,7 +10018,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_sel
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -9050,7 +10029,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":12
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":12
  *     cdef IntList sent_index
  * 
  *     cdef int link(self, int i, int j):             # <<<<<<<<<<<<<<
@@ -9058,12 +10037,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_15write_enhanced(PyObject *__pyx_v_sel
  *         return i*65536 + j
  */
 
-static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
+static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("link");
+  __Pyx_RefNannySetupContext("link", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":14
  *     cdef int link(self, int i, int j):
  *         """Integerizes an alignment link pair"""
  *         return i*65536 + j             # <<<<<<<<<<<<<<
@@ -9079,7 +10058,19 @@ static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":16
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link); /*proto*/
+static char __pyx_doc_3_sa_9Alignment_unlink[] = "De-integerizes an alignment link pair";
+static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("unlink (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9Alignment_unlink(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((PyObject *)__pyx_v_link));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":16
  *         return i*65536 + j
  * 
  *     def unlink(self, link):             # <<<<<<<<<<<<<<
@@ -9087,9 +10078,7 @@ static int __pyx_f_3_sa_9Alignment_link(struct __pyx_obj_3_sa_Alignment *__pyx_v
  *         return (link/65536, link%65536)
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link); /*proto*/
-static char __pyx_doc_3_sa_9Alignment_unlink[] = "De-integerizes an alignment link pair";
-static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObject *__pyx_v_link) {
+static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -9098,9 +10087,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("unlink");
+  __Pyx_RefNannySetupContext("unlink", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":18
  *     def unlink(self, link):
  *         """De-integerizes an alignment link pair"""
  *         return (link/65536, link%65536)             # <<<<<<<<<<<<<<
@@ -9113,7 +10102,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
   __pyx_t_2 = PyNumber_Remainder(__pyx_v_link, __pyx_int_65536); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -9138,7 +10127,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":20
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":20
  *         return (link/65536, link%65536)
  * 
  *     cdef _unlink(self, int link, int* f, int* e):             # <<<<<<<<<<<<<<
@@ -9146,12 +10135,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(PyObject *__pyx_v_self, PyObjec
  *         e[0] = link%65536
  */
 
-static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_link, int *__pyx_v_f, int *__pyx_v_e) {
+static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_link, int *__pyx_v_f, int *__pyx_v_e) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_unlink");
+  __Pyx_RefNannySetupContext("_unlink", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":21
  * 
  *     cdef _unlink(self, int link, int* f, int* e):
  *         f[0] = link/65536             # <<<<<<<<<<<<<<
@@ -9160,7 +10149,7 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment
  */
   (__pyx_v_f[0]) = __Pyx_div_long(__pyx_v_link, 65536);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":22
  *     cdef _unlink(self, int link, int* f, int* e):
  *         f[0] = link/65536
  *         e[0] = link%65536             # <<<<<<<<<<<<<<
@@ -9175,7 +10164,28 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":24
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id) {
+  int __pyx_v_sent_id;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sent_links (wrapper)", 0);
+  assert(__pyx_arg_sent_id); {
+    __pyx_v_sent_id = __Pyx_PyInt_AsInt(__pyx_arg_sent_id); if (unlikely((__pyx_v_sent_id == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.get_sent_links", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_2get_sent_links(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((int)__pyx_v_sent_id));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":24
  *         e[0] = link%65536
  * 
  *     def get_sent_links(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -9183,9 +10193,7 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(struct __pyx_obj_3_sa_Alignment
  *         cdef int* arr
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self, PyObject *__pyx_arg_sent_id) {
-  int __pyx_v_sent_id;
+static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id) {
   struct __pyx_obj_3_sa_IntList *__pyx_v_sent_links = 0;
   int *__pyx_v_arr;
   int __pyx_v_arr_len;
@@ -9195,18 +10203,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sent_links");
-  assert(__pyx_arg_sent_id); {
-    __pyx_v_sent_id = __Pyx_PyInt_AsInt(__pyx_arg_sent_id); if (unlikely((__pyx_v_sent_id == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.get_sent_links", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("get_sent_links", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":28
  *         cdef int* arr
  *         cdef int arr_len
  *         sent_links = IntList()             # <<<<<<<<<<<<<<
@@ -9218,16 +10217,16 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
   __pyx_v_sent_links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":29
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":29
  *         cdef int arr_len
  *         sent_links = IntList()
  *         arr = self._get_sent_links(sent_id, &arr_len)             # <<<<<<<<<<<<<<
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)
  */
-  __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->__pyx_vtab)->_get_sent_links(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_v_sent_id, (&__pyx_v_arr_len));
+  __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->_get_sent_links(__pyx_v_self, __pyx_v_sent_id, (&__pyx_v_arr_len));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":30
  *         sent_links = IntList()
  *         arr = self._get_sent_links(sent_id, &arr_len)
  *         sent_links._extend_arr(arr, arr_len*2)             # <<<<<<<<<<<<<<
@@ -9236,7 +10235,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sent_links->__pyx_vtab)->_extend_arr(__pyx_v_sent_links, __pyx_v_arr, (__pyx_v_arr_len * 2));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":31
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":31
  *         arr = self._get_sent_links(sent_id, &arr_len)
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)             # <<<<<<<<<<<<<<
@@ -9245,7 +10244,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
  */
   free(__pyx_v_arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":32
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":32
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)
  *         return sent_links             # <<<<<<<<<<<<<<
@@ -9270,7 +10269,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_1get_sent_links(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":34
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":34
  *         return sent_links
  * 
  *     cdef int* _get_sent_links(self, int sent_id, int* num_links):             # <<<<<<<<<<<<<<
@@ -9290,9 +10289,9 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_get_sent_links");
+  __Pyx_RefNannySetupContext("_get_sent_links", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":37
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":37
  *         cdef int* sent_links
  *         cdef int i, start, end
  *         start = self.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -9301,7 +10300,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_v_sent_id]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":38
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":38
  *         cdef int i, start, end
  *         start = self.sent_index.arr[sent_id]
  *         end = self.sent_index.arr[sent_id+1]             # <<<<<<<<<<<<<<
@@ -9310,7 +10309,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_end = (__pyx_v_self->sent_index->arr[(__pyx_v_sent_id + 1)]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":39
  *         start = self.sent_index.arr[sent_id]
  *         end = self.sent_index.arr[sent_id+1]
  *         num_links[0] = end - start             # <<<<<<<<<<<<<<
@@ -9319,7 +10318,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   (__pyx_v_num_links[0]) = (__pyx_v_end - __pyx_v_start);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":40
  *         end = self.sent_index.arr[sent_id+1]
  *         num_links[0] = end - start
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))             # <<<<<<<<<<<<<<
@@ -9328,7 +10327,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_sent_links = ((int *)malloc(((2 * (__pyx_v_num_links[0])) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":41
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":41
  *         num_links[0] = end - start
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))
  *         for i from 0 <= i < num_links[0]:             # <<<<<<<<<<<<<<
@@ -9338,7 +10337,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   __pyx_t_1 = (__pyx_v_num_links[0]);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":42
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":42
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))
  *         for i from 0 <= i < num_links[0]:
  *             self._unlink(self.links.arr[start + i], sent_links + (2*i), sent_links + (2*i) + 1)             # <<<<<<<<<<<<<<
@@ -9350,7 +10349,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":43
  *         for i from 0 <= i < num_links[0]:
  *             self._unlink(self.links.arr[start + i], sent_links + (2*i), sent_links + (2*i) + 1)
  *         return sent_links             # <<<<<<<<<<<<<<
@@ -9371,43 +10370,38 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":45
- *         return sent_links
- * 
- *     def __cinit__(self, from_binary=None, from_text=None):             # <<<<<<<<<<<<<<
- *         self.links = IntList(1000,1000)
- *         self.sent_index = IntList(1000,1000)
- */
-
-static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
     PyObject* values[2] = {0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":45
+ *         return sent_links
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None):             # <<<<<<<<<<<<<<
+ *         self.links = IntList(1000,1000)
+ *         self.sent_index = IntList(1000,1000)
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -9420,7 +10414,7 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -9441,8 +10435,24 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_4__cinit__(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":46
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -9452,12 +10462,12 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_29), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links));
-  ((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->links);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->links));
+  __pyx_v_self->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":47
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":47
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -9467,12 +10477,12 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_k_tuple_30), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index));
-  ((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sent_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
+  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":48
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":48
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -9482,17 +10492,17 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":49
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":49
  *         self.sent_index = IntList(1000,1000)
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_text:
  *             self.read_text(from_text)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -9501,10 +10511,10 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":50
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":50
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -9514,17 +10524,17 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":51
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":51
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             self.read_text(from_text)             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -9533,9 +10543,9 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -9550,7 +10560,28 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":53
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_6read_text(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":53
  *             self.read_text(from_text)
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9558,9 +10589,7 @@ static int __pyx_pf_3_sa_9Alignment_2__cinit__(PyObject *__pyx_v_self, PyObject
  *             for line in f:
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_line = NULL;
   PyObject *__pyx_v_pairs = NULL;
@@ -9592,18 +10621,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -9616,7 +10636,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -9626,12 +10646,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -9639,10 +10659,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_v_f = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":55
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":55
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -9650,70 +10671,78 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  *                 pairs = line.split()
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_3 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_3)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_line);
-            __pyx_v_line = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_line = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":56
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":56
  *         with gzip_or_text(filename) as f:
  *             for line in f:
  *                 self.sent_index.append(len(self.links))             # <<<<<<<<<<<<<<
  *                 pairs = line.split()
  *                 for pair in pairs:
  */
-            __pyx_t_3 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
-            __Pyx_INCREF(__pyx_t_3);
-            __pyx_t_10 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = ((PyObject *)__pyx_v_self->links);
+            __Pyx_INCREF(__pyx_t_2);
+            __pyx_t_10 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":57
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":57
  *             for line in f:
  *                 self.sent_index.append(len(self.links))
  *                 pairs = line.split()             # <<<<<<<<<<<<<<
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_XDECREF(__pyx_v_pairs);
-            __pyx_v_pairs = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_pairs = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":58
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":58
  *                 self.sent_index.append(len(self.links))
  *                 pairs = line.split()
  *                 for pair in pairs:             # <<<<<<<<<<<<<<
@@ -9721,158 +10750,173 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  *                     self.links.append(self.link(i, j))
  */
             if (PyList_CheckExact(__pyx_v_pairs) || PyTuple_CheckExact(__pyx_v_pairs)) {
-              __pyx_t_3 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
+              __pyx_t_2 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_2); __pyx_t_10 = 0;
               __pyx_t_11 = NULL;
             } else {
-              __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_3);
-              __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
+              __pyx_t_10 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_11 = Py_TYPE(__pyx_t_2)->tp_iternext;
             }
             for (;;) {
-              if (PyList_CheckExact(__pyx_t_3)) {
-                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
-                __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++;
-              } else if (PyTuple_CheckExact(__pyx_t_3)) {
-                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-                __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++;
+              if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_2)) {
+                if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_2)) break;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #else
+                __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #endif
+              } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_2)) {
+                if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #else
+                __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #endif
               } else {
-                __pyx_t_1 = __pyx_t_11(__pyx_t_3);
-                if (unlikely(!__pyx_t_1)) {
+                __pyx_t_3 = __pyx_t_11(__pyx_t_2);
+                if (unlikely(!__pyx_t_3)) {
                   if (PyErr_Occurred()) {
                     if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                    else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                   }
                   break;
                 }
-                __Pyx_GOTREF(__pyx_t_1);
+                __Pyx_GOTREF(__pyx_t_3);
               }
               __Pyx_XDECREF(__pyx_v_pair);
-              __pyx_v_pair = __pyx_t_1;
-              __pyx_t_1 = 0;
+              __pyx_v_pair = __pyx_t_3;
+              __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":59
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))             # <<<<<<<<<<<<<<
  *                     self.links.append(self.link(i, j))
  *             self.sent_index.append(len(self.links))
  */
-              __pyx_t_1 = PyObject_GetAttr(__pyx_v_pair, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_12 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_32), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_3 = PyObject_GetAttr(__pyx_v_pair, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_12 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_k_tuple_32), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_3);
               __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-              PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
+              PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
               __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-              PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
+              PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_12);
               __Pyx_GIVEREF(__pyx_t_12);
               __pyx_t_12 = 0;
-              __pyx_t_12 = PyObject_Call(__pyx_builtin_map, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_builtin_map, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+              __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
               if ((likely(PyTuple_CheckExact(__pyx_t_12))) || (PyList_CheckExact(__pyx_t_12))) {
                 PyObject* sequence = __pyx_t_12;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                Py_ssize_t size = Py_SIZE(sequence);
+                #else
+                Py_ssize_t size = PySequence_Size(sequence);
+                #endif
+                if (unlikely(size != 2)) {
+                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                }
+                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                  }
-                  __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
+                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                  }
-                  __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
+                  __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
                 }
-                __Pyx_INCREF(__pyx_t_1);
+                __Pyx_INCREF(__pyx_t_3);
                 __Pyx_INCREF(__pyx_t_13);
+                #else
+                __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_t_13 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                #endif
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              } else {
+              } else
+              {
                 Py_ssize_t index = -1;
-                __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
                 __pyx_t_15 = Py_TYPE(__pyx_t_14)->tp_iternext;
-                index = 0; __pyx_t_1 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_1)) goto __pyx_L21_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_1);
-                index = 1; __pyx_t_13 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L21_unpacking_failed;
+                index = 0; __pyx_t_3 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_3)) goto __pyx_L20_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_3);
+                index = 1; __pyx_t_13 = __pyx_t_15(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L20_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_13);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_14), 2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_15(__pyx_t_14), 2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_t_15 = NULL;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                goto __pyx_L22_unpacking_done;
-                __pyx_L21_unpacking_failed:;
+                goto __pyx_L21_unpacking_done;
+                __pyx_L20_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                __pyx_L22_unpacking_done:;
+                __pyx_t_15 = NULL;
+                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                __pyx_L21_unpacking_done:;
               }
               __Pyx_XDECREF(__pyx_v_i);
-              __pyx_v_i = __pyx_t_1;
-              __pyx_t_1 = 0;
+              __pyx_v_i = __pyx_t_3;
+              __pyx_t_3 = 0;
               __Pyx_XDECREF(__pyx_v_j);
               __pyx_v_j = __pyx_t_13;
               __pyx_t_13 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":60
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":60
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))
  *                     self.links.append(self.link(i, j))             # <<<<<<<<<<<<<<
  *             self.sent_index.append(len(self.links))
  * 
  */
-              __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_t_12 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->__pyx_vtab)->link(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), __pyx_t_16, __pyx_t_17)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->link(__pyx_v_self, __pyx_t_16, __pyx_t_17)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __pyx_t_13 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links), __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_13 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->links), __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_13);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
             }
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":61
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":61
  *                     (i, j) = map(int, pair.split('-'))
  *                     self.links.append(self.link(i, j))
  *             self.sent_index.append(len(self.links))             # <<<<<<<<<<<<<<
  * 
  *     def read_binary(self, char* filename):
  */
-          __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links);
-          __Pyx_INCREF(__pyx_t_2);
-          __pyx_t_8 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = ((PyObject *)__pyx_v_self->links);
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_t_8 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_3 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -9881,57 +10925,57 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_13) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_13) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-          __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_3);
-          __Pyx_GIVEREF(__pyx_t_3);
+          __pyx_t_12 = PyTuple_New(3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_12);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_13);
           PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_t_13);
           __Pyx_GIVEREF(__pyx_t_13);
           __pyx_t_19 = PyObject_Call(__pyx_t_4, __pyx_t_12, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_19);
           __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_19);
           __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-          if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_20 = (!__pyx_t_18);
           if (__pyx_t_20) {
-            __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_13);
-            __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_13);
-            __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_13 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L25;
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_13);
+            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_13 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L24;
           }
-          __pyx_L25:;
+          __pyx_L24:;
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L16_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -9945,11 +10989,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
         if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L26;
-    __pyx_L5_error:;
+    goto __pyx_L25;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L26:;
+    __pyx_L25:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -9975,24 +11019,13 @@ static PyObject *__pyx_pf_3_sa_9Alignment_3read_text(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":63
- *             self.sent_index.append(len(self.links))
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -10002,8 +11035,26 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_8read_binary(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":63
+ *             self.sent_index.append(len(self.links))
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "r")
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":65
+static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":65
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -10012,25 +11063,25 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":66
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":66
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.links.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.sent_index.read_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->read_handle(__pyx_v_self->links, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":67
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":67
  *         f = fopen(filename, "r")
  *         self.links.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":68
  *         self.links.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -10045,7 +11096,28 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":70
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_10write_text(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":70
  *         fclose(f)
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -10053,9 +11125,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_4read_binary(PyObject *__pyx_v_self, P
  *             sent_num = 0
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_sent_num = NULL;
   PyObject *__pyx_v_i = NULL;
@@ -10068,9 +11138,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   PyObject *__pyx_t_10 = NULL;
   int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
@@ -10080,18 +11150,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10102,7 +11163,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -10114,23 +11175,24 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":72
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":72
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             sent_num = 0             # <<<<<<<<<<<<<<
@@ -10140,7 +11202,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_sent_num = __pyx_int_0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":73
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":73
  *         with open(filename, "w") as f:
  *             sent_num = 0
  *             for i, link in enumerate(self.links):             # <<<<<<<<<<<<<<
@@ -10148,46 +11210,54 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  *                     f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_1 = __pyx_int_0;
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links))) {
-            __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links); __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_4 = __pyx_int_0;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->links)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->links))) {
+            __pyx_t_1 = ((PyObject *)__pyx_v_self->links); __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->links)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_9 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_9 = __pyx_t_8(__pyx_t_2);
-              if (unlikely(!__pyx_t_9)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_9);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_link);
-            __pyx_v_link = __pyx_t_9;
-            __pyx_t_9 = 0;
-            __Pyx_INCREF(__pyx_t_1);
+            __pyx_v_link = __pyx_t_2;
+            __pyx_t_2 = 0;
+            __Pyx_INCREF(__pyx_t_4);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_9 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_1);
-            __pyx_t_1 = __pyx_t_9;
-            __pyx_t_9 = 0;
+            __pyx_v_i = __pyx_t_4;
+            __pyx_t_2 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_4);
+            __pyx_t_4 = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":74
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":74
  *             sent_num = 0
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:             # <<<<<<<<<<<<<<
@@ -10195,107 +11265,106 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  *                     sent_num = sent_num + 1
  */
             while (1) {
-              __pyx_t_9 = PyObject_GetItem(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index), __pyx_v_sent_num); if (!__pyx_t_9) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_9);
-              __pyx_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_9, Py_GE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_2 = PyObject_GetItem(((PyObject *)__pyx_v_self->sent_index), __pyx_v_sent_num); if (!__pyx_t_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_GE); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               if (!__pyx_t_11) break;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":75
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":75
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  */
-              __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_k_tuple_34), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_2 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_k_tuple_34), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":76
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":76
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")
  *                     sent_num = sent_num + 1             # <<<<<<<<<<<<<<
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")
  */
-              __pyx_t_9 = PyNumber_Add(__pyx_v_sent_num, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_9);
+              __pyx_t_2 = PyNumber_Add(__pyx_v_sent_num, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_2);
               __Pyx_DECREF(__pyx_v_sent_num);
-              __pyx_v_sent_num = __pyx_t_9;
-              __pyx_t_9 = 0;
+              __pyx_v_sent_num = __pyx_t_2;
+              __pyx_t_2 = 0;
             }
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":77
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":77
  *                     f.write("\n")
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__unlink); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__unlink); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
             __Pyx_INCREF(__pyx_v_link);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_link);
             __Pyx_GIVEREF(__pyx_v_link);
-            __pyx_t_13 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_13 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_13);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __pyx_t_12 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_35), __pyx_t_13); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_35), __pyx_t_13); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_12));
             __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_13);
             PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_t_12));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
             __pyx_t_12 = 0;
-            __pyx_t_12 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":78
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def write_binary(self, char* filename):
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_36), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_36), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10304,75 +11373,75 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_12) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_4, &__pyx_t_12) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-          __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_13);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_12);
           PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __pyx_t_14 = PyObject_Call(__pyx_t_3, __pyx_t_13, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_14);
           __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_15 = (!__pyx_t_11);
           if (__pyx_t_15) {
-            __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_12);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_12);
-            __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_12 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_4, __pyx_t_12);
+            __pyx_t_1 = 0; __pyx_t_4 = 0; __pyx_t_12 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
+          __pyx_L22:;
           __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_37, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_37, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -10380,7 +11449,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_XDECREF(__pyx_t_13);
@@ -10396,24 +11465,13 @@ static PyObject *__pyx_pf_3_sa_9Alignment_5write_text(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":80
- *             f.write("\n")
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -10423,8 +11481,26 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_12write_binary(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":80
+ *             f.write("\n")
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":82
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":82
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -10433,25 +11509,25 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":83
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":83
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.links.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.sent_index.write_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->write_handle(__pyx_v_self->links, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":84
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":84
  *         f = fopen(filename, "w")
  *         self.links.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":85
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":85
  *         self.links.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -10466,7 +11542,28 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":87
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9Alignment_14write_enhanced(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":87
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -10474,11 +11571,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6write_binary(PyObject *__pyx_v_self,
  *             sent_num = 1
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
-  long __pyx_v_sent_num;
+  CYTHON_UNUSED long __pyx_v_sent_num;
   PyObject *__pyx_v_link = NULL;
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_r = NULL;
@@ -10489,9 +11584,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   PyObject *__pyx_t_10 = NULL;
   int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
@@ -10499,18 +11594,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10521,7 +11607,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -10533,23 +11619,24 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":89
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":89
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             sent_num = 1             # <<<<<<<<<<<<<<
@@ -10558,167 +11645,183 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  */
           __pyx_v_sent_num = 1;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":90
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":90
  *         with open(filename, "w") as f:
  *             sent_num = 1
  *             for link in self.links:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % link)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->links)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->links))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->links); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->links)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_link);
-            __pyx_v_link = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_link = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":91
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":91
  *             sent_num = 1
  *             for link in self.links:
  *                 f.write("%d " % link)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i in self.sent_index:
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
-            __pyx_t_9 = 0;
-            __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":92
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
  *                 f.write("%d " % link)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_38), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_38), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":93
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":93
  *                 f.write("%d " % link)
  *             f.write("\n")
  *             for i in self.sent_index:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index))) {
-            __pyx_t_9 = ((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index); __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->sent_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sent_index))) {
+            __pyx_t_2 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_1 = __pyx_t_8(__pyx_t_9);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_4 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_4)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[4]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_4);
             }
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_i = __pyx_t_4;
+            __pyx_t_4 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":94
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":94
  *             f.write("\n")
  *             for i in self.sent_index:
  *                 f.write("%d " % i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_10));
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":95
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def alignment(self, i):
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_39), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_39), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10727,75 +11830,75 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_9, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
-          __Pyx_INCREF(__pyx_t_9);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
-          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_9, __pyx_t_2);
-            __pyx_t_10 = 0; __pyx_t_9 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_2, __pyx_t_1);
+            __pyx_t_10 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_40, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_40, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -10803,7 +11906,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_AddTraceback("_sa.Alignment.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -10816,7 +11919,19 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":97
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static char __pyx_doc_3_sa_9Alignment_16alignment[] = "Return all (e,f) pairs for sentence i";
+static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("alignment (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9Alignment_16alignment(((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":97
  *             f.write("\n")
  * 
  *     def alignment(self, i):             # <<<<<<<<<<<<<<
@@ -10824,9 +11939,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_7write_enhanced(PyObject *__pyx_v_self
  *         cdef int j, start, end
  */
 
-static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static char __pyx_doc_3_sa_9Alignment_8alignment[] = "Return all (e,f) pairs for sentence i";
-static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_j;
   int __pyx_v_start;
   int __pyx_v_end;
@@ -10842,9 +11955,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("alignment");
+  __Pyx_RefNannySetupContext("alignment", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":100
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":100
  *         """Return all (e,f) pairs for sentence i"""
  *         cdef int j, start, end
  *         result = []             # <<<<<<<<<<<<<<
@@ -10852,11 +11965,11 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
  *         end = self.sent_index.arr[i+1]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":101
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":101
  *         cdef int j, start, end
  *         result = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
@@ -10864,9 +11977,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
  *         for j from start <= j < end:
  */
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = (((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":102
  *         result = []
  *         start = self.sent_index.arr[i]
  *         end = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
@@ -10877,9 +11990,9 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_end = (((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->sent_index->arr[__pyx_t_2]);
+  __pyx_v_end = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":103
  *         start = self.sent_index.arr[i]
  *         end = self.sent_index.arr[i+1]
  *         for j from start <= j < end:             # <<<<<<<<<<<<<<
@@ -10889,21 +12002,18 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
   __pyx_t_3 = __pyx_v_end;
   for (__pyx_v_j = __pyx_v_start; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":104
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":104
  *         end = self.sent_index.arr[i+1]
  *         for j from start <= j < end:
  *             result.append(self.unlink(self.links.arr[j]))             # <<<<<<<<<<<<<<
  *         return result
  */
-    if (unlikely(((PyObject *)__pyx_v_result) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__unlink); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__unlink); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyInt_FromLong((((struct __pyx_obj_3_sa_Alignment *)__pyx_v_self)->links->arr[__pyx_v_j])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((__pyx_v_self->links->arr[__pyx_v_j])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
@@ -10915,7 +12025,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":105
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":105
  *         for j from start <= j < end:
  *             result.append(self.unlink(self.links.arr[j]))
  *         return result             # <<<<<<<<<<<<<<
@@ -10940,7 +12050,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8alignment(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":15
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":15
  *     int val
  * 
  * cdef _node* new_node(int key):             # <<<<<<<<<<<<<<
@@ -10952,9 +12062,9 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   struct __pyx_t_3_sa__node *__pyx_v_n;
   struct __pyx_t_3_sa__node *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_node");
+  __Pyx_RefNannySetupContext("new_node", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":17
  * cdef _node* new_node(int key):
  *     cdef _node* n
  *     n = <_node*> malloc(sizeof(_node))             # <<<<<<<<<<<<<<
@@ -10963,7 +12073,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n = ((struct __pyx_t_3_sa__node *)malloc((sizeof(struct __pyx_t_3_sa__node))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":18
  *     cdef _node* n
  *     n = <_node*> malloc(sizeof(_node))
  *     n.smaller = NULL             # <<<<<<<<<<<<<<
@@ -10972,7 +12082,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->smaller = NULL;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":19
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":19
  *     n = <_node*> malloc(sizeof(_node))
  *     n.smaller = NULL
  *     n.bigger = NULL             # <<<<<<<<<<<<<<
@@ -10981,7 +12091,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->bigger = NULL;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":20
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":20
  *     n.smaller = NULL
  *     n.bigger = NULL
  *     n.key = key             # <<<<<<<<<<<<<<
@@ -10990,7 +12100,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->key = __pyx_v_key;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":21
  *     n.bigger = NULL
  *     n.key = key
  *     n.val = 0             # <<<<<<<<<<<<<<
@@ -10999,7 +12109,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->val = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":22
  *     n.key = key
  *     n.val = 0
  *     return n             # <<<<<<<<<<<<<<
@@ -11015,7 +12125,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":25
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":25
  * 
  * 
  * cdef del_node(_node* n):             # <<<<<<<<<<<<<<
@@ -11031,9 +12141,9 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("del_node");
+  __Pyx_RefNannySetupContext("del_node", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":26
  * 
  * cdef del_node(_node* n):
  *     if n.smaller != NULL:             # <<<<<<<<<<<<<<
@@ -11043,7 +12153,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   __pyx_t_1 = (__pyx_v_n->smaller != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":27
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":27
  * cdef del_node(_node* n):
  *     if n.smaller != NULL:
  *         del_node(n.smaller)             # <<<<<<<<<<<<<<
@@ -11057,7 +12167,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":28
  *     if n.smaller != NULL:
  *         del_node(n.smaller)
  *     if n.bigger != NULL:             # <<<<<<<<<<<<<<
@@ -11067,7 +12177,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   __pyx_t_1 = (__pyx_v_n->bigger != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":29
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":29
  *         del_node(n.smaller)
  *     if n.bigger != NULL:
  *         del_node(n.bigger)             # <<<<<<<<<<<<<<
@@ -11081,7 +12191,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":30
  *     if n.bigger != NULL:
  *         del_node(n.bigger)
  *     free(n)             # <<<<<<<<<<<<<<
@@ -11102,7 +12212,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":32
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":32
  *     free(n)
  * 
  * cdef int* get_val(_node* n, int key):             # <<<<<<<<<<<<<<
@@ -11114,9 +12224,9 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("get_val");
+  __Pyx_RefNannySetupContext("get_val", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":33
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":33
  * 
  * cdef int* get_val(_node* n, int key):
  *     if key == n.key:             # <<<<<<<<<<<<<<
@@ -11126,7 +12236,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   __pyx_t_1 = (__pyx_v_key == __pyx_v_n->key);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":34
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":34
  * cdef int* get_val(_node* n, int key):
  *     if key == n.key:
  *         return &n.val             # <<<<<<<<<<<<<<
@@ -11138,7 +12248,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":35
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":35
  *     if key == n.key:
  *         return &n.val
  *     elif key < n.key:             # <<<<<<<<<<<<<<
@@ -11148,7 +12258,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   __pyx_t_1 = (__pyx_v_key < __pyx_v_n->key);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":36
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":36
  *         return &n.val
  *     elif key < n.key:
  *         if n.smaller == NULL:             # <<<<<<<<<<<<<<
@@ -11158,7 +12268,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     __pyx_t_1 = (__pyx_v_n->smaller == NULL);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":37
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":37
  *     elif key < n.key:
  *         if n.smaller == NULL:
  *             n.smaller = new_node(key)             # <<<<<<<<<<<<<<
@@ -11167,7 +12277,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
  */
       __pyx_v_n->smaller = __pyx_f_3_sa_new_node(__pyx_v_key);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":38
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":38
  *         if n.smaller == NULL:
  *             n.smaller = new_node(key)
  *             return &(n.smaller.val)             # <<<<<<<<<<<<<<
@@ -11180,7 +12290,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     }
     __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":39
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":39
  *             n.smaller = new_node(key)
  *             return &(n.smaller.val)
  *         return get_val(n.smaller, key)             # <<<<<<<<<<<<<<
@@ -11193,7 +12303,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":41
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":41
  *         return get_val(n.smaller, key)
  *     else:
  *         if n.bigger == NULL:             # <<<<<<<<<<<<<<
@@ -11203,7 +12313,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     __pyx_t_1 = (__pyx_v_n->bigger == NULL);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":42
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":42
  *     else:
  *         if n.bigger == NULL:
  *             n.bigger = new_node(key)             # <<<<<<<<<<<<<<
@@ -11212,7 +12322,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
  */
       __pyx_v_n->bigger = __pyx_f_3_sa_new_node(__pyx_v_key);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":43
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":43
  *         if n.bigger == NULL:
  *             n.bigger = new_node(key)
  *             return &(n.bigger.val)             # <<<<<<<<<<<<<<
@@ -11225,7 +12335,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":44
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":44
  *             n.bigger = new_node(key)
  *             return &(n.bigger.val)
  *         return get_val(n.bigger, key)             # <<<<<<<<<<<<<<
@@ -11243,16 +12353,9 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
- *     cdef id2eword, id2fword, eword2id, fword2id
- * 
- *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
- *             earray=None, fsarray=None, alignment=None):
- *         self.id2eword = []
- */
-
-static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_from_data = 0;
   PyObject *__pyx_v_from_binary = 0;
@@ -11261,23 +12364,23 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   PyObject *__pyx_v_alignment = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
     PyObject* values[6] = {0,0,0,0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
+ *     cdef id2eword, id2fword, eword2id, fword2id
+ * 
+ *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
+ *             earray=None, fsarray=None, alignment=None):
+ *         self.id2eword = []
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = __pyx_k_41;
     values[2] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":55
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":55
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,
  *             earray=None, fsarray=None, alignment=None):             # <<<<<<<<<<<<<<
@@ -11289,7 +12392,8 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     values[5] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -11300,7 +12404,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_text);
@@ -11333,7 +12437,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -11362,8 +12466,33 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex___cinit__(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_v_from_text, __pyx_v_from_data, __pyx_v_from_binary, __pyx_v_earray, __pyx_v_fsarray, __pyx_v_alignment);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
+ *     cdef id2eword, id2fword, eword2id, fword2id
+ * 
+ *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
+ *             earray=None, fsarray=None, alignment=None):
+ *         self.id2eword = []
+ */
+
+static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_from_text, PyObject *__pyx_v_from_data, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_earray, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_alignment) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":56
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":56
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,
  *             earray=None, fsarray=None, alignment=None):
  *         self.id2eword = []             # <<<<<<<<<<<<<<
@@ -11371,14 +12500,14 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
  *         self.eword2id = {}
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->id2eword);
+  __Pyx_DECREF(__pyx_v_self->id2eword);
+  __pyx_v_self->id2eword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":57
  *             earray=None, fsarray=None, alignment=None):
  *         self.id2eword = []
  *         self.id2fword = []             # <<<<<<<<<<<<<<
@@ -11386,14 +12515,14 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
  *         self.fword2id = {}
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->id2fword);
+  __Pyx_DECREF(__pyx_v_self->id2fword);
+  __pyx_v_self->id2fword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":58
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":58
  *         self.id2eword = []
  *         self.id2fword = []
  *         self.eword2id = {}             # <<<<<<<<<<<<<<
@@ -11403,12 +12532,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->eword2id);
+  __Pyx_DECREF(__pyx_v_self->eword2id);
+  __pyx_v_self->eword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":59
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":59
  *         self.id2fword = []
  *         self.eword2id = {}
  *         self.fword2id = {}             # <<<<<<<<<<<<<<
@@ -11418,12 +12547,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id);
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->fword2id);
+  __Pyx_DECREF(__pyx_v_self->fword2id);
+  __pyx_v_self->fword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":60
  *         self.eword2id = {}
  *         self.fword2id = {}
  *         self.e_index = IntList()             # <<<<<<<<<<<<<<
@@ -11433,12 +12562,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->e_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->e_index));
+  __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":61
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":61
  *         self.fword2id = {}
  *         self.e_index = IntList()
  *         self.f_index = IntList()             # <<<<<<<<<<<<<<
@@ -11448,12 +12577,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->f_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->f_index));
+  __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":62
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":62
  *         self.e_index = IntList()
  *         self.f_index = IntList()
  *         self.col1 = FloatList()             # <<<<<<<<<<<<<<
@@ -11463,12 +12592,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->col1);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->col1));
+  __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":63
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":63
  *         self.f_index = IntList()
  *         self.col1 = FloatList()
  *         self.col2 = FloatList()             # <<<<<<<<<<<<<<
@@ -11478,12 +12607,12 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-  ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->col2);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->col2));
+  __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":64
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":64
  *         self.col1 = FloatList()
  *         self.col2 = FloatList()
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -11493,17 +12622,17 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":65
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":65
  *         self.col2 = FloatList()
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_data:
  *             self.compute_from_data(fsarray, earray, alignment)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -11512,10 +12641,10 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":66
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":66
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_data:             # <<<<<<<<<<<<<<
@@ -11525,7 +12654,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_data); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":67
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":67
  *             self.read_binary(from_binary)
  *         elif from_data:
  *             self.compute_from_data(fsarray, earray, alignment)             # <<<<<<<<<<<<<<
@@ -11541,27 +12670,27 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     if (!(likely(((__pyx_v_alignment) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_alignment, __pyx_ptype_3_sa_Alignment))))) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __pyx_v_alignment;
     __Pyx_INCREF(__pyx_t_1);
-    __pyx_t_5 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->compute_from_data(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_t_4), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_3), ((struct __pyx_obj_3_sa_Alignment *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->compute_from_data(__pyx_v_self, ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_t_4), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_3), ((struct __pyx_obj_3_sa_Alignment *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":69
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":69
  *             self.compute_from_data(fsarray, earray, alignment)
  *         else:
  *             self.read_text(from_text)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -11571,7 +12700,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -11587,7 +12716,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(PyObject *__pyx_v_self, PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":72
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":72
  * 
  * 
  *     cdef compute_from_data(self, SuffixArray fsa, DataArray eda, Alignment aa):             # <<<<<<<<<<<<<<
@@ -11639,9 +12768,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("compute_from_data");
+  __Pyx_RefNannySetupContext("compute_from_data", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":79
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":79
  *         cdef int null_word
  * 
  *         null_word = 0             # <<<<<<<<<<<<<<
@@ -11650,7 +12779,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_null_word = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":80
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":80
  * 
  *         null_word = 0
  *         for word in fsa.darray.id2word: # I miss list comprehensions             # <<<<<<<<<<<<<<
@@ -11666,12 +12795,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -11687,7 +12824,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":81
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":81
  *         null_word = 0
  *         for word in fsa.darray.id2word: # I miss list comprehensions
  *             self.id2fword.append(word)             # <<<<<<<<<<<<<<
@@ -11700,7 +12837,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":82
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":82
  *         for word in fsa.darray.id2word: # I miss list comprehensions
  *             self.id2fword.append(word)
  *         self.id2fword[null_word] = "NULL"             # <<<<<<<<<<<<<<
@@ -11709,7 +12846,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   if (__Pyx_SetItemInt(__pyx_v_self->id2fword, __pyx_v_null_word, ((PyObject *)__pyx_n_s__NULL), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":83
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":83
  *             self.id2fword.append(word)
  *         self.id2fword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2fword):             # <<<<<<<<<<<<<<
@@ -11727,12 +12864,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_4)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_4)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_5)) {
@@ -11756,7 +12901,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":84
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":84
  *         self.id2fword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2fword):
  *             self.fword2id[word] = id             # <<<<<<<<<<<<<<
@@ -11768,7 +12913,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":86
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":86
  *             self.fword2id[word] = id
  * 
  *         for word in eda.id2word:             # <<<<<<<<<<<<<<
@@ -11784,12 +12929,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -11805,7 +12958,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":87
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":87
  * 
  *         for word in eda.id2word:
  *             self.id2eword.append(word)             # <<<<<<<<<<<<<<
@@ -11818,7 +12971,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":88
  *         for word in eda.id2word:
  *             self.id2eword.append(word)
  *         self.id2eword[null_word] = "NULL"             # <<<<<<<<<<<<<<
@@ -11827,7 +12980,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   if (__Pyx_SetItemInt(__pyx_v_self->id2eword, __pyx_v_null_word, ((PyObject *)__pyx_n_s__NULL), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":89
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":89
  *             self.id2eword.append(word)
  *         self.id2eword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2eword):             # <<<<<<<<<<<<<<
@@ -11845,12 +12998,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_4)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_4)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_5)) {
@@ -11874,7 +13035,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":90
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":90
  *         self.id2eword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2eword):
  *             self.eword2id[word] = id             # <<<<<<<<<<<<<<
@@ -11886,7 +13047,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":92
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":92
  *             self.eword2id[word] = id
  * 
  *         num_pairs = 0             # <<<<<<<<<<<<<<
@@ -11895,7 +13056,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_num_pairs = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":94
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":94
  *         num_pairs = 0
  * 
  *         V_E = len(eda.id2word)             # <<<<<<<<<<<<<<
@@ -11908,7 +13069,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_V_E = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":95
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":95
  * 
  *         V_E = len(eda.id2word)
  *         V_F = len(fsa.darray.id2word)             # <<<<<<<<<<<<<<
@@ -11921,7 +13082,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_V_F = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":96
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":96
  *         V_E = len(eda.id2word)
  *         V_F = len(fsa.darray.id2word)
  *         fmargin = <int*> malloc(V_F*sizeof(int))             # <<<<<<<<<<<<<<
@@ -11930,7 +13091,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_fmargin = ((int *)malloc((__pyx_v_V_F * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":97
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":97
  *         V_F = len(fsa.darray.id2word)
  *         fmargin = <int*> malloc(V_F*sizeof(int))
  *         emargin = <int*> malloc(V_E*sizeof(int))             # <<<<<<<<<<<<<<
@@ -11939,7 +13100,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_emargin = ((int *)malloc((__pyx_v_V_E * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":98
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":98
  *         fmargin = <int*> malloc(V_F*sizeof(int))
  *         emargin = <int*> malloc(V_E*sizeof(int))
  *         memset(fmargin, 0, V_F*sizeof(int))             # <<<<<<<<<<<<<<
@@ -11948,7 +13109,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_fmargin, 0, (__pyx_v_V_F * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":99
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":99
  *         emargin = <int*> malloc(V_E*sizeof(int))
  *         memset(fmargin, 0, V_F*sizeof(int))
  *         memset(emargin, 0, V_E*sizeof(int))             # <<<<<<<<<<<<<<
@@ -11957,7 +13118,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_emargin, 0, (__pyx_v_V_E * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":101
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":101
  *         memset(emargin, 0, V_E*sizeof(int))
  * 
  *         dict = <_node**> malloc(V_F*sizeof(_node*))             # <<<<<<<<<<<<<<
@@ -11966,7 +13127,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_dict = ((struct __pyx_t_3_sa__node **)malloc((__pyx_v_V_F * (sizeof(struct __pyx_t_3_sa__node *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":102
  * 
  *         dict = <_node**> malloc(V_F*sizeof(_node*))
  *         memset(dict, 0, V_F*sizeof(_node*))             # <<<<<<<<<<<<<<
@@ -11975,7 +13136,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_dict, 0, (__pyx_v_V_F * (sizeof(struct __pyx_t_3_sa__node *))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":104
  *         memset(dict, 0, V_F*sizeof(_node*))
  * 
  *         num_sents = len(fsa.darray.sent_index)             # <<<<<<<<<<<<<<
@@ -11991,7 +13152,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_num_sents = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":105
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":105
  * 
  *         num_sents = len(fsa.darray.sent_index)
  *         for sent_id from 0 <= sent_id < num_sents-1:             # <<<<<<<<<<<<<<
@@ -12004,7 +13165,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (__pyx_v_sent_id = 0; __pyx_v_sent_id < __pyx_t_6; __pyx_v_sent_id++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":107
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":107
  *         for sent_id from 0 <= sent_id < num_sents-1:
  * 
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -12013,7 +13174,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_fsent = (__pyx_v_fsa->darray->data->arr + (__pyx_v_fsa->darray->sent_index->arr[__pyx_v_sent_id]));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":108
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":108
  * 
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1             # <<<<<<<<<<<<<<
@@ -12022,7 +13183,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_I = (((__pyx_v_fsa->darray->sent_index->arr[(__pyx_v_sent_id + 1)]) - (__pyx_v_fsa->darray->sent_index->arr[__pyx_v_sent_id])) - 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":109
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":109
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1
  *             faligned = <int*> malloc(I*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12031,7 +13192,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_faligned = ((int *)malloc((__pyx_v_I * (sizeof(int)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":110
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":110
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1
  *             faligned = <int*> malloc(I*sizeof(int))
  *             memset(faligned, 0, I*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12040,7 +13201,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     memset(__pyx_v_faligned, 0, (__pyx_v_I * (sizeof(int))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":112
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":112
  *             memset(faligned, 0, I*sizeof(int))
  * 
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -12049,7 +13210,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_esent = (__pyx_v_eda->data->arr + (__pyx_v_eda->sent_index->arr[__pyx_v_sent_id]));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":113
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":113
  * 
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1             # <<<<<<<<<<<<<<
@@ -12058,7 +13219,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_J = (((__pyx_v_eda->sent_index->arr[(__pyx_v_sent_id + 1)]) - (__pyx_v_eda->sent_index->arr[__pyx_v_sent_id])) - 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":114
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":114
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1
  *             ealigned = <int*> malloc(J*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12067,7 +13228,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_ealigned = ((int *)malloc((__pyx_v_J * (sizeof(int)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":115
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":115
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1
  *             ealigned = <int*> malloc(J*sizeof(int))
  *             memset(ealigned, 0, J*sizeof(int))             # <<<<<<<<<<<<<<
@@ -12076,7 +13237,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     memset(__pyx_v_ealigned, 0, (__pyx_v_J * (sizeof(int))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":117
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":117
  *             memset(ealigned, 0, J*sizeof(int))
  * 
  *             links = aa._get_sent_links(sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -12085,7 +13246,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_aa->__pyx_vtab)->_get_sent_links(__pyx_v_aa, __pyx_v_sent_id, (&__pyx_v_num_links));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":119
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":119
  *             links = aa._get_sent_links(sent_id, &num_links)
  * 
  *             for l from 0 <= l < num_links:             # <<<<<<<<<<<<<<
@@ -12095,7 +13256,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_num_links;
     for (__pyx_v_l = 0; __pyx_v_l < __pyx_t_7; __pyx_v_l++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":120
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":120
  * 
  *             for l from 0 <= l < num_links:
  *                 i = links[l*2]             # <<<<<<<<<<<<<<
@@ -12104,7 +13265,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_i = (__pyx_v_links[(__pyx_v_l * 2)]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":121
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":121
  *             for l from 0 <= l < num_links:
  *                 i = links[l*2]
  *                 j = links[l*2+1]             # <<<<<<<<<<<<<<
@@ -12113,7 +13274,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_j = (__pyx_v_links[((__pyx_v_l * 2) + 1)]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":122
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":122
  *                 i = links[l*2]
  *                 j = links[l*2+1]
  *                 if i >= I or j >= J:             # <<<<<<<<<<<<<<
@@ -12129,7 +13290,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       if (__pyx_t_10) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":123
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":123
  *                 j = links[l*2+1]
  *                 if i >= I or j >= J:
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))             # <<<<<<<<<<<<<<
@@ -12147,7 +13308,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_12 = PyInt_FromLong((__pyx_v_sent_id + 1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_12);
         __pyx_t_13 = PyTuple_New(5); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+        __Pyx_GOTREF(__pyx_t_13);
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4);
@@ -12167,7 +13328,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __Pyx_GOTREF(((PyObject *)__pyx_t_12));
         __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
         __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+        __Pyx_GOTREF(__pyx_t_13);
         PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_t_12));
         __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
         __pyx_t_12 = 0;
@@ -12181,7 +13342,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       __pyx_L15:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":124
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":124
  *                 if i >= I or j >= J:
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))
  *                 f_i = fsent[i]             # <<<<<<<<<<<<<<
@@ -12190,7 +13351,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_f_i = (__pyx_v_fsent[__pyx_v_i]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":125
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":125
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))
  *                 f_i = fsent[i]
  *                 e_j = esent[j]             # <<<<<<<<<<<<<<
@@ -12199,7 +13360,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_e_j = (__pyx_v_esent[__pyx_v_j]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":126
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":126
  *                 f_i = fsent[i]
  *                 e_j = esent[j]
  *                 fmargin[f_i] = fmargin[f_i]+1             # <<<<<<<<<<<<<<
@@ -12208,7 +13369,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_fmargin[__pyx_v_f_i]) = ((__pyx_v_fmargin[__pyx_v_f_i]) + 1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":127
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":127
  *                 e_j = esent[j]
  *                 fmargin[f_i] = fmargin[f_i]+1
  *                 emargin[e_j] = emargin[e_j]+1             # <<<<<<<<<<<<<<
@@ -12217,7 +13378,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_emargin[__pyx_v_e_j]) = ((__pyx_v_emargin[__pyx_v_e_j]) + 1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":128
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":128
  *                 fmargin[f_i] = fmargin[f_i]+1
  *                 emargin[e_j] = emargin[e_j]+1
  *                 if dict[f_i] == NULL:             # <<<<<<<<<<<<<<
@@ -12227,7 +13388,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_dict[__pyx_v_f_i]) == NULL);
       if (__pyx_t_10) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":129
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":129
  *                 emargin[e_j] = emargin[e_j]+1
  *                 if dict[f_i] == NULL:
  *                     dict[f_i] = new_node(e_j)             # <<<<<<<<<<<<<<
@@ -12236,7 +13397,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_dict[__pyx_v_f_i]) = __pyx_f_3_sa_new_node(__pyx_v_e_j);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":130
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":130
  *                 if dict[f_i] == NULL:
  *                     dict[f_i] = new_node(e_j)
  *                     dict[f_i].val = 1             # <<<<<<<<<<<<<<
@@ -12245,7 +13406,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_dict[__pyx_v_f_i])->val = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":131
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":131
  *                     dict[f_i] = new_node(e_j)
  *                     dict[f_i].val = 1
  *                     num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12257,7 +13418,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":133
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":133
  *                     num_pairs = num_pairs + 1
  *                 else:
  *                     count = get_val(dict[f_i], e_j)             # <<<<<<<<<<<<<<
@@ -12266,7 +13427,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_f_i]), __pyx_v_e_j);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":134
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":134
  *                 else:
  *                     count = get_val(dict[f_i], e_j)
  *                     if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -12276,7 +13437,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_count[0]) == 0);
         if (__pyx_t_10) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":135
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":135
  *                     count = get_val(dict[f_i], e_j)
  *                     if count[0] == 0:
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12288,7 +13449,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         __pyx_L17:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":136
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":136
  *                     if count[0] == 0:
  *                         num_pairs = num_pairs + 1
  *                     count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -12299,7 +13460,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       __pyx_L16:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":138
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":138
  *                     count[0] = count[0] + 1
  *                 # add count
  *                 faligned[i] = 1             # <<<<<<<<<<<<<<
@@ -12308,7 +13469,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_faligned[__pyx_v_i]) = 1;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":139
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":139
  *                 # add count
  *                 faligned[i] = 1
  *                 ealigned[j] = 1             # <<<<<<<<<<<<<<
@@ -12318,7 +13479,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       (__pyx_v_ealigned[__pyx_v_j]) = 1;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":140
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":140
  *                 faligned[i] = 1
  *                 ealigned[j] = 1
  *             for i from 0 <= i < I:             # <<<<<<<<<<<<<<
@@ -12328,7 +13489,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_I;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_7; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":141
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":141
  *                 ealigned[j] = 1
  *             for i from 0 <= i < I:
  *                 if faligned[i] == 0:             # <<<<<<<<<<<<<<
@@ -12338,7 +13499,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_faligned[__pyx_v_i]) == 0);
       if (__pyx_t_10) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":142
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":142
  *             for i from 0 <= i < I:
  *                 if faligned[i] == 0:
  *                     f_i = fsent[i]             # <<<<<<<<<<<<<<
@@ -12347,7 +13508,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_f_i = (__pyx_v_fsent[__pyx_v_i]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":143
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":143
  *                 if faligned[i] == 0:
  *                     f_i = fsent[i]
  *                     fmargin[f_i] = fmargin[f_i] + 1             # <<<<<<<<<<<<<<
@@ -12356,7 +13517,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_fmargin[__pyx_v_f_i]) = ((__pyx_v_fmargin[__pyx_v_f_i]) + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":144
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":144
  *                     f_i = fsent[i]
  *                     fmargin[f_i] = fmargin[f_i] + 1
  *                     emargin[null_word] = emargin[null_word] + 1             # <<<<<<<<<<<<<<
@@ -12365,7 +13526,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_emargin[__pyx_v_null_word]) = ((__pyx_v_emargin[__pyx_v_null_word]) + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":145
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":145
  *                     fmargin[f_i] = fmargin[f_i] + 1
  *                     emargin[null_word] = emargin[null_word] + 1
  *                     if dict[f_i] == NULL:             # <<<<<<<<<<<<<<
@@ -12375,7 +13536,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_dict[__pyx_v_f_i]) == NULL);
         if (__pyx_t_10) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":146
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":146
  *                     emargin[null_word] = emargin[null_word] + 1
  *                     if dict[f_i] == NULL:
  *                         dict[f_i] = new_node(null_word)             # <<<<<<<<<<<<<<
@@ -12384,7 +13545,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_f_i]) = __pyx_f_3_sa_new_node(__pyx_v_null_word);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":147
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":147
  *                     if dict[f_i] == NULL:
  *                         dict[f_i] = new_node(null_word)
  *                         dict[f_i].val = 1             # <<<<<<<<<<<<<<
@@ -12393,7 +13554,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_f_i])->val = 1;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":148
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":148
  *                         dict[f_i] = new_node(null_word)
  *                         dict[f_i].val = 1
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12405,7 +13566,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":150
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":150
  *                         num_pairs = num_pairs + 1
  *                     else:
  *                         count = get_val(dict[f_i], null_word)             # <<<<<<<<<<<<<<
@@ -12414,7 +13575,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_f_i]), __pyx_v_null_word);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":151
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":151
  *                     else:
  *                         count = get_val(dict[f_i], null_word)
  *                         if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -12424,7 +13585,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           __pyx_t_10 = ((__pyx_v_count[0]) == 0);
           if (__pyx_t_10) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":152
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":152
  *                         count = get_val(dict[f_i], null_word)
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12436,7 +13597,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           }
           __pyx_L22:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":153
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":153
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -12451,7 +13612,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_L20:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":154
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":154
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1
  *             for j from 0 <= j < J:             # <<<<<<<<<<<<<<
@@ -12461,7 +13622,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_J;
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_7; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":155
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":155
  *                         count[0] = count[0] + 1
  *             for j from 0 <= j < J:
  *                 if ealigned[j] == 0:             # <<<<<<<<<<<<<<
@@ -12471,7 +13632,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_ealigned[__pyx_v_j]) == 0);
       if (__pyx_t_10) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":156
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":156
  *             for j from 0 <= j < J:
  *                 if ealigned[j] == 0:
  *                     e_j = esent[j]             # <<<<<<<<<<<<<<
@@ -12480,7 +13641,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_e_j = (__pyx_v_esent[__pyx_v_j]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":157
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":157
  *                 if ealigned[j] == 0:
  *                     e_j = esent[j]
  *                     fmargin[null_word] = fmargin[null_word] + 1             # <<<<<<<<<<<<<<
@@ -12489,7 +13650,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_fmargin[__pyx_v_null_word]) = ((__pyx_v_fmargin[__pyx_v_null_word]) + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":158
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":158
  *                     e_j = esent[j]
  *                     fmargin[null_word] = fmargin[null_word] + 1
  *                     emargin[e_j] = emargin[e_j] + 1             # <<<<<<<<<<<<<<
@@ -12498,7 +13659,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_emargin[__pyx_v_e_j]) = ((__pyx_v_emargin[__pyx_v_e_j]) + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":159
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":159
  *                     fmargin[null_word] = fmargin[null_word] + 1
  *                     emargin[e_j] = emargin[e_j] + 1
  *                     if dict[null_word] == NULL:             # <<<<<<<<<<<<<<
@@ -12508,7 +13669,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_dict[__pyx_v_null_word]) == NULL);
         if (__pyx_t_10) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":160
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":160
  *                     emargin[e_j] = emargin[e_j] + 1
  *                     if dict[null_word] == NULL:
  *                         dict[null_word] = new_node(e_j)             # <<<<<<<<<<<<<<
@@ -12517,7 +13678,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_null_word]) = __pyx_f_3_sa_new_node(__pyx_v_e_j);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":161
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":161
  *                     if dict[null_word] == NULL:
  *                         dict[null_word] = new_node(e_j)
  *                         dict[null_word].val = 1             # <<<<<<<<<<<<<<
@@ -12526,7 +13687,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_null_word])->val = 1;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":162
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":162
  *                         dict[null_word] = new_node(e_j)
  *                         dict[null_word].val = 1
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12538,7 +13699,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":164
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":164
  *                         num_pairs = num_pairs + 1
  *                     else:
  *                         count = get_val(dict[null_word], e_j)             # <<<<<<<<<<<<<<
@@ -12547,7 +13708,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_null_word]), __pyx_v_e_j);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":165
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":165
  *                     else:
  *                         count = get_val(dict[null_word], e_j)
  *                         if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -12557,7 +13718,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           __pyx_t_10 = ((__pyx_v_count[0]) == 0);
           if (__pyx_t_10) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":166
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":166
  *                         count = get_val(dict[null_word], e_j)
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -12569,7 +13730,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           }
           __pyx_L27:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":167
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":167
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -12584,7 +13745,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_L25:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":168
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":168
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1
  *             free(links)             # <<<<<<<<<<<<<<
@@ -12593,7 +13754,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     free(__pyx_v_links);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":169
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":169
  *                         count[0] = count[0] + 1
  *             free(links)
  *             free(faligned)             # <<<<<<<<<<<<<<
@@ -12602,7 +13763,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     free(__pyx_v_faligned);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":170
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":170
  *             free(links)
  *             free(faligned)
  *             free(ealigned)             # <<<<<<<<<<<<<<
@@ -12612,7 +13773,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     free(__pyx_v_ealigned);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":171
  *             free(faligned)
  *             free(ealigned)
  *         self.f_index = IntList(initial_len=V_F)             # <<<<<<<<<<<<<<
@@ -12625,7 +13786,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_13);
   if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_GIVEREF(__pyx_t_13);
@@ -12634,7 +13795,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_13);
   __pyx_t_13 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":172
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":172
  *             free(ealigned)
  *         self.f_index = IntList(initial_len=V_F)
  *         self.e_index = IntList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -12647,7 +13808,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_12);
   if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
   __Pyx_GIVEREF(__pyx_t_12);
@@ -12656,7 +13817,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
   __pyx_t_12 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":173
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":173
  *         self.f_index = IntList(initial_len=V_F)
  *         self.e_index = IntList(initial_len=num_pairs)
  *         self.col1 = FloatList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -12669,7 +13830,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_13);
   if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_GIVEREF(__pyx_t_13);
@@ -12678,7 +13839,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_13);
   __pyx_t_13 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":174
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":174
  *         self.e_index = IntList(initial_len=num_pairs)
  *         self.col1 = FloatList(initial_len=num_pairs)
  *         self.col2 = FloatList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -12691,7 +13852,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_GOTREF(__pyx_t_12);
   if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
   __Pyx_GIVEREF(__pyx_t_12);
@@ -12700,7 +13861,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
   __pyx_t_12 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":176
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":176
  *         self.col2 = FloatList(initial_len=num_pairs)
  * 
  *         num_pairs = 0             # <<<<<<<<<<<<<<
@@ -12709,7 +13870,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_num_pairs = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":177
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":177
  * 
  *         num_pairs = 0
  *         for i from 0 <= i < V_F:             # <<<<<<<<<<<<<<
@@ -12719,7 +13880,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_t_6 = __pyx_v_V_F;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_6; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":179
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":179
  *         for i from 0 <= i < V_F:
  *             #self.f_index[i] = num_pairs
  *             self.f_index.set(i, num_pairs)             # <<<<<<<<<<<<<<
@@ -12728,7 +13889,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->set(__pyx_v_self->f_index, __pyx_v_i, __pyx_v_num_pairs);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":180
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":180
  *             #self.f_index[i] = num_pairs
  *             self.f_index.set(i, num_pairs)
  *             if dict[i] != NULL:             # <<<<<<<<<<<<<<
@@ -12738,7 +13899,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_10 = ((__pyx_v_dict[__pyx_v_i]) != NULL);
     if (__pyx_t_10) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":181
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":181
  *             self.f_index.set(i, num_pairs)
  *             if dict[i] != NULL:
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)             # <<<<<<<<<<<<<<
@@ -12749,7 +13910,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":182
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":182
  *             if dict[i] != NULL:
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)
  *                 del_node(dict[i])             # <<<<<<<<<<<<<<
@@ -12764,7 +13925,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_L30:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":183
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)
  *                 del_node(dict[i])
  *         free(fmargin)             # <<<<<<<<<<<<<<
@@ -12773,7 +13934,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_fmargin);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":184
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":184
  *                 del_node(dict[i])
  *         free(fmargin)
  *         free(emargin)             # <<<<<<<<<<<<<<
@@ -12782,7 +13943,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_emargin);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":185
  *         free(fmargin)
  *         free(emargin)
  *         free(dict)             # <<<<<<<<<<<<<<
@@ -12791,7 +13952,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_dict);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":186
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":186
  *         free(emargin)
  *         free(dict)
  *         return             # <<<<<<<<<<<<<<
@@ -12822,7 +13983,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":189
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":189
  * 
  * 
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):             # <<<<<<<<<<<<<<
@@ -12839,9 +14000,9 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_add_node");
+  __Pyx_RefNannySetupContext("_add_node", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":191
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":191
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):
  *         cdef int loc
  *         if n.smaller != NULL:             # <<<<<<<<<<<<<<
@@ -12851,7 +14012,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   __pyx_t_1 = (__pyx_v_n->smaller != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":192
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":192
  *         cdef int loc
  *         if n.smaller != NULL:
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)             # <<<<<<<<<<<<<<
@@ -12865,7 +14026,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":193
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":193
  *         if n.smaller != NULL:
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)
  *         loc = num_pairs[0]             # <<<<<<<<<<<<<<
@@ -12874,7 +14035,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   __pyx_v_loc = (__pyx_v_num_pairs[0]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":194
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":194
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)
  *         loc = num_pairs[0]
  *         self.e_index.set(loc, n.key)             # <<<<<<<<<<<<<<
@@ -12883,7 +14044,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->set(__pyx_v_self->e_index, __pyx_v_loc, __pyx_v_n->key);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":195
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":195
  *         loc = num_pairs[0]
  *         self.e_index.set(loc, n.key)
  *         self.col1.set(loc, float(n.val)/fmargin)             # <<<<<<<<<<<<<<
@@ -12896,7 +14057,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->set(__pyx_v_self->col1, __pyx_v_loc, (((double)__pyx_v_n->val) / __pyx_v_fmargin));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":196
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":196
  *         self.e_index.set(loc, n.key)
  *         self.col1.set(loc, float(n.val)/fmargin)
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))             # <<<<<<<<<<<<<<
@@ -12909,7 +14070,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->set(__pyx_v_self->col2, __pyx_v_loc, (((double)__pyx_v_n->val) / ((double)(__pyx_v_emargin[__pyx_v_n->key]))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":197
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":197
  *         self.col1.set(loc, float(n.val)/fmargin)
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))
  *         num_pairs[0] = loc + 1             # <<<<<<<<<<<<<<
@@ -12918,7 +14079,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   (__pyx_v_num_pairs[0]) = (__pyx_v_loc + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":198
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))
  *         num_pairs[0] = loc + 1
  *         if n.bigger != NULL:             # <<<<<<<<<<<<<<
@@ -12928,7 +14089,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   __pyx_t_1 = (__pyx_v_n->bigger != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":199
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":199
  *         num_pairs[0] = loc + 1
  *         if n.bigger != NULL:
  *             self._add_node(n.bigger, num_pairs, fmargin, emargin)             # <<<<<<<<<<<<<<
@@ -12954,7 +14115,28 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":202
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_2write_binary(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":202
  * 
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -12962,9 +14144,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -12973,18 +14153,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":204
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":204
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -12993,71 +14164,71 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":205
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":205
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.f_index.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->write_handle(__pyx_v_self->f_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":206
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":206
  *         f = fopen(filename, "w")
  *         self.f_index.write_handle(f)
  *         self.e_index.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->write_handle(__pyx_v_self->e_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":207
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":207
  *         self.f_index.write_handle(f)
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->write_handle(__pyx_v_self->col1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":208
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":208
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->write_handle(__pyx_v_self->col2, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":209
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":209
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)             # <<<<<<<<<<<<<<
  *         self.write_wordlist(self.id2eword, f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
+  __pyx_t_1 = __pyx_v_self->id2fword;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->write_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->write_wordlist(__pyx_v_self, __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":210
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":210
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
+  __pyx_t_2 = __pyx_v_self->id2eword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->write_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->write_wordlist(__pyx_v_self, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":211
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":211
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -13079,7 +14250,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":214
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":214
  * 
  * 
  *     cdef write_wordlist(self, wordlist, FILE* f):             # <<<<<<<<<<<<<<
@@ -13087,7 +14258,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_1write_binary(PyObject *__pyx_v_self, PyOb
  *         cdef int num_words
  */
 
-static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_wordlist, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_wordlist, FILE *__pyx_v_f) {
   int __pyx_v_word_len;
   int __pyx_v_num_words;
   PyObject *__pyx_v_word = NULL;
@@ -13102,9 +14273,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_wordlist");
+  __Pyx_RefNannySetupContext("write_wordlist", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":218
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":218
  *         cdef int num_words
  * 
  *         num_words = len(wordlist)             # <<<<<<<<<<<<<<
@@ -13114,7 +14285,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
   __pyx_t_1 = PyObject_Length(__pyx_v_wordlist); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_num_words = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":219
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":219
  * 
  *         num_words = len(wordlist)
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -13123,7 +14294,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":220
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":220
  *         num_words = len(wordlist)
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in wordlist:             # <<<<<<<<<<<<<<
@@ -13139,12 +14310,20 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
     __pyx_t_3 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
@@ -13160,7 +14339,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":221
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":221
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in wordlist:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
@@ -13170,7 +14349,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
     __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":222
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":222
  *         for word in wordlist:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -13179,7 +14358,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":223
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":223
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -13205,7 +14384,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":226
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":226
  * 
  * 
  *     cdef read_wordlist(self, word2id, id2word, FILE* f):             # <<<<<<<<<<<<<<
@@ -13213,11 +14392,11 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(struct __pyx_obj_3_sa_BiLex
  *         cdef int word_len
  */
 
-static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_word2id, PyObject *__pyx_v_id2word, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_word2id, PyObject *__pyx_v_id2word, FILE *__pyx_v_f) {
   int __pyx_v_num_words;
   int __pyx_v_word_len;
   char *__pyx_v_word;
-  long __pyx_v_i;
+  CYTHON_UNUSED long __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -13227,9 +14406,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_wordlist");
+  __Pyx_RefNannySetupContext("read_wordlist", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":231
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":231
  *         cdef char* word
  * 
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -13238,7 +14417,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":232
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":232
  * 
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i from 0 <= i < num_words:             # <<<<<<<<<<<<<<
@@ -13248,7 +14427,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
   __pyx_t_1 = __pyx_v_num_words;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":233
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":233
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i from 0 <= i < num_words:
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -13257,7 +14436,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":234
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":234
  *         for i from 0 <= i < num_words:
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -13266,7 +14445,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":235
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":235
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -13275,7 +14454,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":236
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":236
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             word2id[word] = len(id2word)             # <<<<<<<<<<<<<<
@@ -13291,7 +14470,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":237
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":237
  *             fread(word, sizeof(char), word_len, f)
  *             word2id[word] = len(id2word)
  *             id2word.append(word)             # <<<<<<<<<<<<<<
@@ -13305,7 +14484,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":238
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":238
  *             word2id[word] = len(id2word)
  *             id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -13328,7 +14507,28 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":240
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_4read_binary(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":240
  *             free(word)
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -13336,9 +14536,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(struct __pyx_obj_3_sa_BiLex *
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -13348,18 +14546,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":242
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":242
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -13368,77 +14557,77 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":243
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":243
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.f_index.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->read_handle(__pyx_v_self->f_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":244
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":244
  *         f = fopen(filename, "r")
  *         self.f_index.read_handle(f)
  *         self.e_index.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->read_handle(__pyx_v_self->e_index, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":245
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":245
  *         self.f_index.read_handle(f)
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->read_handle(__pyx_v_self->col1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":246
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":246
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  */
-  ((struct __pyx_vtabstruct_3_sa_FloatList *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->read_handle(__pyx_v_self->col2, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":247
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":247
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)             # <<<<<<<<<<<<<<
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id;
+  __pyx_t_1 = __pyx_v_self->fword2id;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
+  __pyx_t_2 = __pyx_v_self->id2fword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->read_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_1, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->read_wordlist(__pyx_v_self, __pyx_t_1, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":248
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":248
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_3 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id;
+  __pyx_t_3 = __pyx_v_self->eword2id;
   __Pyx_INCREF(__pyx_t_3);
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
+  __pyx_t_2 = __pyx_v_self->id2eword;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->read_wordlist(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_3, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->read_wordlist(__pyx_v_self, __pyx_t_3, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":249
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":249
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -13461,7 +14650,18 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":252
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_e_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_5BiLex_6get_e_id(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((PyObject *)__pyx_v_eword));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":252
  * 
  * 
  *     def get_e_id(self, eword):             # <<<<<<<<<<<<<<
@@ -13469,9 +14669,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2read_binary(PyObject *__pyx_v_self, PyObj
  *             e_id = len(self.id2eword)
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject *__pyx_v_eword) {
-  Py_ssize_t __pyx_v_e_id;
+static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_eword) {
+  PyObject *__pyx_v_e_id = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -13480,58 +14679,58 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_e_id");
+  __Pyx_RefNannySetupContext("get_e_id", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":253
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":253
  * 
  *     def get_e_id(self, eword):
  *         if eword not in self.eword2id:             # <<<<<<<<<<<<<<
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":254
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":254
  *     def get_e_id(self, eword):
  *         if eword not in self.eword2id:
  *             e_id = len(self.id2eword)             # <<<<<<<<<<<<<<
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id
  */
-    __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword;
+    __pyx_t_2 = __pyx_v_self->id2eword;
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_v_e_id = __pyx_t_3;
+    __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_v_e_id = __pyx_t_2;
+    __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":255
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":255
  *         if eword not in self.eword2id:
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)             # <<<<<<<<<<<<<<
  *             self.eword2id[eword] = e_id
  *         return self.eword2id[eword]
  */
-    __pyx_t_2 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword, __pyx_v_eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_self->id2eword, __pyx_v_eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":256
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":256
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id             # <<<<<<<<<<<<<<
  *         return self.eword2id[eword]
  * 
  */
-    __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_e_id); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    if (PyObject_SetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L5;
+    if (PyObject_SetItem(__pyx_v_self->eword2id, __pyx_v_eword, __pyx_v_e_id) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":257
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":257
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id
  *         return self.eword2id[eword]             # <<<<<<<<<<<<<<
@@ -13539,7 +14738,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -13552,12 +14751,24 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
   __Pyx_AddTraceback("_sa.BiLex.get_e_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_e_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":260
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_f_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_5BiLex_8get_f_id(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((PyObject *)__pyx_v_fword));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":260
  * 
  * 
  *     def get_f_id(self, fword):             # <<<<<<<<<<<<<<
@@ -13565,9 +14776,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_3get_e_id(PyObject *__pyx_v_self, PyObject
  *             f_id = len(self.id2fword)
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject *__pyx_v_fword) {
-  Py_ssize_t __pyx_v_f_id;
+static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword) {
+  PyObject *__pyx_v_f_id = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -13576,58 +14786,58 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_f_id");
+  __Pyx_RefNannySetupContext("get_f_id", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":261
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":261
  * 
  *     def get_f_id(self, fword):
  *         if fword not in self.fword2id:             # <<<<<<<<<<<<<<
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":262
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":262
  *     def get_f_id(self, fword):
  *         if fword not in self.fword2id:
  *             f_id = len(self.id2fword)             # <<<<<<<<<<<<<<
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id
  */
-    __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword;
+    __pyx_t_2 = __pyx_v_self->id2fword;
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_v_f_id = __pyx_t_3;
+    __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_v_f_id = __pyx_t_2;
+    __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":263
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":263
  *         if fword not in self.fword2id:
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)             # <<<<<<<<<<<<<<
  *             self.fword2id[fword] = f_id
  *         return self.fword2id[fword]
  */
-    __pyx_t_2 = __Pyx_PyObject_Append(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword, __pyx_v_fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_self->id2fword, __pyx_v_fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":264
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":264
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id             # <<<<<<<<<<<<<<
  *         return self.fword2id[fword]
  * 
  */
-    __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_f_id); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    if (PyObject_SetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L5;
+    if (PyObject_SetItem(__pyx_v_self->fword2id, __pyx_v_fword, __pyx_v_f_id) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":265
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":265
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id
  *         return self.fword2id[fword]             # <<<<<<<<<<<<<<
@@ -13635,7 +14845,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -13648,12 +14858,34 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
   __Pyx_AddTraceback("_sa.BiLex.get_f_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_f_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":268
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_10read_text(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":268
  * 
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -13661,9 +14893,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4get_f_id(PyObject *__pyx_v_self, PyObject
  *         cdef IntList fcount
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_j = 0;
   PyObject *__pyx_v_e_id = 0;
@@ -13708,18 +14938,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":272
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":272
  *         cdef IntList fcount
  * 
  *         fcount = IntList()             # <<<<<<<<<<<<<<
@@ -13731,7 +14952,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
   __pyx_v_fcount = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -13744,7 +14965,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
     __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
@@ -13754,12 +14975,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     /*try:*/ {
       {
         __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
@@ -13767,10 +14988,11 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
         __Pyx_XGOTREF(__pyx_t_6);
         __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __Pyx_INCREF(__pyx_t_1);
+          __pyx_v_f = __pyx_t_1;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":275
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":275
  *         with gzip_or_text(filename) as f:
  *             # first loop merely establishes size of array objects
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -13778,102 +15000,119 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 f_id = self.get_f_id(fword)
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_3); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_3 = __pyx_t_9(__pyx_t_2);
-              if (unlikely(!__pyx_t_3)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_1);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_line);
-            __pyx_v_line = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_line = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":276
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":276
  *             # first loop merely establishes size of array objects
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()             # <<<<<<<<<<<<<<
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
-              PyObject* sequence = __pyx_t_1;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+              PyObject* sequence = __pyx_t_3;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 4)) {
+                if (size > 4) __Pyx_RaiseTooManyValuesError(4);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
-                  if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
-                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
+                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
                 __pyx_t_12 = PyTuple_GET_ITEM(sequence, 3); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
-                  if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
-                __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
+                __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
                 __pyx_t_12 = PyList_GET_ITEM(sequence, 3); 
               }
-              __Pyx_INCREF(__pyx_t_3);
+              __Pyx_INCREF(__pyx_t_2);
               __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else {
+              #else
+              Py_ssize_t i;
+              PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_10,&__pyx_t_11,&__pyx_t_12};
+              for (i=0; i < 4; i++) {
+                PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                *(temps[i]) = item;
+              }
+              #endif
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_10,&__pyx_t_11,&__pyx_t_12};
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              index = 0; __pyx_t_3 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_3);
-              index = 1; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_11);
-              index = 3; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L19_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_12);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              for (index=0; index < 4; index++) {
+                PyObject* item = __pyx_t_14(__pyx_t_13); if (unlikely(!item)) goto __pyx_L18_unpacking_failed;
+                __Pyx_GOTREF(item);
+                *(temps[index]) = item;
+              }
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_14 = NULL;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L20_unpacking_done;
-              __pyx_L19_unpacking_failed:;
+              goto __pyx_L19_unpacking_done;
+              __pyx_L18_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_L20_unpacking_done:;
+              __pyx_t_14 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_L19_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_fword);
-            __pyx_v_fword = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_fword = __pyx_t_2;
+            __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_eword);
             __pyx_v_eword = __pyx_t_10;
             __pyx_t_10 = 0;
@@ -13884,51 +15123,51 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
             __pyx_v_score2 = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":277
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":277
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)             # <<<<<<<<<<<<<<
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
             __Pyx_INCREF(__pyx_v_fword);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_fword);
             __Pyx_GIVEREF(__pyx_v_fword);
-            __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XDECREF(__pyx_v_f_id);
             __pyx_v_f_id = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":278
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":278
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)             # <<<<<<<<<<<<<<
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)
  */
-            __pyx_t_11 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
             __Pyx_INCREF(__pyx_v_eword);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_v_eword);
             __Pyx_GIVEREF(__pyx_v_eword);
-            __pyx_t_1 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_e_id = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":279
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":279
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):             # <<<<<<<<<<<<<<
@@ -13936,42 +15175,41 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  */
             while (1) {
-              __pyx_t_15 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_15 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_3, Py_GE); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               if (!__pyx_t_16) break;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":280
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":280
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)             # <<<<<<<<<<<<<<
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  * 
  */
-              __pyx_t_12 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_fcount), __pyx_int_0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_fcount), __pyx_int_0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             }
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":281
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":281
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1             # <<<<<<<<<<<<<<
  * 
  *             # Allocate space for dictionary in arrays
  */
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_fcount->arr[__pyx_t_17]) = ((__pyx_v_fcount->arr[__pyx_t_15]) + 1);
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":284
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":284
  * 
  *             # Allocate space for dictionary in arrays
  *             N = 0             # <<<<<<<<<<<<<<
@@ -13981,192 +15219,192 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_N = __pyx_int_0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":285
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":285
  *             # Allocate space for dictionary in arrays
  *             N = 0
  *             n_f = len(fcount)             # <<<<<<<<<<<<<<
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:
  */
-          __pyx_t_8 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_v_n_f = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_t_8 = PyObject_Length(((PyObject *)__pyx_v_fcount)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_v_n_f = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":286
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":286
  *             N = 0
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)             # <<<<<<<<<<<<<<
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N
  */
-          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          __pyx_t_12 = PyNumber_Add(__pyx_v_n_f, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __pyx_t_12 = PyNumber_Add(__pyx_v_n_f, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
+          __Pyx_GOTREF(__pyx_v_self->f_index);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->f_index));
+          __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":287
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:             # <<<<<<<<<<<<<<
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  */
-          __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19++) {
-            __pyx_t_12 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_XDECREF(__pyx_v_i);
             __pyx_v_i = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":288
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":288
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N             # <<<<<<<<<<<<<<
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0
  */
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8]) = __pyx_t_20;
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":289
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":289
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]             # <<<<<<<<<<<<<<
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_12 = PyInt_FromLong((__pyx_v_fcount->arr[__pyx_t_8])); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_12 = PyInt_FromLong((__pyx_v_fcount->arr[__pyx_t_8])); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_2 = PyNumber_Add(__pyx_v_N, __pyx_t_12); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_1 = PyNumber_Add(__pyx_v_N, __pyx_t_12); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             __Pyx_DECREF(__pyx_v_N);
-            __pyx_v_N = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_N = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":290
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":290
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0             # <<<<<<<<<<<<<<
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)
  */
-            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_fcount->arr[__pyx_t_8]) = 0;
-            __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":287
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:             # <<<<<<<<<<<<<<
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_1 = PyInt_FromLong(__pyx_t_19); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_XDECREF(__pyx_v_i);
-          __pyx_v_i = __pyx_t_2;
-          __pyx_t_2 = 0;
+          __pyx_v_i = __pyx_t_1;
+          __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":291
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":291
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N             # <<<<<<<<<<<<<<
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)
  */
-          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8]) = __pyx_t_20;
+          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_N); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":292
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":292
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)             # <<<<<<<<<<<<<<
  *             self.col1 = FloatList(initial_len=N)
  *             self.col2 = FloatList(initial_len=N)
  */
-          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
+          __Pyx_GOTREF(__pyx_v_self->e_index);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->e_index));
+          __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":293
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":293
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)             # <<<<<<<<<<<<<<
  *             self.col2 = FloatList(initial_len=N)
  * 
  */
-          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-          __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_2);
-          __pyx_t_2 = 0;
+          __Pyx_GIVEREF(__pyx_t_1);
+          __Pyx_GOTREF(__pyx_v_self->col1);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->col1));
+          __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
+          __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":294
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":294
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)
  *             self.col2 = FloatList(initial_len=N)             # <<<<<<<<<<<<<<
  * 
  *             # Re-read file, placing words into buckets
  */
-          __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-          if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __pyx_t_12 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_v_N) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_FloatList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_GIVEREF(__pyx_t_12);
-          __Pyx_GOTREF(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2);
-          __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
+          __Pyx_GOTREF(__pyx_v_self->col2);
+          __Pyx_DECREF(((PyObject *)__pyx_v_self->col2));
+          __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":297
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":297
  * 
  *             # Re-read file, placing words into buckets
  *             f.seek(0)             # <<<<<<<<<<<<<<
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  */
-          __pyx_t_12 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_12 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__seek); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_2 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_1 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_k_tuple_43), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":298
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":298
  *             # Re-read file, placing words into buckets
  *             f.seek(0)
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -14174,26 +15412,34 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *                 f_id = self.get_f_id(fword)
  */
           if (PyList_CheckExact(__pyx_v_f) || PyTuple_CheckExact(__pyx_v_f)) {
-            __pyx_t_2 = __pyx_v_f; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_1 = __pyx_v_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_12 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_12 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_12 = __pyx_t_9(__pyx_t_2);
+              __pyx_t_12 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_12)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -14203,69 +15449,78 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
             __pyx_v_line = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":299
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":299
  *             f.seek(0)
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()             # <<<<<<<<<<<<<<
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  */
-            __pyx_t_12 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_12 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_1 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
-              PyObject* sequence = __pyx_t_1;
+            if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+              PyObject* sequence = __pyx_t_3;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 4)) {
+                if (size > 4) __Pyx_RaiseTooManyValuesError(4);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
-                  if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_12 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
-                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 3); 
+                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 3); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
-                  if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_12 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
-                __pyx_t_3 = PyList_GET_ITEM(sequence, 3); 
+                __pyx_t_2 = PyList_GET_ITEM(sequence, 3); 
               }
               __Pyx_INCREF(__pyx_t_12);
               __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_3);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else {
+              __Pyx_INCREF(__pyx_t_2);
+              #else
+              Py_ssize_t i;
+              PyObject** temps[4] = {&__pyx_t_12,&__pyx_t_11,&__pyx_t_10,&__pyx_t_2};
+              for (i=0; i < 4; i++) {
+                PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                *(temps[i]) = item;
+              }
+              #endif
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              PyObject** temps[4] = {&__pyx_t_12,&__pyx_t_11,&__pyx_t_10,&__pyx_t_2};
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              index = 0; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_12);
-              index = 1; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_11);
-              index = 2; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_10);
-              index = 3; __pyx_t_3 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L27_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_3);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              for (index=0; index < 4; index++) {
+                PyObject* item = __pyx_t_14(__pyx_t_13); if (unlikely(!item)) goto __pyx_L26_unpacking_failed;
+                __Pyx_GOTREF(item);
+                *(temps[index]) = item;
+              }
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 4) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_14 = NULL;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              goto __pyx_L28_unpacking_done;
-              __pyx_L27_unpacking_failed:;
+              goto __pyx_L27_unpacking_done;
+              __pyx_L26_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_L28_unpacking_done:;
+              __pyx_t_14 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_L27_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_fword);
             __pyx_v_fword = __pyx_t_12;
@@ -14277,141 +15532,141 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
             __pyx_v_score1 = __pyx_t_10;
             __pyx_t_10 = 0;
             __Pyx_XDECREF(__pyx_v_score2);
-            __pyx_v_score2 = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __pyx_v_score2 = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":300
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":300
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)             # <<<<<<<<<<<<<<
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_f_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_v_fword);
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fword);
+            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fword);
             __Pyx_GIVEREF(__pyx_v_fword);
-            __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_f_id);
             __pyx_v_f_id = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":301
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":301
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)             # <<<<<<<<<<<<<<
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_e_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_v_eword);
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_eword);
+            PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_eword);
             __Pyx_GIVEREF(__pyx_v_eword);
-            __pyx_t_1 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_3 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_e_id = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":302
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":302
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]             # <<<<<<<<<<<<<<
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)
  */
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_1 = PyInt_FromLong(((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_15]) + (__pyx_v_fcount->arr[__pyx_t_17]))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_3 = PyInt_FromLong(((__pyx_v_self->f_index->arr[__pyx_t_15]) + (__pyx_v_fcount->arr[__pyx_t_17]))); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_XDECREF(__pyx_v_index);
-            __pyx_v_index = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_index = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":303
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":303
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1             # <<<<<<<<<<<<<<
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)
  */
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_fcount->arr[__pyx_t_15]) = ((__pyx_v_fcount->arr[__pyx_t_17]) + 1);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":304
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":304
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)             # <<<<<<<<<<<<<<
  *                 self.col1[index] = float(score1)
  *                 self.col2[index] = float(score2)
  */
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_INCREF(__pyx_v_e_id);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_e_id);
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_e_id);
             __Pyx_GIVEREF(__pyx_v_e_id);
-            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            (((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_17]) = __pyx_t_20;
+            __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            (__pyx_v_self->e_index->arr[__pyx_t_17]) = __pyx_t_20;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":305
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":305
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)             # <<<<<<<<<<<<<<
  *                 self.col2[index] = float(score2)
  * 
  */
-            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score1); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_3 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            if (PyObject_SetItem(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1), __pyx_v_index, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score1); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            if (PyObject_SetItem(((PyObject *)__pyx_v_self->col1), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":306
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":306
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)
  *                 self.col2[index] = float(score2)             # <<<<<<<<<<<<<<
  * 
  *         # Sort buckets by eword
  */
-            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score2); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_3 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            if (PyObject_SetItem(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2), __pyx_v_index, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __pyx_t_21 = __Pyx_PyObject_AsDouble(__pyx_v_score2); if (unlikely(__pyx_t_21 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_t_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            if (PyObject_SetItem(((PyObject *)__pyx_v_self->col2), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         }
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -14420,57 +15675,57 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_3, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_3);
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+          __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
-          __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_22 = PyObject_Call(__pyx_t_4, __pyx_t_10, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_22)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_22)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_22);
           __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_22);
           __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
-          if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_23 = (!__pyx_t_16);
           if (__pyx_t_23) {
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_3);
-            __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_3, __pyx_t_1);
-            __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L31;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_3);
+            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L30;
           }
-          __pyx_L31:;
+          __pyx_L30:;
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
         __Pyx_XGIVEREF(__pyx_t_7);
         __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
-        __pyx_L16_try_end:;
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
@@ -14484,29 +15739,30 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
         if (unlikely(__pyx_t_23 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L32;
-    __pyx_L5_error:;
+    goto __pyx_L31;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     goto __pyx_L1_error;
-    __pyx_L32:;
+    __pyx_L31:;
   }
-  if (unlikely(!__pyx_v_n_f)) { __Pyx_RaiseUnboundLocalError("n_f"); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":309
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":309
  * 
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:             # <<<<<<<<<<<<<<
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  */
+  if (unlikely(!__pyx_v_n_f)) { __Pyx_RaiseUnboundLocalError("n_f"); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_n_f); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_19; __pyx_t_18++) {
-    __pyx_t_1 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_XDECREF(__pyx_v_b);
-    __pyx_v_b = __pyx_t_1;
-    __pyx_t_1 = 0;
+    __pyx_v_b = __pyx_t_3;
+    __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":310
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":310
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:
  *             i = self.f_index.arr[b]             # <<<<<<<<<<<<<<
@@ -14514,30 +15770,30 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  *             self.qsort(i,j, "")
  */
     __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_b); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_XDECREF(__pyx_v_i);
-    __pyx_v_i = __pyx_t_1;
-    __pyx_t_1 = 0;
+    __pyx_v_i = __pyx_t_3;
+    __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":311
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":311
  *         for b from 0 <= b < n_f:
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]             # <<<<<<<<<<<<<<
  *             self.qsort(i,j, "")
  * 
  */
-    __pyx_t_1 = PyNumber_Add(__pyx_v_b, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = PyNumber_Add(__pyx_v_b, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_XDECREF(__pyx_v_j);
-    __pyx_v_j = __pyx_t_1;
-    __pyx_t_1 = 0;
+    __pyx_v_j = __pyx_t_3;
+    __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":312
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":312
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  *             self.qsort(i,j, "")             # <<<<<<<<<<<<<<
@@ -14546,27 +15802,27 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
  */
     __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_24 = __Pyx_PyInt_AsInt(__pyx_v_j); if (unlikely((__pyx_t_24 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = ((PyObject *)__pyx_kp_s_45);
-    __Pyx_INCREF(__pyx_t_1);
-    __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_BiLex *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->__pyx_vtab)->qsort(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_t_20, __pyx_t_24, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __pyx_t_3 = ((PyObject *)__pyx_kp_s_45);
+    __Pyx_INCREF(__pyx_t_3);
+    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_BiLex *)__pyx_v_self->__pyx_vtab)->qsort(__pyx_v_self, __pyx_t_20, __pyx_t_24, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_b); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":309
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":309
  * 
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:             # <<<<<<<<<<<<<<
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  */
-  __pyx_t_3 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = PyInt_FromLong(__pyx_t_18); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_v_b);
-  __pyx_v_b = __pyx_t_3;
-  __pyx_t_3 = 0;
+  __pyx_v_b = __pyx_t_2;
+  __pyx_t_2 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -14601,7 +15857,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_5read_text(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":315
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":315
  * 
  * 
  *     cdef swap(self, int i, int j):             # <<<<<<<<<<<<<<
@@ -14615,9 +15871,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("swap");
+  __Pyx_RefNannySetupContext("swap", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":319
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":319
  *         cdef float ftmp
  * 
  *         if i == j:             # <<<<<<<<<<<<<<
@@ -14627,7 +15883,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = (__pyx_v_i == __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":320
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":320
  * 
  *         if i == j:
  *             return             # <<<<<<<<<<<<<<
@@ -14641,7 +15897,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":322
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":322
  *             return
  * 
  *         itmp = self.e_index.arr[i]             # <<<<<<<<<<<<<<
@@ -14650,7 +15906,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_itmp = (__pyx_v_self->e_index->arr[__pyx_v_i]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":323
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":323
  * 
  *         itmp = self.e_index.arr[i]
  *         self.e_index.arr[i] = self.e_index.arr[j]             # <<<<<<<<<<<<<<
@@ -14659,7 +15915,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->e_index->arr[__pyx_v_i]) = (__pyx_v_self->e_index->arr[__pyx_v_j]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":324
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":324
  *         itmp = self.e_index.arr[i]
  *         self.e_index.arr[i] = self.e_index.arr[j]
  *         self.e_index.arr[j] = itmp             # <<<<<<<<<<<<<<
@@ -14668,7 +15924,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->e_index->arr[__pyx_v_j]) = __pyx_v_itmp;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":326
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":326
  *         self.e_index.arr[j] = itmp
  * 
  *         ftmp = self.col1.arr[i]             # <<<<<<<<<<<<<<
@@ -14677,7 +15933,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_ftmp = (__pyx_v_self->col1->arr[__pyx_v_i]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":327
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":327
  * 
  *         ftmp = self.col1.arr[i]
  *         self.col1.arr[i] = self.col1.arr[j]             # <<<<<<<<<<<<<<
@@ -14686,7 +15942,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col1->arr[__pyx_v_i]) = (__pyx_v_self->col1->arr[__pyx_v_j]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":328
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":328
  *         ftmp = self.col1.arr[i]
  *         self.col1.arr[i] = self.col1.arr[j]
  *         self.col1.arr[j] = ftmp             # <<<<<<<<<<<<<<
@@ -14695,7 +15951,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col1->arr[__pyx_v_j]) = __pyx_v_ftmp;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":330
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":330
  *         self.col1.arr[j] = ftmp
  * 
  *         ftmp = self.col2.arr[i]             # <<<<<<<<<<<<<<
@@ -14704,7 +15960,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_ftmp = (__pyx_v_self->col2->arr[__pyx_v_i]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":331
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":331
  * 
  *         ftmp = self.col2.arr[i]
  *         self.col2.arr[i] = self.col2.arr[j]             # <<<<<<<<<<<<<<
@@ -14713,7 +15969,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col2->arr[__pyx_v_i]) = (__pyx_v_self->col2->arr[__pyx_v_j]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":332
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":332
  *         ftmp = self.col2.arr[i]
  *         self.col2.arr[i] = self.col2.arr[j]
  *         self.col2.arr[j] = ftmp             # <<<<<<<<<<<<<<
@@ -14729,7 +15985,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":335
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":335
  * 
  * 
  *     cdef qsort(self, int i, int j, pad):             # <<<<<<<<<<<<<<
@@ -14750,9 +16006,9 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("qsort");
+  __Pyx_RefNannySetupContext("qsort", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":338
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":338
  *         cdef int pval, p
  * 
  *         if i > j:             # <<<<<<<<<<<<<<
@@ -14762,7 +16018,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i > __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":339
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":339
  * 
  *         if i > j:
  *             raise Exception("Sort error in CLex")             # <<<<<<<<<<<<<<
@@ -14778,7 +16034,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":340
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":340
  *         if i > j:
  *             raise Exception("Sort error in CLex")
  *         if i == j: #empty interval             # <<<<<<<<<<<<<<
@@ -14788,7 +16044,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i == __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":341
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":341
  *             raise Exception("Sort error in CLex")
  *         if i == j: #empty interval
  *             return             # <<<<<<<<<<<<<<
@@ -14802,7 +16058,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":342
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":342
  *         if i == j: #empty interval
  *             return
  *         if i == j-1: # singleton interval             # <<<<<<<<<<<<<<
@@ -14812,7 +16068,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i == (__pyx_v_j - 1));
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":343
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":343
  *             return
  *         if i == j-1: # singleton interval
  *             return             # <<<<<<<<<<<<<<
@@ -14826,7 +16082,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":345
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":345
  *             return
  * 
  *         p = (i+j)/2             # <<<<<<<<<<<<<<
@@ -14835,7 +16091,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_p = __Pyx_div_long((__pyx_v_i + __pyx_v_j), 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":346
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":346
  * 
  *         p = (i+j)/2
  *         pval = self.e_index.arr[p]             # <<<<<<<<<<<<<<
@@ -14844,7 +16100,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_pval = (__pyx_v_self->e_index->arr[__pyx_v_p]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":347
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":347
  *         p = (i+j)/2
  *         pval = self.e_index.arr[p]
  *         self.swap(i, p)             # <<<<<<<<<<<<<<
@@ -14855,7 +16111,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":348
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":348
  *         pval = self.e_index.arr[p]
  *         self.swap(i, p)
  *         p = i             # <<<<<<<<<<<<<<
@@ -14864,7 +16120,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_p = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":349
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":349
  *         self.swap(i, p)
  *         p = i
  *         for k from i+1 <= k < j:             # <<<<<<<<<<<<<<
@@ -14874,7 +16130,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_3 = __pyx_v_j;
   for (__pyx_v_k = (__pyx_v_i + 1); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":350
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":350
  *         p = i
  *         for k from i+1 <= k < j:
  *             if pval >= self.e_index.arr[k]:             # <<<<<<<<<<<<<<
@@ -14884,7 +16140,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
     __pyx_t_1 = (__pyx_v_pval >= (__pyx_v_self->e_index->arr[__pyx_v_k]));
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":351
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":351
  *         for k from i+1 <= k < j:
  *             if pval >= self.e_index.arr[k]:
  *                 self.swap(p+1, k)             # <<<<<<<<<<<<<<
@@ -14895,7 +16151,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":352
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":352
  *             if pval >= self.e_index.arr[k]:
  *                 self.swap(p+1, k)
  *                 self.swap(p, p+1)             # <<<<<<<<<<<<<<
@@ -14906,7 +16162,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":353
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":353
  *                 self.swap(p+1, k)
  *                 self.swap(p, p+1)
  *                 p = p + 1             # <<<<<<<<<<<<<<
@@ -14919,7 +16175,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
     __pyx_L8:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":354
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":354
  *                 self.swap(p, p+1)
  *                 p = p + 1
  *         self.qsort(i,p, pad+"    ")             # <<<<<<<<<<<<<<
@@ -14933,7 +16189,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":355
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":355
  *                 p = p + 1
  *         self.qsort(i,p, pad+"    ")
  *         self.qsort(p+1,j, pad+"    ")             # <<<<<<<<<<<<<<
@@ -14960,7 +16216,28 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":358
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_12write_enhanced(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":358
  * 
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -14968,9 +16245,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  *             for i in self.f_index:
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_s1 = NULL;
@@ -14984,9 +16259,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   PyObject *__pyx_t_10 = NULL;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
@@ -14997,18 +16272,9 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -15019,7 +16285,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -15031,213 +16297,238 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":360
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":360
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             for i in self.f_index:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index); __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->f_index)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->f_index))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->f_index); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->f_index)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_8(__pyx_t_1);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":361
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":361
  *         with open(filename, "w") as f:
  *             for i in self.f_index:
  *                 f.write("%d " % i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_9));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
-            __pyx_t_9 = 0;
-            __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":362
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_49), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_49), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":363
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":363
  *                 f.write("%d " % i)
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):             # <<<<<<<<<<<<<<
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")
  */
-          __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index));
-          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          PyTuple_SET_ITEM(__pyx_t_9, 1, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1));
-          __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          PyTuple_SET_ITEM(__pyx_t_9, 2, ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2));
-          __pyx_t_1 = PyObject_Call(__pyx_builtin_zip, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-          if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
-            __pyx_t_9 = __pyx_t_1; __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_INCREF(((PyObject *)__pyx_v_self->e_index));
+          PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->e_index));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e_index));
+          __Pyx_INCREF(((PyObject *)__pyx_v_self->col1));
+          PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->col1));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->col1));
+          __Pyx_INCREF(((PyObject *)__pyx_v_self->col2));
+          PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->col2));
+          __Pyx_GIVEREF(((PyObject *)__pyx_v_self->col2));
+          __pyx_t_4 = PyObject_Call(__pyx_builtin_zip, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+          if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
+            __pyx_t_2 = __pyx_t_4; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_1 = __pyx_t_8(__pyx_t_9);
-              if (unlikely(!__pyx_t_1)) {
+              __pyx_t_4 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_4)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_1);
+              __Pyx_GOTREF(__pyx_t_4);
             }
-            if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
-              PyObject* sequence = __pyx_t_1;
+            if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
+              PyObject* sequence = __pyx_t_4;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 3)) {
+                if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); 
-                __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
+                __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-                  if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-                }
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 0); 
-                __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
+                __pyx_t_1 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
               }
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_2);
+              __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_11);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            } else {
+              #else
+              __pyx_t_10 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+            } else
+            {
               Py_ssize_t index = -1;
-              __pyx_t_12 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              __pyx_t_12 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
               __pyx_t_13 = Py_TYPE(__pyx_t_12)->tp_iternext;
-              index = 0; __pyx_t_10 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
+              index = 0; __pyx_t_10 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_10)) goto __pyx_L20_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_10);
-              index = 1; __pyx_t_2 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_2)) goto __pyx_L21_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_2);
-              index = 2; __pyx_t_11 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L21_unpacking_failed;
+              index = 1; __pyx_t_1 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_1)) goto __pyx_L20_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_1);
+              index = 2; __pyx_t_11 = __pyx_t_13(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L20_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_11);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_13(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_13 = NULL;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              goto __pyx_L22_unpacking_done;
-              __pyx_L21_unpacking_failed:;
+              goto __pyx_L21_unpacking_done;
+              __pyx_L20_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __pyx_L22_unpacking_done:;
+              __pyx_t_13 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_L21_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_i);
             __pyx_v_i = __pyx_t_10;
             __pyx_t_10 = 0;
             __Pyx_XDECREF(__pyx_v_s1);
-            __pyx_v_s1 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_s1 = __pyx_t_1;
+            __pyx_t_1 = 0;
             __Pyx_XDECREF(__pyx_v_s2);
             __pyx_v_s2 = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":364
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":364
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+            __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_11 = PyTuple_New(3); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __Pyx_INCREF(__pyx_v_i);
             PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
@@ -15247,37 +16538,37 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
             __Pyx_INCREF(__pyx_v_s2);
             PyTuple_SET_ITEM(__pyx_t_11, 2, __pyx_v_s2);
             __Pyx_GIVEREF(__pyx_v_s2);
-            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_50), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_50), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
-            PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_t_2));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-            __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_t_1));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
+            __pyx_t_1 = 0;
+            __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           }
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":365
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":365
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_51), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_51), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":366
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":366
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):             # <<<<<<<<<<<<<<
@@ -15285,28 +16576,36 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_2 = __pyx_int_0;
-          if (PyList_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword)) {
-            __pyx_t_9 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword; __Pyx_INCREF(__pyx_t_9); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_1 = __pyx_int_0;
+          if (PyList_CheckExact(__pyx_v_self->id2fword) || PyTuple_CheckExact(__pyx_v_self->id2fword)) {
+            __pyx_t_2 = __pyx_v_self->id2fword; __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_9 = PyObject_GetIter(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_8 = Py_TYPE(__pyx_t_9)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self->id2fword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_11); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_9)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_7); __Pyx_INCREF(__pyx_t_11); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_11 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_11 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_11 = __pyx_t_8(__pyx_t_9);
+              __pyx_t_11 = __pyx_t_9(__pyx_t_2);
               if (unlikely(!__pyx_t_11)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -15315,64 +16614,64 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
             __Pyx_XDECREF(__pyx_v_w);
             __pyx_v_w = __pyx_t_11;
             __pyx_t_11 = 0;
-            __Pyx_INCREF(__pyx_t_2);
+            __Pyx_INCREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_2;
-            __pyx_t_11 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_v_i = __pyx_t_1;
+            __pyx_t_11 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_2);
-            __pyx_t_2 = __pyx_t_11;
+            __Pyx_DECREF(__pyx_t_1);
+            __pyx_t_1 = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":367
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":367
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):
  */
-            __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_INCREF(__pyx_v_i);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
             __Pyx_INCREF(__pyx_v_w);
-            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_w);
+            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_w);
             __Pyx_GIVEREF(__pyx_v_w);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":368
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_53), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_53), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":369
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":369
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):             # <<<<<<<<<<<<<<
@@ -15380,28 +16679,36 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  *             f.write("\n")
  */
           __Pyx_INCREF(__pyx_int_0);
-          __pyx_t_9 = __pyx_int_0;
-          if (PyList_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword)) {
-            __pyx_t_2 = ((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
-            __pyx_t_8 = NULL;
+          __pyx_t_2 = __pyx_int_0;
+          if (PyList_CheckExact(__pyx_v_self->id2eword) || PyTuple_CheckExact(__pyx_v_self->id2eword)) {
+            __pyx_t_1 = __pyx_v_self->id2eword; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+            __pyx_t_9 = NULL;
           } else {
-            __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->id2eword); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_10); __pyx_t_7++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_10); __pyx_t_7++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_10 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_1)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_10 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_10 = __pyx_t_8(__pyx_t_2);
+              __pyx_t_10 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_10)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -15410,76 +16717,76 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
             __Pyx_XDECREF(__pyx_v_w);
             __pyx_v_w = __pyx_t_10;
             __pyx_t_10 = 0;
-            __Pyx_INCREF(__pyx_t_9);
+            __Pyx_INCREF(__pyx_t_2);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_9;
-            __pyx_t_10 = PyNumber_Add(__pyx_t_9, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_v_i = __pyx_t_2;
+            __pyx_t_10 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_9);
-            __pyx_t_9 = __pyx_t_10;
+            __Pyx_DECREF(__pyx_t_2);
+            __pyx_t_2 = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":370
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":370
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+            __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_INCREF(__pyx_v_i);
-            PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
             __Pyx_GIVEREF(__pyx_v_i);
             __Pyx_INCREF(__pyx_v_w);
-            PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_w);
+            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_w);
             __Pyx_GIVEREF(__pyx_v_w);
-            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_52), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_11));
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_11));
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_11));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
             __pyx_t_11 = 0;
-            __pyx_t_11 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_11 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
           }
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":371
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  * 
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_54), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+          __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_54), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
-        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -15488,75 +16795,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_9, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __Pyx_INCREF(__pyx_t_9);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
-          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
-          __pyx_t_15 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __pyx_t_15 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_16 = (!__pyx_t_14);
           if (__pyx_t_16) {
+            __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_9, __pyx_t_11);
-            __pyx_t_2 = 0; __pyx_t_9 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L29;
+            __Pyx_ErrRestore(__pyx_t_1, __pyx_t_2, __pyx_t_11);
+            __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_11 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L28;
           }
-          __pyx_L29:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __pyx_L28:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_55, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_55, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L30;
-    __pyx_L5_error:;
+    goto __pyx_L29;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L30:;
+    __pyx_L29:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -15564,7 +16871,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_12);
@@ -15581,41 +16888,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6write_enhanced(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":374
- * 
- * 
- *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
- *         cdef e_id, f_id, low, high, midpoint, val
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fword = 0;
   PyObject *__pyx_v_eword = 0;
   PyObject *__pyx_v_col = 0;
-  PyObject *__pyx_v_e_id = 0;
-  PyObject *__pyx_v_f_id = 0;
-  PyObject *__pyx_v_low = 0;
-  PyObject *__pyx_v_high = 0;
-  PyObject *__pyx_v_midpoint = 0;
-  PyObject *__pyx_v_val = 0;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
-  __Pyx_RefNannySetupContext("get_score");
+  __Pyx_RefNannySetupContext("get_score (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -15623,26 +16911,23 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fword);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fword)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eword);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eword)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_score", 1, 3, 3, 1); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__col);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__col)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_score", 1, 3, 3, 2); {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_score") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_score") < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -15663,18 +16948,48 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_14get_score(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), __pyx_v_fword, __pyx_v_eword, __pyx_v_col);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":374
+ * 
+ * 
+ *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
+ *         cdef e_id, f_id, low, high, midpoint, val
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, PyObject *__pyx_v_fword, PyObject *__pyx_v_eword, PyObject *__pyx_v_col) {
+  PyObject *__pyx_v_e_id = 0;
+  PyObject *__pyx_v_f_id = 0;
+  PyObject *__pyx_v_low = 0;
+  PyObject *__pyx_v_high = 0;
+  PyObject *__pyx_v_midpoint = 0;
+  PyObject *__pyx_v_val = 0;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_score", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":377
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":377
  *         cdef e_id, f_id, low, high, midpoint, val
  * 
  *         if eword not in self.eword2id:             # <<<<<<<<<<<<<<
  *             return None
  *         if fword not in self.fword2id:
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":378
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":378
  * 
  *         if eword not in self.eword2id:
  *             return None             # <<<<<<<<<<<<<<
@@ -15685,21 +17000,21 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
     __Pyx_INCREF(Py_None);
     __pyx_r = Py_None;
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":379
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":379
  *         if eword not in self.eword2id:
  *             return None
  *         if fword not in self.fword2id:             # <<<<<<<<<<<<<<
  *             return None
  *         f_id = self.fword2id[fword]
  */
-  __pyx_t_1 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":380
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":380
  *             return None
  *         if fword not in self.fword2id:
  *             return None             # <<<<<<<<<<<<<<
@@ -15710,35 +17025,35 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
     __Pyx_INCREF(Py_None);
     __pyx_r = Py_None;
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":381
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":381
  *         if fword not in self.fword2id:
  *             return None
  *         f_id = self.fword2id[fword]             # <<<<<<<<<<<<<<
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]
  */
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->fword2id, __pyx_v_fword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_f_id = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":382
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":382
  *             return None
  *         f_id = self.fword2id[fword]
  *         e_id = self.eword2id[eword]             # <<<<<<<<<<<<<<
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]
  */
-  __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetItem(__pyx_v_self->eword2id, __pyx_v_eword); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_e_id = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":383
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":383
  *         f_id = self.fword2id[fword]
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]             # <<<<<<<<<<<<<<
@@ -15746,12 +17061,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *         while high - low > 0:
  */
   __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_low = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":384
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":384
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]             # <<<<<<<<<<<<<<
@@ -15762,12 +17077,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_t_2); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_high = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":385
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":385
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]
  *         while high - low > 0:             # <<<<<<<<<<<<<<
@@ -15777,14 +17092,13 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   while (1) {
     __pyx_t_2 = PyNumber_Subtract(__pyx_v_high, __pyx_v_low); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (!__pyx_t_1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":386
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":386
  *         high = self.f_index.arr[f_id+1]
  *         while high - low > 0:
  *             midpoint = (low+high)/2             # <<<<<<<<<<<<<<
@@ -15800,7 +17114,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
     __pyx_v_midpoint = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":387
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":387
  *         while high - low > 0:
  *             midpoint = (low+high)/2
  *             val = self.e_index.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -15808,39 +17122,37 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *                 if col == 0:
  */
     __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->e_index->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_XDECREF(__pyx_v_val);
     __pyx_v_val = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":388
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":388
  *             midpoint = (low+high)/2
  *             val = self.e_index.arr[midpoint]
  *             if val == e_id:             # <<<<<<<<<<<<<<
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":389
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":389
  *             val = self.e_index.arr[midpoint]
  *             if val == e_id:
  *                 if col == 0:             # <<<<<<<<<<<<<<
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":390
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":390
  *             if val == e_id:
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -15849,29 +17161,28 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  */
         __Pyx_XDECREF(__pyx_r);
         __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyFloat_FromDouble((__pyx_v_self->col1->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_r = __pyx_t_2;
         __pyx_t_2 = 0;
         goto __pyx_L0;
-        goto __pyx_L11;
+        goto __pyx_L8;
       }
-      __pyx_L11:;
+      __pyx_L8:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":391
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":391
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:             # <<<<<<<<<<<<<<
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_col, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":392
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":392
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:
  *                     return self.col2.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -15880,32 +17191,31 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  */
         __Pyx_XDECREF(__pyx_r);
         __pyx_t_3 = __Pyx_PyIndex_AsSsize_t(__pyx_v_midpoint); if (unlikely((__pyx_t_3 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyFloat_FromDouble((__pyx_v_self->col2->arr[__pyx_t_3])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_r = __pyx_t_2;
         __pyx_t_2 = 0;
         goto __pyx_L0;
-        goto __pyx_L12;
+        goto __pyx_L9;
       }
-      __pyx_L12:;
-      goto __pyx_L10;
+      __pyx_L9:;
+      goto __pyx_L7;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":393
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":393
  *                 if col == 1:
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:             # <<<<<<<<<<<<<<
  *                 high = midpoint
  *             if val < e_id:
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":394
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":394
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:
  *                 high = midpoint             # <<<<<<<<<<<<<<
@@ -15915,24 +17225,23 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
       __Pyx_INCREF(__pyx_v_midpoint);
       __Pyx_DECREF(__pyx_v_high);
       __pyx_v_high = __pyx_v_midpoint;
-      goto __pyx_L13;
+      goto __pyx_L10;
     }
-    __pyx_L13:;
+    __pyx_L10:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":395
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":395
  *             if val > e_id:
  *                 high = midpoint
  *             if val < e_id:             # <<<<<<<<<<<<<<
  *                 low = midpoint + 1
  *         return None
  */
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_val, __pyx_v_e_id, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":396
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":396
  *                 high = midpoint
  *             if val < e_id:
  *                 low = midpoint + 1             # <<<<<<<<<<<<<<
@@ -15944,12 +17253,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
       __Pyx_DECREF(__pyx_v_low);
       __pyx_v_low = __pyx_t_2;
       __pyx_t_2 = 0;
-      goto __pyx_L14;
+      goto __pyx_L11;
     }
-    __pyx_L14:;
+    __pyx_L11:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":397
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":397
  *             if val < e_id:
  *                 low = midpoint + 1
  *         return None             # <<<<<<<<<<<<<<
@@ -15980,7 +17289,29 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":400
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static char __pyx_doc_3_sa_5BiLex_16write_text[] = "Note: does not guarantee writing the dictionary in the original order";
+static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_5BiLex_16write_text(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":400
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -15988,10 +17319,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_7get_score(PyObject *__pyx_v_self, PyObjec
  *         cdef i, N, e_id, f_id
  */
 
-static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static char __pyx_doc_3_sa_5BiLex_8write_text[] = "Note: does not guarantee writing the dictionary in the original order";
-static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_N = 0;
   PyObject *__pyx_v_e_id = 0;
@@ -16007,29 +17335,20 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  Py_ssize_t __pyx_t_7;
-  long __pyx_t_8;
+  PyObject *__pyx_t_7 = NULL;
+  Py_ssize_t __pyx_t_8;
   long __pyx_t_9;
-  int __pyx_t_10;
-  PyObject *__pyx_t_11 = NULL;
+  long __pyx_t_10;
+  int __pyx_t_11;
   PyObject *__pyx_t_12 = NULL;
   PyObject *__pyx_t_13 = NULL;
   int __pyx_t_14;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -16040,7 +17359,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -16052,39 +17371,40 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":405
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":405
  * 
  *         with open(filename, "w") as f:
  *             N = len(self.e_index)             # <<<<<<<<<<<<<<
  *             f_id = 0
  *             for i from 0 <= i < N:
  */
-          __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index);
-          __Pyx_INCREF(__pyx_t_1);
-          __pyx_t_7 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_v_N = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_t_4 = ((PyObject *)__pyx_v_self->e_index);
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_t_8 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_8); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_v_N = __pyx_t_4;
+          __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":406
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":406
  *         with open(filename, "w") as f:
  *             N = len(self.e_index)
  *             f_id = 0             # <<<<<<<<<<<<<<
@@ -16094,22 +17414,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_f_id = __pyx_int_0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":407
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":407
  *             N = len(self.e_index)
  *             f_id = 0
  *             for i from 0 <= i < N:             # <<<<<<<<<<<<<<
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  */
-          __pyx_t_8 = __Pyx_PyInt_AsLong(__pyx_v_N); if (unlikely((__pyx_t_8 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9++) {
-            __pyx_t_1 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_9 = __Pyx_PyInt_AsLong(__pyx_v_N); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10++) {
+            __pyx_t_4 = PyInt_FromLong(__pyx_t_10); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_XDECREF(__pyx_v_i);
-            __pyx_v_i = __pyx_t_1;
-            __pyx_t_1 = 0;
+            __pyx_v_i = __pyx_t_4;
+            __pyx_t_4 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":408
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":408
  *             f_id = 0
  *             for i from 0 <= i < N:
  *                 while self.f_index.arr[f_id+1] == i:             # <<<<<<<<<<<<<<
@@ -16117,139 +17437,138 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  *                 e_id = self.e_index.arr[i]
  */
             while (1) {
-              __pyx_t_1 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->f_index->arr[__pyx_t_7])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_v_i, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_4 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __pyx_t_4 = PyInt_FromLong((__pyx_v_self->f_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_4);
+              __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_v_i, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+              __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-              __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-              if (!__pyx_t_10) break;
+              if (!__pyx_t_11) break;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":409
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":409
  *             for i from 0 <= i < N:
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1             # <<<<<<<<<<<<<<
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]
  */
-              __pyx_t_2 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-              __Pyx_GOTREF(__pyx_t_2);
+              __pyx_t_1 = PyNumber_Add(__pyx_v_f_id, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_v_f_id);
-              __pyx_v_f_id = __pyx_t_2;
-              __pyx_t_2 = 0;
+              __pyx_v_f_id = __pyx_t_1;
+              __pyx_t_1 = 0;
             }
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":410
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":410
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  *                 e_id = self.e_index.arr[i]             # <<<<<<<<<<<<<<
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  */
-            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->e_index->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyInt_FromLong((__pyx_v_self->e_index->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_e_id);
-            __pyx_v_e_id = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_e_id = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":411
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":411
  *                     f_id = f_id + 1
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]             # <<<<<<<<<<<<<<
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))
  */
-            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col1->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->col1->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_score1);
-            __pyx_v_score1 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_score1 = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":412
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":412
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]             # <<<<<<<<<<<<<<
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))
  */
-            __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __pyx_t_2 = PyFloat_FromDouble((((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->col2->arr[__pyx_t_7])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->col2->arr[__pyx_t_8])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
             __Pyx_XDECREF(__pyx_v_score2);
-            __pyx_v_score2 = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_score2 = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":413
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":413
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))             # <<<<<<<<<<<<<<
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2fword, __pyx_v_f_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_11 = PyObject_GetItem(((struct __pyx_obj_3_sa_BiLex *)__pyx_v_self)->id2eword, __pyx_v_e_id); if (!__pyx_t_11) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_12 = PyTuple_New(4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_1);
-            __Pyx_GIVEREF(__pyx_t_1);
-            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_11);
-            __Pyx_GIVEREF(__pyx_t_11);
+            __pyx_t_4 = PyObject_GetItem(__pyx_v_self->id2fword, __pyx_v_f_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_2 = PyObject_GetItem(__pyx_v_self->id2eword, __pyx_v_e_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_12 = PyTuple_New(4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
+            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_4);
+            __Pyx_GIVEREF(__pyx_t_4);
+            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_2);
+            __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_v_score1);
             PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_v_score1);
             __Pyx_GIVEREF(__pyx_v_score1);
             __Pyx_INCREF(__pyx_v_score2);
             PyTuple_SET_ITEM(__pyx_t_12, 3, __pyx_v_score2);
             __Pyx_GIVEREF(__pyx_v_score2);
-            __pyx_t_1 = 0;
-            __pyx_t_11 = 0;
-            __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_56), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+            __pyx_t_4 = 0;
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_56), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-            PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
-            __pyx_t_11 = 0;
-            __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_11);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_12);
+            PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_2));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+            __pyx_t_2 = 0;
+            __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            __pyx_t_9 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __pyx_t_10 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":407
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":407
  *             N = len(self.e_index)
  *             f_id = 0
  *             for i from 0 <= i < N:             # <<<<<<<<<<<<<<
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  */
-          __pyx_t_11 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_2 = PyInt_FromLong(__pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
           __Pyx_XDECREF(__pyx_v_i);
-          __pyx_v_i = __pyx_t_11;
-          __pyx_t_11 = 0;
+          __pyx_v_i = __pyx_t_2;
+          __pyx_t_2 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
+        __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -16258,75 +17577,75 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_11, &__pyx_t_12, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(__pyx_t_11);
-          __Pyx_GOTREF(__pyx_t_12);
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_12, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-          __Pyx_INCREF(__pyx_t_11);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
-          __Pyx_GIVEREF(__pyx_t_11);
-          __Pyx_INCREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_12);
-          __Pyx_GIVEREF(__pyx_t_12);
+          __Pyx_GOTREF(__pyx_t_12);
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
+          __Pyx_INCREF(__pyx_t_12);
+          PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_12);
+          __Pyx_GIVEREF(__pyx_t_12);
+          __Pyx_INCREF(__pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
+          __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __pyx_t_14 = (!__pyx_t_10);
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_14 = (!__pyx_t_11);
           if (__pyx_t_14) {
-            __Pyx_GIVEREF(__pyx_t_11);
-            __Pyx_GIVEREF(__pyx_t_12);
             __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_11, __pyx_t_12, __pyx_t_2);
-            __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_GIVEREF(__pyx_t_12);
+            __Pyx_GIVEREF(__pyx_t_1);
+            __Pyx_ErrRestore(__pyx_t_2, __pyx_t_12, __pyx_t_1);
+            __pyx_t_2 = 0; __pyx_t_12 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_57, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_57, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -16334,7 +17653,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_11);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_12);
   __Pyx_AddTraceback("_sa.BiLex.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -16351,7 +17670,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8write_text(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":21
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":21
  * cdef int LOWER_MASK[32]
  * 
  * cdef void _init_lower_mask():             # <<<<<<<<<<<<<<
@@ -16365,9 +17684,9 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   unsigned int __pyx_t_2;
-  __Pyx_RefNannySetupContext("_init_lower_mask");
+  __Pyx_RefNannySetupContext("_init_lower_mask", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":23
  * cdef void _init_lower_mask():
  *     cdef unsigned i
  *     cdef int mask = 0             # <<<<<<<<<<<<<<
@@ -16376,7 +17695,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
  */
   __pyx_v_mask = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":24
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":24
  *     cdef unsigned i
  *     cdef int mask = 0
  *     for i in range(MIN_BOTTOM_SIZE):             # <<<<<<<<<<<<<<
@@ -16387,7 +17706,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":25
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":25
  *     cdef int mask = 0
  *     for i in range(MIN_BOTTOM_SIZE):
  *         mask = (mask << 1) + 1             # <<<<<<<<<<<<<<
@@ -16396,7 +17715,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
  */
     __pyx_v_mask = ((__pyx_v_mask << 1) + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":26
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":26
  *     for i in range(MIN_BOTTOM_SIZE):
  *         mask = (mask << 1) + 1
  *         LOWER_MASK[i] = mask             # <<<<<<<<<<<<<<
@@ -16409,7 +17728,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":37
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":37
  * 
  * 
  * cdef _BitSet* new_BitSet():             # <<<<<<<<<<<<<<
@@ -16421,9 +17740,9 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   struct __pyx_t_3_sa__BitSet *__pyx_v_b;
   struct __pyx_t_3_sa__BitSet *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_BitSet");
+  __Pyx_RefNannySetupContext("new_BitSet", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":40
  *     cdef _BitSet* b
  * 
  *     b = <_BitSet*> malloc(sizeof(_BitSet))             # <<<<<<<<<<<<<<
@@ -16432,7 +17751,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b = ((struct __pyx_t_3_sa__BitSet *)malloc((sizeof(struct __pyx_t_3_sa__BitSet))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":41
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":41
  * 
  *     b = <_BitSet*> malloc(sizeof(_BitSet))
  *     b.bitset = 0             # <<<<<<<<<<<<<<
@@ -16441,7 +17760,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->bitset = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":42
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":42
  *     b = <_BitSet*> malloc(sizeof(_BitSet))
  *     b.bitset = 0
  *     b.min_val = -1             # <<<<<<<<<<<<<<
@@ -16450,7 +17769,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->min_val = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":43
  *     b.bitset = 0
  *     b.min_val = -1
  *     b.max_val = -1             # <<<<<<<<<<<<<<
@@ -16459,7 +17778,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->max_val = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":44
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":44
  *     b.min_val = -1
  *     b.max_val = -1
  *     b.size = 0             # <<<<<<<<<<<<<<
@@ -16468,7 +17787,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->size = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":45
  *     b.max_val = -1
  *     b.size = 0
  *     return b             # <<<<<<<<<<<<<<
@@ -16484,7 +17803,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":48
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":48
  * 
  * 
  * cdef int bitset_findsucc(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -16503,9 +17822,9 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("bitset_findsucc");
+  __Pyx_RefNannySetupContext("bitset_findsucc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":52
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":52
  *     cdef int low, high, mid
  * 
  *     if b.max_val == -1 or i >= b.max_val:             # <<<<<<<<<<<<<<
@@ -16521,7 +17840,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":53
  * 
  *     if b.max_val == -1 or i >= b.max_val:
  *         return -1             # <<<<<<<<<<<<<<
@@ -16534,7 +17853,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":54
  *     if b.max_val == -1 or i >= b.max_val:
  *         return -1
  *     if i < b.min_val:             # <<<<<<<<<<<<<<
@@ -16544,7 +17863,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   __pyx_t_3 = (__pyx_v_i < __pyx_v_b->min_val);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":55
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":55
  *         return -1
  *     if i < b.min_val:
  *         return b.min_val             # <<<<<<<<<<<<<<
@@ -16557,7 +17876,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":57
  *         return b.min_val
  * 
  *     bitset = b.bitset & ~LOWER_MASK[i]             # <<<<<<<<<<<<<<
@@ -16566,7 +17885,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_bitset = (__pyx_v_b->bitset & (~(__pyx_v_3_sa_LOWER_MASK[__pyx_v_i])));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":58
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":58
  * 
  *     bitset = b.bitset & ~LOWER_MASK[i]
  *     low = i+1             # <<<<<<<<<<<<<<
@@ -16575,7 +17894,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_low = (__pyx_v_i + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":59
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":59
  *     bitset = b.bitset & ~LOWER_MASK[i]
  *     low = i+1
  *     high = b.max_val+1             # <<<<<<<<<<<<<<
@@ -16584,7 +17903,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_high = (__pyx_v_b->max_val + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":60
  *     low = i+1
  *     high = b.max_val+1
  *     while low < high-1:             # <<<<<<<<<<<<<<
@@ -16595,7 +17914,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_t_3 = (__pyx_v_low < (__pyx_v_high - 1));
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":61
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":61
  *     high = b.max_val+1
  *     while low < high-1:
  *         mid = (high + low)/2             # <<<<<<<<<<<<<<
@@ -16604,7 +17923,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
     __pyx_v_mid = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":62
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":62
  *     while low < high-1:
  *         mid = (high + low)/2
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])             # <<<<<<<<<<<<<<
@@ -16613,7 +17932,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
     __pyx_v_mask = (~((__pyx_v_3_sa_LOWER_MASK[(__pyx_v_high - 1)]) ^ (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_mid - 1)])));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":63
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":63
  *         mid = (high + low)/2
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])
  *         if bitset & mask == 0:             # <<<<<<<<<<<<<<
@@ -16623,7 +17942,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_t_3 = ((__pyx_v_bitset & __pyx_v_mask) == 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":64
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":64
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])
  *         if bitset & mask == 0:
  *             low = mid             # <<<<<<<<<<<<<<
@@ -16635,7 +17954,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":66
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":66
  *             low = mid
  *         else:
  *             bitset = bitset & mask             # <<<<<<<<<<<<<<
@@ -16644,7 +17963,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
       __pyx_v_bitset = (__pyx_v_bitset & __pyx_v_mask);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":67
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":67
  *         else:
  *             bitset = bitset & mask
  *             high = mid             # <<<<<<<<<<<<<<
@@ -16656,7 +17975,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_L7:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":68
  *             bitset = bitset & mask
  *             high = mid
  *     return low             # <<<<<<<<<<<<<<
@@ -16672,7 +17991,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":71
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":71
  * 
  * 
  * cdef int bitset_insert(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -16685,9 +18004,9 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("bitset_insert");
+  __Pyx_RefNannySetupContext("bitset_insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":74
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":74
  *     cdef int val
  * 
  *     val = 1 << i             # <<<<<<<<<<<<<<
@@ -16696,7 +18015,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
   __pyx_v_val = (1 << __pyx_v_i);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":75
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":75
  * 
  *     val = 1 << i
  *     if b.bitset & val == 0:             # <<<<<<<<<<<<<<
@@ -16706,7 +18025,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   __pyx_t_1 = ((__pyx_v_b->bitset & __pyx_v_val) == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":76
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":76
  *     val = 1 << i
  *     if b.bitset & val == 0:
  *         b.bitset = b.bitset | val             # <<<<<<<<<<<<<<
@@ -16715,7 +18034,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
     __pyx_v_b->bitset = (__pyx_v_b->bitset | __pyx_v_val);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":77
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":77
  *     if b.bitset & val == 0:
  *         b.bitset = b.bitset | val
  *         if b.size == 0:             # <<<<<<<<<<<<<<
@@ -16725,7 +18044,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     __pyx_t_1 = (__pyx_v_b->size == 0);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":78
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":78
  *         b.bitset = b.bitset | val
  *         if b.size == 0:
  *             b.min_val = i             # <<<<<<<<<<<<<<
@@ -16734,7 +18053,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
       __pyx_v_b->min_val = __pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":79
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":79
  *         if b.size == 0:
  *             b.min_val = i
  *             b.max_val = i             # <<<<<<<<<<<<<<
@@ -16746,7 +18065,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":81
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":81
  *             b.max_val = i
  *         else:
  *             if i < b.min_val:             # <<<<<<<<<<<<<<
@@ -16756,7 +18075,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       __pyx_t_1 = (__pyx_v_i < __pyx_v_b->min_val);
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":82
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":82
  *         else:
  *             if i < b.min_val:
  *                 b.min_val = i             # <<<<<<<<<<<<<<
@@ -16768,7 +18087,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       }
       __pyx_L5:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":83
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":83
  *             if i < b.min_val:
  *                 b.min_val = i
  *             if i > b.max_val:             # <<<<<<<<<<<<<<
@@ -16778,7 +18097,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       __pyx_t_1 = (__pyx_v_i > __pyx_v_b->max_val);
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":84
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":84
  *                 b.min_val = i
  *             if i > b.max_val:
  *                 b.max_val = i             # <<<<<<<<<<<<<<
@@ -16792,7 +18111,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     }
     __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":85
  *             if i > b.max_val:
  *                 b.max_val = i
  *         b.size = b.size + 1             # <<<<<<<<<<<<<<
@@ -16801,7 +18120,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
     __pyx_v_b->size = (__pyx_v_b->size + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":86
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":86
  *                 b.max_val = i
  *         b.size = b.size + 1
  *         return 1             # <<<<<<<<<<<<<<
@@ -16814,7 +18133,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":87
  *         b.size = b.size + 1
  *         return 1
  *     return 0             # <<<<<<<<<<<<<<
@@ -16830,7 +18149,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":90
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":90
  * 
  * 
  * cdef int bitset_contains(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -16843,9 +18162,9 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("bitset_contains");
+  __Pyx_RefNannySetupContext("bitset_contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":93
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":93
  *     cdef int val
  * 
  *     val = 1 << i             # <<<<<<<<<<<<<<
@@ -16854,7 +18173,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_val = (1 << __pyx_v_i);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":94
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":94
  * 
  *     val = 1 << i
  *     if b.bitset & val == 0:             # <<<<<<<<<<<<<<
@@ -16864,7 +18183,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   __pyx_t_1 = ((__pyx_v_b->bitset & __pyx_v_val) == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":95
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":95
  *     val = 1 << i
  *     if b.bitset & val == 0:
  *         return 0             # <<<<<<<<<<<<<<
@@ -16877,7 +18196,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":97
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":97
  *         return 0
  *     else:
  *         return 1             # <<<<<<<<<<<<<<
@@ -16895,7 +18214,18 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":104
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_14BitSetIterator___next__(((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":104
  *     cdef int next_val
  * 
  *     def __next__(self):             # <<<<<<<<<<<<<<
@@ -16903,8 +18233,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_self) {
   int __pyx_v_ret_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -16913,19 +18242,19 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__next__");
+  __Pyx_RefNannySetupContext("__next__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":107
  *         cdef int ret_val
  * 
  *         if self.next_val == -1:             # <<<<<<<<<<<<<<
  *             raise StopIteration()
  *         ret_val = self.next_val
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val == -1);
+  __pyx_t_1 = (__pyx_v_self->next_val == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":108
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":108
  * 
  *         if self.next_val == -1:
  *             raise StopIteration()             # <<<<<<<<<<<<<<
@@ -16937,29 +18266,29 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[6]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":109
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":109
  *         if self.next_val == -1:
  *             raise StopIteration()
  *         ret_val = self.next_val             # <<<<<<<<<<<<<<
  *         self.next_val = bitset_findsucc(self.b, ret_val)
  *         return ret_val
  */
-  __pyx_v_ret_val = ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val;
+  __pyx_v_ret_val = __pyx_v_self->next_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":110
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":110
  *             raise StopIteration()
  *         ret_val = self.next_val
  *         self.next_val = bitset_findsucc(self.b, ret_val)             # <<<<<<<<<<<<<<
  *         return ret_val
  * 
  */
-  ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->next_val = __pyx_f_3_sa_bitset_findsucc(((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_v_self)->b, __pyx_v_ret_val);
+  __pyx_v_self->next_val = __pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_v_ret_val);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":111
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":111
  *         ret_val = self.next_val
  *         self.next_val = bitset_findsucc(self.b, ret_val)
  *         return ret_val             # <<<<<<<<<<<<<<
@@ -16985,7 +18314,21 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":122
+/* Python wrapper */
+static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_6BitSet___cinit__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":122
  *     cdef _BitSet* b
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -16993,30 +18336,35 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(PyObject *__pyx_v_self)
  * 
  */
 
-static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":123
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":123
  * 
  *     def __cinit__(self):
  *         self.b = new_BitSet()             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b = __pyx_f_3_sa_new_BitSet();
+  __pyx_v_self->b = __pyx_f_3_sa_new_BitSet();
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":125
+/* Python wrapper */
+static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_6BitSet_2__dealloc__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":125
  *         self.b = new_BitSet()
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -17024,24 +18372,34 @@ static int __pyx_pf_3_sa_6BitSet___cinit__(PyObject *__pyx_v_self, PyObject *__p
  * 
  */
 
-static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":126
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":126
  * 
  *     def __dealloc__(self):
  *         free(self.b)             # <<<<<<<<<<<<<<
  * 
  *     def __iter__(self):
  */
-  free(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b);
+  free(__pyx_v_self->b);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":128
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_4__iter__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":128
  *         free(self.b)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -17049,8 +18407,7 @@ static void __pyx_pf_3_sa_6BitSet_1__dealloc__(PyObject *__pyx_v_self) {
  *         it = BitSetIterator()
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   struct __pyx_obj_3_sa_BitSetIterator *__pyx_v_it = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -17058,9 +18415,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__");
+  __Pyx_RefNannySetupContext("__iter__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":130
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":130
  *     def __iter__(self):
  *         cdef BitSetIterator it
  *         it = BitSetIterator()             # <<<<<<<<<<<<<<
@@ -17072,25 +18429,25 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
   __pyx_v_it = ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":131
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":131
  *         cdef BitSetIterator it
  *         it = BitSetIterator()
  *         it.b = self.b             # <<<<<<<<<<<<<<
  *         it.next_val = self.b.min_val
  *         return it
  */
-  __pyx_v_it->b = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b;
+  __pyx_v_it->b = __pyx_v_self->b;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":132
  *         it = BitSetIterator()
  *         it.b = self.b
  *         it.next_val = self.b.min_val             # <<<<<<<<<<<<<<
  *         return it
  * 
  */
-  __pyx_v_it->next_val = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val;
+  __pyx_v_it->next_val = __pyx_v_self->b->min_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":133
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":133
  *         it.b = self.b
  *         it.next_val = self.b.min_val
  *         return it             # <<<<<<<<<<<<<<
@@ -17115,7 +18472,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":135
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_6insert(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":135
  *         return it
  * 
  *     def insert(self, i):             # <<<<<<<<<<<<<<
@@ -17123,8 +18491,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_2__iter__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17132,9 +18499,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert");
+  __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":136
  * 
  *     def insert(self, i):
  *         return bitset_insert(self.b, i)             # <<<<<<<<<<<<<<
@@ -17143,7 +18510,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_insert(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_insert(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -17161,7 +18528,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":138
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("findsucc (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_8findsucc(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":138
  *         return bitset_insert(self.b, i)
  * 
  *     def findsucc(self, i):             # <<<<<<<<<<<<<<
@@ -17169,8 +18547,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_3insert(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17178,9 +18555,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("findsucc");
+  __Pyx_RefNannySetupContext("findsucc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":139
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":139
  * 
  *     def findsucc(self, i):
  *         return bitset_findsucc(self.b, i)             # <<<<<<<<<<<<<<
@@ -17189,7 +18566,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_findsucc(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -17207,7 +18584,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":141
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_10__str__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":141
  *         return bitset_findsucc(self.b, i)
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -17215,8 +18603,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4findsucc(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -17225,9 +18612,9 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":142
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":142
  * 
  *     def __str__(self):
  *         return dec2bin(self.b.bitset)+"  ("+str(self.b.size)+","+str(self.b.min_val)+","+str(self.b.max_val)+")"             # <<<<<<<<<<<<<<
@@ -17235,15 +18622,15 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
  *     def min(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = ((PyObject *)__pyx_f_3_sa_dec2bin(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->bitset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PyObject *)__pyx_f_3_sa_dec2bin(__pyx_v_self->b->bitset)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyNumber_Add(__pyx_t_1, ((PyObject *)__pyx_kp_s_58)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -17257,10 +18644,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   __pyx_t_1 = PyNumber_Add(__pyx_t_3, ((PyObject *)__pyx_kp_s_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromLong(__pyx_v_self->b->min_val); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
@@ -17274,10 +18661,10 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   __pyx_t_3 = PyNumber_Add(__pyx_t_2, ((PyObject *)__pyx_kp_s_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->max_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_v_self->b->max_val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -17309,7 +18696,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":144
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("min (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_12min(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":144
  *         return dec2bin(self.b.bitset)+"  ("+str(self.b.size)+","+str(self.b.min_val)+","+str(self.b.max_val)+")"
  * 
  *     def min(self):             # <<<<<<<<<<<<<<
@@ -17317,17 +18715,16 @@ static PyObject *__pyx_pf_3_sa_6BitSet_5__str__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("min");
+  __Pyx_RefNannySetupContext("min", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":145
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":145
  * 
  *     def min(self):
  *         return self.b.min_val             # <<<<<<<<<<<<<<
@@ -17335,7 +18732,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSE
  *     def max(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->min_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->min_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -17353,7 +18750,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":147
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("max (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_14max(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":147
  *         return self.b.min_val
  * 
  *     def max(self):             # <<<<<<<<<<<<<<
@@ -17361,17 +18769,16 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6min(PyObject *__pyx_v_self, CYTHON_UNUSE
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("max");
+  __Pyx_RefNannySetupContext("max", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":148
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":148
  * 
  *     def max(self):
  *         return self.b.max_val             # <<<<<<<<<<<<<<
@@ -17379,7 +18786,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSE
  *     def __len__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->max_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->b->max_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -17397,7 +18804,18 @@ static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":150
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_16__len__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":150
  *         return self.b.max_val
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -17405,20 +18823,19 @@ static PyObject *__pyx_pf_3_sa_6BitSet_7max(PyObject *__pyx_v_self, CYTHON_UNUSE
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":151
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":151
  * 
  *     def __len__(self):
  *         return self.b.size             # <<<<<<<<<<<<<<
  * 
  *     def __contains__(self, i):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b->size;
+  __pyx_r = __pyx_v_self->b->size;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -17427,7 +18844,18 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":153
+/* Python wrapper */
+static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6BitSet_18__contains__(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":153
  *         return self.b.size
  * 
  *     def __contains__(self, i):             # <<<<<<<<<<<<<<
@@ -17435,8 +18863,7 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_8__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17445,9 +18872,9 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__contains__");
+  __Pyx_RefNannySetupContext("__contains__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":154
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":154
  * 
  *     def __contains__(self, i):
  *         return bool(bitset_contains(self.b, i))             # <<<<<<<<<<<<<<
@@ -17455,7 +18882,7 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
  * 
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_contains(((struct __pyx_obj_3_sa_BitSet *)__pyx_v_self)->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_bitset_contains(__pyx_v_self->b, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -17473,7 +18900,7 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":157
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":157
  * 
  * 
  * cdef str dec2bin(long i):             # <<<<<<<<<<<<<<
@@ -17483,7 +18910,7 @@ static int __pyx_pf_3_sa_6BitSet_9__contains__(PyObject *__pyx_v_self, PyObject
 
 static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   PyObject *__pyx_v_result = 0;
-  unsigned int __pyx_v_d;
+  CYTHON_UNUSED unsigned int __pyx_v_d;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -17493,9 +18920,9 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("dec2bin");
+  __Pyx_RefNannySetupContext("dec2bin", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":158
  * 
  * cdef str dec2bin(long i):
  *     cdef str result = ""             # <<<<<<<<<<<<<<
@@ -17505,7 +18932,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_result = __pyx_kp_s_45;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":160
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":160
  *     cdef str result = ""
  *     cdef unsigned d
  *     for d in range(MIN_BOTTOM_SIZE):             # <<<<<<<<<<<<<<
@@ -17516,7 +18943,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_d = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":161
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":161
  *     cdef unsigned d
  *     for d in range(MIN_BOTTOM_SIZE):
  *         if i & LOWER_MASK[0] == 0:             # <<<<<<<<<<<<<<
@@ -17526,7 +18953,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     __pyx_t_3 = ((__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[0])) == 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":162
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":162
  *     for d in range(MIN_BOTTOM_SIZE):
  *         if i & LOWER_MASK[0] == 0:
  *             result = "0"+result             # <<<<<<<<<<<<<<
@@ -17542,7 +18969,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":164
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":164
  *             result = "0"+result
  *         else:
  *             result = "1"+result             # <<<<<<<<<<<<<<
@@ -17557,7 +18984,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":165
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":165
  *         else:
  *             result = "1"+result
  *         i = i >> 1             # <<<<<<<<<<<<<<
@@ -17567,7 +18994,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     __pyx_v_i = (__pyx_v_i >> 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":166
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":166
  *             result = "1"+result
  *         i = i >> 1
  *     return result             # <<<<<<<<<<<<<<
@@ -17592,7 +19019,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":177
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":177
  *     void** bottom
  * 
  * cdef _VEB* new_VEB(int n):             # <<<<<<<<<<<<<<
@@ -17611,9 +19038,9 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("new_VEB");
+  __Pyx_RefNannySetupContext("new_VEB", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":181
  *     cdef int num_bits, num_top_bits, i
  * 
  *     veb = <_VEB*> malloc(sizeof(_VEB))             # <<<<<<<<<<<<<<
@@ -17622,7 +19049,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb = ((struct __pyx_t_3_sa__VEB *)malloc((sizeof(struct __pyx_t_3_sa__VEB))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":183
  *     veb = <_VEB*> malloc(sizeof(_VEB))
  * 
  *     num_bits = int(ceil(log(n) / log(2)))             # <<<<<<<<<<<<<<
@@ -17637,7 +19064,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_v_num_bits = ((int)ceil((__pyx_t_1 / __pyx_t_2)));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":184
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":184
  * 
  *     num_bits = int(ceil(log(n) / log(2)))
  *     veb.num_bottom_bits = num_bits/2             # <<<<<<<<<<<<<<
@@ -17646,7 +19073,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->num_bottom_bits = __Pyx_div_long(__pyx_v_num_bits, 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":185
  *     num_bits = int(ceil(log(n) / log(2)))
  *     veb.num_bottom_bits = num_bits/2
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -17656,7 +19083,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   __pyx_t_3 = (__pyx_v_veb->num_bottom_bits < __pyx_v_3_sa_MIN_BOTTOM_BITS);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":186
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":186
  *     veb.num_bottom_bits = num_bits/2
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:
  *         veb.num_bottom_bits = MIN_BOTTOM_BITS             # <<<<<<<<<<<<<<
@@ -17668,7 +19095,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":187
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":187
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:
  *         veb.num_bottom_bits = MIN_BOTTOM_BITS
  *     veb.top_universe_size = (n >> veb.num_bottom_bits) + 1             # <<<<<<<<<<<<<<
@@ -17677,7 +19104,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->top_universe_size = ((__pyx_v_n >> __pyx_v_veb->num_bottom_bits) + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":189
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":189
  *     veb.top_universe_size = (n >> veb.num_bottom_bits) + 1
  * 
  *     veb.bottom = <void**> malloc(veb.top_universe_size * sizeof(void*))             # <<<<<<<<<<<<<<
@@ -17686,7 +19113,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->bottom = ((void **)malloc((__pyx_v_veb->top_universe_size * (sizeof(void *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":190
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":190
  * 
  *     veb.bottom = <void**> malloc(veb.top_universe_size * sizeof(void*))
  *     memset(veb.bottom, 0, veb.top_universe_size * sizeof(void*))             # <<<<<<<<<<<<<<
@@ -17695,7 +19122,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   memset(__pyx_v_veb->bottom, 0, (__pyx_v_veb->top_universe_size * (sizeof(void *))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":192
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":192
  *     memset(veb.bottom, 0, veb.top_universe_size * sizeof(void*))
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -17705,7 +19132,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":193
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":193
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         veb.top = new_VEB(veb.top_universe_size)             # <<<<<<<<<<<<<<
@@ -17717,7 +19144,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":195
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":195
  *         veb.top = new_VEB(veb.top_universe_size)
  *     else:
  *         veb.top = new_BitSet()             # <<<<<<<<<<<<<<
@@ -17728,7 +19155,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":197
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":197
  *         veb.top = new_BitSet()
  * 
  *     veb.max_val = -1             # <<<<<<<<<<<<<<
@@ -17737,7 +19164,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->max_val = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":198
  * 
  *     veb.max_val = -1
  *     veb.min_val = -1             # <<<<<<<<<<<<<<
@@ -17746,7 +19173,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->min_val = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":199
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":199
  *     veb.max_val = -1
  *     veb.min_val = -1
  *     veb.size = 0             # <<<<<<<<<<<<<<
@@ -17755,7 +19182,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->size = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":200
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":200
  *     veb.min_val = -1
  *     veb.size = 0
  *     return veb             # <<<<<<<<<<<<<<
@@ -17775,7 +19202,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":203
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":203
  * 
  * 
  * cdef int VEB_insert(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -17794,9 +19221,9 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("VEB_insert");
+  __Pyx_RefNannySetupContext("VEB_insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":208
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":208
  *     cdef int a, b, tmp
  * 
  *     if veb.size == 0:             # <<<<<<<<<<<<<<
@@ -17806,7 +19233,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   __pyx_t_1 = (__pyx_v_veb->size == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":209
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":209
  * 
  *     if veb.size == 0:
  *         veb.min_val = i             # <<<<<<<<<<<<<<
@@ -17815,7 +19242,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_veb->min_val = __pyx_v_i;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":210
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":210
  *     if veb.size == 0:
  *         veb.min_val = i
  *         veb.max_val = i             # <<<<<<<<<<<<<<
@@ -17826,7 +19253,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":211
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":211
  *         veb.min_val = i
  *         veb.max_val = i
  *     elif i == veb.min_val or i == veb.max_val:             # <<<<<<<<<<<<<<
@@ -17842,7 +19269,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":212
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":212
  *         veb.max_val = i
  *     elif i == veb.min_val or i == veb.max_val:
  *         return 0             # <<<<<<<<<<<<<<
@@ -17855,7 +19282,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":214
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":214
  *         return 0
  *     else:
  *         if i < veb.min_val:             # <<<<<<<<<<<<<<
@@ -17865,7 +19292,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_i < __pyx_v_veb->min_val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":215
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":215
  *     else:
  *         if i < veb.min_val:
  *             tmp = i             # <<<<<<<<<<<<<<
@@ -17874,7 +19301,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_tmp = __pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":216
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":216
  *         if i < veb.min_val:
  *             tmp = i
  *             i = veb.min_val             # <<<<<<<<<<<<<<
@@ -17883,7 +19310,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_i = __pyx_v_veb->min_val;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":217
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":217
  *             tmp = i
  *             i = veb.min_val
  *             veb.min_val = tmp             # <<<<<<<<<<<<<<
@@ -17895,7 +19322,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":218
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":218
  *             i = veb.min_val
  *             veb.min_val = tmp
  *         a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -17904,7 +19331,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":219
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":219
  *             veb.min_val = tmp
  *         a = i >> veb.num_bottom_bits
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -17913,7 +19340,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":220
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":220
  *         a = i >> veb.num_bottom_bits
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *         if veb.bottom[a] == NULL:             # <<<<<<<<<<<<<<
@@ -17923,7 +19350,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = ((__pyx_v_veb->bottom[__pyx_v_a]) == NULL);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":221
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":221
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *         if veb.bottom[a] == NULL:
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -17933,7 +19360,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":222
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":222
  *         if veb.bottom[a] == NULL:
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *                 subv = <_VEB*> veb.top             # <<<<<<<<<<<<<<
@@ -17942,7 +19369,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
         __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)__pyx_v_veb->top);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":223
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":223
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *                 subv = <_VEB*> veb.top
  *                 VEB_insert(subv, a)             # <<<<<<<<<<<<<<
@@ -17954,7 +19381,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":225
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":225
  *                 VEB_insert(subv, a)
  *             else:
  *                 subb = <_BitSet*> veb.top             # <<<<<<<<<<<<<<
@@ -17963,7 +19390,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
         __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)__pyx_v_veb->top);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":226
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":226
  *             else:
  *                 subb = <_BitSet*> veb.top
  *                 bitset_insert(subb, a)             # <<<<<<<<<<<<<<
@@ -17974,7 +19401,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       __pyx_L6:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":227
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":227
  *                 subb = <_BitSet*> veb.top
  *                 bitset_insert(subb, a)
  *             if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -17984,7 +19411,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":228
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":228
  *                 bitset_insert(subb, a)
  *             if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *                 veb.bottom[a] = new_VEB(1 << veb.num_bottom_bits)             # <<<<<<<<<<<<<<
@@ -17996,7 +19423,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":230
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":230
  *                 veb.bottom[a] = new_VEB(1 << veb.num_bottom_bits)
  *             else:
  *                 veb.bottom[a] = new_BitSet()             # <<<<<<<<<<<<<<
@@ -18010,7 +19437,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":231
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":231
  *             else:
  *                 veb.bottom[a] = new_BitSet()
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -18020,7 +19447,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":232
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":232
  *                 veb.bottom[a] = new_BitSet()
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18029,7 +19456,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":233
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":233
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             if VEB_insert(subv, b) == 0:             # <<<<<<<<<<<<<<
@@ -18039,7 +19466,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_f_3_sa_VEB_insert(__pyx_v_subv, __pyx_v_b) == 0);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":234
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":234
  *             subv = <_VEB*> veb.bottom[a]
  *             if VEB_insert(subv, b) == 0:
  *                 return 0             # <<<<<<<<<<<<<<
@@ -18055,7 +19482,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":236
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":236
  *                 return 0
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18064,7 +19491,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":237
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":237
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             if bitset_insert(subb, b) == 0:             # <<<<<<<<<<<<<<
@@ -18074,7 +19501,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_f_3_sa_bitset_insert(__pyx_v_subb, __pyx_v_b) == 0);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":238
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":238
  *             subb = <_BitSet*> veb.bottom[a]
  *             if bitset_insert(subb, b) == 0:
  *                 return 0             # <<<<<<<<<<<<<<
@@ -18089,7 +19516,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":240
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":240
  *                 return 0
  * 
  *         if i > veb.max_val:             # <<<<<<<<<<<<<<
@@ -18099,7 +19526,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_i > __pyx_v_veb->max_val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":241
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":241
  * 
  *         if i > veb.max_val:
  *             veb.max_val = i             # <<<<<<<<<<<<<<
@@ -18113,7 +19540,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":242
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":242
  *         if i > veb.max_val:
  *             veb.max_val = i
  *     veb.size = veb.size + 1             # <<<<<<<<<<<<<<
@@ -18122,7 +19549,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
   __pyx_v_veb->size = (__pyx_v_veb->size + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":243
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":243
  *             veb.max_val = i
  *     veb.size = veb.size + 1
  *     return 1             # <<<<<<<<<<<<<<
@@ -18138,7 +19565,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":246
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":246
  * 
  * 
  * cdef del_VEB(_VEB* veb):             # <<<<<<<<<<<<<<
@@ -18155,9 +19582,9 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("del_VEB");
+  __Pyx_RefNannySetupContext("del_VEB", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":249
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":249
  *     cdef int i
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -18167,7 +19594,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":250
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":250
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         i = (<_VEB*> veb.top).min_val             # <<<<<<<<<<<<<<
@@ -18179,7 +19606,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":252
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":252
  *         i = (<_VEB*> veb.top).min_val
  *     else:
  *         i = (<_BitSet*> veb.top).min_val             # <<<<<<<<<<<<<<
@@ -18190,7 +19617,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":254
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":254
  *         i = (<_BitSet*> veb.top).min_val
  * 
  *     while i != -1:             # <<<<<<<<<<<<<<
@@ -18201,7 +19628,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_i != -1);
     if (!__pyx_t_1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":255
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":255
  * 
  *     while i != -1:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -18211,7 +19638,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":256
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":256
  *     while i != -1:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             del_VEB(<_VEB*> veb.bottom[i])             # <<<<<<<<<<<<<<
@@ -18225,7 +19652,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":258
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":258
  *             del_VEB(<_VEB*> veb.bottom[i])
  *         else:
  *             free(<_BitSet*> veb.bottom[i])             # <<<<<<<<<<<<<<
@@ -18236,7 +19663,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     __pyx_L6:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":260
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":260
  *             free(<_BitSet*> veb.bottom[i])
  * 
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -18246,7 +19673,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":261
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":261
  * 
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             i = VEB_findsucc(<_VEB*> veb.top, i)             # <<<<<<<<<<<<<<
@@ -18258,7 +19685,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":263
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":263
  *             i = VEB_findsucc(<_VEB*> veb.top, i)
  *         else:
  *             i = bitset_findsucc(<_BitSet*> veb.top, i)             # <<<<<<<<<<<<<<
@@ -18270,7 +19697,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_L7:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":265
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":265
  *             i = bitset_findsucc(<_BitSet*> veb.top, i)
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -18280,7 +19707,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":266
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":266
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         del_VEB(<_VEB*> veb.top)             # <<<<<<<<<<<<<<
@@ -18294,7 +19721,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":268
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":268
  *         del_VEB(<_VEB*> veb.top)
  *     else:
  *         free(<_BitSet*> veb.top)             # <<<<<<<<<<<<<<
@@ -18305,7 +19732,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   __pyx_L8:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":269
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":269
  *     else:
  *         free(<_BitSet*> veb.top)
  *     free(veb.bottom)             # <<<<<<<<<<<<<<
@@ -18314,7 +19741,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
  */
   free(__pyx_v_veb->bottom);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":270
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":270
  *         free(<_BitSet*> veb.top)
  *     free(veb.bottom)
  *     free(veb)             # <<<<<<<<<<<<<<
@@ -18335,7 +19762,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":273
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":273
  * 
  * 
  * cdef int VEB_findsucc(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -18356,9 +19783,9 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("VEB_findsucc");
+  __Pyx_RefNannySetupContext("VEB_findsucc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":278
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":278
  *     cdef int a, b, j, c, found
  * 
  *     if veb.max_val == -1 or i>=veb.max_val:             # <<<<<<<<<<<<<<
@@ -18374,7 +19801,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":279
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":279
  * 
  *     if veb.max_val == -1 or i>=veb.max_val:
  *         return -1             # <<<<<<<<<<<<<<
@@ -18387,7 +19814,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":280
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":280
  *     if veb.max_val == -1 or i>=veb.max_val:
  *         return -1
  *     if i < veb.min_val:             # <<<<<<<<<<<<<<
@@ -18397,7 +19824,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = (__pyx_v_i < __pyx_v_veb->min_val);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":281
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":281
  *         return -1
  *     if i < veb.min_val:
  *         return veb.min_val             # <<<<<<<<<<<<<<
@@ -18410,7 +19837,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":283
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":283
  *         return veb.min_val
  * 
  *     a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -18419,7 +19846,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":284
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":284
  * 
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -18428,7 +19855,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":285
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":285
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     found = 0             # <<<<<<<<<<<<<<
@@ -18437,7 +19864,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_found = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":286
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":286
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     found = 0
  *     if veb.bottom[a] != NULL:             # <<<<<<<<<<<<<<
@@ -18447,7 +19874,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = ((__pyx_v_veb->bottom[__pyx_v_a]) != NULL);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":287
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":287
  *     found = 0
  *     if veb.bottom[a] != NULL:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -18457,7 +19884,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":288
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":288
  *     if veb.bottom[a] != NULL:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18466,7 +19893,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":289
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":289
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             if subv.max_val > b:             # <<<<<<<<<<<<<<
@@ -18476,7 +19903,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
       __pyx_t_3 = (__pyx_v_subv->max_val > __pyx_v_b);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":290
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":290
  *             subv = <_VEB*> veb.bottom[a]
  *             if subv.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + VEB_findsucc(subv, b)             # <<<<<<<<<<<<<<
@@ -18485,7 +19912,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
         __pyx_v_j = ((__pyx_v_a << __pyx_v_veb->num_bottom_bits) + __pyx_f_3_sa_VEB_findsucc(__pyx_v_subv, __pyx_v_b));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":291
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":291
  *             if subv.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + VEB_findsucc(subv, b)
  *                 found = 1             # <<<<<<<<<<<<<<
@@ -18500,7 +19927,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":293
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":293
  *                 found = 1
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18509,7 +19936,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":294
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":294
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             if subb.max_val > b:             # <<<<<<<<<<<<<<
@@ -18519,7 +19946,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
       __pyx_t_3 = (__pyx_v_subb->max_val > __pyx_v_b);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":295
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":295
  *             subb = <_BitSet*> veb.bottom[a]
  *             if subb.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)             # <<<<<<<<<<<<<<
@@ -18528,7 +19955,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
         __pyx_v_j = ((__pyx_v_a << __pyx_v_veb->num_bottom_bits) + __pyx_f_3_sa_bitset_findsucc(__pyx_v_subb, __pyx_v_b));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":296
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":296
  *             if subb.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)
  *                 found = 1             # <<<<<<<<<<<<<<
@@ -18545,7 +19972,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":297
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)
  *                 found = 1
  *     if found==0:             # <<<<<<<<<<<<<<
@@ -18555,7 +19982,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = (__pyx_v_found == 0);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":298
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":298
  *                 found = 1
  *     if found==0:
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -18565,7 +19992,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":299
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":299
  *     if found==0:
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             subv = <_VEB*> veb.top             # <<<<<<<<<<<<<<
@@ -18574,7 +20001,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)__pyx_v_veb->top);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":300
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":300
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             subv = <_VEB*> veb.top
  *             c = VEB_findsucc(subv, a)             # <<<<<<<<<<<<<<
@@ -18586,7 +20013,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":302
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":302
  *             c = VEB_findsucc(subv, a)
  *         else:
  *             subb = <_BitSet*> veb.top             # <<<<<<<<<<<<<<
@@ -18595,7 +20022,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)__pyx_v_veb->top);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":303
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":303
  *         else:
  *             subb = <_BitSet*> veb.top
  *             c = bitset_findsucc(subb, a)             # <<<<<<<<<<<<<<
@@ -18606,7 +20033,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     __pyx_L10:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":304
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":304
  *             subb = <_BitSet*> veb.top
  *             c = bitset_findsucc(subb, a)
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -18616,7 +20043,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":305
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":305
  *             c = bitset_findsucc(subb, a)
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[c]             # <<<<<<<<<<<<<<
@@ -18625,7 +20052,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_c]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":306
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":306
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subv.min_val             # <<<<<<<<<<<<<<
@@ -18637,7 +20064,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":308
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":308
  *             j = (c << veb.num_bottom_bits) + subv.min_val
  *         else:
  *             subb = <_BitSet*> veb.bottom[c]             # <<<<<<<<<<<<<<
@@ -18646,7 +20073,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_c]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":309
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":309
  *         else:
  *             subb = <_BitSet*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subb.min_val             # <<<<<<<<<<<<<<
@@ -18660,7 +20087,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L9:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":310
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":310
  *             subb = <_BitSet*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subb.min_val
  *     return j             # <<<<<<<<<<<<<<
@@ -18676,7 +20103,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":313
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":313
  * 
  * 
  * cdef int VEB_contains(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -18695,9 +20122,9 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("VEB_contains");
+  __Pyx_RefNannySetupContext("VEB_contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":318
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":318
  *     cdef int a, b
  * 
  *     if veb.size == 0 or i < veb.min_val or i > veb.max_val:             # <<<<<<<<<<<<<<
@@ -18719,7 +20146,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":319
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":319
  * 
  *     if veb.size == 0 or i < veb.min_val or i > veb.max_val:
  *         return 0             # <<<<<<<<<<<<<<
@@ -18732,7 +20159,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":321
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":321
  *         return 0
  * 
  *     if veb.min_val == i:             # <<<<<<<<<<<<<<
@@ -18742,7 +20169,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_2 = (__pyx_v_veb->min_val == __pyx_v_i);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":322
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":322
  * 
  *     if veb.min_val == i:
  *         return 1             # <<<<<<<<<<<<<<
@@ -18755,7 +20182,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":324
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":324
  *         return 1
  *     else:
  *         if veb.size == 1:             # <<<<<<<<<<<<<<
@@ -18765,7 +20192,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_2 = (__pyx_v_veb->size == 1);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":325
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":325
  *     else:
  *         if veb.size == 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -18780,7 +20207,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":327
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":327
  *             return 0
  * 
  *     a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -18789,7 +20216,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":328
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":328
  * 
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -18798,7 +20225,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":329
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":329
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     if veb.bottom[a] == NULL:             # <<<<<<<<<<<<<<
@@ -18808,7 +20235,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_2 = ((__pyx_v_veb->bottom[__pyx_v_a]) == NULL);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":330
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":330
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     if veb.bottom[a] == NULL:
  *         return 0             # <<<<<<<<<<<<<<
@@ -18821,7 +20248,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":332
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":332
  *         return 0
  *     else:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -18831,7 +20258,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_2 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":333
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":333
  *     else:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18840,7 +20267,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":334
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":334
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             return VEB_contains(subv, b)             # <<<<<<<<<<<<<<
@@ -18853,7 +20280,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":336
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":336
  *             return VEB_contains(subv, b)
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -18862,7 +20289,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":337
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":337
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             return bitset_contains(subb, b)             # <<<<<<<<<<<<<<
@@ -18882,7 +20309,18 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":344
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11VEBIterator___next__(((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":344
  *     cdef int next_val
  * 
  *     def __next__(self):             # <<<<<<<<<<<<<<
@@ -18890,8 +20328,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBIterator *__pyx_v_self) {
   int __pyx_v_ret_val;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -18900,19 +20337,19 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__next__");
+  __Pyx_RefNannySetupContext("__next__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":347
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":347
  *         cdef int ret_val
  * 
  *         if self.next_val == -1:             # <<<<<<<<<<<<<<
  *             raise StopIteration()
  *         ret_val = self.next_val
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val == -1);
+  __pyx_t_1 = (__pyx_v_self->next_val == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":348
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":348
  * 
  *         if self.next_val == -1:
  *             raise StopIteration()             # <<<<<<<<<<<<<<
@@ -18924,29 +20361,29 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[6]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":349
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":349
  *         if self.next_val == -1:
  *             raise StopIteration()
  *         ret_val = self.next_val             # <<<<<<<<<<<<<<
  *         self.next_val = VEB_findsucc(self.v, ret_val)
  *         return ret_val
  */
-  __pyx_v_ret_val = ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val;
+  __pyx_v_ret_val = __pyx_v_self->next_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":350
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":350
  *             raise StopIteration()
  *         ret_val = self.next_val
  *         self.next_val = VEB_findsucc(self.v, ret_val)             # <<<<<<<<<<<<<<
  *         return ret_val
  * 
  */
-  ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->next_val = __pyx_f_3_sa_VEB_findsucc(((struct __pyx_obj_3_sa_VEBIterator *)__pyx_v_self)->v, __pyx_v_ret_val);
+  __pyx_v_self->next_val = __pyx_f_3_sa_VEB_findsucc(__pyx_v_self->v, __pyx_v_ret_val);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":351
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":351
  *         ret_val = self.next_val
  *         self.next_val = VEB_findsucc(self.v, ret_val)
  *         return ret_val             # <<<<<<<<<<<<<<
@@ -18972,42 +20409,32 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":360
- *     cdef int _first(self)
- * 
- *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
- *         self.veb = new_VEB(size)
- * 
- */
-
-static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_size;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__size)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 360; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -19024,22 +20451,48 @@ static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_3VEB___cinit__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), __pyx_v_size);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":360
+ *     cdef int _first(self)
+ * 
+ *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
+ *         self.veb = new_VEB(size)
+ * 
+ */
+
+static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_size) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":361
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":361
  * 
  *     def __cinit__(self, int size):
  *         self.veb = new_VEB(size)             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb = __pyx_f_3_sa_new_VEB(__pyx_v_size);
+  __pyx_v_self->veb = __pyx_f_3_sa_new_VEB(__pyx_v_size);
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":363
+/* Python wrapper */
+static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_3VEB_2__dealloc__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":363
  *         self.veb = new_VEB(size)
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -19047,23 +20500,22 @@ static int __pyx_pf_3_sa_3VEB___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  * 
  */
 
-static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":364
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":364
  * 
  *     def __dealloc__(self):
  *         del_VEB(self.veb)             # <<<<<<<<<<<<<<
  * 
  *     def __iter__(self):
  */
-  __pyx_t_1 = __pyx_f_3_sa_del_VEB(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_f_3_sa_del_VEB(__pyx_v_self->veb); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
@@ -19075,7 +20527,18 @@ static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":366
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_4__iter__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":366
  *         del_VEB(self.veb)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -19083,8 +20546,7 @@ static void __pyx_pf_3_sa_3VEB_1__dealloc__(PyObject *__pyx_v_self) {
  *         it = VEBIterator()
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   struct __pyx_obj_3_sa_VEBIterator *__pyx_v_it = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -19092,9 +20554,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__iter__");
+  __Pyx_RefNannySetupContext("__iter__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":368
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":368
  *     def __iter__(self):
  *         cdef VEBIterator it
  *         it = VEBIterator()             # <<<<<<<<<<<<<<
@@ -19106,25 +20568,25 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
   __pyx_v_it = ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":369
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":369
  *         cdef VEBIterator it
  *         it = VEBIterator()
  *         it.v = self.veb             # <<<<<<<<<<<<<<
  *         it.next_val = self.veb.min_val
  *         return it
  */
-  __pyx_v_it->v = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb;
+  __pyx_v_it->v = __pyx_v_self->veb;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":370
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":370
  *         it = VEBIterator()
  *         it.v = self.veb
  *         it.next_val = self.veb.min_val             # <<<<<<<<<<<<<<
  *         return it
  * 
  */
-  __pyx_v_it->next_val = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb->min_val;
+  __pyx_v_it->next_val = __pyx_v_self->veb->min_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":371
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":371
  *         it.v = self.veb
  *         it.next_val = self.veb.min_val
  *         return it             # <<<<<<<<<<<<<<
@@ -19149,7 +20611,18 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":373
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_6insert(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":373
  *         return it
  * 
  *     def insert(self, i):             # <<<<<<<<<<<<<<
@@ -19157,8 +20630,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_2__iter__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -19166,9 +20638,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert");
+  __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":374
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":374
  * 
  *     def insert(self, i):
  *         return VEB_insert(self.veb, i)             # <<<<<<<<<<<<<<
@@ -19177,7 +20649,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_insert(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_insert(__pyx_v_self->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -19195,7 +20667,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":376
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":376
  *         return VEB_insert(self.veb, i)
  * 
  *     cdef int _insert(self, int i):             # <<<<<<<<<<<<<<
@@ -19206,9 +20678,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_3insert(PyObject *__pyx_v_self, PyObject *__
 static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_insert");
+  __Pyx_RefNannySetupContext("_insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":377
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":377
  * 
  *     cdef int _insert(self, int i):
  *         return VEB_insert(self.veb, i)             # <<<<<<<<<<<<<<
@@ -19224,7 +20696,18 @@ static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":379
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("findsucc (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_8findsucc(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":379
  *         return VEB_insert(self.veb, i)
  * 
  *     def findsucc(self, i):             # <<<<<<<<<<<<<<
@@ -19232,8 +20715,7 @@ static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, in
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -19241,9 +20723,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("findsucc");
+  __Pyx_RefNannySetupContext("findsucc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":380
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":380
  * 
  *     def findsucc(self, i):
  *         return VEB_findsucc(self.veb, i)             # <<<<<<<<<<<<<<
@@ -19252,7 +20734,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_findsucc(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_VEB_findsucc(__pyx_v_self->veb, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -19270,7 +20752,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":382
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":382
  *         return VEB_findsucc(self.veb, i)
  * 
  *     cdef int _first(self):             # <<<<<<<<<<<<<<
@@ -19281,9 +20763,9 @@ static PyObject *__pyx_pf_3_sa_3VEB_4findsucc(PyObject *__pyx_v_self, PyObject *
 static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_first");
+  __Pyx_RefNannySetupContext("_first", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":383
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":383
  * 
  *     cdef int _first(self):
  *         return self.veb.min_val             # <<<<<<<<<<<<<<
@@ -19299,7 +20781,7 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":385
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":385
  *         return self.veb.min_val
  * 
  *     cdef int _findsucc(self, int i):             # <<<<<<<<<<<<<<
@@ -19310,9 +20792,9 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
 static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self, int __pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("_findsucc");
+  __Pyx_RefNannySetupContext("_findsucc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":386
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":386
  * 
  *     cdef int _findsucc(self, int i):
  *         return VEB_findsucc(self.veb, i)             # <<<<<<<<<<<<<<
@@ -19328,7 +20810,18 @@ static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":388
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_10__len__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":388
  *         return VEB_findsucc(self.veb, i)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -19336,20 +20829,19 @@ static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":389
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":389
  * 
  *     def __len__(self):
  *         return self.veb.size             # <<<<<<<<<<<<<<
  * 
  *     def __contains__(self, i):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb->size;
+  __pyx_r = __pyx_v_self->veb->size;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -19358,30 +20850,40 @@ static Py_ssize_t __pyx_pf_3_sa_3VEB_5__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":391
+/* Python wrapper */
+static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__contains__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_3VEB_12__contains__(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":391
  *         return self.veb.size
  * 
  *     def __contains__(self, i):             # <<<<<<<<<<<<<<
  *         return VEB_contains(self.veb, i)
  */
 
-static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__contains__");
+  __Pyx_RefNannySetupContext("__contains__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":392
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":392
  * 
  *     def __contains__(self, i):
  *         return VEB_contains(self.veb, i)             # <<<<<<<<<<<<<<
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_f_3_sa_VEB_contains(((struct __pyx_obj_3_sa_VEB *)__pyx_v_self)->veb, __pyx_t_1);
+  __pyx_r = __pyx_f_3_sa_VEB_contains(__pyx_v_self->veb, __pyx_t_1);
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -19394,55 +20896,32 @@ static int __pyx_pf_3_sa_3VEB_6__contains__(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":9
- *     cdef IntList lcp
- * 
- *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
- *         cdef int i, k, j, h, n
- *         cdef IntList rank
- */
-
-static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa = 0;
-  int __pyx_v_i;
-  int __pyx_v_k;
-  int __pyx_v_j;
-  int __pyx_v_h;
-  int __pyx_v_n;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_rank = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  int __pyx_t_4;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -19460,8 +20939,45 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sa), __pyx_ptype_3_sa_SuffixArray, 1, "sa", 0))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_3LCP___cinit__(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self), __pyx_v_sa);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":9
+ *     cdef IntList lcp
+ * 
+ *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
+ *         cdef int i, k, j, h, n
+ *         cdef IntList rank
+ */
+
+static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sa) {
+  int __pyx_v_i;
+  int __pyx_v_k;
+  int __pyx_v_j;
+  int __pyx_v_h;
+  int __pyx_v_n;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_rank = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":13
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
  * 
  *         logger.info("Constructing LCP array")             # <<<<<<<<<<<<<<
@@ -19478,7 +20994,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":14
  * 
  *         logger.info("Constructing LCP array")
  *         self.sa = sa             # <<<<<<<<<<<<<<
@@ -19487,20 +21003,20 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_sa));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_sa));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa = __pyx_v_sa;
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = __pyx_v_sa;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":15
  *         logger.info("Constructing LCP array")
  *         self.sa = sa
  *         n = self.sa.sa.len             # <<<<<<<<<<<<<<
  *         self.lcp = IntList(initial_len=n)
  * 
  */
-  __pyx_v_n = ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->sa->sa->len;
+  __pyx_v_n = __pyx_v_self->sa->sa->len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":16
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":16
  *         self.sa = sa
  *         n = self.sa.sa.len
  *         self.lcp = IntList(initial_len=n)             # <<<<<<<<<<<<<<
@@ -19513,16 +21029,16 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp));
-  ((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->lcp);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->lcp));
+  __pyx_v_self->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":18
  *         self.lcp = IntList(initial_len=n)
  * 
  *         rank = IntList(initial_len=n)             # <<<<<<<<<<<<<<
@@ -19535,13 +21051,13 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":19
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":19
  * 
  *         rank = IntList(initial_len=n)
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -19551,7 +21067,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __pyx_t_3 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":20
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":20
  *         rank = IntList(initial_len=n)
  *         for i from 0 <= i < n:
  *             rank.arr[sa.sa.arr[i]] = i             # <<<<<<<<<<<<<<
@@ -19561,7 +21077,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
     (__pyx_v_rank->arr[(__pyx_v_sa->sa->arr[__pyx_v_i])]) = __pyx_v_i;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":22
  *             rank.arr[sa.sa.arr[i]] = i
  * 
  *         h = 0             # <<<<<<<<<<<<<<
@@ -19570,7 +21086,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
   __pyx_v_h = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":23
  * 
  *         h = 0
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -19580,7 +21096,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __pyx_t_3 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":24
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":24
  *         h = 0
  *         for i from 0 <= i < n:
  *             k = rank.arr[i]             # <<<<<<<<<<<<<<
@@ -19589,7 +21105,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
     __pyx_v_k = (__pyx_v_rank->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":25
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":25
  *         for i from 0 <= i < n:
  *             k = rank.arr[i]
  *             if k == 0:             # <<<<<<<<<<<<<<
@@ -19599,19 +21115,19 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
     __pyx_t_4 = (__pyx_v_k == 0);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":26
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":26
  *             k = rank.arr[i]
  *             if k == 0:
  *                 self.lcp.arr[k] = -1             # <<<<<<<<<<<<<<
  *             else:
  *                 j = sa.sa.arr[k-1]
  */
-      (((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp->arr[__pyx_v_k]) = -1;
-      goto __pyx_L10;
+      (__pyx_v_self->lcp->arr[__pyx_v_k]) = -1;
+      goto __pyx_L7;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":28
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":28
  *                 self.lcp.arr[k] = -1
  *             else:
  *                 j = sa.sa.arr[k-1]             # <<<<<<<<<<<<<<
@@ -19620,7 +21136,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  */
       __pyx_v_j = (__pyx_v_sa->sa->arr[(__pyx_v_k - 1)]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":29
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":29
  *             else:
  *                 j = sa.sa.arr[k-1]
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:             # <<<<<<<<<<<<<<
@@ -19643,7 +21159,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
         }
         if (!__pyx_t_5) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":30
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":30
  *                 j = sa.sa.arr[k-1]
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:
  *                     h = h+1             # <<<<<<<<<<<<<<
@@ -19653,18 +21169,18 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
         __pyx_v_h = (__pyx_v_h + 1);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":31
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":31
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:
  *                     h = h+1
  *                 self.lcp.arr[k] = h             # <<<<<<<<<<<<<<
  *             if h > 0:
  *                 h = h-1
  */
-      (((struct __pyx_obj_3_sa_LCP *)__pyx_v_self)->lcp->arr[__pyx_v_k]) = __pyx_v_h;
+      (__pyx_v_self->lcp->arr[__pyx_v_k]) = __pyx_v_h;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":32
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":32
  *                     h = h+1
  *                 self.lcp.arr[k] = h
  *             if h > 0:             # <<<<<<<<<<<<<<
@@ -19674,7 +21190,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
     __pyx_t_5 = (__pyx_v_h > 0);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":33
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":33
  *                 self.lcp.arr[k] = h
  *             if h > 0:
  *                 h = h-1             # <<<<<<<<<<<<<<
@@ -19682,12 +21198,12 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
  * 
  */
       __pyx_v_h = (__pyx_v_h - 1);
-      goto __pyx_L13;
+      goto __pyx_L10;
     }
-    __pyx_L13:;
+    __pyx_L10:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":34
  *             if h > 0:
  *                 h = h-1
  *         logger.info("LCP array completed")             # <<<<<<<<<<<<<<
@@ -19716,9 +21232,31 @@ static int __pyx_pf_3_sa_3LCP___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n); /*proto*/
+static char __pyx_doc_3_sa_3LCP_2compute_stats[] = "Note: the output of this function is not exact.  In\n        particular, the frequency associated with each word is \n        not guaranteed to be correct.  This is due to a bit of\n        laxness in the design; the function is intended only to\n        obtain a list of the most frequent words; for this \n        purpose it is perfectly fine";
+static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n) {
+  int __pyx_v_max_n;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("compute_stats (wrapper)", 0);
+  assert(__pyx_arg_max_n); {
+    __pyx_v_max_n = __Pyx_PyInt_AsInt(__pyx_arg_max_n); if (unlikely((__pyx_v_max_n == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_3LCP_2compute_stats(((struct __pyx_obj_3_sa_LCP *)__pyx_v_self), ((int)__pyx_v_max_n));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":36
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
  * 
  *     def compute_stats(self, int max_n):             # <<<<<<<<<<<<<<
@@ -19726,51 +21264,46 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *         particular, the frequency associated with each word is
  */
 
-static PyObject *__pyx_pf_3_sa_3LCP_1compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n); /*proto*/
-static char __pyx_doc_3_sa_3LCP_1compute_stats[] = "Note: the output of this function is not exact.  In\n        particular, the frequency associated with each word is \n        not guaranteed to be correct.  This is due to a bit of\n        laxness in the design; the function is intended only to\n        obtain a list of the most frequent words; for this \n        purpose it is perfectly fine";
-static PyObject *__pyx_pf_3_sa_3LCP_1compute_stats(PyObject *__pyx_v_self, PyObject *__pyx_arg_max_n) {
+static PyObject *__pyx_pf_3_sa_3LCP_2compute_stats(struct __pyx_obj_3_sa_LCP *__pyx_v_self, int __pyx_v_max_n) {
   struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("compute_stats");
+  __Pyx_RefNannySetupContext("compute_stats", 0);
   __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  assert(__pyx_arg_max_n); {
-    __pyx_cur_scope->__pyx_v_max_n = __Pyx_PyInt_AsInt(__pyx_arg_max_n); if (unlikely((__pyx_cur_scope->__pyx_v_max_n == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_XDECREF((PyObject *)__pyx_cur_scope->__pyx_v_self); __pyx_cur_scope->__pyx_v_self = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_3LCP_2generator1;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  __pyx_cur_scope->__pyx_v_max_n = __pyx_v_max_n;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_3LCP_4generator1, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.LCP.compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   int __pyx_t_2;
@@ -19783,8 +21316,8 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   long __pyx_t_9;
   PyObject *__pyx_t_10 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L26_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -19794,16 +21327,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":48
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":48
  *         cdef VEB veb
  * 
  *         N = self.sa.sa.len             # <<<<<<<<<<<<<<
  * 
  *         ngram_starts = []
  */
-  __pyx_cur_scope->__pyx_v_N = ((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->sa->len;
+  __pyx_cur_scope->__pyx_v_N = __pyx_cur_scope->__pyx_v_self->sa->sa->len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":50
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":50
  *         N = self.sa.sa.len
  * 
  *         ngram_starts = []             # <<<<<<<<<<<<<<
@@ -19811,12 +21344,12 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *             ngram_starts.append(IntList(initial_len=N))
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_cur_scope->__pyx_v_ngram_starts = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":51
  * 
  *         ngram_starts = []
  *         for n from 0 <= n < max_n:             # <<<<<<<<<<<<<<
@@ -19826,30 +21359,27 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_t_2 = __pyx_cur_scope->__pyx_v_max_n;
   for (__pyx_cur_scope->__pyx_v_n = 0; __pyx_cur_scope->__pyx_v_n < __pyx_t_2; __pyx_cur_scope->__pyx_v_n++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":52
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":52
  *         ngram_starts = []
  *         for n from 0 <= n < max_n:
  *             ngram_starts.append(IntList(initial_len=N))             # <<<<<<<<<<<<<<
  * 
  *         run_start = IntList(initial_len=max_n)
  */
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_ngram_starts) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __pyx_t_4 = PyList_Append(__pyx_cur_scope->__pyx_v_ngram_starts, __pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":54
  *             ngram_starts.append(IntList(initial_len=N))
  * 
  *         run_start = IntList(initial_len=max_n)             # <<<<<<<<<<<<<<
@@ -19862,14 +21392,14 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_cur_scope->__pyx_v_run_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":55
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":55
  * 
  *         run_start = IntList(initial_len=max_n)
  *         veb = VEB(N)             # <<<<<<<<<<<<<<
@@ -19879,7 +21409,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_t_1 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -19890,7 +21420,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_cur_scope->__pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":57
  *         veb = VEB(N)
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -19900,16 +21430,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __pyx_t_2 = __pyx_cur_scope->__pyx_v_N;
   for (__pyx_cur_scope->__pyx_v_i = 0; __pyx_cur_scope->__pyx_v_i < __pyx_t_2; __pyx_cur_scope->__pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":58
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":58
  * 
  *         for i from 0 <= i < N:
  *             h = self.lcp.arr[i]             # <<<<<<<<<<<<<<
  *             if h < 0:
  *                 h = 0
  */
-    __pyx_cur_scope->__pyx_v_h = (((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
+    __pyx_cur_scope->__pyx_v_h = (__pyx_cur_scope->__pyx_v_self->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":59
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":59
  *         for i from 0 <= i < N:
  *             h = self.lcp.arr[i]
  *             if h < 0:             # <<<<<<<<<<<<<<
@@ -19919,7 +21449,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     __pyx_t_5 = (__pyx_cur_scope->__pyx_v_h < 0);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":60
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":60
  *             h = self.lcp.arr[i]
  *             if h < 0:
  *                 h = 0             # <<<<<<<<<<<<<<
@@ -19931,7 +21461,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     }
     __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":61
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":61
  *             if h < 0:
  *                 h = 0
  *             for n from h <= n < max_n:             # <<<<<<<<<<<<<<
@@ -19941,7 +21471,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     __pyx_t_6 = __pyx_cur_scope->__pyx_v_max_n;
     for (__pyx_cur_scope->__pyx_v_n = __pyx_cur_scope->__pyx_v_h; __pyx_cur_scope->__pyx_v_n < __pyx_t_6; __pyx_cur_scope->__pyx_v_n++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":62
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":62
  *                 h = 0
  *             for n from h <= n < max_n:
  *                 rs = run_start.arr[n]             # <<<<<<<<<<<<<<
@@ -19950,7 +21480,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
       __pyx_cur_scope->__pyx_v_rs = (__pyx_cur_scope->__pyx_v_run_start->arr[__pyx_cur_scope->__pyx_v_n]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":63
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":63
  *             for n from h <= n < max_n:
  *                 rs = run_start.arr[n]
  *                 run_start.arr[n] = i             # <<<<<<<<<<<<<<
@@ -19959,7 +21489,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
       (__pyx_cur_scope->__pyx_v_run_start->arr[__pyx_cur_scope->__pyx_v_n]) = __pyx_cur_scope->__pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":64
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":64
  *                 rs = run_start.arr[n]
  *                 run_start.arr[n] = i
  *                 freq = i - rs             # <<<<<<<<<<<<<<
@@ -19968,7 +21498,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
       __pyx_cur_scope->__pyx_v_freq = (__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_rs);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":65
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":65
  *                 run_start.arr[n] = i
  *                 freq = i - rs
  *                 if freq > 1000: # arbitrary, but see note below             # <<<<<<<<<<<<<<
@@ -19978,7 +21508,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
       __pyx_t_5 = (__pyx_cur_scope->__pyx_v_freq > 1000);
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":66
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":66
  *                 freq = i - rs
  *                 if freq > 1000: # arbitrary, but see note below
  *                     veb._insert(freq)             # <<<<<<<<<<<<<<
@@ -19987,7 +21517,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
         ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_cur_scope->__pyx_v_veb->__pyx_vtab)->_insert(__pyx_cur_scope->__pyx_v_veb, __pyx_cur_scope->__pyx_v_freq);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":67
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":67
  *                 if freq > 1000: # arbitrary, but see note below
  *                     veb._insert(freq)
  *                     ngram_start = ngram_starts[n]             # <<<<<<<<<<<<<<
@@ -20003,7 +21533,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
         __pyx_cur_scope->__pyx_v_ngram_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
         __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":68
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":68
  *                     veb._insert(freq)
  *                     ngram_start = ngram_starts[n]
  *                     while ngram_start.arr[freq] > 0:             # <<<<<<<<<<<<<<
@@ -20014,7 +21544,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_t_5 = ((__pyx_cur_scope->__pyx_v_ngram_start->arr[__pyx_cur_scope->__pyx_v_freq]) > 0);
           if (!__pyx_t_5) break;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":69
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":69
  *                     ngram_start = ngram_starts[n]
  *                     while ngram_start.arr[freq] > 0:
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram             # <<<<<<<<<<<<<<
@@ -20024,7 +21554,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_cur_scope->__pyx_v_freq = (__pyx_cur_scope->__pyx_v_freq + 1);
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":70
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":70
  *                     while ngram_start.arr[freq] > 0:
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram
  *                     ngram_start.arr[freq] = rs             # <<<<<<<<<<<<<<
@@ -20038,7 +21568,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":71
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram
  *                     ngram_start.arr[freq] = rs
  *         i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -20047,7 +21577,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
   __pyx_cur_scope->__pyx_v_i = __pyx_cur_scope->__pyx_v_veb->veb->min_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":72
  *                     ngram_start.arr[freq] = rs
  *         i = veb.veb.min_val
  *         while i != -1:             # <<<<<<<<<<<<<<
@@ -20058,7 +21588,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     __pyx_t_5 = (__pyx_cur_scope->__pyx_v_i != -1);
     if (!__pyx_t_5) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":73
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":73
  *         i = veb.veb.min_val
  *         while i != -1:
  *             ii = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -20067,7 +21597,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
     __pyx_cur_scope->__pyx_v_ii = ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_cur_scope->__pyx_v_veb->__pyx_vtab)->_findsucc(__pyx_cur_scope->__pyx_v_veb, __pyx_cur_scope->__pyx_v_i);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":74
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":74
  *         while i != -1:
  *             ii = veb._findsucc(i)
  *             for n from 0 <= n < max_n:             # <<<<<<<<<<<<<<
@@ -20077,7 +21607,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
     __pyx_t_2 = __pyx_cur_scope->__pyx_v_max_n;
     for (__pyx_cur_scope->__pyx_v_n = 0; __pyx_cur_scope->__pyx_v_n < __pyx_t_2; __pyx_cur_scope->__pyx_v_n++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":75
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":75
  *             ii = veb._findsucc(i)
  *             for n from 0 <= n < max_n:
  *                 ngram_start = ngram_starts[n]             # <<<<<<<<<<<<<<
@@ -20093,7 +21623,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
       __pyx_cur_scope->__pyx_v_ngram_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
       __pyx_t_1 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":76
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":76
  *             for n from 0 <= n < max_n:
  *                 ngram_start = ngram_starts[n]
  *                 iii = i             # <<<<<<<<<<<<<<
@@ -20102,7 +21632,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
       __pyx_cur_scope->__pyx_v_iii = __pyx_cur_scope->__pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":77
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":77
  *                 ngram_start = ngram_starts[n]
  *                 iii = i
  *                 rs = ngram_start.arr[iii]             # <<<<<<<<<<<<<<
@@ -20111,7 +21641,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
       __pyx_cur_scope->__pyx_v_rs = (__pyx_cur_scope->__pyx_v_ngram_start->arr[__pyx_cur_scope->__pyx_v_iii]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":78
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":78
  *                 iii = i
  *                 rs = ngram_start.arr[iii]
  *                 while (ii==-1 or iii < ii) and rs != 0:             # <<<<<<<<<<<<<<
@@ -20134,16 +21664,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
         }
         if (!__pyx_t_7) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":79
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":79
  *                 rs = ngram_start.arr[iii]
  *                 while (ii==-1 or iii < ii) and rs != 0:
  *                     j = self.sa.sa.arr[rs]             # <<<<<<<<<<<<<<
  *                     valid = 1
  *                     for k from 0 <= k < n+1:
  */
-        __pyx_cur_scope->__pyx_v_j = (((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
+        __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_self->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":80
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":80
  *                 while (ii==-1 or iii < ii) and rs != 0:
  *                     j = self.sa.sa.arr[rs]
  *                     valid = 1             # <<<<<<<<<<<<<<
@@ -20152,7 +21682,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
         __pyx_cur_scope->__pyx_v_valid = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":81
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":81
  *                     j = self.sa.sa.arr[rs]
  *                     valid = 1
  *                     for k from 0 <= k < n+1:             # <<<<<<<<<<<<<<
@@ -20162,17 +21692,17 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
         __pyx_t_9 = (__pyx_cur_scope->__pyx_v_n + 1);
         for (__pyx_cur_scope->__pyx_v_k = 0; __pyx_cur_scope->__pyx_v_k < __pyx_t_9; __pyx_cur_scope->__pyx_v_k++) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":82
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":82
  *                     valid = 1
  *                     for k from 0 <= k < n+1:
  *                         if self.sa.darray.data.arr[j+k] < 2:             # <<<<<<<<<<<<<<
  *                             valid = 0
  *                     if valid:
  */
-          __pyx_t_7 = ((((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
+          __pyx_t_7 = ((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":83
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":83
  *                     for k from 0 <= k < n+1:
  *                         if self.sa.darray.data.arr[j+k] < 2:
  *                             valid = 0             # <<<<<<<<<<<<<<
@@ -20185,7 +21715,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_L22:;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":84
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":84
  *                         if self.sa.darray.data.arr[j+k] < 2:
  *                             valid = 0
  *                     if valid:             # <<<<<<<<<<<<<<
@@ -20194,7 +21724,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
         if (__pyx_cur_scope->__pyx_v_valid) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":85
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":85
  *                             valid = 0
  *                     if valid:
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])             # <<<<<<<<<<<<<<
@@ -20202,13 +21732,13 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *                     iii = iii + 1
  */
           __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __Pyx_GOTREF(__pyx_t_1);
           __pyx_t_9 = (__pyx_cur_scope->__pyx_v_n + 1);
           for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_9; __pyx_t_6+=1) {
             __pyx_cur_scope->__pyx_v_k = __pyx_t_6;
-            __pyx_t_3 = PyInt_FromLong((((struct __pyx_obj_3_sa_LCP *)__pyx_cur_scope->__pyx_v_self)->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_3))) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           }
           __pyx_t_3 = ((PyObject *)PyList_AsTuple(__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -20220,7 +21750,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_cur_scope->__pyx_v_ngram = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":86
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":86
  *                     if valid:
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])
  *                         yield i, n+1, ngram             # <<<<<<<<<<<<<<
@@ -20232,7 +21762,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __pyx_t_1 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_n + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+          __Pyx_GOTREF(__pyx_t_10);
           PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
@@ -20248,7 +21778,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
           __Pyx_XGIVEREF(__pyx_r);
           __Pyx_RefNannyFinishContext();
           /* return from generator, yielding value */
-          __pyx_cur_scope->__pyx_base.resume_label = 1;
+          __pyx_generator->resume_label = 1;
           return __pyx_r;
           __pyx_L26_resume_from_yield:;
           __pyx_t_2 = __pyx_cur_scope->__pyx_t_0;
@@ -20257,7 +21787,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
         }
         __pyx_L23:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":87
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":87
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])
  *                         yield i, n+1, ngram
  *                     iii = iii + 1             # <<<<<<<<<<<<<<
@@ -20266,7 +21796,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  */
         __pyx_cur_scope->__pyx_v_iii = (__pyx_cur_scope->__pyx_v_iii + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":88
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":88
  *                         yield i, n+1, ngram
  *                     iii = iii + 1
  *                     rs = ngram_start.arr[iii]             # <<<<<<<<<<<<<<
@@ -20276,14 +21806,14 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
       }
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":89
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":89
  *                     iii = iii + 1
  *                     rs = ngram_start.arr[iii]
  *             i = ii             # <<<<<<<<<<<<<<
  */
     __pyx_cur_scope->__pyx_v_i = __pyx_cur_scope->__pyx_v_ii;
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -20292,12 +21822,27 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
   __Pyx_AddTraceback("compute_stats", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":12
+/* Python wrapper */
+static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_8Alphabet___cinit__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":12
  *     cdef dict id2sym
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -20305,20 +21850,16 @@ static PyObject *__pyx_gb_3_sa_3LCP_2generator1(struct __pyx_obj_3_sa___pyx_scop
  *         self.nonterminals = StringMap()
  */
 
-static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":13
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":13
  * 
  *     def __cinit__(self):
  *         self.terminals = StringMap()             # <<<<<<<<<<<<<<
@@ -20328,12 +21869,12 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals));
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->terminals);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->terminals));
+  __pyx_v_self->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":14
  *     def __cinit__(self):
  *         self.terminals = StringMap()
  *         self.nonterminals = StringMap()             # <<<<<<<<<<<<<<
@@ -20343,12 +21884,12 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals));
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->nonterminals);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->nonterminals));
+  __pyx_v_self->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":15
  *         self.terminals = StringMap()
  *         self.nonterminals = StringMap()
  *         self.id2sym = {}             # <<<<<<<<<<<<<<
@@ -20358,19 +21899,19 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym));
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->id2sym = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->id2sym);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->id2sym));
+  __pyx_v_self->id2sym = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":16
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":16
  *         self.nonterminals = StringMap()
  *         self.id2sym = {}
  *         self.first_nonterminal = -1             # <<<<<<<<<<<<<<
  * 
  *     def __dealloc__(self):
  */
-  ((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->first_nonterminal = -1;
+  __pyx_v_self->first_nonterminal = -1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -20383,7 +21924,16 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":18
+/* Python wrapper */
+static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_8Alphabet_2__dealloc__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":18
  *         self.first_nonterminal = -1
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -20391,15 +21941,14 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(PyObject *__pyx_v_self, PyObject *_
  * 
  */
 
-static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":21
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":21
  *         pass
  * 
  *     cdef int isvar(self, int sym):             # <<<<<<<<<<<<<<
@@ -20407,12 +21956,12 @@ static void __pyx_pf_3_sa_8Alphabet_1__dealloc__(PyObject *__pyx_v_self) {
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_isvar(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("isvar");
+  __Pyx_RefNannySetupContext("isvar", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":22
  * 
  *     cdef int isvar(self, int sym):
  *         return sym < 0             # <<<<<<<<<<<<<<
@@ -20428,7 +21977,7 @@ static int __pyx_f_3_sa_8Alphabet_isvar(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":24
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":24
  *         return sym < 0
  * 
  *     cdef int isword(self, int sym):             # <<<<<<<<<<<<<<
@@ -20436,12 +21985,12 @@ static int __pyx_f_3_sa_8Alphabet_isvar(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_isword(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("isword");
+  __Pyx_RefNannySetupContext("isword", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":25
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":25
  * 
  *     cdef int isword(self, int sym):
  *         return sym >= 0             # <<<<<<<<<<<<<<
@@ -20457,7 +22006,7 @@ static int __pyx_f_3_sa_8Alphabet_isword(struct __pyx_obj_3_sa_Alphabet *__pyx_v
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":27
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":27
  *         return sym >= 0
  * 
  *     cdef int getindex(self, int sym):             # <<<<<<<<<<<<<<
@@ -20465,12 +22014,12 @@ static int __pyx_f_3_sa_8Alphabet_isword(struct __pyx_obj_3_sa_Alphabet *__pyx_v
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_getindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("getindex");
+  __Pyx_RefNannySetupContext("getindex", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":28
  * 
  *     cdef int getindex(self, int sym):
  *         return -sym & INDEX_MASK             # <<<<<<<<<<<<<<
@@ -20486,7 +22035,7 @@ static int __pyx_f_3_sa_8Alphabet_getindex(struct __pyx_obj_3_sa_Alphabet *__pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":30
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":30
  *         return -sym & INDEX_MASK
  * 
  *     cdef int setindex(self, int sym, int ind):             # <<<<<<<<<<<<<<
@@ -20494,12 +22043,12 @@ static int __pyx_f_3_sa_8Alphabet_getindex(struct __pyx_obj_3_sa_Alphabet *__pyx
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_setindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym, int __pyx_v_ind) {
+static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym, int __pyx_v_ind) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("setindex");
+  __Pyx_RefNannySetupContext("setindex", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":31
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":31
  * 
  *     cdef int setindex(self, int sym, int ind):
  *         return -(-sym & ~INDEX_MASK | ind)             # <<<<<<<<<<<<<<
@@ -20515,7 +22064,7 @@ static int __pyx_f_3_sa_8Alphabet_setindex(struct __pyx_obj_3_sa_Alphabet *__pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":33
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":33
  *         return -(-sym & ~INDEX_MASK | ind)
  * 
  *     cdef int clearindex(self, int sym):             # <<<<<<<<<<<<<<
@@ -20523,12 +22072,12 @@ static int __pyx_f_3_sa_8Alphabet_setindex(struct __pyx_obj_3_sa_Alphabet *__pyx
  * 
  */
 
-static int __pyx_f_3_sa_8Alphabet_clearindex(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
+static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("clearindex");
+  __Pyx_RefNannySetupContext("clearindex", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":34
  * 
  *     cdef int clearindex(self, int sym):
  *         return -(-sym& ~INDEX_MASK)             # <<<<<<<<<<<<<<
@@ -20544,7 +22093,7 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":36
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":36
  *         return -(-sym& ~INDEX_MASK)
  * 
  *     cdef int match(self, int sym1, int sym2):             # <<<<<<<<<<<<<<
@@ -20555,9 +22104,9 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(struct __pyx_obj_3_sa_Alphabet *__p
 static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym1, int __pyx_v_sym2) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("match");
+  __Pyx_RefNannySetupContext("match", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":37
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":37
  * 
  *     cdef int match(self, int sym1, int sym2):
  *         return self.clearindex(sym1) == self.clearindex(sym2);             # <<<<<<<<<<<<<<
@@ -20573,7 +22122,7 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":39
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":39
  *         return self.clearindex(sym1) == self.clearindex(sym2);
  * 
  *     cdef char* tocat(self, int sym):             # <<<<<<<<<<<<<<
@@ -20584,9 +22133,9 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
 static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self, int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("tocat");
+  __Pyx_RefNannySetupContext("tocat", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":40
  * 
  *     cdef char* tocat(self, int sym):
  *         return self.nonterminals.word((-sym >> INDEX_SHIFT)-1)             # <<<<<<<<<<<<<<
@@ -20602,7 +22151,7 @@ static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":42
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":42
  *         return self.nonterminals.word((-sym >> INDEX_SHIFT)-1)
  * 
  *     cdef int fromcat(self, char *s):             # <<<<<<<<<<<<<<
@@ -20615,9 +22164,9 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("fromcat");
+  __Pyx_RefNannySetupContext("fromcat", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":44
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":44
  *     cdef int fromcat(self, char *s):
  *         cdef int i
  *         i = self.nonterminals.index(s)             # <<<<<<<<<<<<<<
@@ -20626,7 +22175,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
  */
   __pyx_v_i = ((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_self->nonterminals->__pyx_vtab)->index(__pyx_v_self->nonterminals, __pyx_v_s);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":45
  *         cdef int i
  *         i = self.nonterminals.index(s)
  *         if self.first_nonterminal == -1:             # <<<<<<<<<<<<<<
@@ -20636,7 +22185,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   __pyx_t_1 = (__pyx_v_self->first_nonterminal == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":46
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":46
  *         i = self.nonterminals.index(s)
  *         if self.first_nonterminal == -1:
  *             self.first_nonterminal = i             # <<<<<<<<<<<<<<
@@ -20648,7 +22197,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":47
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":47
  *         if self.first_nonterminal == -1:
  *             self.first_nonterminal = i
  *         if i > self.last_nonterminal:             # <<<<<<<<<<<<<<
@@ -20658,7 +22207,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   __pyx_t_1 = (__pyx_v_i > __pyx_v_self->last_nonterminal);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":48
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":48
  *             self.first_nonterminal = i
  *         if i > self.last_nonterminal:
  *             self.last_nonterminal = i             # <<<<<<<<<<<<<<
@@ -20670,7 +22219,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":49
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":49
  *         if i > self.last_nonterminal:
  *             self.last_nonterminal = i
  *         return -(i+1 << INDEX_SHIFT)             # <<<<<<<<<<<<<<
@@ -20686,7 +22235,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":51
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":51
  *         return -(i+1 << INDEX_SHIFT)
  * 
  *     cdef char* tostring(self, int sym):             # <<<<<<<<<<<<<<
@@ -20707,9 +22256,9 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("tostring");
+  __Pyx_RefNannySetupContext("tostring", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":53
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":53
  *     cdef char* tostring(self, int sym):
  *         cdef int ind
  *         if self.isvar(sym):             # <<<<<<<<<<<<<<
@@ -20719,7 +22268,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_self->__pyx_vtab)->isvar(__pyx_v_self, __pyx_v_sym);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":54
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":54
  *         cdef int ind
  *         if self.isvar(sym):
  *             if sym in self.id2sym:             # <<<<<<<<<<<<<<
@@ -20729,19 +22278,24 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_2 = PyInt_FromLong(__pyx_v_sym); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    __pyx_t_3 = ((PyDict_Contains(((PyObject *)__pyx_v_self->id2sym), __pyx_t_2))); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = (__Pyx_PyDict_Contains(__pyx_t_2, ((PyObject *)__pyx_v_self->id2sym), Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":55
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":55
  *         if self.isvar(sym):
  *             if sym in self.id2sym:
  *                 return self.id2sym[sym]             # <<<<<<<<<<<<<<
  *             ind = self.getindex(sym)
  *             if ind > 0:
  */
+      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
       __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_4 = PyBytes_AsString(__pyx_t_2); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -20752,7 +22306,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":56
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":56
  *             if sym in self.id2sym:
  *                 return self.id2sym[sym]
  *             ind = self.getindex(sym)             # <<<<<<<<<<<<<<
@@ -20761,7 +22315,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_ind = ((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_self->__pyx_vtab)->getindex(__pyx_v_self, __pyx_v_sym);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":57
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":57
  *                 return self.id2sym[sym]
  *             ind = self.getindex(sym)
  *             if ind > 0:             # <<<<<<<<<<<<<<
@@ -20771,7 +22325,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_3 = (__pyx_v_ind > 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":58
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":58
  *             ind = self.getindex(sym)
  *             if ind > 0:
  *                 self.id2sym[sym] = "[%s,%d]" % (self.tocat(sym), ind)             # <<<<<<<<<<<<<<
@@ -20783,7 +22337,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_5 = PyInt_FromLong(__pyx_v_ind); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+      __Pyx_GOTREF(__pyx_t_6);
       PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -20793,13 +22347,17 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_64), ((PyObject *)__pyx_t_6)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
+      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
       if (__Pyx_SetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, ((PyObject *)__pyx_t_5), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":60
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":60
  *                 self.id2sym[sym] = "[%s,%d]" % (self.tocat(sym), ind)
  *             else:
  *                 self.id2sym[sym] = "[%s]" % self.tocat(sym)             # <<<<<<<<<<<<<<
@@ -20811,18 +22369,26 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_65), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
+      if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
       if (__Pyx_SetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, ((PyObject *)__pyx_t_6), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":61
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":61
  *             else:
  *                 self.id2sym[sym] = "[%s]" % self.tocat(sym)
  *             return self.id2sym[sym]             # <<<<<<<<<<<<<<
  *         else:
  *             return self.terminals.word(sym)
  */
+    if (unlikely(((PyObject *)__pyx_v_self->id2sym) == Py_None)) {
+      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
     __pyx_t_6 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->id2sym), __pyx_v_sym, sizeof(int), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_4 = PyBytes_AsString(__pyx_t_6); if (unlikely((!__pyx_t_4) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -20833,7 +22399,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":63
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":63
  *             return self.id2sym[sym]
  *         else:
  *             return self.terminals.word(sym)             # <<<<<<<<<<<<<<
@@ -20858,7 +22424,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":65
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":65
  *             return self.terminals.word(sym)
  * 
  *     cdef int fromstring(self, char *s, bint terminal):             # <<<<<<<<<<<<<<
@@ -20884,9 +22450,9 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("fromstring");
+  __Pyx_RefNannySetupContext("fromstring", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":69
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":69
  *         cdef char *comma
  *         cdef int n
  *         n = strlen(s)             # <<<<<<<<<<<<<<
@@ -20895,7 +22461,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
   __pyx_v_n = strlen(__pyx_v_s);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":71
  *         n = strlen(s)
  *         cdef char *sep
  *         sep = strstr(s,"_SEP_")             # <<<<<<<<<<<<<<
@@ -20904,7 +22470,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
   __pyx_v_sep = strstr(__pyx_v_s, __pyx_k___SEP_);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":72
  *         cdef char *sep
  *         sep = strstr(s,"_SEP_")
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:             # <<<<<<<<<<<<<<
@@ -20932,7 +22498,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":73
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":73
  *         sep = strstr(s,"_SEP_")
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:
  *             if terminal:             # <<<<<<<<<<<<<<
@@ -20941,7 +22507,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     if (__pyx_v_terminal) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":74
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":74
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:
  *             if terminal:
  *                 s1 = "\\"+s             # <<<<<<<<<<<<<<
@@ -20956,7 +22522,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_v_s1 = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":75
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":75
  *             if terminal:
  *                 s1 = "\\"+s
  *                 return self.terminals.index(s1)             # <<<<<<<<<<<<<<
@@ -20970,7 +22536,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":76
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":76
  *                 s1 = "\\"+s
  *                 return self.terminals.index(s1)
  *             s[n-1] = c'\0'             # <<<<<<<<<<<<<<
@@ -20979,7 +22545,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     (__pyx_v_s[(__pyx_v_n - 1)]) = '\x00';
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":77
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":77
  *                 return self.terminals.index(s1)
  *             s[n-1] = c'\0'
  *             s = s + 1             # <<<<<<<<<<<<<<
@@ -20988,7 +22554,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_s = (__pyx_v_s + 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":78
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":78
  *             s[n-1] = c'\0'
  *             s = s + 1
  *             comma = strrchr(s, c',')             # <<<<<<<<<<<<<<
@@ -20997,7 +22563,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_comma = strrchr(__pyx_v_s, ',');
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":79
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":79
  *             s = s + 1
  *             comma = strrchr(s, c',')
  *             if comma != NULL:             # <<<<<<<<<<<<<<
@@ -21007,7 +22573,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_2 = (__pyx_v_comma != NULL);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":80
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":80
  *             comma = strrchr(s, c',')
  *             if comma != NULL:
  *                 comma[0] = c'\0'             # <<<<<<<<<<<<<<
@@ -21016,7 +22582,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
       (__pyx_v_comma[0]) = '\x00';
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":81
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":81
  *             if comma != NULL:
  *                 comma[0] = c'\0'
  *                 return self.setindex(self.fromcat(s), strtol(comma+1, NULL, 10))             # <<<<<<<<<<<<<<
@@ -21029,7 +22595,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":83
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":83
  *                 return self.setindex(self.fromcat(s), strtol(comma+1, NULL, 10))
  *             else:
  *                 return self.fromcat(s)             # <<<<<<<<<<<<<<
@@ -21044,7 +22610,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":85
  *                 return self.fromcat(s)
  *         else:
  *             return self.terminals.index(s)             # <<<<<<<<<<<<<<
@@ -21069,7 +22635,18 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":8
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8Alphabet_9terminals___get__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":8
  * 
  * cdef class Alphabet:
  *     cdef readonly StringMap terminals, nonterminals             # <<<<<<<<<<<<<<
@@ -21077,14 +22654,13 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  *     cdef dict id2sym
  */
 
-static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->terminals);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->terminals));
+  __pyx_r = ((PyObject *)__pyx_v_self->terminals);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -21094,14 +22670,24 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_9terminals___get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8Alphabet_12nonterminals___get__(((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj_3_sa_Alphabet *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Alphabet *)__pyx_v_self)->nonterminals);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->nonterminals));
+  __pyx_r = ((PyObject *)__pyx_v_self->nonterminals);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -21111,7 +22697,7 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":89
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":89
  * cdef Alphabet ALPHABET = Alphabet()
  * 
  * cdef char* sym_tostring(int sym):             # <<<<<<<<<<<<<<
@@ -21122,9 +22708,9 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(PyObject *__pyx_
 static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_tostring");
+  __Pyx_RefNannySetupContext("sym_tostring", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":90
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":90
  * 
  * cdef char* sym_tostring(int sym):
  *     return ALPHABET.tostring(sym)             # <<<<<<<<<<<<<<
@@ -21140,7 +22726,7 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":92
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":92
  *     return ALPHABET.tostring(sym)
  * 
  * cdef char* sym_tocat(int sym):             # <<<<<<<<<<<<<<
@@ -21151,9 +22737,9 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
 static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   char *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_tocat");
+  __Pyx_RefNannySetupContext("sym_tocat", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":93
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":93
  * 
  * cdef char* sym_tocat(int sym):
  *     return ALPHABET.tocat(sym)             # <<<<<<<<<<<<<<
@@ -21169,7 +22755,7 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":95
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":95
  *     return ALPHABET.tocat(sym)
  * 
  * cdef int sym_isvar(int sym):             # <<<<<<<<<<<<<<
@@ -21180,9 +22766,9 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_isvar");
+  __Pyx_RefNannySetupContext("sym_isvar", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":96
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":96
  * 
  * cdef int sym_isvar(int sym):
  *     return ALPHABET.isvar(sym)             # <<<<<<<<<<<<<<
@@ -21198,7 +22784,7 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":98
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":98
  *     return ALPHABET.isvar(sym)
  * 
  * cdef int sym_getindex(int sym):             # <<<<<<<<<<<<<<
@@ -21209,9 +22795,9 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_getindex");
+  __Pyx_RefNannySetupContext("sym_getindex", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":99
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":99
  * 
  * cdef int sym_getindex(int sym):
  *     return ALPHABET.getindex(sym)             # <<<<<<<<<<<<<<
@@ -21227,7 +22813,7 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":101
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":101
  *     return ALPHABET.getindex(sym)
  * 
  * cdef int sym_setindex(int sym, int id):             # <<<<<<<<<<<<<<
@@ -21238,14 +22824,14 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
 static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("sym_setindex");
+  __Pyx_RefNannySetupContext("sym_setindex", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":102
  * 
  * cdef int sym_setindex(int sym, int id):
  *     return ALPHABET.setindex(sym, id)             # <<<<<<<<<<<<<<
  * 
- * def sym_fromstring(char* string, bint terminal):
+ * cdef int sym_fromstring(char* string, bint terminal):
  */
   __pyx_r = ((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_3_sa_ALPHABET->__pyx_vtab)->setindex(__pyx_v_3_sa_ALPHABET, __pyx_v_sym, __pyx_v_id);
   goto __pyx_L0;
@@ -21256,79 +22842,404 @@ static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":104
  *     return ALPHABET.setindex(sym, id)
  * 
- * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
+ * cdef int sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
  *     return ALPHABET.fromstring(string, terminal)
+ * 
+ */
+
+static int __pyx_f_3_sa_sym_fromstring(char *__pyx_v_string, int __pyx_v_terminal) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("sym_fromstring", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":105
+ * 
+ * cdef int sym_fromstring(char* string, bint terminal):
+ *     return ALPHABET.fromstring(string, terminal)             # <<<<<<<<<<<<<<
+ * 
+ * def make_lattice(words):
+ */
+  __pyx_r = ((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_3_sa_ALPHABET->__pyx_vtab)->fromstring(__pyx_v_3_sa_ALPHABET, __pyx_v_string, __pyx_v_terminal);
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_3make_lattice(PyObject *__pyx_self, PyObject *__pyx_v_words); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_3make_lattice = {__Pyx_NAMESTR("make_lattice"), (PyCFunction)__pyx_pw_3_sa_3make_lattice, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_3make_lattice(PyObject *__pyx_self, PyObject *__pyx_v_words) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("make_lattice (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_2make_lattice(__pyx_self, ((PyObject *)__pyx_v_words));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_12make_lattice_2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":108
+ * 
+ * def make_lattice(words):
+ *     word_ids = (sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
+ *     return tuple(((word, None, 1), ) for word in word_ids)
+ * 
  */
 
-static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_3_sa_1sym_fromstring = {__Pyx_NAMESTR("sym_fromstring"), (PyCFunction)__pyx_pf_3_sa_1sym_fromstring, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  char *__pyx_v_string;
-  int __pyx_v_terminal;
+static PyObject *__pyx_pf_3_sa_12make_lattice_genexpr(PyObject *__pyx_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__string,&__pyx_n_s__terminal,0};
-  __Pyx_RefNannySetupContext("sym_fromstring");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_5_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_5_genexpr, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *) __pyx_self;
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
   {
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__string);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__terminal);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("sym_fromstring", 1, 2, 2, 1); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_12make_lattice_2generator7, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.make_lattice.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_gb_3_sa_12make_lattice_2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  char *__pyx_t_5;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L6_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_words)) { __Pyx_RaiseClosureNameError("words"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_words) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_words)) {
+    __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_words; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+    __pyx_t_3 = NULL;
+  } else {
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_words); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  }
+  for (;;) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else {
+      __pyx_t_4 = __pyx_t_3(__pyx_t_1);
+      if (unlikely(!__pyx_t_4)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
+        break;
       }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "sym_fromstring") < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
+      __Pyx_GOTREF(__pyx_t_4);
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_word);
+    __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_word);
+    __Pyx_GIVEREF(__pyx_t_4);
+    __pyx_cur_scope->__pyx_v_word = __pyx_t_4;
+    __pyx_t_4 = 0;
+    __pyx_t_5 = PyBytes_AsString(__pyx_cur_scope->__pyx_v_word); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_fromstring(__pyx_t_5, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_r = __pyx_t_4;
+    __pyx_t_4 = 0;
+    __Pyx_XGIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+    __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+    __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    /* return from generator, yielding value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L6_resume_from_yield:;
+    __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+    __pyx_cur_scope->__pyx_t_0 = 0;
+    __Pyx_XGOTREF(__pyx_t_1);
+    __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+    __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+}
+static PyObject *__pyx_gb_3_sa_12make_lattice_5generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":109
+ * def make_lattice(words):
+ *     word_ids = (sym_fromstring(word, True) for word in words)
+ *     return tuple(((word, None, 1), ) for word in word_ids)             # <<<<<<<<<<<<<<
+ * 
+ * def decode_lattice(lattice):
+ */
+
+static PyObject *__pyx_pf_3_sa_12make_lattice_3genexpr(PyObject *__pyx_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *) __pyx_self;
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_12make_lattice_5generator8, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.make_lattice.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_gb_3_sa_12make_lattice_5generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L6_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_word_ids)) { __Pyx_RaiseClosureNameError("word_ids"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_word_ids) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_word_ids)) {
+    __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_word_ids; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+    __pyx_t_3 = NULL;
+  } else {
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_word_ids); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  }
+  for (;;) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      __pyx_t_4 = __pyx_t_3(__pyx_t_1);
+      if (unlikely(!__pyx_t_4)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_4);
     }
-    __pyx_v_string = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_string) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_terminal = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_terminal == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_word);
+    __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_word);
+    __Pyx_GIVEREF(__pyx_t_4);
+    __pyx_cur_scope->__pyx_v_word = __pyx_t_4;
+    __pyx_t_4 = 0;
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_word);
+    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_cur_scope->__pyx_v_word);
+    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_word);
+    __Pyx_INCREF(Py_None);
+    PyTuple_SET_ITEM(__pyx_t_4, 1, Py_None);
+    __Pyx_GIVEREF(Py_None);
+    __Pyx_INCREF(__pyx_int_1);
+    PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_int_1);
+    __Pyx_GIVEREF(__pyx_int_1);
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_4));
+    __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
+    __pyx_t_4 = 0;
+    __pyx_r = ((PyObject *)__pyx_t_5);
+    __pyx_t_5 = 0;
+    __Pyx_XGIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+    __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+    __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    /* return from generator, yielding value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L6_resume_from_yield:;
+    __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+    __pyx_cur_scope->__pyx_t_0 = 0;
+    __Pyx_XGOTREF(__pyx_t_1);
+    __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+    __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("sym_fromstring", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.sym_fromstring", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
-  __pyx_L4_argument_unpacking_done:;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":105
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":107
+ *     return ALPHABET.fromstring(string, terminal)
  * 
- * def sym_fromstring(char* string, bint terminal):
- *     return ALPHABET.fromstring(string, terminal)             # <<<<<<<<<<<<<<
+ * def make_lattice(words):             # <<<<<<<<<<<<<<
+ *     word_ids = (sym_fromstring(word, True) for word in words)
+ *     return tuple(((word, None, 1), ) for word in word_ids)
+ */
+
+static PyObject *__pyx_pf_3_sa_2make_lattice(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_words) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("make_lattice", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *)__pyx_ptype_3_sa___pyx_scope_struct_4_make_lattice->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_4_make_lattice, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_v_words = __pyx_v_words;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_words);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_words);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":108
+ * 
+ * def make_lattice(words):
+ *     word_ids = (sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
+ *     return tuple(((word, None, 1), ) for word in word_ids)
+ * 
+ */
+  __pyx_t_1 = __pyx_pf_3_sa_12make_lattice_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_cur_scope->__pyx_v_word_ids = __pyx_t_1;
+  __pyx_t_1 = 0;
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":109
+ * def make_lattice(words):
+ *     word_ids = (sym_fromstring(word, True) for word in words)
+ *     return tuple(((word, None, 1), ) for word in word_ids)             # <<<<<<<<<<<<<<
+ * 
+ * def decode_lattice(lattice):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_3_sa_ALPHABET->__pyx_vtab)->fromstring(__pyx_v_3_sa_ALPHABET, __pyx_v_string, __pyx_v_terminal)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_pf_3_sa_12make_lattice_3genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
@@ -21337,60 +23248,817 @@ static PyObject *__pyx_pf_3_sa_1sym_fromstring(PyObject *__pyx_self, PyObject *_
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_sa.sym_fromstring", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_sa.make_lattice", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":6
- * cdef class Phrase:
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_5decode_lattice(PyObject *__pyx_self, PyObject *__pyx_v_lattice); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_5decode_lattice = {__Pyx_NAMESTR("decode_lattice"), (PyCFunction)__pyx_pw_3_sa_5decode_lattice, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_5decode_lattice(PyObject *__pyx_self, PyObject *__pyx_v_lattice) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("decode_lattice (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4decode_lattice(__pyx_self, ((PyObject *)__pyx_v_lattice));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":112
+ * 
+ * def decode_lattice(lattice):
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
+ *             for arc in node for node in lattice)
  * 
- *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
- *         cdef int i, j, n, n_vars
- *         n_vars = 0
  */
 
-static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_words = 0;
-  int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_n;
-  int __pyx_v_n_vars;
-  int __pyx_r;
+static PyObject *__pyx_pf_3_sa_14decode_lattice_genexpr(PyObject *__pyx_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__words,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_8_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_8_genexpr, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *) __pyx_self;
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
   {
-    PyObject* values[1] = {0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__words);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_14decode_lattice_2generator9, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.decode_lattice.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_10;
+  PyObject *(*__pyx_t_11)(PyObject *);
+  Py_ssize_t __pyx_t_12;
+  PyObject *(*__pyx_t_13)(PyObject *);
+  int __pyx_t_14;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L12_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":113
+ * def decode_lattice(lattice):
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc
+ *             for arc in node for node in lattice)             # <<<<<<<<<<<<<<
+ * 
+ * def decode_sentence(lattice):
+ */
+  if (unlikely(!__pyx_cur_scope->__pyx_v_arc)) { __Pyx_RaiseUnboundLocalError("arc"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_arc) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_arc)) {
+    __pyx_t_1 = __pyx_cur_scope->__pyx_v_arc; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+    __pyx_t_3 = NULL;
+  } else {
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_arc); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  }
+  for (;;) {
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":112
+ * 
+ * def decode_lattice(lattice):
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
+ *             for arc in node for node in lattice)
+ * 
+ */
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else {
+      __pyx_t_4 = __pyx_t_3(__pyx_t_1);
+      if (unlikely(!__pyx_t_4)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_4);
+    }
+    if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
+      PyObject* sequence = __pyx_t_4;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 3)) {
+        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
+      if (likely(PyTuple_CheckExact(sequence))) {
+        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
+        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
+        __pyx_t_7 = PyTuple_GET_ITEM(sequence, 2); 
+      } else {
+        __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
+        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
+        __pyx_t_7 = PyList_GET_ITEM(sequence, 2); 
+      }
+      __Pyx_INCREF(__pyx_t_5);
+      __Pyx_INCREF(__pyx_t_6);
+      __Pyx_INCREF(__pyx_t_7);
+      #else
+      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    } else
+    {
+      Py_ssize_t index = -1;
+      __pyx_t_8 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
+      index = 0; __pyx_t_5 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_5);
+      index = 1; __pyx_t_6 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_6)) goto __pyx_L6_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_6);
+      index = 2; __pyx_t_7 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_7)) goto __pyx_L6_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_7);
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 3) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = NULL;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L7_unpacking_done;
+      __pyx_L6_unpacking_failed:;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_9 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_L7_unpacking_done:;
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_sym);
+    __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_sym);
+    __Pyx_GIVEREF(__pyx_t_5);
+    __pyx_cur_scope->__pyx_v_sym = __pyx_t_5;
+    __pyx_t_5 = 0;
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_weight);
+    __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_weight);
+    __Pyx_GIVEREF(__pyx_t_6);
+    __pyx_cur_scope->__pyx_v_weight = __pyx_t_6;
+    __pyx_t_6 = 0;
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_dist);
+    __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_dist);
+    __Pyx_GIVEREF(__pyx_t_7);
+    __pyx_cur_scope->__pyx_v_dist = __pyx_t_7;
+    __pyx_t_7 = 0;
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":113
+ * def decode_lattice(lattice):
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc
+ *             for arc in node for node in lattice)             # <<<<<<<<<<<<<<
+ * 
+ * def decode_sentence(lattice):
+ */
+    if (unlikely(!__pyx_cur_scope->__pyx_v_node)) { __Pyx_RaiseUnboundLocalError("node"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_node) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_node)) {
+      __pyx_t_4 = __pyx_cur_scope->__pyx_v_node; __Pyx_INCREF(__pyx_t_4); __pyx_t_10 = 0;
+      __pyx_t_11 = NULL;
+    } else {
+      __pyx_t_10 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_node); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_11 = Py_TYPE(__pyx_t_4)->tp_iternext;
+    }
+    for (;;) {
+      if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_4)) {
+        if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_4)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_7); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_4)) {
+        if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_7); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else {
+        __pyx_t_7 = __pyx_t_11(__pyx_t_4);
+        if (unlikely(!__pyx_t_7)) {
+          if (PyErr_Occurred()) {
+            if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+            else {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
+          break;
+        }
+        __Pyx_GOTREF(__pyx_t_7);
+      }
+      __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_arc);
+      __Pyx_DECREF(__pyx_cur_scope->__pyx_v_arc);
+      __Pyx_GIVEREF(__pyx_t_7);
+      __pyx_cur_scope->__pyx_v_arc = __pyx_t_7;
+      __pyx_t_7 = 0;
+      if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_lattice)) { __Pyx_RaiseClosureNameError("lattice"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_lattice) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_lattice)) {
+        __pyx_t_7 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_lattice; __Pyx_INCREF(__pyx_t_7); __pyx_t_12 = 0;
+        __pyx_t_13 = NULL;
+      } else {
+        __pyx_t_12 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_lattice); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_13 = Py_TYPE(__pyx_t_7)->tp_iternext;
+      }
+      for (;;) {
+        if (!__pyx_t_13 && PyList_CheckExact(__pyx_t_7)) {
+          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_7)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_6 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_6); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_6 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        } else if (!__pyx_t_13 && PyTuple_CheckExact(__pyx_t_7)) {
+          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_6); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_6 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        } else {
+          __pyx_t_6 = __pyx_t_13(__pyx_t_7);
+          if (unlikely(!__pyx_t_6)) {
+            if (PyErr_Occurred()) {
+              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+              else {__pyx_filename = __pyx_f[10]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            }
+            break;
+          }
+          __Pyx_GOTREF(__pyx_t_6);
+        }
+        __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_node);
+        __Pyx_DECREF(__pyx_cur_scope->__pyx_v_node);
+        __Pyx_GIVEREF(__pyx_t_6);
+        __pyx_cur_scope->__pyx_v_node = __pyx_t_6;
+        __pyx_t_6 = 0;
+
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":112
+ * 
+ * def decode_lattice(lattice):
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
+ *             for arc in node for node in lattice)
+ * 
+ */
+        __pyx_t_14 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_sym); if (unlikely((__pyx_t_14 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_14)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+        __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_6));
+        __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
+        __Pyx_INCREF(__pyx_cur_scope->__pyx_v_weight);
+        PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_cur_scope->__pyx_v_weight);
+        __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_weight);
+        __Pyx_INCREF(__pyx_cur_scope->__pyx_v_dist);
+        PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_cur_scope->__pyx_v_dist);
+        __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_dist);
+        __pyx_t_6 = 0;
+        __pyx_r = ((PyObject *)__pyx_t_5);
+        __pyx_t_5 = 0;
+        __Pyx_XGIVEREF(__pyx_t_1);
+        __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+        __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+        __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_cur_scope->__pyx_t_3 = __pyx_t_4;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __pyx_cur_scope->__pyx_t_4 = __pyx_t_7;
+        __pyx_cur_scope->__pyx_t_5 = __pyx_t_10;
+        __pyx_cur_scope->__pyx_t_6 = __pyx_t_11;
+        __pyx_cur_scope->__pyx_t_7 = __pyx_t_12;
+        __pyx_cur_scope->__pyx_t_8 = __pyx_t_13;
+        __Pyx_XGIVEREF(__pyx_r);
+        __Pyx_RefNannyFinishContext();
+        /* return from generator, yielding value */
+        __pyx_generator->resume_label = 1;
+        return __pyx_r;
+        __pyx_L12_resume_from_yield:;
+        __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+        __pyx_cur_scope->__pyx_t_0 = 0;
+        __Pyx_XGOTREF(__pyx_t_1);
+        __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+        __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+        __pyx_t_4 = __pyx_cur_scope->__pyx_t_3;
+        __pyx_cur_scope->__pyx_t_3 = 0;
+        __Pyx_XGOTREF(__pyx_t_4);
+        __pyx_t_7 = __pyx_cur_scope->__pyx_t_4;
+        __pyx_cur_scope->__pyx_t_4 = 0;
+        __Pyx_XGOTREF(__pyx_t_7);
+        __pyx_t_10 = __pyx_cur_scope->__pyx_t_5;
+        __pyx_t_11 = __pyx_cur_scope->__pyx_t_6;
+        __pyx_t_12 = __pyx_cur_scope->__pyx_t_7;
+        __pyx_t_13 = __pyx_cur_scope->__pyx_t_8;
+        if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+    }
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":111
+ *     return tuple(((word, None, 1), ) for word in word_ids)
+ * 
+ * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc
+ *             for arc in node for node in lattice)
+ */
+
+static PyObject *__pyx_pf_3_sa_4decode_lattice(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_lattice) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("decode_lattice", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *)__pyx_ptype_3_sa___pyx_scope_struct_7_decode_lattice->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_7_decode_lattice, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_v_lattice = __pyx_v_lattice;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_lattice);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_lattice);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":112
+ * 
+ * def decode_lattice(lattice):
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
+ *             for arc in node for node in lattice)
+ * 
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_pf_3_sa_14decode_lattice_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_sa.decode_lattice", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7decode_sentence(PyObject *__pyx_self, PyObject *__pyx_v_lattice); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_7decode_sentence = {__Pyx_NAMESTR("decode_sentence"), (PyCFunction)__pyx_pw_3_sa_7decode_sentence, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_7decode_sentence(PyObject *__pyx_self, PyObject *__pyx_v_lattice) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("decode_sentence (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6decode_sentence(__pyx_self, ((PyObject *)__pyx_v_lattice));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_15decode_sentence_2generator10(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":116
+ * 
+ * def decode_sentence(lattice):
+ *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)             # <<<<<<<<<<<<<<
+ */
+
+static PyObject *__pyx_pf_3_sa_15decode_sentence_genexpr(PyObject *__pyx_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_10_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_10_genexpr, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *) __pyx_self;
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_15decode_sentence_2generator10, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.decode_sentence.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_gb_3_sa_15decode_sentence_2generator10(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
+{
+  struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *)__pyx_generator->closure);
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *(*__pyx_t_7)(PyObject *);
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  int __pyx_t_11;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
+    case 0: goto __pyx_L3_first_run;
+    case 1: goto __pyx_L10_resume_from_yield;
+    default: /* CPython raises the right error here */
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __pyx_L3_first_run:;
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_lattice)) { __Pyx_RaiseClosureNameError("lattice"); {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_lattice) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_lattice)) {
+    __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_lattice; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+    __pyx_t_3 = NULL;
+  } else {
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_lattice); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  }
+  for (;;) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else {
+      __pyx_t_4 = __pyx_t_3(__pyx_t_1);
+      if (unlikely(!__pyx_t_4)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_4);
+    }
+    if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
+      PyObject* sequence = __pyx_t_4;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 1)) {
+        if (size > 1) __Pyx_RaiseTooManyValuesError(1);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
+      if (likely(PyTuple_CheckExact(sequence))) {
+        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
+      } else {
+        __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
+      }
+      __Pyx_INCREF(__pyx_t_5);
+      #else
+      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    } else
+    {
+      Py_ssize_t index = -1;
+      __pyx_t_6 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
+      index = 0; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_5);
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = NULL;
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      goto __pyx_L7_unpacking_done;
+      __pyx_L6_unpacking_failed:;
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_7 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_L7_unpacking_done:;
+    }
+    if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
+      PyObject* sequence = __pyx_t_5;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 3)) {
+        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
+      if (likely(PyTuple_CheckExact(sequence))) {
+        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
+        __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); 
+        __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
+      } else {
+        __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
+        __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
+        __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
+      }
+      __Pyx_INCREF(__pyx_t_6);
+      __Pyx_INCREF(__pyx_t_8);
+      __Pyx_INCREF(__pyx_t_9);
+      #else
+      __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    } else
+    {
+      Py_ssize_t index = -1;
+      __pyx_t_10 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_7 = Py_TYPE(__pyx_t_10)->tp_iternext;
+      index = 0; __pyx_t_6 = __pyx_t_7(__pyx_t_10); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_6);
+      index = 1; __pyx_t_8 = __pyx_t_7(__pyx_t_10); if (unlikely(!__pyx_t_8)) goto __pyx_L8_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_8);
+      index = 2; __pyx_t_9 = __pyx_t_7(__pyx_t_10); if (unlikely(!__pyx_t_9)) goto __pyx_L8_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_9);
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_10), 3) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = NULL;
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      goto __pyx_L9_unpacking_done;
+      __pyx_L8_unpacking_failed:;
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __pyx_t_7 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_L9_unpacking_done:;
+    }
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_sym);
+    __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_sym);
+    __Pyx_GIVEREF(__pyx_t_6);
+    __pyx_cur_scope->__pyx_v_sym = __pyx_t_6;
+    __pyx_t_6 = 0;
+    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v__);
+    __Pyx_XDECREF(__pyx_cur_scope->__pyx_v__);
+    __Pyx_GIVEREF(__pyx_t_8);
+    __pyx_cur_scope->__pyx_v__ = __pyx_t_8;
+    __pyx_t_8 = 0;
+    __Pyx_GOTREF(__pyx_cur_scope->__pyx_v__);
+    __Pyx_DECREF(__pyx_cur_scope->__pyx_v__);
+    __Pyx_GIVEREF(__pyx_t_9);
+    __pyx_cur_scope->__pyx_v__ = __pyx_t_9;
+    __pyx_t_9 = 0;
+    __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_sym); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_11)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __pyx_r = ((PyObject *)__pyx_t_4);
+    __pyx_t_4 = 0;
+    __Pyx_XGIVEREF(__pyx_t_1);
+    __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
+    __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
+    __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
+    __Pyx_XGIVEREF(__pyx_r);
+    __Pyx_RefNannyFinishContext();
+    /* return from generator, yielding value */
+    __pyx_generator->resume_label = 1;
+    return __pyx_r;
+    __pyx_L10_resume_from_yield:;
+    __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
+    __pyx_cur_scope->__pyx_t_0 = 0;
+    __Pyx_XGOTREF(__pyx_t_1);
+    __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
+    __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  PyErr_SetNone(PyExc_StopIteration);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":115
+ *             for arc in node for node in lattice)
+ * 
+ * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
+ *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
+ */
+
+static PyObject *__pyx_pf_3_sa_6decode_sentence(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_lattice) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *__pyx_cur_scope;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("decode_sentence", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *)__pyx_ptype_3_sa___pyx_scope_struct_9_decode_sentence->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_9_decode_sentence, __pyx_empty_tuple, NULL);
+  if (unlikely(!__pyx_cur_scope)) {
+    __Pyx_RefNannyFinishContext();
+    return NULL;
+  }
+  __Pyx_GOTREF(__pyx_cur_scope);
+  __pyx_cur_scope->__pyx_v_lattice = __pyx_v_lattice;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_lattice);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_lattice);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":116
+ * 
+ * def decode_sentence(lattice):
+ *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)             # <<<<<<<<<<<<<<
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_pf_3_sa_15decode_sentence_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_sa.decode_sentence", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_words = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__words,0};
+    PyObject* values[1] = {0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__words)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
     } else {
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -21405,8 +24073,36 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_6Phrase___cinit__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_v_words);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":6
+ * cdef class Phrase:
+ * 
+ *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
+ *         cdef int i, j, n, n_vars
+ *         n_vars = 0
+ */
+
+static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_words) {
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_n;
+  int __pyx_v_n_vars;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  Py_ssize_t __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":8
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":8
  *     def __cinit__(self, words):
  *         cdef int i, j, n, n_vars
  *         n_vars = 0             # <<<<<<<<<<<<<<
@@ -21415,7 +24111,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  */
   __pyx_v_n_vars = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":9
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":9
  *         cdef int i, j, n, n_vars
  *         n_vars = 0
  *         n = len(words)             # <<<<<<<<<<<<<<
@@ -21425,16 +24121,16 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   __pyx_t_1 = PyObject_Length(__pyx_v_words); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_n = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":10
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":10
  *         n_vars = 0
  *         n = len(words)
  *         self.syms = <int *>malloc(n*sizeof(int))             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
+  __pyx_v_self->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":11
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":11
  *         n = len(words)
  *         self.syms = <int *>malloc(n*sizeof(int))
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -21444,7 +24140,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   __pyx_t_2 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":12
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":12
  *         self.syms = <int *>malloc(n*sizeof(int))
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]             # <<<<<<<<<<<<<<
@@ -21455,19 +24151,19 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) = __pyx_t_4;
+    (__pyx_v_self->syms[__pyx_v_i]) = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":13
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":13
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
  *                 n_vars += 1
  *         self.n = n
  */
-    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":14
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":14
  *             self.syms[i] = words[i]
  *             if sym_isvar(self.syms[i]):
  *                 n_vars += 1             # <<<<<<<<<<<<<<
@@ -21475,39 +24171,39 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *         self.n_vars = n_vars
  */
       __pyx_v_n_vars = (__pyx_v_n_vars + 1);
-      goto __pyx_L8;
+      goto __pyx_L5;
     }
-    __pyx_L8:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":15
  *             if sym_isvar(self.syms[i]):
  *                 n_vars += 1
  *         self.n = n             # <<<<<<<<<<<<<<
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n = __pyx_v_n;
+  __pyx_v_self->n = __pyx_v_n;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":16
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":16
  *                 n_vars += 1
  *         self.n = n
  *         self.n_vars = n_vars             # <<<<<<<<<<<<<<
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars = __pyx_v_n_vars;
+  __pyx_v_self->n_vars = __pyx_v_n_vars;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":17
  *         self.n = n
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))             # <<<<<<<<<<<<<<
  *         j = 0
  *         for i from 0 <= i < n:
  */
-  ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
+  __pyx_v_self->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":18
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0             # <<<<<<<<<<<<<<
@@ -21516,7 +24212,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  */
   __pyx_v_j = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":19
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":19
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -21526,26 +24222,26 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   __pyx_t_2 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":20
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":20
  *         j = 0
  *         for i from 0 <= i < n:
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
  *                 self.varpos[j] = i
  *                 j = j + 1
  */
-    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+    __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":21
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":21
  *         for i from 0 <= i < n:
  *             if sym_isvar(self.syms[i]):
  *                 self.varpos[j] = i             # <<<<<<<<<<<<<<
  *                 j = j + 1
  * 
  */
-      (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_v_j]) = __pyx_v_i;
+      (__pyx_v_self->varpos[__pyx_v_j]) = __pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":22
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":22
  *             if sym_isvar(self.syms[i]):
  *                 self.varpos[j] = i
  *                 j = j + 1             # <<<<<<<<<<<<<<
@@ -21553,9 +24249,9 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *     def __dealloc__(self):
  */
       __pyx_v_j = (__pyx_v_j + 1);
-      goto __pyx_L11;
+      goto __pyx_L8;
     }
-    __pyx_L11:;
+    __pyx_L8:;
   }
 
   __pyx_r = 0;
@@ -21569,7 +24265,16 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":24
+/* Python wrapper */
+static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_6Phrase_2__dealloc__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":24
  *                 j = j + 1
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -21577,33 +24282,43 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(PyObject *__pyx_v_self, PyObject *__p
  *         free(self.varpos)
  */
 
-static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":25
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":25
  * 
  *     def __dealloc__(self):
  *         free(self.syms)             # <<<<<<<<<<<<<<
  *         free(self.varpos)
  * 
  */
-  free(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms);
+  free(__pyx_v_self->syms);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":26
  *     def __dealloc__(self):
  *         free(self.syms)
  *         free(self.varpos)             # <<<<<<<<<<<<<<
  * 
  *     def __str__(self):
  */
-  free(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos);
+  free(__pyx_v_self->varpos);
+
+  __Pyx_RefNannyFinishContext();
+}
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_4__str__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
   __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":28
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":28
  *         free(self.varpos)
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -21611,8 +24326,7 @@ static void __pyx_pf_3_sa_6Phrase_1__dealloc__(PyObject *__pyx_v_self) {
  *         cdef int i, s
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_v_strs = NULL;
   int __pyx_v_i;
   int __pyx_v_s;
@@ -21626,9 +24340,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
+  __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":29
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":29
  * 
  *     def __str__(self):
  *         strs = []             # <<<<<<<<<<<<<<
@@ -21636,46 +24350,43 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
  *         for i from 0 <= i < self.n:
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":31
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":31
  *         strs = []
  *         cdef int i, s
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":32
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":32
  *         cdef int i, s
  *         for i from 0 <= i < self.n:
  *             s = self.syms[i]             # <<<<<<<<<<<<<<
  *             strs.append(sym_tostring(s))
  *         return ' '.join(strs)
  */
-    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]);
+    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":33
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":33
  *         for i from 0 <= i < self.n:
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))             # <<<<<<<<<<<<<<
  *         return ' '.join(strs)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_strs) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_v_s)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_3 = PyList_Append(__pyx_v_strs, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":34
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))
  *         return ' '.join(strs)             # <<<<<<<<<<<<<<
@@ -21686,7 +24397,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(((PyObject *)__pyx_v_strs));
   PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_strs));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_strs));
@@ -21713,7 +24424,19 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":36
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static char __pyx_doc_3_sa_6Phrase_6handle[] = "return a hashable representation that normalizes the ordering\n        of the nonterminal indices";
+static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("handle (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_6handle(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":36
  *         return ' '.join(strs)
  * 
  *     def handle(self):             # <<<<<<<<<<<<<<
@@ -21721,9 +24444,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_2__str__(PyObject *__pyx_v_self) {
  *         of the nonterminal indices"""
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static char __pyx_doc_3_sa_6Phrase_3handle[] = "return a hashable representation that normalizes the ordering\n        of the nonterminal indices";
-static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_v_norm = NULL;
   int __pyx_v_i;
   int __pyx_v_j;
@@ -21737,9 +24458,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("handle");
+  __Pyx_RefNannySetupContext("handle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":39
  *         """return a hashable representation that normalizes the ordering
  *         of the nonterminal indices"""
  *         norm = []             # <<<<<<<<<<<<<<
@@ -21747,11 +24468,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *         i = 1
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":41
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":41
  *         norm = []
  *         cdef int i, j, s
  *         i = 1             # <<<<<<<<<<<<<<
@@ -21760,7 +24481,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  */
   __pyx_v_i = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":42
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":42
  *         cdef int i, j, s
  *         i = 1
  *         j = 0             # <<<<<<<<<<<<<<
@@ -21769,26 +24490,26 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  */
   __pyx_v_j = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":43
  *         i = 1
  *         j = 0
  *         for j from 0 <= j < self.n:             # <<<<<<<<<<<<<<
  *             s = self.syms[j]
  *             if sym_isvar(s):
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":44
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":44
  *         j = 0
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]             # <<<<<<<<<<<<<<
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  */
-    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_j]);
+    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":45
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":45
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]
  *             if sym_isvar(s):             # <<<<<<<<<<<<<<
@@ -21798,7 +24519,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
     __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_v_s);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":46
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":46
  *             s = self.syms[j]
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)             # <<<<<<<<<<<<<<
@@ -21807,7 +24528,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  */
       __pyx_v_s = __pyx_f_3_sa_sym_setindex(__pyx_v_s, __pyx_v_i);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":47
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":47
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  *                 i = i + 1             # <<<<<<<<<<<<<<
@@ -21815,27 +24536,24 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *         return tuple(norm)
  */
       __pyx_v_i = (__pyx_v_i + 1);
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":48
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":48
  *                 s = sym_setindex(s,i)
  *                 i = i + 1
  *             norm.append(s)             # <<<<<<<<<<<<<<
  *         return tuple(norm)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyInt_FromLong(__pyx_v_s); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyList_Append(__pyx_v_norm, __pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":49
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":49
  *                 i = i + 1
  *             norm.append(s)
  *         return tuple(norm)             # <<<<<<<<<<<<<<
@@ -21843,9 +24561,6 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *     def strhandle(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
   __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_v_norm)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_r = ((PyObject *)__pyx_t_1);
@@ -21865,7 +24580,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":51
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("strhandle (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_8strhandle(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":51
  *         return tuple(norm)
  * 
  *     def strhandle(self):             # <<<<<<<<<<<<<<
@@ -21873,9 +24599,8 @@ static PyObject *__pyx_pf_3_sa_6Phrase_3handle(PyObject *__pyx_v_self, CYTHON_UN
  *         norm = []
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  PyObject *__pyx_v_strs = NULL;
+static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+  CYTHON_UNUSED PyObject *__pyx_v_strs = NULL;
   PyObject *__pyx_v_norm = NULL;
   int __pyx_v_i;
   int __pyx_v_j;
@@ -21891,9 +24616,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("strhandle");
+  __Pyx_RefNannySetupContext("strhandle", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":52
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":52
  * 
  *     def strhandle(self):
  *         strs = []             # <<<<<<<<<<<<<<
@@ -21901,11 +24626,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *         cdef int i, j, s
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":53
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":53
  *     def strhandle(self):
  *         strs = []
  *         norm = []             # <<<<<<<<<<<<<<
@@ -21913,11 +24638,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *         i = 1
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":55
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":55
  *         norm = []
  *         cdef int i, j, s
  *         i = 1             # <<<<<<<<<<<<<<
@@ -21926,7 +24651,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  */
   __pyx_v_i = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":56
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":56
  *         cdef int i, j, s
  *         i = 1
  *         j = 0             # <<<<<<<<<<<<<<
@@ -21935,26 +24660,26 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  */
   __pyx_v_j = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":57
  *         i = 1
  *         j = 0
  *         for j from 0 <= j < self.n:             # <<<<<<<<<<<<<<
  *             s = self.syms[j]
  *             if sym_isvar(s):
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":58
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":58
  *         j = 0
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]             # <<<<<<<<<<<<<<
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  */
-    __pyx_v_s = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_j]);
+    __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":59
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":59
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]
  *             if sym_isvar(s):             # <<<<<<<<<<<<<<
@@ -21964,7 +24689,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
     __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_v_s);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":60
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":60
  *             s = self.syms[j]
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)             # <<<<<<<<<<<<<<
@@ -21973,7 +24698,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  */
       __pyx_v_s = __pyx_f_3_sa_sym_setindex(__pyx_v_s, __pyx_v_i);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":61
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":61
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  *                 i = i + 1             # <<<<<<<<<<<<<<
@@ -21981,27 +24706,24 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  *         return ' '.join(norm)
  */
       __pyx_v_i = (__pyx_v_i + 1);
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":62
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":62
  *                 s = sym_setindex(s,i)
  *                 i = i + 1
  *             norm.append(sym_tostring(s))             # <<<<<<<<<<<<<<
  *         return ' '.join(norm)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_norm) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_v_s)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_4 = PyList_Append(__pyx_v_norm, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":63
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":63
  *                 i = i + 1
  *             norm.append(sym_tostring(s))
  *         return ' '.join(norm)             # <<<<<<<<<<<<<<
@@ -22012,7 +24734,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+  __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_norm));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_norm));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_norm));
@@ -22040,7 +24762,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":65
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("arity (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_10arity(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":65
  *         return ' '.join(norm)
  * 
  *     def arity(self):             # <<<<<<<<<<<<<<
@@ -22048,17 +24781,16 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4strhandle(PyObject *__pyx_v_self, CYTHON
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("arity");
+  __Pyx_RefNannySetupContext("arity", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":66
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":66
  * 
  *     def arity(self):
  *         return self.n_vars             # <<<<<<<<<<<<<<
@@ -22066,7 +24798,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNU
  *     def getvarpos(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -22084,7 +24816,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNU
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":68
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getvarpos (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_12getvarpos(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":68
  *         return self.n_vars
  * 
  *     def getvarpos(self, i):             # <<<<<<<<<<<<<<
@@ -22092,8 +24835,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5arity(PyObject *__pyx_v_self, CYTHON_UNU
  *             return self.varpos[i]
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -22103,30 +24845,28 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getvarpos");
+  __Pyx_RefNannySetupContext("getvarpos", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":69
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":69
  * 
  *     def getvarpos(self, i):
  *         if 0 <= i < self.n_vars:             # <<<<<<<<<<<<<<
  *             return self.varpos[i]
  *         else:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
     __Pyx_DECREF(__pyx_t_1);
-    __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":70
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":70
  *     def getvarpos(self, i):
  *         if 0 <= i < self.n_vars:
  *             return self.varpos[i]             # <<<<<<<<<<<<<<
@@ -22135,16 +24875,16 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_t_4])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->varpos[__pyx_t_4])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":72
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":72
  *             return self.varpos[i]
  *         else:
  *             raise IndexError             # <<<<<<<<<<<<<<
@@ -22154,7 +24894,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
     __Pyx_Raise(__pyx_builtin_IndexError, 0, 0, 0);
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -22169,7 +24909,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":74
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getvar (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_14getvar(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":74
  *             raise IndexError
  * 
  *     def getvar(self, i):             # <<<<<<<<<<<<<<
@@ -22177,8 +24928,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6getvarpos(PyObject *__pyx_v_self, PyObje
  *             return self.syms[self.varpos[i]]
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -22188,30 +24938,28 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getvar");
+  __Pyx_RefNannySetupContext("getvar", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":75
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":75
  * 
  *     def getvar(self, i):
  *         if 0 <= i < self.n_vars:             # <<<<<<<<<<<<<<
  *             return self.syms[self.varpos[i]]
  *         else:
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_int_0, __pyx_v_i, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
     __Pyx_DECREF(__pyx_t_1);
-    __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_self->n_vars); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
   __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":76
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":76
  *     def getvar(self, i):
  *         if 0 <= i < self.n_vars:
  *             return self.syms[self.varpos[i]]             # <<<<<<<<<<<<<<
@@ -22220,16 +24968,16 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->varpos[__pyx_t_4])])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_self->syms[(__pyx_v_self->varpos[__pyx_t_4])])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_r = __pyx_t_1;
     __pyx_t_1 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":78
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":78
  *             return self.syms[self.varpos[i]]
  *         else:
  *             raise IndexError             # <<<<<<<<<<<<<<
@@ -22239,7 +24987,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
     __Pyx_Raise(__pyx_builtin_IndexError, 0, 0, 0);
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -22254,7 +25002,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_7getvar(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":80
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":80
  *             raise IndexError
  * 
  *     cdef int chunkpos(self, int k):             # <<<<<<<<<<<<<<
@@ -22266,9 +25014,9 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("chunkpos");
+  __Pyx_RefNannySetupContext("chunkpos", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":81
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":81
  * 
  *     cdef int chunkpos(self, int k):
  *         if k == 0:             # <<<<<<<<<<<<<<
@@ -22278,7 +25026,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":82
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":82
  *     cdef int chunkpos(self, int k):
  *         if k == 0:
  *             return 0             # <<<<<<<<<<<<<<
@@ -22291,7 +25039,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":84
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":84
  *             return 0
  *         else:
  *             return self.varpos[k-1]+1             # <<<<<<<<<<<<<<
@@ -22309,7 +25057,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":86
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":86
  *             return self.varpos[k-1]+1
  * 
  *     cdef int chunklen(self, int k):             # <<<<<<<<<<<<<<
@@ -22321,9 +25069,9 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("chunklen");
+  __Pyx_RefNannySetupContext("chunklen", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":87
  * 
  *     cdef int chunklen(self, int k):
  *         if self.n_vars == 0:             # <<<<<<<<<<<<<<
@@ -22333,7 +25081,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_self->n_vars == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":88
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":88
  *     cdef int chunklen(self, int k):
  *         if self.n_vars == 0:
  *             return self.n             # <<<<<<<<<<<<<<
@@ -22345,7 +25093,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":89
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":89
  *         if self.n_vars == 0:
  *             return self.n
  *         elif k == 0:             # <<<<<<<<<<<<<<
@@ -22355,7 +25103,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":90
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":90
  *             return self.n
  *         elif k == 0:
  *             return self.varpos[0]             # <<<<<<<<<<<<<<
@@ -22367,7 +25115,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":91
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":91
  *         elif k == 0:
  *             return self.varpos[0]
  *         elif k == self.n_vars:             # <<<<<<<<<<<<<<
@@ -22377,7 +25125,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == __pyx_v_self->n_vars);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":92
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":92
  *             return self.varpos[0]
  *         elif k == self.n_vars:
  *             return self.n-self.varpos[k-1]-1             # <<<<<<<<<<<<<<
@@ -22390,7 +25138,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":94
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":94
  *             return self.n-self.varpos[k-1]-1
  *         else:
  *             return self.varpos[k]-self.varpos[k-1]-1             # <<<<<<<<<<<<<<
@@ -22408,7 +25156,18 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":96
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("clen (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_16clen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_k));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":96
  *             return self.varpos[k]-self.varpos[k-1]-1
  * 
  *     def clen(self, k):             # <<<<<<<<<<<<<<
@@ -22416,8 +25175,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *__pyx_v_k) {
+static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_k) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -22425,9 +25183,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("clen");
+  __Pyx_RefNannySetupContext("clen", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":97
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":97
  * 
  *     def clen(self, k):
  *          return self.chunklen(k)             # <<<<<<<<<<<<<<
@@ -22436,7 +25194,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_k); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunklen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -22454,7 +25212,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":99
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("getchunk (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_18getchunk(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_ci));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":99
  *          return self.chunklen(k)
  * 
  *     def getchunk(self, ci):             # <<<<<<<<<<<<<<
@@ -22462,8 +25231,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8clen(PyObject *__pyx_v_self, PyObject *_
  *         start = self.chunkpos(ci)
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObject *__pyx_v_ci) {
+static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_ci) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_chunk = NULL;
@@ -22476,9 +25244,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("getchunk");
+  __Pyx_RefNannySetupContext("getchunk", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":101
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":101
  *     def getchunk(self, ci):
  *         cdef int start, stop
  *         start = self.chunkpos(ci)             # <<<<<<<<<<<<<<
@@ -22486,9 +25254,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  *         chunk = []
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunkpos(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1);
+  __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunkpos(__pyx_v_self, __pyx_t_1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":102
  *         cdef int start, stop
  *         start = self.chunkpos(ci)
  *         stop = start+self.chunklen(ci)             # <<<<<<<<<<<<<<
@@ -22496,9 +25264,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  *         for i from start <= i < stop:
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->__pyx_vtab)->chunklen(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_t_1));
+  __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":103
  *         start = self.chunkpos(ci)
  *         stop = start+self.chunklen(ci)
  *         chunk = []             # <<<<<<<<<<<<<<
@@ -22506,11 +25274,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  *             chunk.append(self.syms[i])
  */
   __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_chunk = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":104
  *         stop = start+self.chunklen(ci)
  *         chunk = []
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -22520,23 +25288,20 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = __pyx_v_stop;
   for (__pyx_v_i = __pyx_v_start; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":105
  *         chunk = []
  *         for i from start <= i < stop:
  *             chunk.append(self.syms[i])             # <<<<<<<<<<<<<<
  *         return chunk
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_chunk) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->syms[__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_3 = PyList_Append(__pyx_v_chunk, __pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":106
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":106
  *         for i from start <= i < stop:
  *             chunk.append(self.syms[i])
  *         return chunk             # <<<<<<<<<<<<<<
@@ -22561,7 +25326,20 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":108
+/* Python wrapper */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cmp__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_20__cmp__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_other));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+#endif /*!(#if PY_MAJOR_VERSION < 3)*/
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":108
  *         return chunk
  * 
  *     def __cmp__(self, other):             # <<<<<<<<<<<<<<
@@ -22570,8 +25348,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_9getchunk(PyObject *__pyx_v_self, PyObjec
  */
 
 #if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_other) {
   struct __pyx_obj_3_sa_Phrase *__pyx_v_otherp = 0;
   int __pyx_v_i;
   int __pyx_r;
@@ -22583,9 +25360,9 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cmp__");
+  __Pyx_RefNannySetupContext("__cmp__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":111
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":111
  *         cdef Phrase otherp
  *         cdef int i
  *         otherp = other             # <<<<<<<<<<<<<<
@@ -22596,7 +25373,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
   __Pyx_INCREF(__pyx_v_other);
   __pyx_v_otherp = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_other);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":112
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":112
  *         cdef int i
  *         otherp = other
  *         for i from 0 <= i < min(self.n, otherp.n):             # <<<<<<<<<<<<<<
@@ -22604,7 +25381,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  *                 return -1
  */
   __pyx_t_1 = __pyx_v_otherp->n;
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_2 = __pyx_v_self->n;
   if ((__pyx_t_1 < __pyx_t_2)) {
     __pyx_t_3 = __pyx_t_1;
   } else {
@@ -22613,17 +25390,17 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
   __pyx_t_1 = __pyx_t_3;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":113
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":113
  *         otherp = other
  *         for i from 0 <= i < min(self.n, otherp.n):
  *             if self.syms[i] < otherp.syms[i]:             # <<<<<<<<<<<<<<
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:
  */
-    __pyx_t_4 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
+    __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":114
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":114
  *         for i from 0 <= i < min(self.n, otherp.n):
  *             if self.syms[i] < otherp.syms[i]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -22632,20 +25409,20 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
       __pyx_r = -1;
       goto __pyx_L0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":115
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":115
  *             if self.syms[i] < otherp.syms[i]:
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:             # <<<<<<<<<<<<<<
  *                 return 1
  *         if self.n < otherp.n:
  */
-    __pyx_t_4 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
+    __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":116
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":116
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -22654,22 +25431,22 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
       __pyx_r = 1;
       goto __pyx_L0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":117
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":117
  *             elif self.syms[i] > otherp.syms[i]:
  *                 return 1
  *         if self.n < otherp.n:             # <<<<<<<<<<<<<<
  *             return -1
  *         elif self.n > otherp.n:
  */
-  __pyx_t_4 = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n < __pyx_v_otherp->n);
+  __pyx_t_4 = (__pyx_v_self->n < __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":118
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":118
  *                 return 1
  *         if self.n < otherp.n:
  *             return -1             # <<<<<<<<<<<<<<
@@ -22678,20 +25455,20 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
     __pyx_r = -1;
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L6;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":119
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":119
  *         if self.n < otherp.n:
  *             return -1
  *         elif self.n > otherp.n:             # <<<<<<<<<<<<<<
  *             return 1
  *         else:
  */
-  __pyx_t_4 = (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n > __pyx_v_otherp->n);
+  __pyx_t_4 = (__pyx_v_self->n > __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":120
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":120
  *             return -1
  *         elif self.n > otherp.n:
  *             return 1             # <<<<<<<<<<<<<<
@@ -22700,11 +25477,11 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  */
     __pyx_r = 1;
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L6;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":122
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":122
  *             return 1
  *         else:
  *             return 0             # <<<<<<<<<<<<<<
@@ -22714,7 +25491,7 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
     __pyx_r = 0;
     goto __pyx_L0;
   }
-  __pyx_L8:;
+  __pyx_L6:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -22728,7 +25505,18 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":124
+/* Python wrapper */
+static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self); /*proto*/
+static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self) {
+  Py_hash_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_22__hash__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":124
  *             return 0
  * 
  *     def __hash__(self):             # <<<<<<<<<<<<<<
@@ -22736,17 +25524,16 @@ static int __pyx_pf_3_sa_6Phrase_10__cmp__(PyObject *__pyx_v_self, PyObject *__p
  *         cdef unsigned h
  */
 
-static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
+static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   int __pyx_v_i;
   unsigned int __pyx_v_h;
   Py_hash_t __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("__hash__");
+  __Pyx_RefNannySetupContext("__hash__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":127
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":127
  *         cdef int i
  *         cdef unsigned h
  *         h = 0             # <<<<<<<<<<<<<<
@@ -22755,51 +25542,51 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
  */
   __pyx_v_h = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":128
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":128
  *         cdef unsigned h
  *         h = 0
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             if self.syms[i] > 0:
  *                 h = (h << 1) + self.syms[i]
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_1 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":129
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":129
  *         h = 0
  *         for i from 0 <= i < self.n:
  *             if self.syms[i] > 0:             # <<<<<<<<<<<<<<
  *                 h = (h << 1) + self.syms[i]
  *             else:
  */
-    __pyx_t_2 = ((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]) > 0);
+    __pyx_t_2 = ((__pyx_v_self->syms[__pyx_v_i]) > 0);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":130
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":130
  *         for i from 0 <= i < self.n:
  *             if self.syms[i] > 0:
  *                 h = (h << 1) + self.syms[i]             # <<<<<<<<<<<<<<
  *             else:
  *                 h = (h << 1) + -self.syms[i]
  */
-      __pyx_v_h = ((__pyx_v_h << 1) + (((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
-      goto __pyx_L7;
+      __pyx_v_h = ((__pyx_v_h << 1) + (__pyx_v_self->syms[__pyx_v_i]));
+      goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":132
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":132
  *                 h = (h << 1) + self.syms[i]
  *             else:
  *                 h = (h << 1) + -self.syms[i]             # <<<<<<<<<<<<<<
  *         return h
  * 
  */
-      __pyx_v_h = ((__pyx_v_h << 1) + (-(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])));
+      __pyx_v_h = ((__pyx_v_h << 1) + (-(__pyx_v_self->syms[__pyx_v_i])));
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":133
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":133
  *             else:
  *                 h = (h << 1) + -self.syms[i]
  *         return h             # <<<<<<<<<<<<<<
@@ -22816,7 +25603,18 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":135
+/* Python wrapper */
+static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self); /*proto*/
+static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self) {
+  Py_ssize_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__len__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_24__len__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":135
  *         return h
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -22824,20 +25622,19 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_11__hash__(PyObject *__pyx_v_self) {
  * 
  */
 
-static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self); /*proto*/
-static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
+static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   Py_ssize_t __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__len__");
+  __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":136
  * 
  *     def __len__(self):
  *         return self.n             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, i):
  */
-  __pyx_r = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_r = __pyx_v_self->n;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -22846,7 +25643,18 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":138
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_26__getitem__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":138
  *         return self.n
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -22854,8 +25662,7 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_12__len__(PyObject *__pyx_v_self) {
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -22863,9 +25670,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyO
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":139
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":139
  * 
  *     def __getitem__(self, i):
  *         return self.syms[i]             # <<<<<<<<<<<<<<
@@ -22874,7 +25681,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyO
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->syms[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -22891,9 +25698,20 @@ static PyObject *__pyx_pf_3_sa_6Phrase_13__getitem__(PyObject *__pyx_v_self, PyO
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_28__iter__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -22901,42 +25719,51 @@ static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_
  *         for i from 0 <= i < self.n:
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_14__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_14__iter__(PyObject *__pyx_v_self) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope;
+static PyObject *__pyx_pf_3_sa_6Phrase_28__iter__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__");
-  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_4___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_4___iter__, __pyx_empty_tuple, NULL);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__iter__", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_11___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_11___iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_6Phrase_15generator2;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_6Phrase_30generator2, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.Phrase.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -22946,24 +25773,24 @@ static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":143
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":143
  *     def __iter__(self):
  *         cdef int i
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             yield self.syms[i]
  * 
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_self)->n;
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->n;
   for (__pyx_cur_scope->__pyx_v_i = 0; __pyx_cur_scope->__pyx_v_i < __pyx_t_1; __pyx_cur_scope->__pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":144
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":144
  *         cdef int i
  *         for i from 0 <= i < self.n:
  *             yield self.syms[i]             # <<<<<<<<<<<<<<
  * 
  *     def subst(self, start, children):
  */
-    __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_self)->syms[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_self->syms[__pyx_cur_scope->__pyx_v_i])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
@@ -22971,74 +25798,58 @@ static PyObject *__pyx_gb_3_sa_6Phrase_15generator2(struct __pyx_obj_3_sa___pyx_
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":146
- *             yield self.syms[i]
- * 
- *     def subst(self, start, children):             # <<<<<<<<<<<<<<
- *         cdef int i
- *         for i from 0 <= i < self.n:
- */
-
-static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_start = 0;
   PyObject *__pyx_v_children = 0;
-  int __pyx_v_i;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  long __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
-  __Pyx_RefNannySetupContext("subst");
+  __Pyx_RefNannySetupContext("subst (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__start)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__children)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("subst", 1, 2, 2, 1); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "subst") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "subst") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -23057,36 +25868,62 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_6Phrase_31subst(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self), __pyx_v_start, __pyx_v_children);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":146
+ *             yield self.syms[i]
+ * 
+ *     def subst(self, start, children):             # <<<<<<<<<<<<<<
+ *         cdef int i
+ *         for i from 0 <= i < self.n:
+ */
+
+static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, PyObject *__pyx_v_start, PyObject *__pyx_v_children) {
+  int __pyx_v_i;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  long __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("subst", 0);
   __Pyx_INCREF(__pyx_v_start);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":148
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":148
  *     def subst(self, start, children):
  *         cdef int i
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
  *             if sym_isvar(self.syms[i]):
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->n;
+  __pyx_t_1 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":149
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":149
  *         cdef int i
  *         for i from 0 <= i < self.n:
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  *             else:
  */
-    __pyx_t_2 = __pyx_f_3_sa_sym_isvar((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i]));
+    __pyx_t_2 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":150
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":150
  *         for i from 0 <= i < self.n:
  *             if sym_isvar(self.syms[i]):
  *                 start = start + children[sym_getindex(self.syms[i])-1]             # <<<<<<<<<<<<<<
  *             else:
  *                 start = start + (self.syms[i],)
  */
-      __pyx_t_3 = (__pyx_f_3_sa_sym_getindex((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])) - 1);
+      __pyx_t_3 = (__pyx_f_3_sa_sym_getindex((__pyx_v_self->syms[__pyx_v_i])) - 1);
       __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_children, __pyx_t_3, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_5 = PyNumber_Add(__pyx_v_start, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -23095,21 +25932,21 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
       __Pyx_DECREF(__pyx_v_start);
       __pyx_v_start = __pyx_t_5;
       __pyx_t_5 = 0;
-      goto __pyx_L8;
+      goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":152
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":152
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  *             else:
  *                 start = start + (self.syms[i],)             # <<<<<<<<<<<<<<
  *         return start
  * 
  */
-      __pyx_t_5 = PyInt_FromLong((((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self)->syms[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_self->syms[__pyx_v_i])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
@@ -23120,10 +25957,10 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
       __pyx_v_start = __pyx_t_5;
       __pyx_t_5 = 0;
     }
-    __pyx_L8:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":153
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":153
  *             else:
  *                 start = start + (self.syms[i],)
  *         return start             # <<<<<<<<<<<<<<
@@ -23149,7 +25986,18 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":156
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_6Phrase_5words___get__(((struct __pyx_obj_3_sa_Phrase *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":156
  * 
  *     property words:
  *         def __get__(self):             # <<<<<<<<<<<<<<
@@ -23157,8 +26005,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16subst(PyObject *__pyx_v_self, PyObject
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phrase *__pyx_v_self) {
   PyObject *__pyx_v_w = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -23172,9 +26019,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":157
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":157
  *     property words:
  *         def __get__(self):
  *             return [sym_tostring(w) for w in self if not sym_isvar(w)]             # <<<<<<<<<<<<<<
@@ -23183,22 +26030,30 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (PyList_CheckExact(__pyx_v_self) || PyTuple_CheckExact(__pyx_v_self)) {
-    __pyx_t_2 = __pyx_v_self; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyList_CheckExact(((PyObject *)__pyx_v_self)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self))) {
+    __pyx_t_2 = ((PyObject *)__pyx_v_self); __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
@@ -23219,11 +26074,11 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-      if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_INCREF(((PyObject *)__pyx_t_1));
@@ -23246,16 +26101,9 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":161
- * cdef class Rule:
- * 
- *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
- *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
- *         self.lhs = lhs
- */
-
-static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_lhs;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_f = 0;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_e = 0;
@@ -23263,21 +26111,24 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   PyObject *__pyx_v_word_alignments = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
     PyObject* values[5] = {0,0,0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":161
+ * cdef class Rule:
+ * 
+ *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
+ *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
+ *         self.lhs = lhs
+ */
     values[3] = ((PyObject *)Py_None);
     values[4] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -23287,20 +26138,17 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lhs);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lhs)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -23316,7 +26164,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -23345,8 +26193,27 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_e), __pyx_ptype_3_sa_Phrase, 1, "e", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_4Rule___cinit__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), __pyx_v_lhs, __pyx_v_f, __pyx_v_e, __pyx_v_scores, __pyx_v_word_alignments);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":162
+static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, int __pyx_v_lhs, struct __pyx_obj_3_sa_Phrase *__pyx_v_f, struct __pyx_obj_3_sa_Phrase *__pyx_v_e, PyObject *__pyx_v_scores, PyObject *__pyx_v_word_alignments) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":162
  * 
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)             # <<<<<<<<<<<<<<
@@ -23361,7 +26228,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -23371,20 +26238,20 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     {__pyx_filename = __pyx_f[7]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":163
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":163
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
  *         self.lhs = lhs             # <<<<<<<<<<<<<<
  *         self.f = f
  *         self.e = e
  */
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs = __pyx_v_lhs;
+  __pyx_v_self->lhs = __pyx_v_lhs;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":164
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":164
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
  *         self.lhs = lhs
  *         self.f = f             # <<<<<<<<<<<<<<
@@ -23393,11 +26260,11 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_f));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_f));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f = __pyx_v_f;
+  __Pyx_GOTREF(__pyx_v_self->f);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
+  __pyx_v_self->f = __pyx_v_f;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":165
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":165
  *         self.lhs = lhs
  *         self.f = f
  *         self.e = e             # <<<<<<<<<<<<<<
@@ -23406,11 +26273,11 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_e));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_e));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e = __pyx_v_e;
+  __Pyx_GOTREF(__pyx_v_self->e);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->e));
+  __pyx_v_self->e = __pyx_v_e;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":166
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":166
  *         self.f = f
  *         self.e = e
  *         self.word_alignments = word_alignments             # <<<<<<<<<<<<<<
@@ -23419,11 +26286,11 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  */
   __Pyx_INCREF(__pyx_v_word_alignments);
   __Pyx_GIVEREF(__pyx_v_word_alignments);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments = __pyx_v_word_alignments;
+  __Pyx_GOTREF(__pyx_v_self->word_alignments);
+  __Pyx_DECREF(__pyx_v_self->word_alignments);
+  __pyx_v_self->word_alignments = __pyx_v_word_alignments;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":167
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":167
  *         self.e = e
  *         self.word_alignments = word_alignments
  *         self.scores = scores             # <<<<<<<<<<<<<<
@@ -23433,9 +26300,9 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   if (!(likely(((__pyx_v_scores) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_scores, __pyx_ptype_3_sa_FeatureVector))))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_scores);
   __Pyx_GIVEREF(__pyx_v_scores);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores));
-  ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_scores);
+  __Pyx_GOTREF(__pyx_v_self->scores);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->scores));
+  __pyx_v_self->scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_scores);
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -23449,7 +26316,18 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":169
+/* Python wrapper */
+static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self); /*proto*/
+static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self) {
+  Py_hash_t __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_2__hash__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":169
  *         self.scores = scores
  * 
  *     def __hash__(self):             # <<<<<<<<<<<<<<
@@ -23457,8 +26335,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(PyObject *__pyx_v_self, PyObject *__pyx
  * 
  */
 
-static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self); /*proto*/
-static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
+static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   Py_hash_t __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23467,27 +26344,27 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__hash__");
+  __Pyx_RefNannySetupContext("__hash__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":170
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":170
  * 
  *     def __hash__(self):
  *         return hash((self.lhs, self.f, self.e))             # <<<<<<<<<<<<<<
  * 
  *     def __cmp__(self, Rule other):
  */
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->f));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e));
   __pyx_t_1 = 0;
   __pyx_t_3 = PyObject_Hash(((PyObject *)__pyx_t_2)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -23507,7 +26384,25 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":172
+/* Python wrapper */
+#if PY_MAJOR_VERSION < 3
+static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
+static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cmp__ (wrapper)", 0);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_ptype_3_sa_Rule, 1, "other", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_4Rule_4__cmp__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), ((struct __pyx_obj_3_sa_Rule *)__pyx_v_other));
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+#endif /*!(#if PY_MAJOR_VERSION < 3)*/
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":172
  *         return hash((self.lhs, self.f, self.e))
  * 
  *     def __cmp__(self, Rule other):             # <<<<<<<<<<<<<<
@@ -23516,8 +26411,7 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_1__hash__(PyObject *__pyx_v_self) {
  */
 
 #if PY_MAJOR_VERSION < 3
-static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
-static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
+static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Rule *__pyx_v_other) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23527,58 +26421,57 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cmp__");
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_other), __pyx_ptype_3_sa_Rule, 1, "other", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("__cmp__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":173
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":173
  * 
  *     def __cmp__(self, Rule other):
  *         return cmp((self.lhs, self.f, self.e, self.word_alignments),             # <<<<<<<<<<<<<<
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  PyTuple_SET_ITEM(__pyx_t_2, 3, ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  __Pyx_GIVEREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->f));
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->e));
+  __Pyx_INCREF(__pyx_v_self->word_alignments);
+  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->word_alignments);
+  __Pyx_GIVEREF(__pyx_v_self->word_alignments);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":174
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":174
  *     def __cmp__(self, Rule other):
  *         return cmp((self.lhs, self.f, self.e, self.word_alignments),
  *                 (other.lhs, other.f, other.e, self.word_alignments))             # <<<<<<<<<<<<<<
  * 
  *     def fmerge(self, Phrase f):
  */
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_other->lhs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
-  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->f));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
-  PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_other)->e));
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  PyTuple_SET_ITEM(__pyx_t_3, 3, ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
-  __Pyx_GIVEREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->word_alignments);
+  __Pyx_INCREF(((PyObject *)__pyx_v_other->f));
+  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_other->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_other->f));
+  __Pyx_INCREF(((PyObject *)__pyx_v_other->e));
+  PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)__pyx_v_other->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_other->e));
+  __Pyx_INCREF(__pyx_v_self->word_alignments);
+  PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_v_self->word_alignments);
+  __Pyx_GIVEREF(__pyx_v_self->word_alignments);
   __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_3));
@@ -23607,7 +26500,23 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":176
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("fmerge (wrapper)", 0);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_4Rule_6fmerge(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self), ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_f));
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":176
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
  *     def fmerge(self, Phrase f):             # <<<<<<<<<<<<<<
@@ -23615,8 +26524,7 @@ static int __pyx_pf_3_sa_4Rule_2__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
  *             self.f = f
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v_self, struct __pyx_obj_3_sa_Phrase *__pyx_v_f) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23624,37 +26532,35 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("fmerge");
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_f), __pyx_ptype_3_sa_Phrase, 1, "f", 0))) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("fmerge", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":177
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":177
  * 
  *     def fmerge(self, Phrase f):
  *         if self.f == f:             # <<<<<<<<<<<<<<
  *             self.f = f
  * 
  */
-  __pyx_t_1 = PyObject_RichCompare(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f), __pyx_v_f, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(((PyObject *)__pyx_v_self->f), ((PyObject *)__pyx_v_f), Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":178
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":178
  *     def fmerge(self, Phrase f):
  *         if self.f == f:
  *             self.f = f             # <<<<<<<<<<<<<<
  * 
  *     def arity(self):
  */
-    __Pyx_INCREF(__pyx_v_f);
-    __Pyx_GIVEREF(__pyx_v_f);
-    __Pyx_GOTREF(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
-    __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-    ((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_f);
-    goto __pyx_L5;
+    __Pyx_INCREF(((PyObject *)__pyx_v_f));
+    __Pyx_GIVEREF(((PyObject *)__pyx_v_f));
+    __Pyx_GOTREF(__pyx_v_self->f);
+    __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
+    __pyx_v_self->f = __pyx_v_f;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -23668,7 +26574,18 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":180
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("arity (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_8arity(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":180
  *             self.f = f
  * 
  *     def arity(self):             # <<<<<<<<<<<<<<
@@ -23676,8 +26593,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_3fmerge(PyObject *__pyx_v_self, PyObject *_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -23685,9 +26601,9 @@ static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSE
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("arity");
+  __Pyx_RefNannySetupContext("arity", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":181
  * 
  *     def arity(self):
  *         return self.f.arity()             # <<<<<<<<<<<<<<
@@ -23695,7 +26611,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSE
  *     def __str__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->f), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -23716,9 +26632,20 @@ static PyObject *__pyx_pf_3_sa_4Rule_4arity(PyObject *__pyx_v_self, CYTHON_UNUSE
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_10__str__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator11(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
@@ -23726,45 +26653,53 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7__str___genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7__str___genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope;
+static PyObject *__pyx_pf_3_sa_4Rule_7__str___genexpr(PyObject *__pyx_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("genexpr");
-  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_6_genexpr, __pyx_empty_tuple, NULL);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_13_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_13_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)__pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *) __pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  __pyx_self = __pyx_self;
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7__str___1generator7;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_7__str___2generator11, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.Rule.__str__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator11(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   Py_ssize_t __pyx_t_3;
   PyObject *(*__pyx_t_4)(PyObject *);
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -23773,7 +26708,8 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self, __pyx_n_s__alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self), __pyx_n_s__alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -23788,12 +26724,20 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_2 = __pyx_t_4(__pyx_t_1);
       if (unlikely(!__pyx_t_2)) {
@@ -23821,7 +26765,7 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -23832,7 +26776,7 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -23840,12 +26784,13 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":183
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":183
  *         return self.f.arity()
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -23853,9 +26798,8 @@ static PyObject *__pyx_gb_3_sa_7__str___1generator7(struct __pyx_obj_3_sa___pyx_
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *__pyx_cur_scope;
+static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *__pyx_cur_scope;
   PyObject *__pyx_v_fields = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -23869,52 +26813,52 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
-  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_5___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_5___str__, __pyx_empty_tuple, NULL);
+  __Pyx_RefNannySetupContext("__str__", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_12___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_12___str__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":185
  *     def __str__(self):
  *         cdef unsigned i
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]             # <<<<<<<<<<<<<<
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  */
-  __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->lhs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_cur_scope->__pyx_v_self->lhs)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->f));
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
+  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->f));
   __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->e));
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
+  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->e));
   __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
-  __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->scores));
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
+  __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->scores));
   __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_t_2 = PyList_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
@@ -23930,32 +26874,29 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   __pyx_v_fields = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":186
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":186
  *         cdef unsigned i
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:             # <<<<<<<<<<<<<<
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  *         return ' ||| '.join(fields)
  */
-  __pyx_t_6 = (((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments != Py_None);
+  __pyx_t_6 = (__pyx_cur_scope->__pyx_v_self->word_alignments != Py_None);
   if (__pyx_t_6) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
  *         return ' ||| '.join(fields)
  * 
  */
-    if (unlikely(((PyObject *)__pyx_v_fields) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_5 = __pyx_pf_3_sa_7__str___genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __pyx_pf_3_sa_4Rule_7__str___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
@@ -23965,11 +26906,11 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_t_7 = PyList_Append(__pyx_v_fields, __pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":188
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":188
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  *         return ' ||| '.join(fields)             # <<<<<<<<<<<<<<
@@ -23980,7 +26921,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_18), __pyx_n_s__join); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(((PyObject *)__pyx_v_fields));
   PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_fields));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fields));
@@ -24009,9 +26950,20 @@ static PyObject *__pyx_pf_3_sa_4Rule_5__str__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":190
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("alignments (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_12alignments(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
  * 
  *     def alignments(self):             # <<<<<<<<<<<<<<
@@ -24019,36 +26971,45 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
  *             yield point/65536, point%65536
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_6alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_6alignments(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope;
+static PyObject *__pyx_pf_3_sa_4Rule_12alignments(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("alignments");
-  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)__pyx_ptype_3_sa___pyx_scope_struct_7_alignments->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_7_alignments, __pyx_empty_tuple, NULL);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("alignments", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *)__pyx_ptype_3_sa___pyx_scope_struct_14_alignments->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_14_alignments, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_7generator3;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_4Rule_14generator3, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.Rule.alignments", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
@@ -24057,8 +27018,8 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -24068,27 +27029,35 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":191
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":191
  * 
  *     def alignments(self):
  *         for point in self.word_alignments:             # <<<<<<<<<<<<<<
  *             yield point/65536, point%65536
  */
-  if (PyList_CheckExact(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments) || PyTuple_CheckExact(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments)) {
-    __pyx_t_1 = ((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_self->word_alignments) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_self->word_alignments)) {
+    __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->word_alignments; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((struct __pyx_obj_3_sa_Rule *)__pyx_cur_scope->__pyx_v_self)->word_alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_self->word_alignments); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -24106,7 +27075,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     __pyx_cur_scope->__pyx_v_point = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":192
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":192
  *     def alignments(self):
  *         for point in self.word_alignments:
  *             yield point/65536, point%65536             # <<<<<<<<<<<<<<
@@ -24116,7 +27085,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     __pyx_t_5 = PyNumber_Remainder(__pyx_cur_scope->__pyx_v_point, __pyx_int_65536); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -24132,7 +27101,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -24143,7 +27112,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -24153,11 +27122,23 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
   __Pyx_AddTraceback("alignments", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_1f_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_1f___get__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* "_sa.pxd":37
  * cdef class Rule:
  *     cdef int lhs
@@ -24166,14 +27147,13 @@ static PyObject *__pyx_gb_3_sa_4Rule_7generator3(struct __pyx_obj_3_sa___pyx_sco
  *     cdef int n_scores
  */
 
-static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->f);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->f));
+  __pyx_r = ((PyObject *)__pyx_v_self->f);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -24183,14 +27163,24 @@ static PyObject *__pyx_pf_3_sa_4Rule_1f___get__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_4Rule_1e_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_4Rule_1e_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_4Rule_1e___get__(((struct __pyx_obj_3_sa_Rule *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e));
-  __pyx_r = ((PyObject *)((struct __pyx_obj_3_sa_Rule *)__pyx_v_self)->e);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->e));
+  __pyx_r = ((PyObject *)__pyx_v_self->e);
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -24200,7 +27190,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":21
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":21
  *     int arr_len
  * 
  * cdef _Trie_Node* new_trie_node():             # <<<<<<<<<<<<<<
@@ -24212,9 +27202,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   struct __pyx_t_3_sa__Trie_Node *__pyx_v_node;
   struct __pyx_t_3_sa__Trie_Node *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_trie_node");
+  __Pyx_RefNannySetupContext("new_trie_node", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":23
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":23
  * cdef _Trie_Node* new_trie_node():
  *     cdef _Trie_Node* node
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))             # <<<<<<<<<<<<<<
@@ -24223,7 +27213,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node = ((struct __pyx_t_3_sa__Trie_Node *)malloc((sizeof(struct __pyx_t_3_sa__Trie_Node))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":24
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":24
  *     cdef _Trie_Node* node
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))
  *     node.root = NULL             # <<<<<<<<<<<<<<
@@ -24232,7 +27222,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->root = NULL;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":25
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":25
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))
  *     node.root = NULL
  *     node.arr_len = 0             # <<<<<<<<<<<<<<
@@ -24241,7 +27231,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->arr_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":26
  *     node.root = NULL
  *     node.arr_len = 0
  *     node.arr = <int*> malloc(sizeof(0*sizeof(int)))             # <<<<<<<<<<<<<<
@@ -24250,7 +27240,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->arr = ((int *)malloc((sizeof((0 * (sizeof(int)))))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":27
  *     node.arr_len = 0
  *     node.arr = <int*> malloc(sizeof(0*sizeof(int)))
  *     return node             # <<<<<<<<<<<<<<
@@ -24266,7 +27256,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":29
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":29
  *     return node
  * 
  * cdef _Trie_Edge* new_trie_edge(int val):             # <<<<<<<<<<<<<<
@@ -24278,9 +27268,9 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   struct __pyx_t_3_sa__Trie_Edge *__pyx_v_edge;
   struct __pyx_t_3_sa__Trie_Edge *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("new_trie_edge");
+  __Pyx_RefNannySetupContext("new_trie_edge", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":31
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":31
  * cdef _Trie_Edge* new_trie_edge(int val):
  *     cdef _Trie_Edge* edge
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))             # <<<<<<<<<<<<<<
@@ -24289,7 +27279,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge = ((struct __pyx_t_3_sa__Trie_Edge *)malloc((sizeof(struct __pyx_t_3_sa__Trie_Edge))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":32
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":32
  *     cdef _Trie_Edge* edge
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))
  *     edge.node = new_trie_node()             # <<<<<<<<<<<<<<
@@ -24298,7 +27288,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->node = __pyx_f_3_sa_new_trie_node();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":33
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":33
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))
  *     edge.node = new_trie_node()
  *     edge.bigger = NULL             # <<<<<<<<<<<<<<
@@ -24307,7 +27297,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->bigger = NULL;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":34
  *     edge.node = new_trie_node()
  *     edge.bigger = NULL
  *     edge.smaller = NULL             # <<<<<<<<<<<<<<
@@ -24316,7 +27306,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->smaller = NULL;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":35
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":35
  *     edge.bigger = NULL
  *     edge.smaller = NULL
  *     edge.val = val             # <<<<<<<<<<<<<<
@@ -24325,7 +27315,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->val = __pyx_v_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":36
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":36
  *     edge.smaller = NULL
  *     edge.val = val
  *     return edge             # <<<<<<<<<<<<<<
@@ -24341,7 +27331,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":38
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":38
  *     return edge
  * 
  * cdef free_trie_node(_Trie_Node* node):             # <<<<<<<<<<<<<<
@@ -24357,9 +27347,9 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("free_trie_node");
+  __Pyx_RefNannySetupContext("free_trie_node", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":39
  * 
  * cdef free_trie_node(_Trie_Node* node):
  *     if node != NULL:             # <<<<<<<<<<<<<<
@@ -24369,7 +27359,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   __pyx_t_1 = (__pyx_v_node != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":40
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":40
  * cdef free_trie_node(_Trie_Node* node):
  *     if node != NULL:
  *         free_trie_edge(node.root)             # <<<<<<<<<<<<<<
@@ -24380,7 +27370,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":41
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":41
  *     if node != NULL:
  *         free_trie_edge(node.root)
  *         free(node.arr)             # <<<<<<<<<<<<<<
@@ -24404,7 +27394,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":43
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":43
  *         free(node.arr)
  * 
  * cdef free_trie_edge(_Trie_Edge* edge):             # <<<<<<<<<<<<<<
@@ -24420,9 +27410,9 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("free_trie_edge");
+  __Pyx_RefNannySetupContext("free_trie_edge", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":44
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":44
  * 
  * cdef free_trie_edge(_Trie_Edge* edge):
  *     if edge != NULL:             # <<<<<<<<<<<<<<
@@ -24432,7 +27422,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   __pyx_t_1 = (__pyx_v_edge != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":45
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":45
  * cdef free_trie_edge(_Trie_Edge* edge):
  *     if edge != NULL:
  *         free_trie_node(edge.node)             # <<<<<<<<<<<<<<
@@ -24443,7 +27433,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":46
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":46
  *     if edge != NULL:
  *         free_trie_node(edge.node)
  *         free_trie_edge(edge.bigger)             # <<<<<<<<<<<<<<
@@ -24454,7 +27444,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":47
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":47
  *         free_trie_node(edge.node)
  *         free_trie_edge(edge.bigger)
  *         free_trie_edge(edge.smaller)             # <<<<<<<<<<<<<<
@@ -24480,7 +27470,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":49
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":49
  *         free_trie_edge(edge.smaller)
  * 
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -24495,9 +27485,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("trie_find");
+  __Pyx_RefNannySetupContext("trie_find", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":51
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):
  *     cdef _Trie_Edge* cur
  *     cur = node.root             # <<<<<<<<<<<<<<
@@ -24506,7 +27496,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
  */
   __pyx_v_cur = __pyx_v_node->root;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":52
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":52
  *     cdef _Trie_Edge* cur
  *     cur = node.root
  *     while cur != NULL and cur.val != val:             # <<<<<<<<<<<<<<
@@ -24523,7 +27513,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":53
  *     cur = node.root
  *     while cur != NULL and cur.val != val:
  *         if val > cur.val:             # <<<<<<<<<<<<<<
@@ -24533,7 +27523,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_t_3 = (__pyx_v_val > __pyx_v_cur->val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":54
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":54
  *     while cur != NULL and cur.val != val:
  *         if val > cur.val:
  *             cur = cur.bigger             # <<<<<<<<<<<<<<
@@ -24544,7 +27534,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
       goto __pyx_L5;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":55
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":55
  *         if val > cur.val:
  *             cur = cur.bigger
  *         elif val < cur.val:             # <<<<<<<<<<<<<<
@@ -24554,7 +27544,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_t_3 = (__pyx_v_val < __pyx_v_cur->val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":56
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":56
  *             cur = cur.bigger
  *         elif val < cur.val:
  *             cur = cur.smaller             # <<<<<<<<<<<<<<
@@ -24567,7 +27557,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":57
  *         elif val < cur.val:
  *             cur = cur.smaller
  *     if cur == NULL:             # <<<<<<<<<<<<<<
@@ -24577,7 +27567,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   __pyx_t_3 = (__pyx_v_cur == NULL);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":58
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":58
  *             cur = cur.smaller
  *     if cur == NULL:
  *         return NULL             # <<<<<<<<<<<<<<
@@ -24590,7 +27580,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":60
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":60
  *         return NULL
  *     else:
  *         return cur.node             # <<<<<<<<<<<<<<
@@ -24608,7 +27598,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":62
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":62
  *         return cur.node
  * 
  * cdef trie_node_data_append(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -24620,9 +27610,9 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   int __pyx_v_new_len;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("trie_node_data_append");
+  __Pyx_RefNannySetupContext("trie_node_data_append", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":64
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":64
  * cdef trie_node_data_append(_Trie_Node* node, int val):
  *     cdef int new_len
  *     new_len = node.arr_len + 1             # <<<<<<<<<<<<<<
@@ -24631,7 +27621,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_new_len = (__pyx_v_node->arr_len + 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":65
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":65
  *     cdef int new_len
  *     new_len = node.arr_len + 1
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -24640,7 +27630,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_node->arr = ((int *)realloc(__pyx_v_node->arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":66
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":66
  *     new_len = node.arr_len + 1
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     node.arr[node.arr_len] = val             # <<<<<<<<<<<<<<
@@ -24649,7 +27639,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   (__pyx_v_node->arr[__pyx_v_node->arr_len]) = __pyx_v_val;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":67
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":67
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     node.arr[node.arr_len] = val
  *     node.arr_len = new_len             # <<<<<<<<<<<<<<
@@ -24664,7 +27654,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":69
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":69
  *     node.arr_len = new_len
  * 
  * cdef trie_node_data_extend(_Trie_Node* node, int* vals, int num_vals):             # <<<<<<<<<<<<<<
@@ -24676,9 +27666,9 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   int __pyx_v_new_len;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("trie_node_data_extend");
+  __Pyx_RefNannySetupContext("trie_node_data_extend", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":71
  * cdef trie_node_data_extend(_Trie_Node* node, int* vals, int num_vals):
  *     cdef int new_len
  *     new_len = node.arr_len + num_vals             # <<<<<<<<<<<<<<
@@ -24687,7 +27677,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_new_len = (__pyx_v_node->arr_len + __pyx_v_num_vals);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":72
  *     cdef int new_len
  *     new_len = node.arr_len + num_vals
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -24696,7 +27686,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_node->arr = ((int *)realloc(__pyx_v_node->arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":73
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":73
  *     new_len = node.arr_len + num_vals
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     memcpy(node.arr + node.arr_len, vals, num_vals*sizeof(int))             # <<<<<<<<<<<<<<
@@ -24705,7 +27695,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   memcpy((__pyx_v_node->arr + __pyx_v_node->arr_len), __pyx_v_vals, (__pyx_v_num_vals * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":74
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":74
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     memcpy(node.arr + node.arr_len, vals, num_vals*sizeof(int))
  *     node.arr_len = new_len             # <<<<<<<<<<<<<<
@@ -24720,7 +27710,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":77
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":77
  * 
  * 
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -24735,9 +27725,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("trie_insert");
+  __Pyx_RefNannySetupContext("trie_insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":79
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":79
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):
  *     cdef _Trie_Edge** cur
  *     cur = &node.root             # <<<<<<<<<<<<<<
@@ -24746,7 +27736,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
  */
   __pyx_v_cur = (&__pyx_v_node->root);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":80
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":80
  *     cdef _Trie_Edge** cur
  *     cur = &node.root
  *     while cur[0] != NULL and cur[0].val != val:             # <<<<<<<<<<<<<<
@@ -24763,7 +27753,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":81
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":81
  *     cur = &node.root
  *     while cur[0] != NULL and cur[0].val != val:
  *         if val > cur[0].val:             # <<<<<<<<<<<<<<
@@ -24773,7 +27763,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_t_3 = (__pyx_v_val > (__pyx_v_cur[0])->val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":82
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":82
  *     while cur[0] != NULL and cur[0].val != val:
  *         if val > cur[0].val:
  *             cur = &cur[0].bigger             # <<<<<<<<<<<<<<
@@ -24784,7 +27774,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
       goto __pyx_L5;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":83
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":83
  *         if val > cur[0].val:
  *             cur = &cur[0].bigger
  *         elif val < cur[0].val:             # <<<<<<<<<<<<<<
@@ -24794,7 +27784,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_t_3 = (__pyx_v_val < (__pyx_v_cur[0])->val);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":84
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":84
  *             cur = &cur[0].bigger
  *         elif val < cur[0].val:
  *             cur = &cur[0].smaller             # <<<<<<<<<<<<<<
@@ -24807,7 +27797,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":85
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":85
  *         elif val < cur[0].val:
  *             cur = &cur[0].smaller
  *     if cur[0] == NULL:             # <<<<<<<<<<<<<<
@@ -24817,7 +27807,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   __pyx_t_3 = ((__pyx_v_cur[0]) == NULL);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":86
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":86
  *             cur = &cur[0].smaller
  *     if cur[0] == NULL:
  *         cur[0] = new_trie_edge(val)             # <<<<<<<<<<<<<<
@@ -24829,7 +27819,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":87
  *     if cur[0] == NULL:
  *         cur[0] = new_trie_edge(val)
  *     return cur[0].node             # <<<<<<<<<<<<<<
@@ -24845,7 +27835,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":89
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":89
  *     return cur[0].node
  * 
  * cdef trie_node_to_map(_Trie_Node* node, result, prefix, int include_zeros):             # <<<<<<<<<<<<<<
@@ -24863,9 +27853,9 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("trie_node_to_map");
+  __Pyx_RefNannySetupContext("trie_node_to_map", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":92
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":92
  *     cdef IntList arr
  * 
  *     if include_zeros or node.arr_len > 0:             # <<<<<<<<<<<<<<
@@ -24880,7 +27870,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   }
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":93
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":93
  * 
  *     if include_zeros or node.arr_len > 0:
  *         arr = IntList()             # <<<<<<<<<<<<<<
@@ -24892,7 +27882,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":94
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":94
  *     if include_zeros or node.arr_len > 0:
  *         arr = IntList()
  *         free(arr.arr)             # <<<<<<<<<<<<<<
@@ -24901,7 +27891,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     free(__pyx_v_arr->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":95
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":95
  *         arr = IntList()
  *         free(arr.arr)
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -24910,7 +27900,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->arr = ((int *)malloc((__pyx_v_node->arr_len * (sizeof(int)))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":96
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":96
  *         free(arr.arr)
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -24919,7 +27909,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     memcpy(__pyx_v_arr->arr, __pyx_v_node->arr, (__pyx_v_node->arr_len * (sizeof(int))));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":97
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":97
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))
  *         arr.len = node.arr_len             # <<<<<<<<<<<<<<
@@ -24928,7 +27918,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->len = __pyx_v_node->arr_len;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":98
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":98
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))
  *         arr.len = node.arr_len
  *         arr.size = node.arr_len             # <<<<<<<<<<<<<<
@@ -24937,7 +27927,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->size = __pyx_v_node->arr_len;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":99
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":99
  *         arr.len = node.arr_len
  *         arr.size = node.arr_len
  *         result[prefix] = arr             # <<<<<<<<<<<<<<
@@ -24949,7 +27939,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":100
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":100
  *         arr.size = node.arr_len
  *         result[prefix] = arr
  *     trie_edge_to_map(node.root, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -24973,7 +27963,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":102
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":102
  *     trie_edge_to_map(node.root, result, prefix, include_zeros)
  * 
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):             # <<<<<<<<<<<<<<
@@ -24990,10 +27980,10 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("trie_edge_to_map");
+  __Pyx_RefNannySetupContext("trie_edge_to_map", 0);
   __Pyx_INCREF(__pyx_v_prefix);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":103
  * 
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):
  *     if edge != NULL:             # <<<<<<<<<<<<<<
@@ -25003,7 +27993,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   __pyx_t_1 = (__pyx_v_edge != NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":104
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":104
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):
  *     if edge != NULL:
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -25014,7 +28004,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":105
  *     if edge != NULL:
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -25025,7 +28015,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":106
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":106
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)
  *         prefix = prefix + (edge.val,)             # <<<<<<<<<<<<<<
@@ -25035,7 +28025,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __pyx_t_2 = PyInt_FromLong(__pyx_v_edge->val); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
@@ -25046,7 +28036,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __pyx_v_prefix = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":107
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":107
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)
  *         prefix = prefix + (edge.val,)
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -25074,42 +28064,32 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":114
- *     cdef int V
- * 
- *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
- *         self.V = alphabet_size
- *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
- */
-
-static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_alphabet_size;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alphabet_size);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alphabet_size)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
       goto __pyx_L5_argtuple_error;
@@ -25126,40 +28106,66 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_7TrieMap___cinit__(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_alphabet_size);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":114
+ *     cdef int V
+ * 
+ *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
+ *         self.V = alphabet_size
+ *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
+ */
+
+static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, int __pyx_v_alphabet_size) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":115
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":115
  * 
  *     def __cinit__(self, int alphabet_size):
  *         self.V = alphabet_size             # <<<<<<<<<<<<<<
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))
  */
-  ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V = __pyx_v_alphabet_size;
+  __pyx_v_self->V = __pyx_v_alphabet_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":116
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":116
  *     def __cinit__(self, int alphabet_size):
  *         self.V = alphabet_size
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))             # <<<<<<<<<<<<<<
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))
  * 
  */
-  ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
+  __pyx_v_self->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":117
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":117
  *         self.V = alphabet_size
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  memset(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root, 0, (((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *))));
+  memset(__pyx_v_self->root, 0, (__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *))));
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":120
+/* Python wrapper */
+static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self) {
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
+  __pyx_pf_3_sa_7TrieMap_2__dealloc__(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":120
  * 
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -25167,8 +28173,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         for i from 0 <= i < self.V:
  */
 
-static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self) {
   int __pyx_v_i;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -25177,51 +28182,51 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__dealloc__");
+  __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":122
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":122
  *     def __dealloc__(self):
  *         cdef int i
  *         for i from 0 <= i < self.V:             # <<<<<<<<<<<<<<
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V;
+  __pyx_t_1 = __pyx_v_self->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":123
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":123
  *         cdef int i
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:             # <<<<<<<<<<<<<<
  *                 free_trie_node(self.root[i])
  *         free(self.root)
  */
-    __pyx_t_2 = ((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]) != NULL);
+    __pyx_t_2 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":124
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":124
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])             # <<<<<<<<<<<<<<
  *         free(self.root)
  * 
  */
-      __pyx_t_3 = __pyx_f_3_sa_free_trie_node((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __pyx_f_3_sa_free_trie_node((__pyx_v_self->root[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":125
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":125
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])
  *         free(self.root)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  free(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root);
+  free(__pyx_v_self->root);
 
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -25231,7 +28236,18 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":128
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("insert (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7TrieMap_4insert(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":128
  * 
  * 
  *     def insert(self, pattern):             # <<<<<<<<<<<<<<
@@ -25239,8 +28255,7 @@ static void __pyx_pf_3_sa_7TrieMap_1__dealloc__(PyObject *__pyx_v_self) {
  *         cdef int i, l
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern) {
   int *__pyx_v_p;
   int __pyx_v_i;
   int __pyx_v_l;
@@ -25253,9 +28268,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("insert");
+  __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":131
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":131
  *         cdef int* p
  *         cdef int i, l
  *         l = len(pattern)             # <<<<<<<<<<<<<<
@@ -25265,7 +28280,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
   __pyx_t_1 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_l = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":132
  *         cdef int i, l
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))             # <<<<<<<<<<<<<<
@@ -25274,7 +28289,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
  */
   __pyx_v_p = ((int *)malloc((__pyx_v_l * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":133
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":133
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:             # <<<<<<<<<<<<<<
@@ -25284,7 +28299,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
   __pyx_t_2 = __pyx_v_l;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":134
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":134
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]             # <<<<<<<<<<<<<<
@@ -25298,16 +28313,16 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
     (__pyx_v_p[__pyx_v_i]) = __pyx_t_4;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":135
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":135
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]
  *         self._insert(p,l)             # <<<<<<<<<<<<<<
  *         free(p)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_TrieMap *)((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->__pyx_vtab)->_insert(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_p, __pyx_v_l);
+  ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_insert(__pyx_v_self, __pyx_v_p, __pyx_v_l);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":136
  *             p[i] = pattern[i]
  *         self._insert(p,l)
  *         free(p)             # <<<<<<<<<<<<<<
@@ -25328,7 +28343,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_2insert(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":139
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":139
  * 
  * 
  *     cdef _Trie_Node* _insert(self, int* pattern, int pattern_len):             # <<<<<<<<<<<<<<
@@ -25343,9 +28358,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("_insert");
+  __Pyx_RefNannySetupContext("_insert", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":142
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":142
  *         cdef int i
  *         cdef _Trie_Node* node
  *         if self.root[pattern[0]] == NULL:             # <<<<<<<<<<<<<<
@@ -25355,7 +28370,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __pyx_t_1 = ((__pyx_v_self->root[(__pyx_v_pattern[0])]) == NULL);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":143
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":143
  *         cdef _Trie_Node* node
  *         if self.root[pattern[0]] == NULL:
  *             self.root[pattern[0]] = new_trie_node()             # <<<<<<<<<<<<<<
@@ -25367,7 +28382,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":144
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":144
  *         if self.root[pattern[0]] == NULL:
  *             self.root[pattern[0]] = new_trie_node()
  *         node = self.root[pattern[0]]             # <<<<<<<<<<<<<<
@@ -25376,7 +28391,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
  */
   __pyx_v_node = (__pyx_v_self->root[(__pyx_v_pattern[0])]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":145
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":145
  *             self.root[pattern[0]] = new_trie_node()
  *         node = self.root[pattern[0]]
  *         for i from 1 <= i < pattern_len:             # <<<<<<<<<<<<<<
@@ -25386,7 +28401,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __pyx_t_2 = __pyx_v_pattern_len;
   for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":146
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":146
  *         node = self.root[pattern[0]]
  *         for i from 1 <= i < pattern_len:
  *             node = trie_insert(node, pattern[i])             # <<<<<<<<<<<<<<
@@ -25396,7 +28411,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_pattern[__pyx_v_i]));
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":147
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":147
  *         for i from 1 <= i < pattern_len:
  *             node = trie_insert(node, pattern[i])
  *         return node             # <<<<<<<<<<<<<<
@@ -25412,7 +28427,18 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":149
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("contains (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7TrieMap_6contains(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":149
  *         return node
  * 
  *     def contains(self, pattern):             # <<<<<<<<<<<<<<
@@ -25420,8 +28446,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
  *         cdef int i, l
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_pattern) {
   int *__pyx_v_p;
   int __pyx_v_i;
   int __pyx_v_l;
@@ -25436,9 +28461,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("contains");
+  __Pyx_RefNannySetupContext("contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":153
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":153
  *         cdef int i, l
  *         cdef _Trie_Node* node
  *         l = len(pattern)             # <<<<<<<<<<<<<<
@@ -25448,7 +28473,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   __pyx_t_1 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_l = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":154
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":154
  *         cdef _Trie_Node* node
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))             # <<<<<<<<<<<<<<
@@ -25457,7 +28482,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
  */
   __pyx_v_p = ((int *)malloc((__pyx_v_l * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":155
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:             # <<<<<<<<<<<<<<
@@ -25467,7 +28492,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   __pyx_t_2 = __pyx_v_l;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":156
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":156
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]             # <<<<<<<<<<<<<<
@@ -25481,16 +28506,16 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
     (__pyx_v_p[__pyx_v_i]) = __pyx_t_4;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":157
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":157
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]
  *         node = self._contains(p,l)             # <<<<<<<<<<<<<<
  *         free(p)
  *         if node == NULL:
  */
-  __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->__pyx_vtab)->_contains(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), __pyx_v_p, __pyx_v_l);
+  __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_contains(__pyx_v_self, __pyx_v_p, __pyx_v_l);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":158
  *             p[i] = pattern[i]
  *         node = self._contains(p,l)
  *         free(p)             # <<<<<<<<<<<<<<
@@ -25499,7 +28524,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
  */
   free(__pyx_v_p);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":159
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":159
  *         node = self._contains(p,l)
  *         free(p)
  *         if node == NULL:             # <<<<<<<<<<<<<<
@@ -25509,7 +28534,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   __pyx_t_5 = (__pyx_v_node == NULL);
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":160
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":160
  *         free(p)
  *         if node == NULL:
  *             return False             # <<<<<<<<<<<<<<
@@ -25522,11 +28547,11 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
     __pyx_r = __pyx_t_3;
     __pyx_t_3 = 0;
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":162
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":162
  *             return False
  *         else:
  *             return True             # <<<<<<<<<<<<<<
@@ -25540,7 +28565,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
     __pyx_t_3 = 0;
     goto __pyx_L0;
   }
-  __pyx_L7:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -25554,7 +28579,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_3contains(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":164
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":164
  *             return True
  * 
  *     cdef _Trie_Node* _contains(self, int* pattern, int pattern_len):             # <<<<<<<<<<<<<<
@@ -25570,9 +28595,9 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("_contains");
+  __Pyx_RefNannySetupContext("_contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":167
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":167
  *         cdef int i
  *         cdef _Trie_Node* node
  *         node = self.root[pattern[0]]             # <<<<<<<<<<<<<<
@@ -25581,7 +28606,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
   __pyx_v_node = (__pyx_v_self->root[(__pyx_v_pattern[0])]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":168
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":168
  *         cdef _Trie_Node* node
  *         node = self.root[pattern[0]]
  *         i = 1             # <<<<<<<<<<<<<<
@@ -25590,7 +28615,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
   __pyx_v_i = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":169
  *         node = self.root[pattern[0]]
  *         i = 1
  *         while node != NULL and i < pattern_len:             # <<<<<<<<<<<<<<
@@ -25607,7 +28632,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":170
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":170
  *         i = 1
  *         while node != NULL and i < pattern_len:
  *             node = trie_find(node, pattern[i])             # <<<<<<<<<<<<<<
@@ -25616,7 +28641,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
     __pyx_v_node = __pyx_f_3_sa_trie_find(__pyx_v_node, (__pyx_v_pattern[__pyx_v_i]));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":171
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":171
  *         while node != NULL and i < pattern_len:
  *             node = trie_find(node, pattern[i])
  *             i = i+1             # <<<<<<<<<<<<<<
@@ -25626,7 +28651,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
     __pyx_v_i = (__pyx_v_i + 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":172
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":172
  *             node = trie_find(node, pattern[i])
  *             i = i+1
  *         return node             # <<<<<<<<<<<<<<
@@ -25642,7 +28667,18 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":174
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
+static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("toMap (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_7TrieMap_8toMap(((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self), ((PyObject *)__pyx_v_flag));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":174
  *         return node
  * 
  *     def toMap(self, flag):             # <<<<<<<<<<<<<<
@@ -25650,8 +28686,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag); /*proto*/
-static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject *__pyx_v_flag) {
+static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__pyx_v_self, PyObject *__pyx_v_flag) {
   int __pyx_v_i;
   int __pyx_v_include_zeros;
   PyObject *__pyx_v_result = NULL;
@@ -25664,9 +28699,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("toMap");
+  __Pyx_RefNannySetupContext("toMap", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":177
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":177
  *         cdef int i, include_zeros
  * 
  *         if flag:             # <<<<<<<<<<<<<<
@@ -25676,7 +28711,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
   __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_flag); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":178
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":178
  * 
  *         if flag:
  *             include_zeros=1             # <<<<<<<<<<<<<<
@@ -25684,11 +28719,11 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
  *             include_zeros=0
  */
     __pyx_v_include_zeros = 1;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":180
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":180
  *             include_zeros=1
  *         else:
  *             include_zeros=0             # <<<<<<<<<<<<<<
@@ -25697,9 +28732,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
  */
     __pyx_v_include_zeros = 0;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":181
  *         else:
  *             include_zeros=0
  *         result = {}             # <<<<<<<<<<<<<<
@@ -25711,27 +28746,27 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
   __pyx_v_result = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":182
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":182
  *             include_zeros=0
  *         result = {}
  *         for i from 0 <= i < self.V:             # <<<<<<<<<<<<<<
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  */
-  __pyx_t_3 = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->V;
+  __pyx_t_3 = __pyx_v_self->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":183
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":183
  *         result = {}
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:             # <<<<<<<<<<<<<<
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  *         return result
  */
-    __pyx_t_1 = ((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]) != NULL);
+    __pyx_t_1 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":184
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":184
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)             # <<<<<<<<<<<<<<
@@ -25741,20 +28776,20 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
       __pyx_t_2 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_2 = 0;
-      __pyx_t_2 = __pyx_f_3_sa_trie_node_to_map((((struct __pyx_obj_3_sa_TrieMap *)__pyx_v_self)->root[__pyx_v_i]), ((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_4), __pyx_v_include_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __pyx_f_3_sa_trie_node_to_map((__pyx_v_self->root[__pyx_v_i]), ((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_4), __pyx_v_include_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      goto __pyx_L8;
+      goto __pyx_L6;
     }
-    __pyx_L8:;
+    __pyx_L6:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":185
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  *         return result             # <<<<<<<<<<<<<<
@@ -25780,16 +28815,9 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4toMap(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":200
- *     cdef write_map(self, m, FILE* f)
- * 
- *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
- *             precompute_rank=1000, precompute_secondary_rank=20,
- *             max_length=5, max_nonterminals=2,
- */
-
-static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fsarray = 0;
   PyObject *__pyx_v_from_stats = 0;
   PyObject *__pyx_v_from_binary = 0;
@@ -25801,18 +28829,18 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   PyObject *__pyx_v_train_min_gap_size = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
     PyObject* values[9] = {0,0,0,0,0,0,0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":200
+ *     cdef write_map(self, m, FILE* f)
+ * 
+ *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
+ *             precompute_rank=1000, precompute_secondary_rank=20,
+ *             max_length=5, max_nonterminals=2,
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
@@ -25824,7 +28852,8 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
     values[8] = ((PyObject *)__pyx_int_2);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
         case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
         case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
@@ -25838,7 +28867,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
@@ -25886,7 +28915,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -25921,8 +28950,25 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14Precomputation___cinit__(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_from_stats, __pyx_v_from_binary, __pyx_v_precompute_rank, __pyx_v_precompute_secondary_rank, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_fsarray, PyObject *__pyx_v_from_stats, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_precompute_rank, PyObject *__pyx_v_precompute_secondary_rank, PyObject *__pyx_v_max_length, PyObject *__pyx_v_max_nonterminals, PyObject *__pyx_v_train_max_initial_size, PyObject *__pyx_v_train_min_gap_size) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":204
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":204
  *             max_length=5, max_nonterminals=2,
  *             train_max_initial_size=10, train_min_gap_size=2):
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
@@ -25930,9 +28976,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.max_length = max_length
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank = __pyx_t_1;
+  __pyx_v_self->precompute_rank = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":205
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":205
  *             train_max_initial_size=10, train_min_gap_size=2):
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
@@ -25940,9 +28986,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.max_nonterminals = max_nonterminals
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_secondary_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank = __pyx_t_1;
+  __pyx_v_self->precompute_secondary_rank = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":206
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":206
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
@@ -25950,9 +28996,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.train_max_initial_size = train_max_initial_size
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_length); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length = __pyx_t_1;
+  __pyx_v_self->max_length = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":207
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":207
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
@@ -25960,9 +29006,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         self.train_min_gap_size = train_min_gap_size
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_nonterminals); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals = __pyx_t_1;
+  __pyx_v_self->max_nonterminals = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":208
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":208
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
@@ -25970,9 +29016,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         if from_binary:
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_max_initial_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size = __pyx_t_1;
+  __pyx_v_self->train_max_initial_size = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":209
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":209
  *         self.max_nonterminals = max_nonterminals
  *         self.train_max_initial_size = train_max_initial_size
  *         self.train_min_gap_size = train_min_gap_size             # <<<<<<<<<<<<<<
@@ -25980,9 +29026,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *             self.read_binary(from_binary)
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_min_gap_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size = __pyx_t_1;
+  __pyx_v_self->train_min_gap_size = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":210
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":210
  *         self.train_max_initial_size = train_max_initial_size
  *         self.train_min_gap_size = train_min_gap_size
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -25992,17 +29038,17 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":211
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":211
  *         self.train_min_gap_size = train_min_gap_size
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_stats:
  *             self.precompute(from_stats, fsarray)
  */
-    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -26011,10 +29057,10 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":212
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":212
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_stats:             # <<<<<<<<<<<<<<
@@ -26024,17 +29070,17 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_stats); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":213
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":213
  *             self.read_binary(from_binary)
  *         elif from_stats:
  *             self.precompute(from_stats, fsarray)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__precompute); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_from_stats);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_from_stats);
     __Pyx_GIVEREF(__pyx_v_from_stats);
@@ -26046,9 +29092,9 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -26063,7 +29109,28 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":216
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14Precomputation_2read_binary(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":216
  * 
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -26071,9 +29138,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(PyObject *__pyx_v_self, PyOb
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -26081,18 +29146,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.read_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":218
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":218
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -26101,91 +29157,91 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":219
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":219
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":220
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":220
  *         f = fopen(filename, "r")
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":221
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":221
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":222
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":222
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":223
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":223
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":224
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":224
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)
  */
-  fread((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
+  fread((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":225
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":225
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)             # <<<<<<<<<<<<<<
  *         self.precomputed_collocations = self.read_map(f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->read_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->read_map(__pyx_v_self, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
+  __Pyx_DECREF(__pyx_v_self->precomputed_index);
+  __pyx_v_self->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":226
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":226
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->read_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->read_map(__pyx_v_self, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
+  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
+  __pyx_v_self->precomputed_collocations = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":227
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":227
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -26206,7 +29262,28 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":230
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14Precomputation_4write_binary(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":230
  * 
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -26214,9 +29291,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_1read_binary(PyObject *__pyx_v_s
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -26225,18 +29300,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.write_binary", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":232
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":232
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -26245,89 +29311,89 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":233
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":233
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":234
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":234
  *         f = fopen(filename, "w")
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":235
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":235
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":236
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":236
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":237
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":237
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":238
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":238
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)
  */
-  fwrite((&((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
+  fwrite((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":239
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":239
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)             # <<<<<<<<<<<<<<
  *         self.write_map(self.precomputed_collocations, f)
  *         fclose(f)
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index;
+  __pyx_t_1 = __pyx_v_self->precomputed_index;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->write_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->write_map(__pyx_v_self, __pyx_t_1, __pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":240
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":240
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
+  __pyx_t_2 = __pyx_v_self->precomputed_collocations;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->__pyx_vtab)->write_map(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Precomputation *)__pyx_v_self->__pyx_vtab)->write_map(__pyx_v_self, __pyx_t_2, __pyx_v_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":241
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":241
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -26349,7 +29415,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":244
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":244
  * 
  * 
  *     cdef write_map(self, m, FILE* f):             # <<<<<<<<<<<<<<
@@ -26357,7 +29423,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2write_binary(PyObject *__pyx_v_
  *         cdef IntList arr
  */
 
-static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_m, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_m, FILE *__pyx_v_f) {
   int __pyx_v_i;
   int __pyx_v_N;
   struct __pyx_obj_3_sa_IntList *__pyx_v_arr = 0;
@@ -26368,21 +29434,19 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *(*__pyx_t_4)(PyObject *);
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  Py_ssize_t __pyx_t_9;
-  PyObject *(*__pyx_t_10)(PyObject *);
-  int __pyx_t_11;
+  int __pyx_t_7;
+  Py_ssize_t __pyx_t_8;
+  PyObject *(*__pyx_t_9)(PyObject *);
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_map");
+  __Pyx_RefNannySetupContext("write_map", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":248
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":248
  *         cdef IntList arr
  * 
  *         N = len(m)             # <<<<<<<<<<<<<<
@@ -26392,7 +29456,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
   __pyx_t_1 = PyObject_Length(__pyx_v_m); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":249
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":249
  * 
  *         N = len(m)
  *         fwrite(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26401,87 +29465,29 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  */
   fwrite((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":250
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":250
  *         N = len(m)
  *         fwrite(&(N), sizeof(int), 1, f)
  *         for pattern, val in m.iteritems():             # <<<<<<<<<<<<<<
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)
  */
-  __pyx_t_2 = PyObject_GetAttr(__pyx_v_m, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-    __pyx_t_2 = __pyx_t_3; __Pyx_INCREF(__pyx_t_2); __pyx_t_1 = 0;
-    __pyx_t_4 = NULL;
-  } else {
-    __pyx_t_1 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
+  __pyx_t_1 = 0;
+  if (unlikely(__pyx_v_m == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
-      if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
-      if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
-    } else {
-      __pyx_t_3 = __pyx_t_4(__pyx_t_2);
-      if (unlikely(!__pyx_t_3)) {
-        if (PyErr_Occurred()) {
-          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        break;
-      }
-      __Pyx_GOTREF(__pyx_t_3);
-    }
-    if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-      PyObject* sequence = __pyx_t_3;
-      if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
-        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
-      } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
-        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
-      }
-      __Pyx_INCREF(__pyx_t_5);
-      __Pyx_INCREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    } else {
-      Py_ssize_t index = -1;
-      __pyx_t_7 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
-      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_5);
-      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_6);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L6_unpacking_done;
-      __pyx_L5_unpacking_failed:;
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L6_unpacking_done:;
-    }
+  __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_m, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_2);
+  __pyx_t_2 = __pyx_t_5;
+  __pyx_t_5 = 0;
+  while (1) {
+    __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_2, __pyx_t_3, &__pyx_t_1, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4);
+    if (unlikely(__pyx_t_7 == 0)) break;
+    if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_XDECREF(__pyx_v_pattern);
     __pyx_v_pattern = __pyx_t_5;
     __pyx_t_5 = 0;
@@ -26489,17 +29495,17 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
     __pyx_v_val = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":251
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":251
  *         fwrite(&(N), sizeof(int), 1, f)
  *         for pattern, val in m.iteritems():
  *             N = len(pattern)             # <<<<<<<<<<<<<<
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:
  */
-    __pyx_t_9 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_N = __pyx_t_9;
+    __pyx_t_8 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_N = __pyx_t_8;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":252
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":252
  *         for pattern, val in m.iteritems():
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26508,7 +29514,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  */
     fwrite((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":253
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":253
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -26516,46 +29522,54 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  *                 fwrite(&(i), sizeof(int), 1, f)
  */
     if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-      __pyx_t_3 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_3); __pyx_t_9 = 0;
-      __pyx_t_10 = NULL;
+      __pyx_t_6 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_6); __pyx_t_8 = 0;
+      __pyx_t_9 = NULL;
     } else {
-      __pyx_t_9 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_10 = Py_TYPE(__pyx_t_3)->tp_iternext;
+      __pyx_t_8 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_9 = Py_TYPE(__pyx_t_6)->tp_iternext;
     }
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_3)) {
-        if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_3)) break;
-        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++;
-      } else if (PyTuple_CheckExact(__pyx_t_3)) {
-        if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++;
+      if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_6)) {
+        if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_6)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_6)) {
+        if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
-        __pyx_t_6 = __pyx_t_10(__pyx_t_3);
-        if (unlikely(!__pyx_t_6)) {
+        __pyx_t_5 = __pyx_t_9(__pyx_t_6);
+        if (unlikely(!__pyx_t_5)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
             else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
-        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_GOTREF(__pyx_t_5);
       }
       __Pyx_XDECREF(__pyx_v_word_id);
-      __pyx_v_word_id = __pyx_t_6;
-      __pyx_t_6 = 0;
+      __pyx_v_word_id = __pyx_t_5;
+      __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":254
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":254
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:
  *                 i = word_id             # <<<<<<<<<<<<<<
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val
  */
-      __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_i = __pyx_t_11;
+      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_i = __pyx_t_7;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":255
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":255
  *             for word_id in pattern:
  *                 i = word_id
  *                 fwrite(&(i), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26564,9 +29578,9 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  */
       fwrite((&__pyx_v_i), (sizeof(int)), 1, __pyx_v_f);
     }
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":256
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":256
  *                 i = word_id
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val             # <<<<<<<<<<<<<<
@@ -26578,7 +29592,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
     __Pyx_XDECREF(((PyObject *)__pyx_v_arr));
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_val);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":257
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":257
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val
  *             arr.write_handle(f)             # <<<<<<<<<<<<<<
@@ -26593,10 +29607,8 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_5);
   __Pyx_XDECREF(__pyx_t_6);
-  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_AddTraceback("_sa.Precomputation.write_map", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
@@ -26609,7 +29621,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":260
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":260
  * 
  * 
  *     cdef read_map(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -26617,10 +29629,10 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(struct __pyx_obj_3_sa_P
  *         cdef IntList arr
  */
 
-static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, FILE *__pyx_v_f) {
+static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, FILE *__pyx_v_f) {
   int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_k;
+  CYTHON_UNUSED int __pyx_v_j;
+  CYTHON_UNUSED int __pyx_v_k;
   int __pyx_v_word_id;
   int __pyx_v_N;
   struct __pyx_obj_3_sa_IntList *__pyx_v_arr = 0;
@@ -26635,9 +29647,9 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_map");
+  __Pyx_RefNannySetupContext("read_map", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":264
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":264
  *         cdef IntList arr
  * 
  *         m = {}             # <<<<<<<<<<<<<<
@@ -26649,7 +29661,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
   __pyx_v_m = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":265
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":265
  * 
  *         m = {}
  *         fread(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26658,7 +29670,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  */
   fread((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":266
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":266
  *         m = {}
  *         fread(&(N), sizeof(int), 1, f)
  *         for j from 0 <= j < N:             # <<<<<<<<<<<<<<
@@ -26668,7 +29680,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
   __pyx_t_2 = __pyx_v_N;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":267
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":267
  *         fread(&(N), sizeof(int), 1, f)
  *         for j from 0 <= j < N:
  *             fread(&(i), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26677,7 +29689,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  */
     fread((&__pyx_v_i), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":268
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":268
  *         for j from 0 <= j < N:
  *             fread(&(i), sizeof(int), 1, f)
  *             key = ()             # <<<<<<<<<<<<<<
@@ -26688,7 +29700,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
     __Pyx_XDECREF(((PyObject *)__pyx_v_key));
     __pyx_v_key = __pyx_empty_tuple;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":269
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":269
  *             fread(&(i), sizeof(int), 1, f)
  *             key = ()
  *             for k from 0 <= k < i:             # <<<<<<<<<<<<<<
@@ -26698,7 +29710,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
     __pyx_t_3 = __pyx_v_i;
     for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":270
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":270
  *             key = ()
  *             for k from 0 <= k < i:
  *                 fread(&(word_id), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -26707,7 +29719,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  */
       fread((&__pyx_v_word_id), (sizeof(int)), 1, __pyx_v_f);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":271
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":271
  *             for k from 0 <= k < i:
  *                 fread(&(word_id), sizeof(int), 1, f)
  *                 key = key + (word_id,)             # <<<<<<<<<<<<<<
@@ -26717,7 +29729,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
       __pyx_t_1 = PyInt_FromLong(__pyx_v_word_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
@@ -26729,7 +29741,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
       __pyx_t_1 = 0;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":272
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":272
  *                 fread(&(word_id), sizeof(int), 1, f)
  *                 key = key + (word_id,)
  *             arr = IntList()             # <<<<<<<<<<<<<<
@@ -26742,7 +29754,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":273
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":273
  *                 key = key + (word_id,)
  *             arr = IntList()
  *             arr.read_handle(f)             # <<<<<<<<<<<<<<
@@ -26751,7 +29763,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_arr->__pyx_vtab)->read_handle(__pyx_v_arr, __pyx_v_f);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":274
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":274
  *             arr = IntList()
  *             arr.read_handle(f)
  *             m[key] = arr             # <<<<<<<<<<<<<<
@@ -26761,7 +29773,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
     if (PyDict_SetItem(((PyObject *)__pyx_v_m), ((PyObject *)__pyx_v_key), ((PyObject *)__pyx_v_arr)) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":275
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":275
  *             arr.read_handle(f)
  *             m[key] = arr
  *         return m             # <<<<<<<<<<<<<<
@@ -26789,7 +29801,68 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":278
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_stats = 0;
+  struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("precompute (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__sarray,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stats)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sarray)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, 1); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "precompute") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_stats = values[0];
+    __pyx_v_sarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.Precomputation.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sarray), __pyx_ptype_3_sa_SuffixArray, 1, "sarray", 0))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_14Precomputation_6precompute(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self), __pyx_v_stats, __pyx_v_sarray);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":278
  * 
  * 
  *     def precompute(self, stats, SuffixArray sarray):             # <<<<<<<<<<<<<<
@@ -26797,10 +29870,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(struct __pyx_obj_3_sa_Pr
  *         cdef DataArray darray = sarray.darray
  */
 
-static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_stats = 0;
-  struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray = 0;
+static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray) {
   int __pyx_v_i;
   int __pyx_v_l;
   int __pyx_v_N;
@@ -26833,7 +29903,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   PyObject *__pyx_v_pattern_rank = NULL;
   float __pyx_v_start_time;
   PyObject *__pyx_v_rank = NULL;
-  PyObject *__pyx_v__ = NULL;
+  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
   PyObject *__pyx_v_phrase = NULL;
   int __pyx_v_sa_word_id;
   PyObject *__pyx_v_x = NULL;
@@ -26848,7 +29918,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   PyObject *__pyx_v_arity = NULL;
   PyObject *__pyx_v_cumul_cost = NULL;
   PyObject *__pyx_v_cumul_count = NULL;
-  Py_ssize_t __pyx_v_num_found_patterns;
+  PyObject *__pyx_v_num_found_patterns = NULL;
   float __pyx_v_stop_time;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -26875,54 +29945,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__sarray,0};
-  __Pyx_RefNannySetupContext("precompute");
-  {
-    PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__stats);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sarray);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, 1); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "precompute") < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-    }
-    __pyx_v_stats = values[0];
-    __pyx_v_sarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("precompute", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.Precomputation.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sarray), __pyx_ptype_3_sa_SuffixArray, 1, "sarray", 0))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("precompute", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":280
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":280
  *     def precompute(self, stats, SuffixArray sarray):
  *         cdef int i, l, N, max_pattern_len, i1, l1, i2, l2, i3, l3, ptr1, ptr2, ptr3, is_super, sent_count, max_rank
  *         cdef DataArray darray = sarray.darray             # <<<<<<<<<<<<<<
@@ -26932,7 +29957,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_INCREF(((PyObject *)__pyx_v_sarray->darray));
   __pyx_v_darray = __pyx_v_sarray->darray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":285
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":285
  *         cdef _Trie_Node* node
  * 
  *         data = darray.data             # <<<<<<<<<<<<<<
@@ -26942,7 +29967,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_INCREF(((PyObject *)__pyx_v_darray->data));
   __pyx_v_data = __pyx_v_darray->data;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":287
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":287
  *         data = darray.data
  * 
  *         frequent_patterns = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -26956,7 +29981,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -26966,7 +29991,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_frequent_patterns = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":288
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":288
  * 
  *         frequent_patterns = TrieMap(len(darray.id2word))
  *         super_frequent_patterns = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -26980,7 +30005,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -26990,7 +30015,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_super_frequent_patterns = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":289
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":289
  *         frequent_patterns = TrieMap(len(darray.id2word))
  *         super_frequent_patterns = TrieMap(len(darray.id2word))
  *         collocations = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -27004,7 +30029,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -27014,7 +30039,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_collocations = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":291
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":291
  *         collocations = TrieMap(len(darray.id2word))
  * 
  *         I_set = set()             # <<<<<<<<<<<<<<
@@ -27026,7 +30051,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_I_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":292
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":292
  * 
  *         I_set = set()
  *         J_set = set()             # <<<<<<<<<<<<<<
@@ -27038,7 +30063,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_J_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":293
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":293
  *         I_set = set()
  *         J_set = set()
  *         J2_set = set()             # <<<<<<<<<<<<<<
@@ -27050,7 +30075,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_J2_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":294
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":294
  *         J_set = set()
  *         J2_set = set()
  *         IJ_set = set()             # <<<<<<<<<<<<<<
@@ -27062,7 +30087,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_IJ_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":295
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":295
  *         J2_set = set()
  *         IJ_set = set()
  *         pattern_rank = {}             # <<<<<<<<<<<<<<
@@ -27074,7 +30099,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_v_pattern_rank = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":297
  *         pattern_rank = {}
  * 
  *         logger.info("Precomputing frequent intersections")             # <<<<<<<<<<<<<<
@@ -27091,7 +30116,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":298
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":298
  * 
  *         logger.info("Precomputing frequent intersections")
  *         cdef float start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -27100,7 +30125,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
   __pyx_v_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":300
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":300
  *         cdef float start_time = monitor_cpu()
  * 
  *         max_pattern_len = 0             # <<<<<<<<<<<<<<
@@ -27109,7 +30134,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
   __pyx_v_max_pattern_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":301
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":301
  * 
  *         max_pattern_len = 0
  *         for rank, (_, _, phrase) in enumerate(stats):             # <<<<<<<<<<<<<<
@@ -27127,12 +30152,20 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_3)) {
+    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_3)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_5)) {
@@ -27146,21 +30179,22 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
       PyObject* sequence = __pyx_t_5;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 3)) {
+        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-          if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_8 = PyTuple_GET_ITEM(sequence, 2); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-          if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_8 = PyList_GET_ITEM(sequence, 2); 
@@ -27168,28 +30202,35 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_INCREF(__pyx_t_6);
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_8);
+      #else
+      __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
       __pyx_t_9 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_10 = Py_TYPE(__pyx_t_9)->tp_iternext;
-      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
+      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
-      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L8_unpacking_failed;
+      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_7)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L8_unpacking_failed;
+      index = 2; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_8);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_9), 3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = NULL;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      goto __pyx_L9_unpacking_done;
-      __pyx_L8_unpacking_failed:;
+      goto __pyx_L6_unpacking_done;
+      __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      __pyx_t_10 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L9_unpacking_done:;
+      __pyx_L6_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v__);
     __pyx_v__ = __pyx_t_6;
@@ -27209,35 +30250,34 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":302
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":302
  *         max_pattern_len = 0
  *         for rank, (_, _, phrase) in enumerate(stats):
  *             if rank >= self.precompute_rank:             # <<<<<<<<<<<<<<
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  */
-    __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_rank); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(__pyx_v_self->precompute_rank); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_8 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_5, Py_GE); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_8 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_5, Py_GE); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
     if (__pyx_t_11) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":303
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":303
  *         for rank, (_, _, phrase) in enumerate(stats):
  *             if rank >= self.precompute_rank:
  *                 break             # <<<<<<<<<<<<<<
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)
  */
-      goto __pyx_L7_break;
-      goto __pyx_L10;
+      goto __pyx_L4_break;
+      goto __pyx_L7;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":304
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":304
  *             if rank >= self.precompute_rank:
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))             # <<<<<<<<<<<<<<
@@ -27253,7 +30293,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     }
     __pyx_v_max_pattern_len = __pyx_t_14;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":305
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":305
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)             # <<<<<<<<<<<<<<
@@ -27263,7 +30303,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_frequent_patterns), __pyx_n_s__insert); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_phrase);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_phrase);
     __Pyx_GIVEREF(__pyx_v_phrase);
@@ -27273,19 +30313,16 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":306
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":306
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)
  *             I_set.add(phrase)             # <<<<<<<<<<<<<<
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:
  */
-    if (unlikely(((PyObject *)__pyx_v_I_set) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_15 = PySet_Add(__pyx_v_I_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":307
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":307
  *             frequent_patterns.insert(phrase)
  *             I_set.add(phrase)
  *             pattern_rank[phrase] = rank             # <<<<<<<<<<<<<<
@@ -27294,23 +30331,22 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
     if (PyDict_SetItem(((PyObject *)__pyx_v_pattern_rank), __pyx_v_phrase, __pyx_v_rank) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":308
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":308
  *             I_set.add(phrase)
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:             # <<<<<<<<<<<<<<
  *                 super_frequent_patterns.insert(phrase)
  *                 J_set.add(phrase)
  */
-    __pyx_t_7 = PyInt_FromLong(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precompute_secondary_rank); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyInt_FromLong(__pyx_v_self->precompute_secondary_rank); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_7, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_5 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_7, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_11) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":309
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":309
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:
  *                 super_frequent_patterns.insert(phrase)             # <<<<<<<<<<<<<<
@@ -27320,7 +30356,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_super_frequent_patterns), __pyx_n_s__insert); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_7));
+      __Pyx_GOTREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_v_phrase);
@@ -27330,26 +30366,23 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":310
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":310
  *             if rank < self.precompute_secondary_rank:
  *                 super_frequent_patterns.insert(phrase)
  *                 J_set.add(phrase)             # <<<<<<<<<<<<<<
  * 
  *         queue = IntList(increment=1000)
  */
-      if (unlikely(((PyObject *)__pyx_v_J_set) == Py_None)) {
-        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-      }
       __pyx_t_15 = PySet_Add(__pyx_v_J_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L11;
+      goto __pyx_L8;
     }
-    __pyx_L11:;
+    __pyx_L8:;
   }
-  __pyx_L7_break:;
+  __pyx_L4_break:;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":312
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":312
  *                 J_set.add(phrase)
  * 
  *         queue = IntList(increment=1000)             # <<<<<<<<<<<<<<
@@ -27359,13 +30392,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__increment), __pyx_int_1000) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_queue = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":314
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":314
  *         queue = IntList(increment=1000)
  * 
  *         logger.info("    Computing inverted indexes...")             # <<<<<<<<<<<<<<
@@ -27382,7 +30415,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":315
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":315
  * 
  *         logger.info("    Computing inverted indexes...")
  *         N = len(data)             # <<<<<<<<<<<<<<
@@ -27392,7 +30425,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_data)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":316
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":316
  *         logger.info("    Computing inverted indexes...")
  *         N = len(data)
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -27402,7 +30435,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_13 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":317
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":317
  *         N = len(data)
  *         for i from 0 <= i < N:
  *             sa_word_id = data.arr[i]             # <<<<<<<<<<<<<<
@@ -27411,7 +30444,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
     __pyx_v_sa_word_id = (__pyx_v_data->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":318
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":318
  *         for i from 0 <= i < N:
  *             sa_word_id = data.arr[i]
  *             if sa_word_id == 1:             # <<<<<<<<<<<<<<
@@ -27421,7 +30454,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_11 = (__pyx_v_sa_word_id == 1);
     if (__pyx_t_11) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":319
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":319
  *             sa_word_id = data.arr[i]
  *             if sa_word_id == 1:
  *                 queue._append(-1)             # <<<<<<<<<<<<<<
@@ -27429,11 +30462,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 for l from 1 <= l <= max_pattern_len:
  */
       ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, -1);
-      goto __pyx_L14;
+      goto __pyx_L11;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":321
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":321
  *                 queue._append(-1)
  *             else:
  *                 for l from 1 <= l <= max_pattern_len:             # <<<<<<<<<<<<<<
@@ -27443,7 +30476,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_t_16 = __pyx_v_max_pattern_len;
       for (__pyx_v_l = 1; __pyx_v_l <= __pyx_t_16; __pyx_v_l++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":322
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":322
  *             else:
  *                 for l from 1 <= l <= max_pattern_len:
  *                     node = frequent_patterns._contains(data.arr+i, l)             # <<<<<<<<<<<<<<
@@ -27452,7 +30485,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i), __pyx_v_l);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":323
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":323
  *                 for l from 1 <= l <= max_pattern_len:
  *                     node = frequent_patterns._contains(data.arr+i, l)
  *                     if node == NULL:             # <<<<<<<<<<<<<<
@@ -27462,19 +30495,19 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_t_11 = (__pyx_v_node == NULL);
         if (__pyx_t_11) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":324
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":324
  *                     node = frequent_patterns._contains(data.arr+i, l)
  *                     if node == NULL:
  *                         break             # <<<<<<<<<<<<<<
  *                     queue._append(i)
  *                     queue._append(l)
  */
-          goto __pyx_L16_break;
-          goto __pyx_L17;
+          goto __pyx_L13_break;
+          goto __pyx_L14;
         }
-        __pyx_L17:;
+        __pyx_L14:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":325
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":325
  *                     if node == NULL:
  *                         break
  *                     queue._append(i)             # <<<<<<<<<<<<<<
@@ -27483,7 +30516,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, __pyx_v_i);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":326
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":326
  *                         break
  *                     queue._append(i)
  *                     queue._append(l)             # <<<<<<<<<<<<<<
@@ -27492,7 +30525,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, __pyx_v_l);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":327
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":327
  *                     queue._append(i)
  *                     queue._append(l)
  *                     trie_node_data_append(node, i)             # <<<<<<<<<<<<<<
@@ -27503,12 +30536,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       }
-      __pyx_L16_break:;
+      __pyx_L13_break:;
     }
-    __pyx_L14:;
+    __pyx_L11:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":329
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":329
  *                     trie_node_data_append(node, i)
  * 
  *         logger.info("    Computing collocations...")             # <<<<<<<<<<<<<<
@@ -27525,7 +30558,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":330
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":330
  * 
  *         logger.info("    Computing collocations...")
  *         N = len(queue)             # <<<<<<<<<<<<<<
@@ -27535,7 +30568,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_queue)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":331
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":331
  *         logger.info("    Computing collocations...")
  *         N = len(queue)
  *         ptr1 = 0             # <<<<<<<<<<<<<<
@@ -27544,7 +30577,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
   __pyx_v_ptr1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":332
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":332
  *         N = len(queue)
  *         ptr1 = 0
  *         sent_count = 0             # <<<<<<<<<<<<<<
@@ -27553,7 +30586,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
   __pyx_v_sent_count = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":333
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":333
  *         ptr1 = 0
  *         sent_count = 0
  *         while ptr1 < N:    # main loop             # <<<<<<<<<<<<<<
@@ -27564,7 +30597,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_11 = (__pyx_v_ptr1 < __pyx_v_N);
     if (!__pyx_t_11) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":334
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":334
  *         sent_count = 0
  *         while ptr1 < N:    # main loop
  *             i1 = queue.arr[ptr1]             # <<<<<<<<<<<<<<
@@ -27573,7 +30606,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
     __pyx_v_i1 = (__pyx_v_queue->arr[__pyx_v_ptr1]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":335
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":335
  *         while ptr1 < N:    # main loop
  *             i1 = queue.arr[ptr1]
  *             if i1 > -1:             # <<<<<<<<<<<<<<
@@ -27583,7 +30616,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_t_11 = (__pyx_v_i1 > -1);
     if (__pyx_t_11) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":336
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":336
  *             i1 = queue.arr[ptr1]
  *             if i1 > -1:
  *                 l1 = queue.arr[ptr1+1]             # <<<<<<<<<<<<<<
@@ -27592,7 +30625,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_l1 = (__pyx_v_queue->arr[(__pyx_v_ptr1 + 1)]);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":337
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":337
  *             if i1 > -1:
  *                 l1 = queue.arr[ptr1+1]
  *                 ptr2 = ptr1 + 2             # <<<<<<<<<<<<<<
@@ -27601,7 +30634,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_ptr2 = (__pyx_v_ptr1 + 2);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":338
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":338
  *                 l1 = queue.arr[ptr1+1]
  *                 ptr2 = ptr1 + 2
  *                 while ptr2 < N:             # <<<<<<<<<<<<<<
@@ -27612,7 +30645,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_t_11 = (__pyx_v_ptr2 < __pyx_v_N);
         if (!__pyx_t_11) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":339
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":339
  *                 ptr2 = ptr1 + 2
  *                 while ptr2 < N:
  *                     i2 = queue.arr[ptr2]             # <<<<<<<<<<<<<<
@@ -27621,7 +30654,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_v_i2 = (__pyx_v_queue->arr[__pyx_v_ptr2]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":340
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":340
  *                 while ptr2 < N:
  *                     i2 = queue.arr[ptr2]
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -27630,26 +30663,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_t_11 = (__pyx_v_i2 == -1);
         if (!__pyx_t_11) {
-          __pyx_t_17 = ((__pyx_v_i2 - __pyx_v_i1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+          __pyx_t_17 = ((__pyx_v_i2 - __pyx_v_i1) >= __pyx_v_self->train_max_initial_size);
           __pyx_t_18 = __pyx_t_17;
         } else {
           __pyx_t_18 = __pyx_t_11;
         }
         if (__pyx_t_18) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":341
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":341
  *                     i2 = queue.arr[ptr2]
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
  *                         break             # <<<<<<<<<<<<<<
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  */
-          goto __pyx_L22_break;
-          goto __pyx_L23;
+          goto __pyx_L19_break;
+          goto __pyx_L20;
         }
-        __pyx_L23:;
+        __pyx_L20:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":342
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":342
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
  *                         break
  *                     l2 = queue.arr[ptr2+1]             # <<<<<<<<<<<<<<
@@ -27658,34 +30691,34 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_v_l2 = (__pyx_v_queue->arr[(__pyx_v_ptr2 + 1)]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":343
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":343
  *                         break
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):
  */
-        __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size);
+        __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= __pyx_v_self->train_min_gap_size);
         if (__pyx_t_18) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":344
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":344
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  *                             i2 + l2 - i1 <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)
  */
-          __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+          __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
           if (__pyx_t_11) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":345
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":345
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):             # <<<<<<<<<<<<<<
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)
  */
-            __pyx_t_17 = (((__pyx_v_l1 + __pyx_v_l2) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+            __pyx_t_17 = (((__pyx_v_l1 + __pyx_v_l2) + 1) <= __pyx_v_self->max_length);
             __pyx_t_19 = __pyx_t_17;
           } else {
             __pyx_t_19 = __pyx_t_11;
@@ -27696,7 +30729,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         }
         if (__pyx_t_11) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":346
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":346
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)             # <<<<<<<<<<<<<<
@@ -27705,7 +30738,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
           __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_collocations->__pyx_vtab)->_insert(__pyx_v_collocations, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":347
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":347
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -27714,7 +30747,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
           __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":348
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":348
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)
  *                         for i from i2 <= i < i2+l2:             # <<<<<<<<<<<<<<
@@ -27724,7 +30757,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __pyx_t_13 = (__pyx_v_i2 + __pyx_v_l2);
           for (__pyx_v_i = __pyx_v_i2; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":349
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":349
  *                         node = trie_insert(node, -1)
  *                         for i from i2 <= i < i2+l2:
  *                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -27734,7 +30767,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
             __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":350
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":350
  *                         for i from i2 <= i < i2+l2:
  *                             node = trie_insert(node, data.arr[i])
  *                         trie_node_data_append(node, i1)             # <<<<<<<<<<<<<<
@@ -27745,7 +30778,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":351
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":351
  *                             node = trie_insert(node, data.arr[i])
  *                         trie_node_data_append(node, i1)
  *                         trie_node_data_append(node, i2)             # <<<<<<<<<<<<<<
@@ -27756,7 +30789,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":352
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":352
  *                         trie_node_data_append(node, i1)
  *                         trie_node_data_append(node, i2)
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:             # <<<<<<<<<<<<<<
@@ -27766,7 +30799,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __pyx_t_11 = (((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_super_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_super_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i2), __pyx_v_l2) != NULL);
           if (__pyx_t_11) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":353
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":353
  *                         trie_node_data_append(node, i2)
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:
  *                             if super_frequent_patterns._contains(data.arr+i1, l1) != NULL:             # <<<<<<<<<<<<<<
@@ -27776,7 +30809,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
             __pyx_t_11 = (((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_super_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_super_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1) != NULL);
             if (__pyx_t_11) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":354
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":354
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:
  *                             if super_frequent_patterns._contains(data.arr+i1, l1) != NULL:
  *                                 is_super = 1             # <<<<<<<<<<<<<<
@@ -27784,11 +30817,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                                 is_super = 0
  */
               __pyx_v_is_super = 1;
-              goto __pyx_L28;
+              goto __pyx_L25;
             }
             /*else*/ {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":356
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":356
  *                                 is_super = 1
  *                             else:
  *                                 is_super = 0             # <<<<<<<<<<<<<<
@@ -27797,9 +30830,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_v_is_super = 0;
             }
-            __pyx_L28:;
+            __pyx_L25:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":357
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":357
  *                             else:
  *                                 is_super = 0
  *                             ptr3 = ptr2 + 2             # <<<<<<<<<<<<<<
@@ -27808,7 +30841,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
             __pyx_v_ptr3 = (__pyx_v_ptr2 + 2);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":358
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":358
  *                                 is_super = 0
  *                             ptr3 = ptr2 + 2
  *                             while ptr3 < N:             # <<<<<<<<<<<<<<
@@ -27819,7 +30852,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
               __pyx_t_11 = (__pyx_v_ptr3 < __pyx_v_N);
               if (!__pyx_t_11) break;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":359
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":359
  *                             ptr3 = ptr2 + 2
  *                             while ptr3 < N:
  *                                 i3 = queue.arr[ptr3]             # <<<<<<<<<<<<<<
@@ -27828,7 +30861,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_v_i3 = (__pyx_v_queue->arr[__pyx_v_ptr3]);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":360
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":360
  *                             while ptr3 < N:
  *                                 i3 = queue.arr[ptr3]
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -27837,26 +30870,26 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_t_11 = (__pyx_v_i3 == -1);
               if (!__pyx_t_11) {
-                __pyx_t_18 = ((__pyx_v_i3 - __pyx_v_i1) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+                __pyx_t_18 = ((__pyx_v_i3 - __pyx_v_i1) >= __pyx_v_self->train_max_initial_size);
                 __pyx_t_19 = __pyx_t_18;
               } else {
                 __pyx_t_19 = __pyx_t_11;
               }
               if (__pyx_t_19) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":361
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":361
  *                                 i3 = queue.arr[ptr3]
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
  *                                     break             # <<<<<<<<<<<<<<
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  */
-                goto __pyx_L30_break;
-                goto __pyx_L31;
+                goto __pyx_L27_break;
+                goto __pyx_L28;
               }
-              __pyx_L31:;
+              __pyx_L28:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":362
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":362
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
  *                                     break
  *                                 l3 = queue.arr[ptr3+1]             # <<<<<<<<<<<<<<
@@ -27865,34 +30898,34 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_v_l3 = (__pyx_v_queue->arr[(__pyx_v_ptr3 + 1)]);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":363
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":363
  *                                     break
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):
  */
-              __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_min_gap_size);
+              __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= __pyx_v_self->train_min_gap_size);
               if (__pyx_t_19) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":364
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":364
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  */
-                __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->train_max_initial_size);
+                __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
                 if (__pyx_t_11) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":365
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":365
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):             # <<<<<<<<<<<<<<
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)
  */
-                  __pyx_t_18 = ((((__pyx_v_l1 + __pyx_v_l2) + __pyx_v_l3) + 2) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+                  __pyx_t_18 = ((((__pyx_v_l1 + __pyx_v_l2) + __pyx_v_l3) + 2) <= __pyx_v_self->max_length);
                   __pyx_t_17 = __pyx_t_18;
                 } else {
                   __pyx_t_17 = __pyx_t_11;
@@ -27903,7 +30936,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
               }
               if (__pyx_t_11) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":366
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":366
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:             # <<<<<<<<<<<<<<
@@ -27918,7 +30951,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                 }
                 if (__pyx_t_19) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":367
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":367
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)             # <<<<<<<<<<<<<<
@@ -27927,7 +30960,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
                   __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_collocations->__pyx_vtab)->_insert(__pyx_v_collocations, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":368
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":368
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)
  *                                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -27936,7 +30969,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
                   __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":369
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":369
  *                                         node = collocations._insert(data.arr+i1, l1)
  *                                         node = trie_insert(node, -1)
  *                                         for i from i2 <= i < i2+l2:             # <<<<<<<<<<<<<<
@@ -27946,7 +30979,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __pyx_t_13 = (__pyx_v_i2 + __pyx_v_l2);
                   for (__pyx_v_i = __pyx_v_i2; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":370
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":370
  *                                         node = trie_insert(node, -1)
  *                                         for i from i2 <= i < i2+l2:
  *                                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -27956,7 +30989,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
                   }
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":371
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":371
  *                                         for i from i2 <= i < i2+l2:
  *                                             node = trie_insert(node, data.arr[i])
  *                                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -27965,7 +30998,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
                   __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":372
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":372
  *                                             node = trie_insert(node, data.arr[i])
  *                                         node = trie_insert(node, -1)
  *                                         for i from i3 <= i < i3+l3:             # <<<<<<<<<<<<<<
@@ -27975,7 +31008,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __pyx_t_13 = (__pyx_v_i3 + __pyx_v_l3);
                   for (__pyx_v_i = __pyx_v_i3; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":373
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":373
  *                                         node = trie_insert(node, -1)
  *                                         for i from i3 <= i < i3+l3:
  *                                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -27985,7 +31018,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
                   }
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":374
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":374
  *                                         for i from i3 <= i < i3+l3:
  *                                             node = trie_insert(node, data.arr[i])
  *                                         trie_node_data_append(node, i1)             # <<<<<<<<<<<<<<
@@ -27996,7 +31029,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":375
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":375
  *                                             node = trie_insert(node, data.arr[i])
  *                                         trie_node_data_append(node, i1)
  *                                         trie_node_data_append(node, i2)             # <<<<<<<<<<<<<<
@@ -28007,7 +31040,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":376
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":376
  *                                         trie_node_data_append(node, i1)
  *                                         trie_node_data_append(node, i2)
  *                                         trie_node_data_append(node, i3)             # <<<<<<<<<<<<<<
@@ -28017,14 +31050,14 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
                   __pyx_t_3 = __pyx_f_3_sa_trie_node_data_append(__pyx_v_node, __pyx_v_i3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                  goto __pyx_L33;
+                  goto __pyx_L30;
                 }
-                __pyx_L33:;
-                goto __pyx_L32;
+                __pyx_L30:;
+                goto __pyx_L29;
               }
-              __pyx_L32:;
+              __pyx_L29:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":377
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":377
  *                                         trie_node_data_append(node, i2)
  *                                         trie_node_data_append(node, i3)
  *                                 ptr3 = ptr3 + 2             # <<<<<<<<<<<<<<
@@ -28033,15 +31066,15 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
               __pyx_v_ptr3 = (__pyx_v_ptr3 + 2);
             }
-            __pyx_L30_break:;
-            goto __pyx_L27;
+            __pyx_L27_break:;
+            goto __pyx_L24;
           }
-          __pyx_L27:;
-          goto __pyx_L24;
+          __pyx_L24:;
+          goto __pyx_L21;
         }
-        __pyx_L24:;
+        __pyx_L21:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":378
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":378
  *                                         trie_node_data_append(node, i3)
  *                                 ptr3 = ptr3 + 2
  *                     ptr2 = ptr2 + 2             # <<<<<<<<<<<<<<
@@ -28050,9 +31083,9 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
         __pyx_v_ptr2 = (__pyx_v_ptr2 + 2);
       }
-      __pyx_L22_break:;
+      __pyx_L19_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":379
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":379
  *                                 ptr3 = ptr3 + 2
  *                     ptr2 = ptr2 + 2
  *                 ptr1 = ptr1 + 2             # <<<<<<<<<<<<<<
@@ -28060,11 +31093,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                 sent_count = sent_count + 1
  */
       __pyx_v_ptr1 = (__pyx_v_ptr1 + 2);
-      goto __pyx_L20;
+      goto __pyx_L17;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":381
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":381
  *                 ptr1 = ptr1 + 2
  *             else:
  *                 sent_count = sent_count + 1             # <<<<<<<<<<<<<<
@@ -28073,7 +31106,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_sent_count = (__pyx_v_sent_count + 1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":382
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":382
  *             else:
  *                 sent_count = sent_count + 1
  *                 if sent_count % 10000 == 0:             # <<<<<<<<<<<<<<
@@ -28083,7 +31116,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_t_19 = (__Pyx_mod_long(__pyx_v_sent_count, 10000) == 0);
       if (__pyx_t_19) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":383
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":383
  *                 sent_count = sent_count + 1
  *                 if sent_count % 10000 == 0:
  *                     logger.debug("        %d sentences", sent_count)             # <<<<<<<<<<<<<<
@@ -28098,7 +31131,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_t_3 = PyInt_FromLong(__pyx_v_sent_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+        __Pyx_GOTREF(__pyx_t_8);
         __Pyx_INCREF(((PyObject *)__pyx_kp_s_78));
         PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_78));
         __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_78));
@@ -28110,11 +31143,11 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        goto __pyx_L38;
+        goto __pyx_L35;
       }
-      __pyx_L38:;
+      __pyx_L35:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":384
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":384
  *                 if sent_count % 10000 == 0:
  *                     logger.debug("        %d sentences", sent_count)
  *                 ptr1 = ptr1 + 1             # <<<<<<<<<<<<<<
@@ -28123,10 +31156,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_ptr1 = (__pyx_v_ptr1 + 1);
     }
-    __pyx_L20:;
+    __pyx_L17:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":386
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":386
  *                 ptr1 = ptr1 + 1
  * 
  *         self.precomputed_collocations = collocations.toMap(False)             # <<<<<<<<<<<<<<
@@ -28138,7 +31171,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_8 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
   __pyx_t_8 = 0;
@@ -28147,12 +31180,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_8);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations = __pyx_t_8;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
+  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
+  __pyx_v_self->precomputed_collocations = __pyx_t_8;
   __pyx_t_8 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":387
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":387
  * 
  *         self.precomputed_collocations = collocations.toMap(False)
  *         self.precomputed_index = frequent_patterns.toMap(True)             # <<<<<<<<<<<<<<
@@ -28164,7 +31197,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -28173,12 +31206,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index);
-  ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index = __pyx_t_1;
+  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
+  __Pyx_DECREF(__pyx_v_self->precomputed_index);
+  __pyx_v_self->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":389
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":389
  *         self.precomputed_index = frequent_patterns.toMap(True)
  * 
  *         x = 0             # <<<<<<<<<<<<<<
@@ -28188,7 +31221,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_x = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":390
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":390
  * 
  *         x = 0
  *         for pattern1 in J_set:             # <<<<<<<<<<<<<<
@@ -28214,7 +31247,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":391
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":391
  *         x = 0
  *         for pattern1 in J_set:
  *             for pattern2 in J_set:             # <<<<<<<<<<<<<<
@@ -28240,7 +31273,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_v_pattern2 = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":392
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":392
  *         for pattern1 in J_set:
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:             # <<<<<<<<<<<<<<
@@ -28249,10 +31282,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":393
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":393
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -28268,26 +31301,23 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_v_combined_pattern = __pyx_t_7;
         __pyx_t_7 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":394
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":394
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     J2_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  * 
  *         for pattern1 in I_set:
  */
-        if (unlikely(((PyObject *)__pyx_v_J2_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_J2_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L43;
+        goto __pyx_L40;
       }
-      __pyx_L43:;
+      __pyx_L40:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":396
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":396
  *                     J2_set.add(combined_pattern)
  * 
  *         for pattern1 in I_set:             # <<<<<<<<<<<<<<
@@ -28313,7 +31343,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":397
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":397
  * 
  *         for pattern1 in I_set:
  *             for pattern2 in I_set:             # <<<<<<<<<<<<<<
@@ -28339,7 +31369,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_v_pattern2 = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":398
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":398
  *         for pattern1 in I_set:
  *             for pattern2 in I_set:
  *                 x = x+1             # <<<<<<<<<<<<<<
@@ -28352,7 +31382,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_v_x = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":399
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":399
  *             for pattern2 in I_set:
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:             # <<<<<<<<<<<<<<
@@ -28361,10 +31391,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+      __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":400
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":400
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -28380,26 +31410,23 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_v_combined_pattern = __pyx_t_8;
         __pyx_t_8 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":401
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":401
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  * 
  *         for pattern1 in I_set:
  */
-        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L48;
+        goto __pyx_L45;
       }
-      __pyx_L48:;
+      __pyx_L45:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":403
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":403
  *                     IJ_set.add(combined_pattern)
  * 
  *         for pattern1 in I_set:             # <<<<<<<<<<<<<<
@@ -28425,7 +31452,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":404
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":404
  * 
  *         for pattern1 in I_set:
  *             for pattern2 in J2_set:             # <<<<<<<<<<<<<<
@@ -28451,7 +31478,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_v_pattern2 = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":405
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":405
  *         for pattern1 in I_set:
  *             for pattern2 in J2_set:
  *                 x = x+2             # <<<<<<<<<<<<<<
@@ -28464,7 +31491,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __pyx_v_x = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":406
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":406
  *             for pattern2 in J2_set:
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:             # <<<<<<<<<<<<<<
@@ -28473,10 +31500,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_t_2 = PyObject_Length(__pyx_v_pattern1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_14 = PyObject_Length(__pyx_v_pattern2); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->max_length);
+      __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":407
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":407
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -28492,19 +31519,16 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_v_combined_pattern = __pyx_t_7;
         __pyx_t_7 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":408
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":408
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  *                     IJ_set.add(combined_pattern)
  */
-        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":409
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":409
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1             # <<<<<<<<<<<<<<
@@ -28520,39 +31544,33 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
         __pyx_v_combined_pattern = __pyx_t_8;
         __pyx_t_8 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":410
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":410
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
  * 
  *         N = len(pattern_rank)
  */
-        if (unlikely(((PyObject *)__pyx_v_IJ_set) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L53;
+        goto __pyx_L50;
       }
-      __pyx_L53:;
+      __pyx_L50:;
     }
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":412
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":412
  *                     IJ_set.add(combined_pattern)
  * 
  *         N = len(pattern_rank)             # <<<<<<<<<<<<<<
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)
  */
-  if (unlikely(((PyObject *)__pyx_v_pattern_rank) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); 
+  __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_14;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":413
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":413
  * 
  *         N = len(pattern_rank)
  *         cost_by_rank = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -28565,13 +31583,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_cost_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":414
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":414
  *         N = len(pattern_rank)
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -28584,111 +31602,53 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __pyx_v_count_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":415
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":415
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)
  *         for pattern, arr in self.precomputed_collocations.iteritems():             # <<<<<<<<<<<<<<
  *             if pattern not in IJ_set:
  *                 s = ""
  */
-  __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-    __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_14 = 0;
-    __pyx_t_4 = NULL;
-  } else {
-    __pyx_t_14 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  __pyx_t_14 = 0;
+  if (unlikely(__pyx_v_self->precomputed_collocations == Py_None)) {
+    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
-      if (__pyx_t_14 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
-      if (__pyx_t_14 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_14); __Pyx_INCREF(__pyx_t_3); __pyx_t_14++;
-    } else {
-      __pyx_t_3 = __pyx_t_4(__pyx_t_1);
-      if (unlikely(!__pyx_t_3)) {
-        if (PyErr_Occurred()) {
-          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        break;
-      }
-      __Pyx_GOTREF(__pyx_t_3);
-    }
-    if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-      PyObject* sequence = __pyx_t_3;
-      if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
-        __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
-      } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
-        __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
-      }
-      __Pyx_INCREF(__pyx_t_8);
-      __Pyx_INCREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    } else {
-      Py_ssize_t index = -1;
-      __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_10 = Py_TYPE(__pyx_t_5)->tp_iternext;
-      index = 0; __pyx_t_8 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_8)) goto __pyx_L56_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_8);
-      index = 1; __pyx_t_7 = __pyx_t_10(__pyx_t_5); if (unlikely(!__pyx_t_7)) goto __pyx_L56_unpacking_failed;
-      __Pyx_GOTREF(__pyx_t_7);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_5), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L57_unpacking_done;
-      __pyx_L56_unpacking_failed:;
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L57_unpacking_done:;
-    }
+  __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_self->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_2), (&__pyx_t_13)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_1);
+  __pyx_t_1 = __pyx_t_3;
+  __pyx_t_3 = 0;
+  while (1) {
+    __pyx_t_16 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_2, &__pyx_t_14, &__pyx_t_3, &__pyx_t_8, NULL, __pyx_t_13);
+    if (unlikely(__pyx_t_16 == 0)) break;
+    if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_8;
-    __pyx_t_8 = 0;
+    __pyx_v_pattern = __pyx_t_3;
+    __pyx_t_3 = 0;
     __Pyx_XDECREF(__pyx_v_arr);
-    __pyx_v_arr = __pyx_t_7;
-    __pyx_t_7 = 0;
+    __pyx_v_arr = __pyx_t_8;
+    __pyx_t_8 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":416
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":416
  *         count_by_rank = IntList(initial_len=N)
  *         for pattern, arr in self.precomputed_collocations.iteritems():
  *             if pattern not in IJ_set:             # <<<<<<<<<<<<<<
  *                 s = ""
  *                 for word_id in pattern:
  */
-    __pyx_t_19 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_IJ_set), __pyx_v_pattern))); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, ((PyObject *)__pyx_v_IJ_set), Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":417
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":417
  *         for pattern, arr in self.precomputed_collocations.iteritems():
  *             if pattern not in IJ_set:
  *                 s = ""             # <<<<<<<<<<<<<<
@@ -28699,7 +31659,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_XDECREF(__pyx_v_s);
       __pyx_v_s = ((PyObject *)__pyx_kp_s_45);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":418
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":418
  *             if pattern not in IJ_set:
  *                 s = ""
  *                 for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -28707,117 +31667,124 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         s = s + "X "
  */
       if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-        __pyx_t_3 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
-        __pyx_t_20 = NULL;
+        __pyx_t_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_12 = 0;
+        __pyx_t_4 = NULL;
       } else {
-        __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_20 = Py_TYPE(__pyx_t_3)->tp_iternext;
+        __pyx_t_12 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_4 = Py_TYPE(__pyx_t_8)->tp_iternext;
       }
       for (;;) {
-        if (PyList_CheckExact(__pyx_t_3)) {
-          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-          __pyx_t_7 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
-        } else if (PyTuple_CheckExact(__pyx_t_3)) {
-          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-          __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
+        if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_8)) {
+          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_8)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_12); __Pyx_INCREF(__pyx_t_3); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_8)) {
+          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_12); __Pyx_INCREF(__pyx_t_3); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
         } else {
-          __pyx_t_7 = __pyx_t_20(__pyx_t_3);
-          if (unlikely(!__pyx_t_7)) {
+          __pyx_t_3 = __pyx_t_4(__pyx_t_8);
+          if (unlikely(!__pyx_t_3)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
               else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_7);
+          __Pyx_GOTREF(__pyx_t_3);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_7;
-        __pyx_t_7 = 0;
+        __pyx_v_word_id = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":419
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":419
  *                 s = ""
  *                 for word_id in pattern:
  *                     if word_id == -1:             # <<<<<<<<<<<<<<
  *                         s = s + "X "
  *                     else:
  */
-        __pyx_t_7 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __pyx_t_3 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_19) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":420
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":420
  *                 for word_id in pattern:
  *                     if word_id == -1:
  *                         s = s + "X "             # <<<<<<<<<<<<<<
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "
  */
-          __pyx_t_7 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_7);
+          __pyx_t_3 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_7;
-          __pyx_t_7 = 0;
-          goto __pyx_L61;
+          __pyx_v_s = __pyx_t_3;
+          __pyx_t_3 = 0;
+          goto __pyx_L56;
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":422
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":422
  *                         s = s + "X "
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "             # <<<<<<<<<<<<<<
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)
  *             else:
  */
-          __pyx_t_7 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_7 = PyNumber_Add(__pyx_v_s, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_7);
-          __pyx_t_8 = PyNumber_Add(__pyx_v_s, __pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __pyx_t_3 = PyNumber_Add(__pyx_t_7, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-          __pyx_t_7 = PyNumber_Add(__pyx_t_8, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_7;
-          __pyx_t_7 = 0;
+          __pyx_v_s = __pyx_t_3;
+          __pyx_t_3 = 0;
         }
-        __pyx_L61:;
+        __pyx_L56:;
       }
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":423
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":423
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)             # <<<<<<<<<<<<<<
  *             else:
  *                 chunk = ()
  */
-      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__warn); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_7 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_84));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_84));
+      PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_84));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_84));
       __Pyx_INCREF(__pyx_v_s);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_s);
+      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_s);
       __Pyx_GIVEREF(__pyx_v_s);
-      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      goto __pyx_L58;
+      goto __pyx_L53;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":425
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":425
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)
  *             else:
  *                 chunk = ()             # <<<<<<<<<<<<<<
@@ -28828,7 +31795,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_XDECREF(((PyObject *)__pyx_v_chunk));
       __pyx_v_chunk = __pyx_empty_tuple;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":426
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":426
  *             else:
  *                 chunk = ()
  *                 max_rank = 0             # <<<<<<<<<<<<<<
@@ -28837,7 +31804,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
       __pyx_v_max_rank = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":427
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":427
  *                 chunk = ()
  *                 max_rank = 0
  *                 arity = 0             # <<<<<<<<<<<<<<
@@ -28848,7 +31815,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
       __Pyx_XDECREF(__pyx_v_arity);
       __pyx_v_arity = __pyx_int_0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":428
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":428
  *                 max_rank = 0
  *                 arity = 0
  *                 for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -28856,93 +31823,99 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  */
       if (PyList_CheckExact(__pyx_v_pattern) || PyTuple_CheckExact(__pyx_v_pattern)) {
-        __pyx_t_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_2 = 0;
-        __pyx_t_20 = NULL;
+        __pyx_t_7 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_7); __pyx_t_12 = 0;
+        __pyx_t_4 = NULL;
       } else {
-        __pyx_t_2 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_20 = Py_TYPE(__pyx_t_8)->tp_iternext;
+        __pyx_t_12 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_4 = Py_TYPE(__pyx_t_7)->tp_iternext;
       }
       for (;;) {
-        if (PyList_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_8)) break;
-          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
-        } else if (PyTuple_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
-          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
+        if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_7)) {
+          if (__pyx_t_12 >= PyList_GET_SIZE(__pyx_t_7)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_8 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_8); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
+        } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_7)) {
+          if (__pyx_t_12 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
+          #if CYTHON_COMPILING_IN_CPYTHON
+          __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_8); __pyx_t_12++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #else
+          __pyx_t_8 = PySequence_ITEM(__pyx_t_7, __pyx_t_12); __pyx_t_12++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          #endif
         } else {
-          __pyx_t_3 = __pyx_t_20(__pyx_t_8);
-          if (unlikely(!__pyx_t_3)) {
+          __pyx_t_8 = __pyx_t_4(__pyx_t_7);
+          if (unlikely(!__pyx_t_8)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
               else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_3);
+          __Pyx_GOTREF(__pyx_t_8);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_word_id = __pyx_t_8;
+        __pyx_t_8 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":429
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":429
  *                 arity = 0
  *                 for word_id in pattern:
  *                     if word_id == -1:             # <<<<<<<<<<<<<<
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1
  */
-        __pyx_t_3 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_8 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
         if (__pyx_t_19) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":430
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":430
  *                 for word_id in pattern:
  *                     if word_id == -1:
  *                         max_rank = max(max_rank, pattern_rank[chunk])             # <<<<<<<<<<<<<<
  *                         arity = arity + 1
  *                         chunk = ()
  */
-          __pyx_t_3 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_13 = __pyx_v_max_rank;
-          __pyx_t_5 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_16 = __pyx_v_max_rank;
+          __pyx_t_5 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
-          __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, __pyx_t_5, Py_GT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_5, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
           __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
           if (__pyx_t_19) {
-            __Pyx_INCREF(__pyx_t_3);
-            __pyx_t_7 = __pyx_t_3;
+            __Pyx_INCREF(__pyx_t_8);
+            __pyx_t_3 = __pyx_t_8;
           } else {
-            __pyx_t_6 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_6 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_6);
-            __pyx_t_7 = __pyx_t_6;
+            __pyx_t_3 = __pyx_t_6;
             __pyx_t_6 = 0;
           }
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-          __pyx_v_max_rank = __pyx_t_13;
+          __pyx_v_max_rank = __pyx_t_16;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":431
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":431
  *                     if word_id == -1:
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1             # <<<<<<<<<<<<<<
  *                         chunk = ()
  *                     else:
  */
-          __pyx_t_7 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_7);
+          __pyx_t_3 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_v_arity);
-          __pyx_v_arity = __pyx_t_7;
-          __pyx_t_7 = 0;
+          __pyx_v_arity = __pyx_t_3;
+          __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":432
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":432
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1
  *                         chunk = ()             # <<<<<<<<<<<<<<
@@ -28952,105 +31925,104 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
           __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
           __pyx_v_chunk = __pyx_empty_tuple;
-          goto __pyx_L64;
+          goto __pyx_L59;
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":434
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":434
  *                         chunk = ()
  *                     else:
  *                         chunk = chunk + (word_id,)             # <<<<<<<<<<<<<<
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  */
-          __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_7));
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_v_word_id);
-          PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_word_id);
+          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_word_id);
           __Pyx_GIVEREF(__pyx_v_word_id);
-          __pyx_t_3 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-          __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+          __pyx_t_8 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
-          __pyx_v_chunk = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __pyx_v_chunk = __pyx_t_8;
+          __pyx_t_8 = 0;
         }
-        __pyx_L64:;
+        __pyx_L59:;
       }
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":435
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":435
  *                     else:
  *                         chunk = chunk + (word_id,)
  *                 max_rank = max(max_rank, pattern_rank[chunk])             # <<<<<<<<<<<<<<
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  */
-      __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_13 = __pyx_v_max_rank;
-      __pyx_t_7 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_6 = PyObject_RichCompare(__pyx_t_8, __pyx_t_7, Py_GT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_16 = __pyx_v_max_rank;
+      __pyx_t_3 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_6 = PyObject_RichCompare(__pyx_t_7, __pyx_t_3, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       if (__pyx_t_19) {
-        __Pyx_INCREF(__pyx_t_8);
-        __pyx_t_3 = __pyx_t_8;
+        __Pyx_INCREF(__pyx_t_7);
+        __pyx_t_8 = __pyx_t_7;
       } else {
-        __pyx_t_6 = PyInt_FromLong(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyInt_FromLong(__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_3 = __pyx_t_6;
+        __pyx_t_8 = __pyx_t_6;
         __pyx_t_6 = 0;
       }
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_v_max_rank = __pyx_t_13;
+      __pyx_v_max_rank = __pyx_t_16;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":436
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":436
  *                         chunk = chunk + (word_id,)
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))             # <<<<<<<<<<<<<<
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  * 
  */
-      __pyx_t_2 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_2));
+      __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_12));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":437
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":437
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))             # <<<<<<<<<<<<<<
  * 
  *         cumul_cost = 0
  */
-      __pyx_t_3 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_2 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyInt_FromSsize_t(__pyx_t_12); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_6 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = __Pyx_PyNumber_Divide(__pyx_t_8, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyNumber_Add(__pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyNumber_Add(__pyx_t_8, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_13 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_16 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_13;
+      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_16;
     }
-    __pyx_L58:;
+    __pyx_L53:;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":439
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":439
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  * 
  *         cumul_cost = 0             # <<<<<<<<<<<<<<
@@ -29060,7 +32032,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_cumul_cost = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":440
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":440
  * 
  *         cumul_cost = 0
  *         cumul_count = 0             # <<<<<<<<<<<<<<
@@ -29070,7 +32042,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_cumul_count = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":441
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":441
  *         cumul_cost = 0
  *         cumul_count = 0
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -29080,7 +32052,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __pyx_t_13 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":442
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":442
  *         cumul_count = 0
  *         for i from 0 <= i < N:
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]             # <<<<<<<<<<<<<<
@@ -29096,7 +32068,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_v_cumul_cost = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":443
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":443
  *         for i from 0 <= i < N:
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]
  *             cumul_count = cumul_count + count_by_rank.arr[i]             # <<<<<<<<<<<<<<
@@ -29112,7 +32084,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __pyx_v_cumul_count = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":444
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":444
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]
  *             cumul_count = cumul_count + count_by_rank.arr[i]
  *             logger.debug("RANK %d\tCOUNT, COST: %d    %d\tCUMUL: %d, %d", i, count_by_rank.arr[i], cost_by_rank.arr[i], cumul_count, cumul_cost)             # <<<<<<<<<<<<<<
@@ -29126,104 +32098,107 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_7 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_8 = PyTuple_New(6); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+    __pyx_t_8 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_7 = PyTuple_New(6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_85));
+    PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_85));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
-    PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7);
-    __Pyx_GIVEREF(__pyx_t_7);
-    PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_8);
+    __Pyx_GIVEREF(__pyx_t_8);
     __Pyx_INCREF(__pyx_v_cumul_count);
-    PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_v_cumul_count);
+    PyTuple_SET_ITEM(__pyx_t_7, 4, __pyx_v_cumul_count);
     __Pyx_GIVEREF(__pyx_v_cumul_count);
     __Pyx_INCREF(__pyx_v_cumul_cost);
-    PyTuple_SET_ITEM(__pyx_t_8, 5, __pyx_v_cumul_cost);
+    PyTuple_SET_ITEM(__pyx_t_7, 5, __pyx_v_cumul_cost);
     __Pyx_GIVEREF(__pyx_v_cumul_cost);
     __pyx_t_1 = 0;
-    __pyx_t_7 = 0;
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_8 = 0;
+    __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":446
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":446
  *             logger.debug("RANK %d\tCOUNT, COST: %d    %d\tCUMUL: %d, %d", i, count_by_rank.arr[i], cost_by_rank.arr[i], cumul_count, cumul_cost)
  * 
  *         num_found_patterns = len(self.precomputed_collocations)             # <<<<<<<<<<<<<<
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:
  */
-  __pyx_t_3 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_3);
-  __pyx_t_14 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_num_found_patterns = __pyx_t_14;
+  __pyx_t_8 = __pyx_v_self->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_8);
+  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_v_num_found_patterns = __pyx_t_8;
+  __pyx_t_8 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":447
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":447
  * 
  *         num_found_patterns = len(self.precomputed_collocations)
  *         for pattern in IJ_set:             # <<<<<<<<<<<<<<
  *             if pattern not in self.precomputed_collocations:
  *                 self.precomputed_collocations[pattern] = IntList()
  */
-  __pyx_t_3 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
+  __pyx_t_8 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_4 = Py_TYPE(__pyx_t_8)->tp_iternext;
   for (;;) {
     {
-      __pyx_t_8 = __pyx_t_4(__pyx_t_3);
-      if (unlikely(!__pyx_t_8)) {
+      __pyx_t_7 = __pyx_t_4(__pyx_t_8);
+      if (unlikely(!__pyx_t_7)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
           else {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
-      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_GOTREF(__pyx_t_7);
     }
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_8;
-    __pyx_t_8 = 0;
+    __pyx_v_pattern = __pyx_t_7;
+    __pyx_t_7 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":448
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":448
  *         num_found_patterns = len(self.precomputed_collocations)
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:             # <<<<<<<<<<<<<<
  *                 self.precomputed_collocations[pattern] = IntList()
  * 
  */
-    __pyx_t_19 = (__Pyx_NegateNonNeg(PySequence_Contains(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_v_pattern))); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, __pyx_v_self->precomputed_collocations, Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":449
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":449
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:
  *                 self.precomputed_collocations[pattern] = IntList()             # <<<<<<<<<<<<<<
  * 
  *         cdef float stop_time = monitor_cpu()
  */
-      __pyx_t_8 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      if (PyObject_SetItem(((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations, __pyx_v_pattern, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      goto __pyx_L69;
+      __pyx_t_7 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_pattern, __pyx_t_7) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      goto __pyx_L64;
     }
-    __pyx_L69:;
+    __pyx_L64:;
   }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":451
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":451
  *                 self.precomputed_collocations[pattern] = IntList()
  * 
  *         cdef float stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -29232,102 +32207,100 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
  */
   __pyx_v_stop_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":452
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":452
  * 
  *         cdef float stop_time = monitor_cpu()
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)             # <<<<<<<<<<<<<<
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))
  */
-  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_num_found_patterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_6 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_6);
-  __pyx_t_14 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_14); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __pyx_v_self->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_8);
+  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_6 = PyTuple_New(4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_86));
-  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_86));
+  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_s_86));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_86));
-  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_3);
-  __Pyx_GIVEREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_6);
-  __Pyx_GIVEREF(__pyx_t_6);
+  __Pyx_INCREF(__pyx_v_num_found_patterns);
+  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_v_num_found_patterns);
+  __Pyx_GIVEREF(__pyx_v_num_found_patterns);
+  PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
   __Pyx_INCREF(__pyx_v_x);
-  PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_v_x);
+  PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_v_x);
   __Pyx_GIVEREF(__pyx_v_x);
-  __pyx_t_3 = 0;
-  __pyx_t_6 = 0;
-  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":453
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":453
  *         cdef float stop_time = monitor_cpu()
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))             # <<<<<<<<<<<<<<
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))
  */
-  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_6 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_7 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __pyx_v_self->precomputed_index;
+  __Pyx_INCREF(__pyx_t_8);
+  __pyx_t_2 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_v_self)->precomputed_index;
-  __Pyx_INCREF(__pyx_t_6);
-  __pyx_t_14 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_14); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_8));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_87));
+  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_87));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6);
-  __Pyx_GIVEREF(__pyx_t_6);
-  __pyx_t_6 = 0;
-  __pyx_t_6 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":454
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":454
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
  */
-  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_6 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_7);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_88));
-  PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_kp_s_88));
+  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_kp_s_88));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_88));
-  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6);
-  __Pyx_GIVEREF(__pyx_t_6);
-  __pyx_t_6 = 0;
-  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
+  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -29370,43 +32343,39 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_3precompute(PyObject *__pyx_v_se
   __Pyx_XDECREF(__pyx_v_arity);
   __Pyx_XDECREF(__pyx_v_cumul_cost);
   __Pyx_XDECREF(__pyx_v_cumul_count);
+  __Pyx_XDECREF(__pyx_v_num_found_patterns);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":11
- *     cdef IntList ha
- * 
- *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
- *         self.darray = DataArray()
- *         self.sa = IntList()
- */
-
-static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
     PyObject* values[3] = {0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":11
+ *     cdef IntList ha
+ * 
+ *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
+ *         self.darray = DataArray()
+ *         self.sa = IntList()
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -29414,7 +32383,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__from_binary);
@@ -29432,7 +32401,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -29455,8 +32424,24 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray___cinit__(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_from_binary, __pyx_v_from_text, __pyx_v_side);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":12
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":12
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):
  *         self.darray = DataArray()             # <<<<<<<<<<<<<<
@@ -29466,12 +32451,12 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->darray);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->darray));
+  __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":13
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":13
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):
  *         self.darray = DataArray()
  *         self.sa = IntList()             # <<<<<<<<<<<<<<
@@ -29481,12 +32466,12 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":14
  *         self.darray = DataArray()
  *         self.sa = IntList()
  *         self.ha = IntList()             # <<<<<<<<<<<<<<
@@ -29496,12 +32481,12 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->ha);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->ha));
+  __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":15
  *         self.sa = IntList()
  *         self.ha = IntList()
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -29511,17 +32496,17 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":16
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":16
  *         self.ha = IntList()
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
  *         elif from_text:
  *             self.read_text(from_text, side)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_binary); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_binary);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_binary);
     __Pyx_GIVEREF(__pyx_v_from_binary);
@@ -29530,10 +32515,10 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":17
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -29543,17 +32528,17 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":18
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":18
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             self.read_text(from_text, side)             # <<<<<<<<<<<<<<
  * 
  *     def __getitem__(self, i):
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_v_from_text);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_from_text);
     __Pyx_GIVEREF(__pyx_v_from_text);
@@ -29565,9 +32550,9 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -29582,7 +32567,18 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":20
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_2__getitem__(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":20
  *             self.read_text(from_text, side)
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -29590,8 +32586,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(PyObject *__pyx_v_self, PyObjec
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -29599,9 +32594,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__getitem__");
+  __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":21
  * 
  *     def __getitem__(self, i):
  *         return self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -29610,7 +32605,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sa->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -29628,7 +32623,18 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":23
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_4get_sentence_id(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":23
  *         return self.sa.arr[i]
  * 
  *     def get_sentence_id(self, i):             # <<<<<<<<<<<<<<
@@ -29636,8 +32642,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_1__getitem__(PyObject *__pyx_v_self
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_2get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_2get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -29646,9 +32651,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2get_sentence_id(PyObject *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_id");
+  __Pyx_RefNannySetupContext("get_sentence_id", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":24
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":24
  * 
  *     def get_sentence_id(self, i):
  *         return self.darray.get_sentence_id(i)             # <<<<<<<<<<<<<<
@@ -29656,10 +32661,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2get_sentence_id(PyObject *__pyx_v_
  *     def get_sentence(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__get_sentence_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__get_sentence_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_i);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -29685,7 +32690,18 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2get_sentence_id(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":26
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_6get_sentence(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":26
  *         return self.darray.get_sentence_id(i)
  * 
  *     def get_sentence(self, i):             # <<<<<<<<<<<<<<
@@ -29693,8 +32709,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2get_sentence_id(PyObject *__pyx_v_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_3get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_3get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -29703,9 +32718,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3get_sentence(PyObject *__pyx_v_sel
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence");
+  __Pyx_RefNannySetupContext("get_sentence", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":27
  * 
  *     def get_sentence(self, i):
  *         return self.darray.get_sentence(i)             # <<<<<<<<<<<<<<
@@ -29713,10 +32728,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3get_sentence(PyObject *__pyx_v_sel
  *     def get_sentence_position(self, loc):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__get_sentence); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__get_sentence); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_i);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -29742,7 +32757,18 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3get_sentence(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":29
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence_position (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_8get_sentence_position(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":29
  *         return self.darray.get_sentence(i)
  * 
  *     def get_sentence_position(self, loc):             # <<<<<<<<<<<<<<
@@ -29750,8 +32776,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_3get_sentence(PyObject *__pyx_v_sel
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -29760,9 +32785,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_position(PyObject *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_position");
+  __Pyx_RefNannySetupContext("get_sentence_position", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":30
  * 
  *     def get_sentence_position(self, loc):
  *         return self.darray.get_sentence_position(loc)             # <<<<<<<<<<<<<<
@@ -29770,10 +32795,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_position(PyObject *__
  *     def read_text(self, filename, side):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s_89); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_89); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_loc);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_loc);
   __Pyx_GIVEREF(__pyx_v_loc);
@@ -29799,75 +32824,40 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_position(PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":32
- *         return self.darray.get_sentence_position(loc)
- * 
- *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
- *         '''Constructs suffix array using the algorithm
- *         of Larsson & Sadahkane (1999)'''
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_5read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
-static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_10read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
+static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_filename = 0;
   PyObject *__pyx_v_side = 0;
-  int __pyx_v_V;
-  int __pyx_v_N;
-  int __pyx_v_i;
-  int __pyx_v_j;
-  int __pyx_v_h;
-  int __pyx_v_a_i;
-  int __pyx_v_n;
-  int __pyx_v_current_run;
-  int __pyx_v_skip;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
-  struct __pyx_obj_3_sa_IntList *__pyx_v_word_count = 0;
-  float __pyx_v_sort_start_time;
-  float __pyx_v_start_time;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  long __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
-  __Pyx_RefNannySetupContext("read_text");
+  __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filename)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("read_text", 1, 2, 2, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -29886,8 +32876,52 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_10read_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":32
+ *         return self.darray.get_sentence_position(loc)
+ * 
+ *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
+ *         '''Constructs suffix array using the algorithm
+ *         of Larsson & Sadahkane (1999)'''
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side) {
+  int __pyx_v_V;
+  int __pyx_v_N;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_h;
+  int __pyx_v_a_i;
+  int __pyx_v_n;
+  int __pyx_v_current_run;
+  int __pyx_v_skip;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
+  struct __pyx_obj_3_sa_IntList *__pyx_v_word_count = 0;
+  float __pyx_v_sort_start_time;
+  float __pyx_v_start_time;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  long __pyx_t_5;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":38
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":38
  *         cdef IntList isa, word_count
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)             # <<<<<<<<<<<<<<
@@ -29902,42 +32936,42 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__use_sent_id), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->darray);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->darray));
+  __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":39
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)             # <<<<<<<<<<<<<<
  *         V = len(self.darray.id2word)
  * 
  */
-  __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray);
+  __pyx_t_2 = ((PyObject *)__pyx_v_self->darray);
   __Pyx_INCREF(__pyx_t_2);
   __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_v_N = __pyx_t_3;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":40
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)
  *         V = len(self.darray.id2word)             # <<<<<<<<<<<<<<
  * 
  *         self.sa = IntList(initial_len=N)
  */
-  __pyx_t_2 = ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->id2word;
+  __pyx_t_2 = __pyx_v_self->darray->id2word;
   __Pyx_INCREF(__pyx_t_2);
   __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_v_V = __pyx_t_3;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":42
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":42
  *         V = len(self.darray.id2word)
  * 
  *         self.sa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -29950,16 +32984,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":43
  * 
  *         self.sa = IntList(initial_len=N)
  *         self.ha = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
@@ -29972,16 +33006,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha));
-  ((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->ha);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->ha));
+  __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":45
  *         self.ha = IntList(initial_len=V+1)
  * 
  *         isa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -29994,13 +33028,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_isa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":46
  * 
  *         isa = IntList(initial_len=N)
  *         word_count = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
@@ -30013,13 +33047,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_word_count = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":49
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":49
  * 
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -30028,7 +33062,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
   __pyx_v_sort_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":50
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":50
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()
  *         cdef float start_time = sort_start_time             # <<<<<<<<<<<<<<
@@ -30037,7 +33071,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
   __pyx_v_start_time = __pyx_v_sort_start_time;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":51
  *         cdef float sort_start_time = monitor_cpu()
  *         cdef float start_time = sort_start_time
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -30047,16 +33081,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":52
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":52
  *         cdef float start_time = sort_start_time
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  */
-    __pyx_v_a_i = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->data->arr[__pyx_v_i]);
+    __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":53
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1             # <<<<<<<<<<<<<<
@@ -30066,7 +33100,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     (__pyx_v_word_count->arr[__pyx_v_a_i]) = ((__pyx_v_word_count->arr[__pyx_v_a_i]) + 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":55
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":55
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  *         n = 0             # <<<<<<<<<<<<<<
@@ -30075,7 +33109,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
   __pyx_v_n = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":56
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":56
  * 
  *         n = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -30085,16 +33119,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_5 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":57
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":57
  *         n = 0
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n             # <<<<<<<<<<<<<<
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i]) = __pyx_v_n;
+    (__pyx_v_self->ha->arr[__pyx_v_i]) = __pyx_v_n;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":58
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":58
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]             # <<<<<<<<<<<<<<
@@ -30103,7 +33137,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_n = (__pyx_v_n + (__pyx_v_word_count->arr[__pyx_v_i]));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":59
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":59
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0             # <<<<<<<<<<<<<<
@@ -30113,7 +33147,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     (__pyx_v_word_count->arr[__pyx_v_i]) = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":61
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":61
  *             word_count.arr[i] = 0
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -30123,34 +33157,34 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":62
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":62
  * 
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  */
-    __pyx_v_a_i = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->data->arr[__pyx_v_i]);
+    __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":63
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":63
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i             # <<<<<<<<<<<<<<
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
+    (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":64
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":64
  *             a_i = self.darray.data.arr[i]
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket             # <<<<<<<<<<<<<<
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  */
-    (__pyx_v_isa->arr[__pyx_v_i]) = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[(__pyx_v_a_i + 1)]) - 1);
+    (__pyx_v_isa->arr[__pyx_v_i]) = ((__pyx_v_self->ha->arr[(__pyx_v_a_i + 1)]) - 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":65
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":65
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1             # <<<<<<<<<<<<<<
@@ -30160,7 +33194,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     (__pyx_v_word_count->arr[__pyx_v_a_i]) = ((__pyx_v_word_count->arr[__pyx_v_a_i]) + 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":68
  * 
  *         '''Determine size of initial runs'''
  *         current_run = 0             # <<<<<<<<<<<<<<
@@ -30169,7 +33203,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
   __pyx_v_current_run = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":69
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":69
  *         '''Determine size of initial runs'''
  *         current_run = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -30179,7 +33213,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_5 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":70
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":70
  *         current_run = 0
  *         for i from 0 <= i < V+1:
  *             if i < V and self.ha.arr[i+1] - self.ha.arr[i] == 1:             # <<<<<<<<<<<<<<
@@ -30188,14 +33222,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_t_6 = (__pyx_v_i < __pyx_v_V);
     if (__pyx_t_6) {
-      __pyx_t_7 = (((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[(__pyx_v_i + 1)]) - (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i])) == 1);
+      __pyx_t_7 = (((__pyx_v_self->ha->arr[(__pyx_v_i + 1)]) - (__pyx_v_self->ha->arr[__pyx_v_i])) == 1);
       __pyx_t_8 = __pyx_t_7;
     } else {
       __pyx_t_8 = __pyx_t_6;
     }
     if (__pyx_t_8) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":71
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":71
  *         for i from 0 <= i < V+1:
  *             if i < V and self.ha.arr[i+1] - self.ha.arr[i] == 1:
  *                 current_run = current_run + 1             # <<<<<<<<<<<<<<
@@ -30203,11 +33237,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                 if current_run > 0:
  */
       __pyx_v_current_run = (__pyx_v_current_run + 1);
-      goto __pyx_L14;
+      goto __pyx_L11;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":73
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":73
  *                 current_run = current_run + 1
  *             else:
  *                 if current_run > 0:             # <<<<<<<<<<<<<<
@@ -30217,16 +33251,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
       __pyx_t_8 = (__pyx_v_current_run > 0);
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":74
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":74
  *             else:
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run             # <<<<<<<<<<<<<<
  *                     current_run = 0
  * 
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
+        (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":75
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":75
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run
  *                     current_run = 0             # <<<<<<<<<<<<<<
@@ -30234,14 +33268,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))
  */
         __pyx_v_current_run = 0;
-        goto __pyx_L15;
+        goto __pyx_L12;
       }
-      __pyx_L15:;
+      __pyx_L12:;
     }
-    __pyx_L14:;
+    __pyx_L11:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":77
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":77
  *                     current_run = 0
  * 
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
@@ -30256,7 +33290,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_2 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+  __Pyx_GOTREF(__pyx_t_9);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_90));
   PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_90));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_90));
@@ -30269,7 +33303,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":80
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":80
  * 
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1             # <<<<<<<<<<<<<<
@@ -30278,7 +33312,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
   __pyx_v_h = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":81
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":81
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1
  *         while self.sa.arr[0] != -N:             # <<<<<<<<<<<<<<
@@ -30286,10 +33320,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *             logger.debug("    Refining, sort depth = %d", h)
  */
   while (1) {
-    __pyx_t_8 = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[0]) != (-__pyx_v_N));
+    __pyx_t_8 = ((__pyx_v_self->sa->arr[0]) != (-__pyx_v_N));
     if (!__pyx_t_8) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":82
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":82
  *         h = 1
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -30298,7 +33332,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_sort_start_time = __pyx_f_3_sa_monitor_cpu();
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":83
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":83
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)             # <<<<<<<<<<<<<<
@@ -30313,7 +33347,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __pyx_t_2 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_91));
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_91));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_91));
@@ -30326,7 +33360,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":84
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":84
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0             # <<<<<<<<<<<<<<
@@ -30335,7 +33369,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_i = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":85
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0
  *             skip = 0             # <<<<<<<<<<<<<<
@@ -30344,7 +33378,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_skip = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":86
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":86
  *             i = 0
  *             skip = 0
  *             while i < N:             # <<<<<<<<<<<<<<
@@ -30355,38 +33389,38 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
       __pyx_t_8 = (__pyx_v_i < __pyx_v_N);
       if (!__pyx_t_8) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":87
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":87
  *             skip = 0
  *             while i < N:
  *                 if self.sa.arr[i] < 0:             # <<<<<<<<<<<<<<
  *                     skip = skip + self.sa.arr[i]
  *                     i = i - self.sa.arr[i]
  */
-      __pyx_t_8 = ((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) < 0);
+      __pyx_t_8 = ((__pyx_v_self->sa->arr[__pyx_v_i]) < 0);
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":88
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":88
  *             while i < N:
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]             # <<<<<<<<<<<<<<
  *                     i = i - self.sa.arr[i]
  *                 else:
  */
-        __pyx_v_skip = (__pyx_v_skip + (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]));
+        __pyx_v_skip = (__pyx_v_skip + (__pyx_v_self->sa->arr[__pyx_v_i]));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":89
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":89
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]
  *                     i = i - self.sa.arr[i]             # <<<<<<<<<<<<<<
  *                 else:
  *                     if skip < 0:
  */
-        __pyx_v_i = (__pyx_v_i - (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]));
-        goto __pyx_L20;
+        __pyx_v_i = (__pyx_v_i - (__pyx_v_self->sa->arr[__pyx_v_i]));
+        goto __pyx_L17;
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":91
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":91
  *                     i = i - self.sa.arr[i]
  *                 else:
  *                     if skip < 0:             # <<<<<<<<<<<<<<
@@ -30396,16 +33430,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
         __pyx_t_8 = (__pyx_v_skip < 0);
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":92
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":92
  *                 else:
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  */
-          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
+          (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":93
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":93
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0             # <<<<<<<<<<<<<<
@@ -30413,27 +33447,27 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  *                     self.q3sort(i, j, h, isa)
  */
           __pyx_v_skip = 0;
-          goto __pyx_L21;
+          goto __pyx_L18;
         }
-        __pyx_L21:;
+        __pyx_L18:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":94
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":94
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]             # <<<<<<<<<<<<<<
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  */
-        __pyx_v_j = (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i])]);
+        __pyx_v_j = (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":95
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":95
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)             # <<<<<<<<<<<<<<
  *                     i = j+1
  *             if skip < 0:
  */
-        __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
@@ -30442,7 +33476,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
         __pyx_t_10 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __pyx_t_11 = PyTuple_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+        __Pyx_GOTREF(__pyx_t_11);
         PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_9);
@@ -30461,7 +33495,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
         __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":96
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":96
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1             # <<<<<<<<<<<<<<
@@ -30470,10 +33504,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
         __pyx_v_i = (__pyx_v_j + 1);
       }
-      __pyx_L20:;
+      __pyx_L17:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":97
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":97
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  *             if skip < 0:             # <<<<<<<<<<<<<<
@@ -30483,19 +33517,19 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __pyx_t_8 = (__pyx_v_skip < 0);
     if (__pyx_t_8) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":98
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":98
  *                     i = j+1
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
  *             h = h * 2
  *             logger.debug("    Refinement took %f seconds", (monitor_cpu() - sort_start_time))
  */
-      (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
-      goto __pyx_L22;
+      (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
+      goto __pyx_L19;
     }
-    __pyx_L22:;
+    __pyx_L19:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":99
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":99
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2             # <<<<<<<<<<<<<<
@@ -30504,7 +33538,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_h = (__pyx_v_h * 2);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":100
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":100
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2
  *             logger.debug("    Refinement took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
@@ -30519,7 +33553,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_92));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_92));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_92));
@@ -30533,7 +33567,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":103
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
@@ -30550,7 +33584,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":104
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -30560,7 +33594,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":105
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]             # <<<<<<<<<<<<<<
@@ -30569,17 +33603,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
  */
     __pyx_v_j = (__pyx_v_isa->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":106
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":106
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i             # <<<<<<<<<<<<<<
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
  * 
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_j]) = __pyx_v_i;
+    (__pyx_v_self->sa->arr[__pyx_v_j]) = __pyx_v_i;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":107
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))             # <<<<<<<<<<<<<<
@@ -30594,7 +33628,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
   __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+  __Pyx_GOTREF(__pyx_t_11);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_95));
   PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_kp_s_95));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_95));
@@ -30625,49 +33659,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":109
- *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
- * 
- *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
- *         '''This is a ternary quicksort. It divides the array into
- *         three partitions: items less than the pivot, items equal
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_6q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_12q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
+static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_h;
   struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
   PyObject *__pyx_v_pad = 0;
-  int __pyx_v_k;
-  int __pyx_v_midpoint;
-  int __pyx_v_pval;
-  int __pyx_v_phead;
-  int __pyx_v_ptail;
-  int __pyx_v_tmp;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  long __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *__pyx_t_8 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__i,&__pyx_n_s__j,&__pyx_n_s__h,&__pyx_n_s__isa,&__pyx_n_s__pad,0};
-  __Pyx_RefNannySetupContext("q3sort");
+  __Pyx_RefNannySetupContext("q3sort (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__i,&__pyx_n_s__j,&__pyx_n_s__h,&__pyx_n_s__isa,&__pyx_n_s__pad,0};
     PyObject* values[5] = {0,0,0,0,0};
     values[4] = ((PyObject *)__pyx_kp_s_45);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -30677,26 +33688,22 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -30707,7 +33714,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -30735,8 +33742,46 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_isa), __pyx_ptype_3_sa_IntList, 1, "isa", 0))) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_12q3sort(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_i, __pyx_v_j, __pyx_v_h, __pyx_v_isa, __pyx_v_pad);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":109
+ *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
+ * 
+ *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
+ *         '''This is a ternary quicksort. It divides the array into
+ *         three partitions: items less than the pivot, items equal
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad) {
+  int __pyx_v_k;
+  int __pyx_v_midpoint;
+  int __pyx_v_pval;
+  int __pyx_v_phead;
+  int __pyx_v_ptail;
+  int __pyx_v_tmp;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  long __pyx_t_5;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("q3sort", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":116
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":116
  *         cdef int k, midpoint, pval, phead, ptail, tmp
  * 
  *         if j-i < -1:             # <<<<<<<<<<<<<<
@@ -30746,7 +33791,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) < -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":117
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":117
  * 
  *         if j-i < -1:
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))             # <<<<<<<<<<<<<<
@@ -30758,7 +33803,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __pyx_t_3 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -30769,7 +33814,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -30779,11 +33824,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":118
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":118
  *         if j-i < -1:
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))
  *         if j-i == -1:    # recursive base case -- empty interval             # <<<<<<<<<<<<<<
@@ -30793,7 +33838,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":119
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":119
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return             # <<<<<<<<<<<<<<
@@ -30803,11 +33848,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_XDECREF(__pyx_r);
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":120
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":120
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return
  *         if (j-i == 0):    # recursive base case -- singleton interval             # <<<<<<<<<<<<<<
@@ -30817,25 +33862,25 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":121
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":121
  *             return
  *         if (j-i == 0):    # recursive base case -- singleton interval
  *             isa.arr[self.sa.arr[i]] = i             # <<<<<<<<<<<<<<
  *             self.sa.arr[i] = -1
  *             return
  */
-    (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i])]) = __pyx_v_i;
+    (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]) = __pyx_v_i;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":122
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":122
  *         if (j-i == 0):    # recursive base case -- singleton interval
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1             # <<<<<<<<<<<<<<
  *             return
  * 
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) = -1;
+    (__pyx_v_self->sa->arr[__pyx_v_i]) = -1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":123
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":123
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1
  *             return             # <<<<<<<<<<<<<<
@@ -30845,11 +33890,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
     __Pyx_XDECREF(__pyx_r);
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L5;
   }
-  __pyx_L8:;
+  __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":132
  *         # If the method of assigning word_id's is changed, this method
  *         # may need to be reconsidered as well.
  *         midpoint = (i+j)/2             # <<<<<<<<<<<<<<
@@ -30858,16 +33903,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_i + __pyx_v_j), 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":133
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":133
  *         # may need to be reconsidered as well.
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]             # <<<<<<<<<<<<<<
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  */
-  __pyx_v_pval = (__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
+  __pyx_v_pval = (__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":134
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":134
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:             # <<<<<<<<<<<<<<
@@ -30877,37 +33922,37 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_1 = (__pyx_v_i != __pyx_v_midpoint);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":135
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":135
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]             # <<<<<<<<<<<<<<
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  */
-    __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]);
+    __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_midpoint]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":136
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":136
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]             # <<<<<<<<<<<<<<
  *             self.sa.arr[i] = tmp
  *         phead = i
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_midpoint]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]);
+    (__pyx_v_self->sa->arr[__pyx_v_midpoint]) = (__pyx_v_self->sa->arr[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":137
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":137
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp             # <<<<<<<<<<<<<<
  *         phead = i
  *         ptail = i
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_i]) = __pyx_v_tmp;
-    goto __pyx_L9;
+    (__pyx_v_self->sa->arr[__pyx_v_i]) = __pyx_v_tmp;
+    goto __pyx_L6;
   }
-  __pyx_L9:;
+  __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":138
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":138
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  *         phead = i             # <<<<<<<<<<<<<<
@@ -30916,7 +33961,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  */
   __pyx_v_phead = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":139
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":139
  *             self.sa.arr[i] = tmp
  *         phead = i
  *         ptail = i             # <<<<<<<<<<<<<<
@@ -30925,7 +33970,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  */
   __pyx_v_ptail = __pyx_v_i;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":143
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":143
  *         # find the three partitions.    phead marks the first element
  *         # of the middle partition, and ptail marks the last element
  *         for k from i+1 <= k < j+1:             # <<<<<<<<<<<<<<
@@ -30935,17 +33980,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_5 = (__pyx_v_j + 1);
   for (__pyx_v_k = (__pyx_v_i + 1); __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":144
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":144
  *         # of the middle partition, and ptail marks the last element
  *         for k from i+1 <= k < j+1:
  *             if isa.arr[self.sa.arr[k] + h] < pval:             # <<<<<<<<<<<<<<
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]
  */
-    __pyx_t_1 = ((__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
+    __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":145
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":145
  *         for k from i+1 <= k < j+1:
  *             if isa.arr[self.sa.arr[k] + h] < pval:
  *                 if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -30955,75 +34000,75 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
       __pyx_t_1 = (__pyx_v_k > (__pyx_v_ptail + 1));
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":146
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":146
  *             if isa.arr[self.sa.arr[k] + h] < pval:
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  */
-        __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]);
+        __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":147
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":147
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  *                     self.sa.arr[ptail+1] = tmp
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
+        (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":148
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":148
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]);
+        (__pyx_v_self->sa->arr[__pyx_v_k]) = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":149
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":149
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  *                     self.sa.arr[ptail+1] = tmp             # <<<<<<<<<<<<<<
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]) = __pyx_v_tmp;
-        goto __pyx_L13;
+        (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = __pyx_v_tmp;
+        goto __pyx_L10;
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":151
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":151
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  */
-        __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]);
+        __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":152
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":152
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]             # <<<<<<<<<<<<<<
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
+        (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":153
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":153
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp             # <<<<<<<<<<<<<<
  *                 phead = phead + 1
  *                 ptail = ptail + 1
  */
-        (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
+        (__pyx_v_self->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
       }
-      __pyx_L13:;
+      __pyx_L10:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":154
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":154
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1             # <<<<<<<<<<<<<<
@@ -31032,7 +34077,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  */
       __pyx_v_phead = (__pyx_v_phead + 1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":155
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":155
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  *                 ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -31040,21 +34085,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  */
       __pyx_v_ptail = (__pyx_v_ptail + 1);
-      goto __pyx_L12;
+      goto __pyx_L9;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":157
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":157
  *                 ptail = ptail + 1
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:             # <<<<<<<<<<<<<<
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]
  */
-      __pyx_t_1 = ((__pyx_v_isa->arr[((((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
+      __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":158
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":158
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -31064,37 +34109,37 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
         __pyx_t_1 = (__pyx_v_k > (__pyx_v_ptail + 1));
         if (__pyx_t_1) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":159
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":159
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]             # <<<<<<<<<<<<<<
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp
  */
-          __pyx_v_tmp = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]);
+          __pyx_v_tmp = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":160
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":160
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]             # <<<<<<<<<<<<<<
  *                         self.sa.arr[k] = tmp
  *                     ptail = ptail + 1
  */
-          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[(__pyx_v_ptail + 1)]) = (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]);
+          (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":161
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":161
  *                         tmp = self.sa.arr[ptail+1]
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp             # <<<<<<<<<<<<<<
  *                     ptail = ptail + 1
  * 
  */
-          (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
-          goto __pyx_L15;
+          (__pyx_v_self->sa->arr[__pyx_v_k]) = __pyx_v_tmp;
+          goto __pyx_L12;
         }
-        __pyx_L15:;
+        __pyx_L12:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":162
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":162
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp
  *                     ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -31102,21 +34147,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  *         # recursively sort smaller suffixes
  */
         __pyx_v_ptail = (__pyx_v_ptail + 1);
-        goto __pyx_L14;
+        goto __pyx_L11;
       }
-      __pyx_L14:;
+      __pyx_L11:;
     }
-    __pyx_L12:;
+    __pyx_L9:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":165
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":165
  * 
  *         # recursively sort smaller suffixes
  *         self.q3sort(i, phead-1, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
  * 
  *         # update suffixes with pivot value
  */
-  __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_4 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
@@ -31127,7 +34172,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_7 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __pyx_t_8 = PyTuple_New(5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+  __Pyx_GOTREF(__pyx_t_8);
   PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_2);
@@ -31149,7 +34194,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":169
  *         # update suffixes with pivot value
  *         # corresponds to update_group function in Larsson & Sadakane
  *         for k from phead <= k < ptail+1:             # <<<<<<<<<<<<<<
@@ -31159,17 +34204,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_5 = (__pyx_v_ptail + 1);
   for (__pyx_v_k = __pyx_v_phead; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":170
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":170
  *         # corresponds to update_group function in Larsson & Sadakane
  *         for k from phead <= k < ptail+1:
  *             isa.arr[self.sa.arr[k]] = ptail             # <<<<<<<<<<<<<<
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1
  */
-    (__pyx_v_isa->arr[(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
+    (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":171
  *         for k from phead <= k < ptail+1:
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:             # <<<<<<<<<<<<<<
@@ -31179,26 +34224,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_1 = (__pyx_v_phead == __pyx_v_ptail);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":172
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":172
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1             # <<<<<<<<<<<<<<
  * 
  *         # recursively sort larger suffixes
  */
-    (((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->arr[__pyx_v_phead]) = -1;
-    goto __pyx_L18;
+    (__pyx_v_self->sa->arr[__pyx_v_phead]) = -1;
+    goto __pyx_L15;
   }
-  __pyx_L18:;
+  __pyx_L15:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":175
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":175
  * 
  *         # recursively sort larger suffixes
  *         self.q3sort(ptail+1, j, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_7 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __pyx_t_8 = PyInt_FromLong((__pyx_v_ptail + 1)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
@@ -31209,7 +34254,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   __pyx_t_2 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
   PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -31248,7 +34293,28 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":178
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_14write_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":178
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -31256,9 +34322,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(PyObject *__pyx_v_self, PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -31267,30 +34331,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self,
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_text");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":179
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":179
  * 
  *     def write_text(self, char* filename):
  *         self.darray.write_text(filename)             # <<<<<<<<<<<<<<
  * 
  *     def read_binary(self, char* filename):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_t_2 = 0;
@@ -31314,24 +34369,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_7write_text(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":181
- *         self.darray.write_text(filename)
- * 
- *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE *f
- *         f = fopen(filename, "r")
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("read_binary");
+  __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -31341,8 +34385,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_16read_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":181
+ *         self.darray.write_text(filename)
+ * 
+ *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE *f
+ *         f = fopen(filename, "r")
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":183
+static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("read_binary", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":183
  *     def read_binary(self, char* filename):
  *         cdef FILE *f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -31351,34 +34413,34 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":184
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":184
  *         cdef FILE *f
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->read_handle(__pyx_v_self->darray, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":185
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)             # <<<<<<<<<<<<<<
  *         self.ha.read_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->read_handle(__pyx_v_self->sa, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":186
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":186
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->__pyx_vtab)->read_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->read_handle(__pyx_v_self->ha, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":187
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":187
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -31393,24 +34455,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8read_binary(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":189
- *         fclose(f)
- * 
- *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
- *         cdef FILE* f
- *         f = fopen(filename, "w")
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
-  FILE *__pyx_v_f;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_binary");
+  __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
     __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
@@ -31420,8 +34471,26 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_18write_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":189
+ *         fclose(f)
+ * 
+ *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
+ *         cdef FILE* f
+ *         f = fopen(filename, "w")
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+  FILE *__pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":191
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":191
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -31430,34 +34499,34 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":192
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":192
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_DataArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->write_handle(__pyx_v_self->darray, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":193
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":193
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)             # <<<<<<<<<<<<<<
  *         self.ha.write_handle(f)
  *         fclose(f)
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->write_handle(__pyx_v_self->sa, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":194
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":194
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)             # <<<<<<<<<<<<<<
  *         fclose(f)
  * 
  */
-  ((struct __pyx_vtabstruct_3_sa_IntList *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha->__pyx_vtab)->write_handle(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha, __pyx_v_f);
+  ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->write_handle(__pyx_v_self->ha, __pyx_v_f);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":195
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":195
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -31472,7 +34541,28 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":197
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+  char *__pyx_v_filename;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
+  assert(__pyx_arg_filename); {
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_20write_enhanced(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":197
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -31480,9 +34570,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_9write_binary(PyObject *__pyx_v_sel
  *             self.darray.write_enhanced_handle(f)
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
-  char *__pyx_v_filename;
+static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_a_i = NULL;
   PyObject *__pyx_v_w_i = NULL;
@@ -31504,18 +34592,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("write_enhanced");
-  assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -31526,7 +34605,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
     __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
@@ -31538,203 +34617,220 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L5_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     /*try:*/ {
       {
-        __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6);
-        __Pyx_XGOTREF(__pyx_t_4);
+        __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
         __Pyx_XGOTREF(__pyx_t_5);
         __Pyx_XGOTREF(__pyx_t_6);
+        __Pyx_XGOTREF(__pyx_t_7);
         /*try:*/ {
-          __pyx_v_f = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __Pyx_INCREF(__pyx_t_4);
+          __pyx_v_f = __pyx_t_4;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":199
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":199
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.darray.write_enhanced_handle(f)             # <<<<<<<<<<<<<<
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_2));
           __Pyx_INCREF(__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":200
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":200
  *         with open(filename, "w") as f:
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa))) {
-            __pyx_t_7 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa); __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->sa)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->sa))) {
+            __pyx_t_2 = ((PyObject *)__pyx_v_self->sa); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_7);
-            __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sa)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_7)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break;
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_7)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_2 = __pyx_t_9(__pyx_t_7);
-              if (unlikely(!__pyx_t_2)) {
+              __pyx_t_1 = __pyx_t_9(__pyx_t_2);
+              if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_2);
+              __Pyx_GOTREF(__pyx_t_1);
             }
             __Pyx_XDECREF(__pyx_v_a_i);
-            __pyx_v_a_i = __pyx_t_2;
-            __pyx_t_2 = 0;
+            __pyx_v_a_i = __pyx_t_1;
+            __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":201
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":201
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for w_i in self.ha:
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_1));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-            __pyx_t_1 = 0;
-            __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_4));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
+            __pyx_t_4 = 0;
+            __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           }
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":202
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":202
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  */
-          __pyx_t_7 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_7);
-          __pyx_t_1 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":203
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":203
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  *             for w_i in self.ha:             # <<<<<<<<<<<<<<
  *                 f.write("%d " % w_i)
  *             f.write("\n")
  */
-          if (PyList_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha)) || PyTuple_CheckExact(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha))) {
-            __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha); __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
+          if (PyList_CheckExact(((PyObject *)__pyx_v_self->ha)) || PyTuple_CheckExact(((PyObject *)__pyx_v_self->ha))) {
+            __pyx_t_4 = ((PyObject *)__pyx_v_self->ha); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->ha)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_9 = Py_TYPE(__pyx_t_1)->tp_iternext;
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->ha)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_4);
+            __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_7 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_7); __pyx_t_8++;
-            } else if (PyTuple_CheckExact(__pyx_t_1)) {
-              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-              __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_7); __pyx_t_8++;
+            if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
+            } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
+              if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #else
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              #endif
             } else {
-              __pyx_t_7 = __pyx_t_9(__pyx_t_1);
-              if (unlikely(!__pyx_t_7)) {
+              __pyx_t_2 = __pyx_t_9(__pyx_t_4);
+              if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_7);
+              __Pyx_GOTREF(__pyx_t_2);
             }
             __Pyx_XDECREF(__pyx_v_w_i);
-            __pyx_v_w_i = __pyx_t_7;
-            __pyx_t_7 = 0;
+            __pyx_v_w_i = __pyx_t_2;
+            __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":204
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":204
  *             f.write("\n")
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_7 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(__pyx_t_7);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_2);
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_10));
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_1);
+            PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+            __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           }
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":205
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":205
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_98), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L9_error;}
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_98), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
-        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
-        goto __pyx_L16_try_end;
-        __pyx_L9_error:;
         __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+        goto __pyx_L14_try_end;
+        __pyx_L7_error:;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -31743,75 +34839,75 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_1, &__pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_4, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_7));
           __Pyx_INCREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
+          __Pyx_INCREF(__pyx_t_4);
+          PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4);
+          __Pyx_GIVEREF(__pyx_t_4);
           __Pyx_INCREF(__pyx_t_1);
-          PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1);
+          PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
-          __Pyx_INCREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_7, NULL);
+          __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
+            __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_GIVEREF(__pyx_t_1);
-            __Pyx_GIVEREF(__pyx_t_2);
-            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_1, __pyx_t_2);
-            __pyx_t_10 = 0; __pyx_t_1 = 0; __pyx_t_2 = 0; 
-            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L11_except_error;}
-            goto __pyx_L23;
+            __Pyx_ErrRestore(__pyx_t_10, __pyx_t_4, __pyx_t_1);
+            __pyx_t_10 = 0; __pyx_t_4 = 0; __pyx_t_1 = 0; 
+            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            goto __pyx_L22;
           }
-          __pyx_L23:;
-          __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
+          __pyx_L22:;
+          __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L10_exception_handled;
+          goto __pyx_L8_exception_handled;
         }
-        __pyx_L11_except_error:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L9_except_error:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
         goto __pyx_L1_error;
-        __pyx_L10_exception_handled:;
-        __Pyx_XGIVEREF(__pyx_t_4);
+        __pyx_L8_exception_handled:;
         __Pyx_XGIVEREF(__pyx_t_5);
         __Pyx_XGIVEREF(__pyx_t_6);
-        __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6);
-        __pyx_L16_try_end:;
+        __Pyx_XGIVEREF(__pyx_t_7);
+        __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+        __pyx_L14_try_end:;
       }
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_99, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_99, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
-    goto __pyx_L24;
-    __pyx_L5_error:;
+    goto __pyx_L23;
+    __pyx_L3_error:;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L1_error;
-    __pyx_L24:;
+    __pyx_L23:;
   }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -31819,7 +34915,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_10);
   __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
@@ -31832,7 +34928,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10write_enhanced(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":207
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":207
  *             f.write("\n")
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -31845,9 +34941,9 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__search_high");
+  __Pyx_RefNannySetupContext("__search_high", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":210
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":210
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -31857,7 +34953,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":211
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":211
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -31870,7 +34966,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":212
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":212
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -31879,7 +34975,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":213
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":213
  *             return high
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -31889,27 +34985,27 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":214
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":214
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__search_high(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
  *         else:
  *             return self.__search_high(word_id, offset, low, midpoint)
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
     goto __pyx_L0;
     goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":216
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":216
  *             return self.__search_high(word_id, offset, midpoint+1, high)
  *         else:
  *             return self.__search_high(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
  * 
  *     cdef int __search_low(self, int word_id, int offset, int low, int high):
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
     goto __pyx_L0;
   }
   __pyx_L4:;
@@ -31920,7 +35016,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":218
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":218
  *             return self.__search_high(word_id, offset, low, midpoint)
  * 
  *     cdef int __search_low(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -31933,9 +35029,9 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__search_low");
+  __Pyx_RefNannySetupContext("__search_low", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":221
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":221
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -31945,7 +35041,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":222
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":222
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -31958,7 +35054,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":223
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":223
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -31967,7 +35063,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":224
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":224
  *             return high
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -31977,27 +35073,27 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":225
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":225
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__search_low(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
  *         else:
  *             return self.__search_low(word_id, offset, midpoint+1, high)
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint);
     goto __pyx_L0;
     goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":227
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":227
  *             return self.__search_low(word_id, offset, low, midpoint)
  *         else:
  *             return self.__search_low(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  */
-    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
+    __pyx_r = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high);
     goto __pyx_L0;
   }
   __pyx_L4:;
@@ -32008,7 +35104,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":229
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":229
  *             return self.__search_low(word_id, offset, midpoint+1, high)
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):             # <<<<<<<<<<<<<<
@@ -32025,9 +35121,9 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get_range");
+  __Pyx_RefNannySetupContext("__get_range", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":230
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":230
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  *         return (self.__search_low(word_id, offset, low, midpoint),             # <<<<<<<<<<<<<<
@@ -32035,20 +35131,20 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":231
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":231
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  *         return (self.__search_low(word_id, offset, low, midpoint),
  *                 self.__search_high(word_id, offset, midpoint, high))             # <<<<<<<<<<<<<<
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):
  */
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -32073,7 +35169,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":233
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":233
  *                 self.__search_high(word_id, offset, midpoint, high))
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -32092,9 +35188,9 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__lookup_helper");
+  __Pyx_RefNannySetupContext("__lookup_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":236
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":236
  *         cdef int midpoint
  * 
  *         if offset == 0:             # <<<<<<<<<<<<<<
@@ -32104,7 +35200,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = (__pyx_v_offset == 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":237
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":237
  * 
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])             # <<<<<<<<<<<<<<
@@ -32117,7 +35213,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
     __pyx_t_3 = PyInt_FromLong((__pyx_v_self->ha->arr[(__pyx_v_word_id + 1)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -32131,7 +35227,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":238
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":238
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -32141,7 +35237,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":239
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":239
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])
  *         if low >= high:
  *             return None             # <<<<<<<<<<<<<<
@@ -32156,7 +35252,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":241
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":241
  *             return None
  * 
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -32165,7 +35261,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":242
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":242
  * 
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -32175,7 +35271,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":243
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":243
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__get_range(word_id, offset, low, high, midpoint)             # <<<<<<<<<<<<<<
@@ -32183,7 +35279,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -32192,7 +35288,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":244
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":244
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__get_range(word_id, offset, low, high, midpoint)
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] > word_id:             # <<<<<<<<<<<<<<
@@ -32202,7 +35298,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) > __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":245
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":245
  *             return self.__get_range(word_id, offset, low, high, midpoint)
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] > word_id:
  *             return self.__lookup_helper(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
@@ -32210,7 +35306,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -32219,7 +35315,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":247
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":247
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  *         else:
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
@@ -32227,7 +35323,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *     def lookup(self, word, int offset, int low, int high):
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -32249,37 +35345,23 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":249
- *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
- * 
- *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
- *         cdef int wordid
- *         if low == -1:
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_word = 0;
   int __pyx_v_offset;
   int __pyx_v_low;
   int __pyx_v_high;
-  PyObject *__pyx_v_word_id = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  int __pyx_t_4;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
-  __Pyx_RefNannySetupContext("lookup");
+  __Pyx_RefNannySetupContext("lookup (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
     PyObject* values[4] = {0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -32288,32 +35370,28 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -32336,8 +35414,33 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_22lookup(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_word, __pyx_v_offset, __pyx_v_low, __pyx_v_high);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":251
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":249
+ *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
+ * 
+ *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
+ *         cdef int wordid
+ *         if low == -1:
+ */
+
+static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high) {
+  PyObject *__pyx_v_word_id = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("lookup", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":251
  *     def lookup(self, word, int offset, int low, int high):
  *         cdef int wordid
  *         if low == -1:             # <<<<<<<<<<<<<<
@@ -32347,7 +35450,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
   __pyx_t_1 = (__pyx_v_low == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":252
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":252
  *         cdef int wordid
  *         if low == -1:
  *             low = 0             # <<<<<<<<<<<<<<
@@ -32355,11 +35458,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  *             high = len(self.sa)
  */
     __pyx_v_low = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":253
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":253
  *         if low == -1:
  *             low = 0
  *         if high == -1:             # <<<<<<<<<<<<<<
@@ -32369,45 +35472,45 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
   __pyx_t_1 = (__pyx_v_high == -1);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":254
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":254
  *             low = 0
  *         if high == -1:
  *             high = len(self.sa)             # <<<<<<<<<<<<<<
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]
  */
-    __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->sa);
+    __pyx_t_2 = ((PyObject *)__pyx_v_self->sa);
     __Pyx_INCREF(__pyx_t_2);
     __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_v_high = __pyx_t_3;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":255
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":255
  *         if high == -1:
  *             high = len(self.sa)
  *         if word in self.darray.word2id:             # <<<<<<<<<<<<<<
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)
  */
-  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->word2id, __pyx_v_word))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->darray->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":256
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":256
  *             high = len(self.sa)
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]             # <<<<<<<<<<<<<<
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  */
-    __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_word_id = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":257
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":257
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)             # <<<<<<<<<<<<<<
@@ -32416,16 +35519,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  */
     __Pyx_XDECREF(__pyx_r);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self)->__pyx_vtab)->__lookup_helper(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
     goto __pyx_L0;
-    goto __pyx_L8;
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":259
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":259
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  *             return None             # <<<<<<<<<<<<<<
@@ -32435,7 +35538,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
     __pyx_r = Py_None;
     goto __pyx_L0;
   }
-  __pyx_L8:;
+  __pyx_L5:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -32450,7 +35553,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":37
+/* Python wrapper */
+static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_8TrieNode___cinit__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":37
  *     cdef public children
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -32458,20 +35575,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_11lookup(PyObject *__pyx_v_self, Py
  * 
  */
 
-static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":38
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":38
  * 
  *     def __cinit__(self):
  *         self.children = {}             # <<<<<<<<<<<<<<
@@ -32481,9 +35594,9 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *_
   __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = ((PyObject *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->children);
+  __Pyx_DECREF(__pyx_v_self->children);
+  __pyx_v_self->children = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
   __pyx_r = 0;
@@ -32497,7 +35610,18 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":35
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children___get__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":35
  * 
  * cdef class TrieNode:
  *     cdef public children             # <<<<<<<<<<<<<<
@@ -32505,14 +35629,13 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(PyObject *__pyx_v_self, PyObject *_
  *     def __cinit__(self):
  */
 
-static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __pyx_r = ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children;
+  __Pyx_INCREF(__pyx_v_self->children);
+  __pyx_r = __pyx_v_self->children;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32522,66 +35645,85 @@ static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_8TrieNode_8children_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_8TrieNode_8children_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_8TrieNode_8children_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_8TrieNode_8children_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children_2__set__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->children);
+  __Pyx_DECREF(__pyx_v_self->children);
+  __pyx_v_self->children = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_8TrieNode_8children_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_8TrieNode_8children_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_8TrieNode_8children_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_8TrieNode_8children_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_8TrieNode_8children_4__del__(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_8TrieNode_8children_4__del__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children);
-  ((struct __pyx_obj_3_sa_TrieNode *)__pyx_v_self)->children = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->children);
+  __Pyx_DECREF(__pyx_v_self->children);
+  __pyx_v_self->children = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":45
- *     cdef public suffix_link
- * 
- *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
- *         self.phrase = phrase
- *         self.phrase_location = phrase_location
- */
-
-static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_phrase = 0;
   PyObject *__pyx_v_phrase_location = 0;
   PyObject *__pyx_v_suffix_link = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
     PyObject* values[3] = {0,0,0};
+
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":45
+ *     cdef public suffix_link
+ * 
+ *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
+ *         self.phrase = phrase
+ *         self.phrase_location = phrase_location
+ */
     values[0] = ((PyObject *)Py_None);
     values[1] = ((PyObject *)Py_None);
     values[2] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -32589,7 +35731,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__phrase);
@@ -32607,7 +35749,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -32630,8 +35772,17 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), __pyx_v_phrase, __pyx_v_phrase_location, __pyx_v_suffix_link);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_phrase, PyObject *__pyx_v_phrase_location, PyObject *__pyx_v_suffix_link) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":46
  * 
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase             # <<<<<<<<<<<<<<
@@ -32640,11 +35791,11 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  */
   __Pyx_INCREF(__pyx_v_phrase);
   __Pyx_GIVEREF(__pyx_v_phrase);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = __pyx_v_phrase;
+  __Pyx_GOTREF(__pyx_v_self->phrase);
+  __Pyx_DECREF(__pyx_v_self->phrase);
+  __pyx_v_self->phrase = __pyx_v_phrase;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":47
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":47
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location             # <<<<<<<<<<<<<<
@@ -32653,11 +35804,11 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  */
   __Pyx_INCREF(__pyx_v_phrase_location);
   __Pyx_GIVEREF(__pyx_v_phrase_location);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = __pyx_v_phrase_location;
+  __Pyx_GOTREF(__pyx_v_self->phrase_location);
+  __Pyx_DECREF(__pyx_v_self->phrase_location);
+  __pyx_v_self->phrase_location = __pyx_v_phrase_location;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":48
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":48
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location
  *         self.suffix_link = suffix_link             # <<<<<<<<<<<<<<
@@ -32666,16 +35817,27 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  */
   __Pyx_INCREF(__pyx_v_suffix_link);
   __Pyx_GIVEREF(__pyx_v_suffix_link);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = __pyx_v_suffix_link;
+  __Pyx_GOTREF(__pyx_v_self->suffix_link);
+  __Pyx_DECREF(__pyx_v_self->suffix_link);
+  __pyx_v_self->suffix_link = __pyx_v_suffix_link;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":41
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":41
  * 
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase             # <<<<<<<<<<<<<<
@@ -32683,14 +35845,13 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(PyObject *__pyx_v_self, Py
  *     cdef public suffix_link
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase;
+  __Pyx_INCREF(__pyx_v_self->phrase);
+  __pyx_r = __pyx_v_self->phrase;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32700,39 +35861,70 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(PyObject *__py
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->phrase);
+  __Pyx_DECREF(__pyx_v_self->phrase);
+  __pyx_v_self->phrase = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->phrase);
+  __Pyx_DECREF(__pyx_v_self->phrase);
+  __pyx_v_self->phrase = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":42
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":42
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase
  *     cdef public phrase_location             # <<<<<<<<<<<<<<
@@ -32740,14 +35932,13 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(PyObject *__pyx_v_s
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location;
+  __Pyx_INCREF(__pyx_v_self->phrase_location);
+  __pyx_r = __pyx_v_self->phrase_location;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32757,39 +35948,70 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(PyOb
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->phrase_location);
+  __Pyx_DECREF(__pyx_v_self->phrase_location);
+  __pyx_v_self->phrase_location = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(PyObject *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->phrase_location = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->phrase_location);
+  __Pyx_DECREF(__pyx_v_self->phrase_location);
+  __pyx_v_self->phrase_location = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":43
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":43
  *     cdef public phrase
  *     cdef public phrase_location
  *     cdef public suffix_link             # <<<<<<<<<<<<<<
@@ -32797,14 +36019,13 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(PyObject
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  */
 
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __pyx_r = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link;
+  __Pyx_INCREF(__pyx_v_self->suffix_link);
+  __pyx_r = __pyx_v_self->suffix_link;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -32814,71 +36035,79 @@ static PyObject *__pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(PyObject
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__set__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->suffix_link);
+  __Pyx_DECREF(__pyx_v_self->suffix_link);
+  __pyx_v_self->suffix_link = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_obj_3_sa_ExtendedTrieNode *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link);
-  ((struct __pyx_obj_3_sa_ExtendedTrieNode *)__pyx_v_self)->suffix_link = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->suffix_link);
+  __Pyx_DECREF(__pyx_v_self->suffix_link);
+  __pyx_v_self->suffix_link = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":55
- *     cdef public int count
- *     cdef public root
- *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
- *         self.count = 0
- *         self.extended = extended
- */
-
-static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_extended = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  int __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
     PyObject* values[1] = {0};
     values[0] = __pyx_k_100;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__extended);
@@ -32886,7 +36115,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -32905,17 +36134,40 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_9TrieTable___cinit__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), __pyx_v_extended);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":56
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":55
+ *     cdef public int count
+ *     cdef public root
+ *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
+ *         self.count = 0
+ *         self.extended = extended
+ */
+
+static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_extended) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  int __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":56
  *     cdef public root
  *     def __cinit__(self, extended=False):
  *         self.count = 0             # <<<<<<<<<<<<<<
  *         self.extended = extended
  *         if extended:
  */
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count = 0;
+  __pyx_v_self->count = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":57
  *     def __cinit__(self, extended=False):
  *         self.count = 0
  *         self.extended = extended             # <<<<<<<<<<<<<<
@@ -32923,9 +36175,9 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
  *             self.root = ExtendedTrieNode()
  */
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_extended); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended = __pyx_t_1;
+  __pyx_v_self->extended = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":58
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":58
  *         self.count = 0
  *         self.extended = extended
  *         if extended:             # <<<<<<<<<<<<<<
@@ -32935,7 +36187,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_extended); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":59
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":59
  *         self.extended = extended
  *         if extended:
  *             self.root = ExtendedTrieNode()             # <<<<<<<<<<<<<<
@@ -32945,15 +36197,15 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
     __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_t_3;
+    __Pyx_GOTREF(__pyx_v_self->root);
+    __Pyx_DECREF(__pyx_v_self->root);
+    __pyx_v_self->root = __pyx_t_3;
     __pyx_t_3 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":61
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":61
  *             self.root = ExtendedTrieNode()
  *         else:
  *             self.root = TrieNode()             # <<<<<<<<<<<<<<
@@ -32963,12 +36215,12 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
     __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-    ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_t_3;
+    __Pyx_GOTREF(__pyx_v_self->root);
+    __Pyx_DECREF(__pyx_v_self->root);
+    __pyx_v_self->root = __pyx_t_3;
     __pyx_t_3 = 0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -32981,7 +36233,18 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":52
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_8extended___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":52
  * 
  * cdef class TrieTable:
  *     cdef public int extended             # <<<<<<<<<<<<<<
@@ -32989,17 +36252,16 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(PyObject *__pyx_v_self, PyObject *
  *     cdef public root
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -33017,17 +36279,27 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_8extended_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_8extended_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_8extended_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__", 0);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->extended = __pyx_t_1;
+  __pyx_v_self->extended = __pyx_t_1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33039,7 +36311,18 @@ static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":53
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_5count___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":53
  * cdef class TrieTable:
  *     cdef public int extended
  *     cdef public int count             # <<<<<<<<<<<<<<
@@ -33047,17 +36330,16 @@ static int __pyx_pf_3_sa_9TrieTable_8extended_1__set__(PyObject *__pyx_v_self, P
  *     def __cinit__(self, extended=False):
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -33075,17 +36357,27 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_5count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_5count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_5count_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__", 0);
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->count = __pyx_t_1;
+  __pyx_v_self->count = __pyx_t_1;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33097,7 +36389,18 @@ static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":54
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root___get__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":54
  *     cdef public int extended
  *     cdef public int count
  *     cdef public root             # <<<<<<<<<<<<<<
@@ -33105,14 +36408,13 @@ static int __pyx_pf_3_sa_9TrieTable_5count_1__set__(PyObject *__pyx_v_self, PyOb
  *         self.count = 0
  */
 
-static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__get__");
+  __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  __pyx_r = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root;
+  __Pyx_INCREF(__pyx_v_self->root);
+  __pyx_r = __pyx_v_self->root;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -33122,39 +36424,59 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_4root___get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_4root_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_4root_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_4root_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_4root_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root_2__set__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_4root_2__set__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self, PyObject *__pyx_v_value) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__set__");
+  __Pyx_RefNannySetupContext("__set__", 0);
   __Pyx_INCREF(__pyx_v_value);
   __Pyx_GIVEREF(__pyx_v_value);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = __pyx_v_value;
+  __Pyx_GOTREF(__pyx_v_self->root);
+  __Pyx_DECREF(__pyx_v_self->root);
+  __pyx_v_self->root = __pyx_v_value;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self); /*proto*/
-static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_9TrieTable_4root_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_9TrieTable_4root_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9TrieTable_4root_4__del__(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTable *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__del__");
+  __Pyx_RefNannySetupContext("__del__", 0);
   __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root);
-  ((struct __pyx_obj_3_sa_TrieTable *)__pyx_v_self)->root = Py_None;
+  __Pyx_GOTREF(__pyx_v_self->root);
+  __Pyx_DECREF(__pyx_v_self->root);
+  __pyx_v_self->root = Py_None;
 
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":81
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":81
  * 
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -33162,12 +36484,12 @@ static int __pyx_pf_3_sa_9TrieTable_4root_2__del__(PyObject *__pyx_v_self) {
  * 
  */
 
-static int __pyx_f_3_sa_14PhraseLocation_contains(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sent_id) {
+static int __pyx_f_3_sa_14PhraseLocation_contains(CYTHON_UNUSED struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, CYTHON_UNUSED int __pyx_v_sent_id) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("contains");
+  __Pyx_RefNannySetupContext("contains", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":82
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":82
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):
  *         return 1             # <<<<<<<<<<<<<<
@@ -33183,16 +36505,9 @@ static int __pyx_f_3_sa_14PhraseLocation_contains(struct __pyx_obj_3_sa_PhraseLo
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":84
- *         return 1
- * 
- *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
- *             arr=None, int num_subpatterns=1):
- *         self.sa_low = sa_low
- */
-
-static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_sa_low;
   int __pyx_v_sa_high;
   int __pyx_v_arr_low;
@@ -33201,15 +36516,12 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
   int __pyx_v_num_subpatterns;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
     PyObject* values[6] = {0,0,0,0,0,0};
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":85
  * 
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):             # <<<<<<<<<<<<<<
@@ -33219,7 +36531,8 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
     values[4] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -33230,7 +36543,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
         if (kw_args > 0) {
           PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sa_low);
@@ -33263,7 +36576,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -33312,44 +36625,64 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_14PhraseLocation___cinit__(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self), __pyx_v_sa_low, __pyx_v_sa_high, __pyx_v_arr_low, __pyx_v_arr_high, __pyx_v_arr, __pyx_v_num_subpatterns);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":84
+ *         return 1
+ * 
+ *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
+ *             arr=None, int num_subpatterns=1):
+ *         self.sa_low = sa_low
+ */
+
+static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_self, int __pyx_v_sa_low, int __pyx_v_sa_high, int __pyx_v_arr_low, int __pyx_v_arr_high, PyObject *__pyx_v_arr, int __pyx_v_num_subpatterns) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":86
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":86
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low             # <<<<<<<<<<<<<<
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->sa_low = __pyx_v_sa_low;
+  __pyx_v_self->sa_low = __pyx_v_sa_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":87
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high             # <<<<<<<<<<<<<<
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->sa_high = __pyx_v_sa_high;
+  __pyx_v_self->sa_high = __pyx_v_sa_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":88
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low             # <<<<<<<<<<<<<<
  *         self.arr_high = arr_high
  *         self.arr = arr
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr_low = __pyx_v_arr_low;
+  __pyx_v_self->arr_low = __pyx_v_arr_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":89
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":89
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high             # <<<<<<<<<<<<<<
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr_high = __pyx_v_arr_high;
+  __pyx_v_self->arr_high = __pyx_v_arr_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":90
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":90
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  *         self.arr = arr             # <<<<<<<<<<<<<<
@@ -33359,18 +36692,18 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
   if (!(likely(((__pyx_v_arr) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_arr, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_arr);
   __Pyx_GIVEREF(__pyx_v_arr);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr));
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
+  __Pyx_GOTREF(__pyx_v_self->arr);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->arr));
+  __pyx_v_self->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":91
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":91
  *         self.arr_high = arr_high
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_self)->num_subpatterns = __pyx_v_num_subpatterns;
+  __pyx_v_self->num_subpatterns = __pyx_v_num_subpatterns;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33382,54 +36715,39 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":101
- *     cdef IntList sa
- * 
- *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
- *         self.sample_size = sample_size
- *         self.sa = fsarray.sa
- */
-
-static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_sample_size;
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray = 0;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_size);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_size)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -33449,17 +36767,45 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_7Sampler___cinit__(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), __pyx_v_sample_size, __pyx_v_fsarray);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":101
+ *     cdef IntList sa
+ * 
+ *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
+ *         self.sample_size = sample_size
+ *         self.sa = fsarray.sa
+ */
+
+static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, int __pyx_v_sample_size, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":102
  * 
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size             # <<<<<<<<<<<<<<
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  */
-  ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size = __pyx_v_sample_size;
+  __pyx_v_self->sample_size = __pyx_v_sample_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":103
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa             # <<<<<<<<<<<<<<
@@ -33468,11 +36814,11 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray->sa));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray->sa));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa));
-  ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa = __pyx_v_fsarray->sa;
+  __Pyx_GOTREF(__pyx_v_self->sa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
+  __pyx_v_self->sa = __pyx_v_fsarray->sa;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":104
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa
  *         if sample_size > 0:             # <<<<<<<<<<<<<<
@@ -33482,7 +36828,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
   __pyx_t_1 = (__pyx_v_sample_size > 0);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":105
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)             # <<<<<<<<<<<<<<
@@ -33497,7 +36843,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
     __pyx_t_2 = PyInt_FromLong(__pyx_v_sample_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_101));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_101));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_101));
@@ -33509,11 +36855,11 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":107
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":107
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
@@ -33530,7 +36876,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -33545,7 +36891,24 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":109
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location); /*proto*/
+static char __pyx_doc_3_sa_7Sampler_2sample[] = "Returns a sample of the locations for\n        the phrase.    If there are less than self.sample_size\n        locations, return all of them; otherwise, return\n        up to self.sample_size locations.    In the latter case,\n        we choose to sample UNIFORMLY -- that is, the locations\n        are chosen at uniform intervals over the entire set, rather\n        than randomly.    This makes the algorithm deterministic, which\n        is good for things like MERT";
+static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("sample (wrapper)", 0);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_7Sampler_2sample(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location));
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":109
  *             logger.info("Sampling strategy: no sampling")
  * 
  *     def sample(self, PhraseLocation phrase_location):             # <<<<<<<<<<<<<<
@@ -33553,9 +36916,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(PyObject *__pyx_v_self, PyObject *__
  *         the phrase.    If there are less than self.sample_size
  */
 
-static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location); /*proto*/
-static char __pyx_doc_3_sa_7Sampler_1sample[] = "Returns a sample of the locations for\n        the phrase.    If there are less than self.sample_size\n        locations, return all of them; otherwise, return\n        up to self.sample_size locations.    In the latter case,\n        we choose to sample UNIFORMLY -- that is, the locations\n        are chosen at uniform intervals over the entire set, rather\n        than randomly.    This makes the algorithm deterministic, which\n        is good for things like MERT";
-static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase_location) {
+static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_phrase_location) {
   struct __pyx_obj_3_sa_IntList *__pyx_v_sample = 0;
   double __pyx_v_i;
   double __pyx_v_stepsize;
@@ -33572,10 +36933,9 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sample");
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_RefNannySetupContext("sample", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":122
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":122
  *         cdef int num_locations, val, j
  * 
  *         sample = IntList()             # <<<<<<<<<<<<<<
@@ -33587,76 +36947,76 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
   __pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":123
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":123
  * 
  *         sample = IntList()
  *         if phrase_location.arr is None:             # <<<<<<<<<<<<<<
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  */
-  __pyx_t_2 = (((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr) == Py_None);
+  __pyx_t_2 = (((PyObject *)__pyx_v_phrase_location->arr) == Py_None);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":124
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":124
  *         sample = IntList()
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low             # <<<<<<<<<<<<<<
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  */
-    __pyx_v_num_locations = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_high - ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low);
+    __pyx_v_num_locations = (__pyx_v_phrase_location->sa_high - __pyx_v_phrase_location->sa_low);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":125
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":125
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  */
-    __pyx_t_2 = (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size == -1);
+    __pyx_t_2 = (__pyx_v_self->sample_size == -1);
     if (!__pyx_t_2) {
-      __pyx_t_3 = (__pyx_v_num_locations <= ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
+      __pyx_t_3 = (__pyx_v_num_locations <= __pyx_v_self->sample_size);
       __pyx_t_4 = __pyx_t_3;
     } else {
       __pyx_t_4 = __pyx_t_2;
     }
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":126
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":126
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)             # <<<<<<<<<<<<<<
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  */
-      ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa->arr + ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low), __pyx_v_num_locations);
-      goto __pyx_L6;
+      ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_self->sa->arr + __pyx_v_phrase_location->sa_low), __pyx_v_num_locations);
+      goto __pyx_L4;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":128
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":128
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:
  */
-      if (unlikely(((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size) == 0)) {
+      if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size));
+      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":129
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":129
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low             # <<<<<<<<<<<<<<
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:
  *                     '''Note: int(i) not guaranteed to have the desired
  */
-      __pyx_v_i = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_low;
+      __pyx_v_i = __pyx_v_phrase_location->sa_low;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":130
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":130
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:             # <<<<<<<<<<<<<<
@@ -33664,16 +37024,16 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  *                     effect, according to the python documentation'''
  */
       while (1) {
-        __pyx_t_4 = (__pyx_v_i < ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->sa_high);
+        __pyx_t_4 = (__pyx_v_i < __pyx_v_phrase_location->sa_high);
         if (__pyx_t_4) {
-          __pyx_t_2 = (__pyx_v_sample->len < ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
+          __pyx_t_2 = (__pyx_v_sample->len < __pyx_v_self->sample_size);
           __pyx_t_3 = __pyx_t_2;
         } else {
           __pyx_t_3 = __pyx_t_4;
         }
         if (!__pyx_t_3) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":133
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":133
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -33683,7 +37043,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_t_3 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":134
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":134
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -33691,11 +37051,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  *                         val = int(floor(i))
  */
           __pyx_v_val = ((int)ceil(__pyx_v_i));
-          goto __pyx_L9;
+          goto __pyx_L7;
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":136
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":136
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -33704,18 +37064,18 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  */
           __pyx_v_val = ((int)floor(__pyx_v_i));
         }
-        __pyx_L9:;
+        __pyx_L7:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":137
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":137
  *                     else:
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])             # <<<<<<<<<<<<<<
  *                     i = i + stepsize
  *         else:
  */
-        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sa->arr[__pyx_v_val]));
+        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (__pyx_v_self->sa->arr[__pyx_v_val]));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":138
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":138
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -33725,82 +37085,82 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_v_i = (__pyx_v_i + __pyx_v_stepsize);
       }
     }
-    __pyx_L6:;
-    goto __pyx_L5;
+    __pyx_L4:;
+    goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":140
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":140
  *                     i = i + stepsize
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns             # <<<<<<<<<<<<<<
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr
  */
-    __pyx_t_5 = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_high - ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low);
-    if (unlikely(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns == 0)) {
+    __pyx_t_5 = (__pyx_v_phrase_location->arr_high - __pyx_v_phrase_location->arr_low);
+    if (unlikely(__pyx_v_phrase_location->num_subpatterns == 0)) {
       PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    else if (sizeof(int) == sizeof(long) && unlikely(((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
+    else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_phrase_location->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
       PyErr_Format(PyExc_OverflowError, "value too large to perform division");
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns);
+    __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, __pyx_v_phrase_location->num_subpatterns);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":141
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":141
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
  *                 sample = phrase_location.arr
  *             else:
  */
-    __pyx_t_3 = (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size == -1);
+    __pyx_t_3 = (__pyx_v_self->sample_size == -1);
     if (!__pyx_t_3) {
-      __pyx_t_4 = (__pyx_v_num_locations <= ((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size);
+      __pyx_t_4 = (__pyx_v_num_locations <= __pyx_v_self->sample_size);
       __pyx_t_2 = __pyx_t_4;
     } else {
       __pyx_t_2 = __pyx_t_3;
     }
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":142
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":142
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr             # <<<<<<<<<<<<<<
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  */
-      __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr));
+      __Pyx_INCREF(((PyObject *)__pyx_v_phrase_location->arr));
       __Pyx_DECREF(((PyObject *)__pyx_v_sample));
-      __pyx_v_sample = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr;
-      goto __pyx_L10;
+      __pyx_v_sample = __pyx_v_phrase_location->arr;
+      goto __pyx_L8;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":144
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":144
  *                 sample = phrase_location.arr
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:
  */
-      if (unlikely(((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size) == 0)) {
+      if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size));
+      __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":145
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":145
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low             # <<<<<<<<<<<<<<
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:
  *                     '''Note: int(i) not guaranteed to have the desired
  */
-      __pyx_v_i = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low;
+      __pyx_v_i = __pyx_v_phrase_location->arr_low;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":146
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":146
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -33810,14 +37170,14 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
       while (1) {
         __pyx_t_2 = (__pyx_v_i < __pyx_v_num_locations);
         if (__pyx_t_2) {
-          __pyx_t_3 = (__pyx_v_sample->len < (((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self)->sample_size * ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns));
+          __pyx_t_3 = (__pyx_v_sample->len < (__pyx_v_self->sample_size * __pyx_v_phrase_location->num_subpatterns));
           __pyx_t_4 = __pyx_t_3;
         } else {
           __pyx_t_4 = __pyx_t_2;
         }
         if (!__pyx_t_4) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":149
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":149
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -33827,7 +37187,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_t_4 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":150
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":150
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -33835,11 +37195,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  *                         val = int(floor(i))
  */
           __pyx_v_val = ((int)ceil(__pyx_v_i));
-          goto __pyx_L13;
+          goto __pyx_L11;
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":152
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":152
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -33848,27 +37208,27 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
  */
           __pyx_v_val = ((int)floor(__pyx_v_i));
         }
-        __pyx_L13:;
+        __pyx_L11:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":153
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":153
  *                     else:
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  */
-        __pyx_v_j = (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr_low + (__pyx_v_val * ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns));
+        __pyx_v_j = (__pyx_v_phrase_location->arr_low + (__pyx_v_val * __pyx_v_phrase_location->num_subpatterns));
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":154
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":154
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
  *                     i = i + stepsize
  *         return sample
  */
-        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->arr->arr + __pyx_v_j), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location)->num_subpatterns);
+        ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_phrase_location->arr->arr + __pyx_v_j), __pyx_v_phrase_location->num_subpatterns);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":155
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":155
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -33878,11 +37238,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
         __pyx_v_i = (__pyx_v_i + __pyx_v_stepsize);
       }
     }
-    __pyx_L10:;
+    __pyx_L8:;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":156
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":156
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  *         return sample             # <<<<<<<<<<<<<<
@@ -33907,7 +37267,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":168
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":168
  * 
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):             # <<<<<<<<<<<<<<
@@ -33917,9 +37277,9 @@ static PyObject *__pyx_pf_3_sa_7Sampler_1sample(PyObject *__pyx_v_self, PyObject
 
 static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m, int *__pyx_v_arr, int __pyx_v_start, int __pyx_v_step, int *__pyx_v_sent_id_arr) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("assign_matching");
+  __Pyx_RefNannySetupContext("assign_matching", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":169
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr             # <<<<<<<<<<<<<<
@@ -33928,7 +37288,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->arr = __pyx_v_arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":170
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":170
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr
  *     m.start = start             # <<<<<<<<<<<<<<
@@ -33937,7 +37297,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->start = __pyx_v_start;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":171
  *     m.arr = arr
  *     m.start = start
  *     m.end = start + step             # <<<<<<<<<<<<<<
@@ -33946,7 +37306,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->end = (__pyx_v_start + __pyx_v_step);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":172
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":172
  *     m.start = start
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]             # <<<<<<<<<<<<<<
@@ -33955,7 +37315,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->sent_id = (__pyx_v_sent_id_arr[(__pyx_v_arr[__pyx_v_start])]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":173
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":173
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]
  *     m.size = step             # <<<<<<<<<<<<<<
@@ -33967,7 +37327,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":176
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":176
  * 
  * 
  * cdef int* append_combined_matching(int* arr, Matching* loc1, Matching* loc2,             # <<<<<<<<<<<<<<
@@ -33975,16 +37335,16 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  *     cdef int i, new_len
  */
 
-static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx_t_3_sa_Matching *__pyx_v_loc1, struct __pyx_t_3_sa_Matching *__pyx_v_loc2, int __pyx_v_offset_by_one, int __pyx_v_num_subpatterns, int *__pyx_v_result_len) {
+static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx_t_3_sa_Matching *__pyx_v_loc1, struct __pyx_t_3_sa_Matching *__pyx_v_loc2, CYTHON_UNUSED int __pyx_v_offset_by_one, int __pyx_v_num_subpatterns, int *__pyx_v_result_len) {
   int __pyx_v_i;
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_RefNannySetupContext("append_combined_matching");
+  __Pyx_RefNannySetupContext("append_combined_matching", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":180
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":180
  *     cdef int i, new_len
  * 
  *     new_len = result_len[0] + num_subpatterns             # <<<<<<<<<<<<<<
@@ -33993,7 +37353,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_new_len = ((__pyx_v_result_len[0]) + __pyx_v_num_subpatterns);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":181
  * 
  *     new_len = result_len[0] + num_subpatterns
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -34002,7 +37362,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":183
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  * 
  *     for i from 0 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -34012,7 +37372,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_1 = __pyx_v_loc1->size;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":184
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":184
  * 
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]             # <<<<<<<<<<<<<<
@@ -34022,7 +37382,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
     (__pyx_v_arr[((__pyx_v_result_len[0]) + __pyx_v_i)]) = (__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":185
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:             # <<<<<<<<<<<<<<
@@ -34032,7 +37392,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_2 = (__pyx_v_num_subpatterns > __pyx_v_loc1->size);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":186
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":186
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]             # <<<<<<<<<<<<<<
@@ -34044,7 +37404,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":187
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":187
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -34053,7 +37413,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   (__pyx_v_result_len[0]) = __pyx_v_new_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":188
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":188
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -34069,7 +37429,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":191
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":191
  * 
  * 
  * cdef int* extend_arr(int* arr, int* arr_len, int* appendix, int appendix_len):             # <<<<<<<<<<<<<<
@@ -34081,9 +37441,9 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("extend_arr");
+  __Pyx_RefNannySetupContext("extend_arr", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":194
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":194
  *     cdef int new_len
  * 
  *     new_len = arr_len[0] + appendix_len             # <<<<<<<<<<<<<<
@@ -34092,7 +37452,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_appendix_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":195
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":195
  * 
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -34101,7 +37461,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":196
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":196
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -34110,7 +37470,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_appendix, (__pyx_v_appendix_len * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":197
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":197
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -34119,7 +37479,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":198
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -34135,7 +37495,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":200
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":200
  *     return arr
  * 
  * cdef int median(int low, int high, int step):             # <<<<<<<<<<<<<<
@@ -34150,9 +37510,9 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("median");
+  __Pyx_RefNannySetupContext("median", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":201
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":201
  * 
  * cdef int median(int low, int high, int step):
  *     return low + (((high - low)/step)/2)*step             # <<<<<<<<<<<<<<
@@ -34181,7 +37541,7 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":204
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":204
  * 
  * 
  * cdef void find_comparable_matchings(int low, int high, int* arr, int step, int loc, int* loc_minus, int* loc_plus):             # <<<<<<<<<<<<<<
@@ -34194,9 +37554,9 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("find_comparable_matchings");
+  __Pyx_RefNannySetupContext("find_comparable_matchings", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":208
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":208
  *     # in which all matchings have the same first index as the one
  *     # starting at loc
  *     loc_plus[0] = loc + step             # <<<<<<<<<<<<<<
@@ -34205,7 +37565,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_plus[0]) = (__pyx_v_loc + __pyx_v_step);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":209
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":209
  *     # starting at loc
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -34222,7 +37582,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":210
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":210
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step             # <<<<<<<<<<<<<<
@@ -34232,7 +37592,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     (__pyx_v_loc_plus[0]) = ((__pyx_v_loc_plus[0]) + __pyx_v_step);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":211
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":211
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc             # <<<<<<<<<<<<<<
@@ -34241,7 +37601,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_minus[0]) = __pyx_v_loc;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":212
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":212
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -34258,7 +37618,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_2) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":213
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":213
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:
  *         loc_minus[0] = loc_minus[0] - step             # <<<<<<<<<<<<<<
@@ -34271,16 +37631,9 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":265
- *     cdef IntList findexes1
- * 
- *     def __cinit__(self,             # <<<<<<<<<<<<<<
- *             # compiled alignment object (REQUIRED)
- *             Alignment alignment,
- */
-
-static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment = 0;
   float __pyx_v_by_slack_factor;
   char *__pyx_v_category;
@@ -34304,21 +37657,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   int __pyx_v_use_index;
   int __pyx_r;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_104,&__pyx_n_s_105,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
-  __Pyx_RefNannySetupContext("__cinit__");
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_104,&__pyx_n_s_105,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
     PyObject* values[21] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":273
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":273
  *             char* category="[X]",
  *             # maximum number of contiguous chunks of terminal symbols in RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_chunks=None,             # <<<<<<<<<<<<<<
@@ -34327,7 +37671,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
     values[3] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":281
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":281
  *             unsigned max_nonterminals=2,
  *             # maximum number of contiguous chunks of terminal symbols in target-side RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_target_chunks=None,             # <<<<<<<<<<<<<<
@@ -34336,7 +37680,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
     values[7] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":283
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":283
  *             max_target_chunks=None,
  *             # maximum number of target side symbols (both T and NT) allowed in a rule. If None, defaults to max_initial_size
  *             max_target_length=None,             # <<<<<<<<<<<<<<
@@ -34345,7 +37689,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
     values[8] = ((PyObject *)Py_None);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":287
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":287
  *             unsigned min_gap_size=2,
  *             # filename of file containing precomputed collocations
  *             precompute_file=None,             # <<<<<<<<<<<<<<
@@ -34355,7 +37699,8 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
     values[10] = ((PyObject *)Py_None);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case 21: values[20] = PyTuple_GET_ITEM(__pyx_args, 20);
         case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);
         case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
@@ -34381,10 +37726,9 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
         if (kw_args > 0) {
@@ -34488,7 +37832,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -34519,10 +37863,10 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
     }
     __pyx_v_alignment = ((struct __pyx_obj_3_sa_Alignment *)values[0]);
     if (values[1]) {
-      __pyx_v_by_slack_factor = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_by_slack_factor = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":269
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":269
  *             Alignment alignment,
  *             # parameter for double-binary search; doesn't seem to matter much
  *             float by_slack_factor=1.0,             # <<<<<<<<<<<<<<
@@ -34574,7 +37918,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_require_aligned_terminal = __Pyx_PyObject_IsTrue(values[13]); if (unlikely((__pyx_v_require_aligned_terminal == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":293
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":293
  *             unsigned precompute_rank=100,
  *             # require extracted rules to have at least one aligned word
  *             bint require_aligned_terminal=True,             # <<<<<<<<<<<<<<
@@ -34587,7 +37931,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_require_aligned_chunks = __Pyx_PyObject_IsTrue(values[14]); if (unlikely((__pyx_v_require_aligned_chunks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":295
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":295
  *             bint require_aligned_terminal=True,
  *             # require each contiguous chunk of extracted rules to have at least one aligned word
  *             bint require_aligned_chunks=False,             # <<<<<<<<<<<<<<
@@ -34610,7 +37954,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_tight_phrases = __Pyx_PyObject_IsTrue(values[17]); if (unlikely((__pyx_v_tight_phrases == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":301
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":301
  *             unsigned train_min_gap_size=2,
  *             # True if phrases should be tight, False otherwise (False == slower but better results)
  *             bint tight_phrases=False,             # <<<<<<<<<<<<<<
@@ -34623,7 +37967,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_use_baeza_yates = __Pyx_PyObject_IsTrue(values[18]); if (unlikely((__pyx_v_use_baeza_yates == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":303
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":303
  *             bint tight_phrases=False,
  *             # True to require use of double-binary alg, false otherwise
  *             bint use_baeza_yates=True,             # <<<<<<<<<<<<<<
@@ -34636,7 +37980,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_use_collocations = __Pyx_PyObject_IsTrue(values[19]); if (unlikely((__pyx_v_use_collocations == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":305
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":305
  *             bint use_baeza_yates=True,
  *             # True to enable used of precomputed collocations
  *             bint use_collocations=True,             # <<<<<<<<<<<<<<
@@ -34649,7 +37993,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
       __pyx_v_use_index = __Pyx_PyObject_IsTrue(values[20]); if (unlikely((__pyx_v_use_index == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":307
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":307
  *             bint use_collocations=True,
  *             # True to enable use of precomputed inverted indices
  *             bint use_index=True):             # <<<<<<<<<<<<<<
@@ -34668,8 +38012,36 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_alignment), __pyx_ptype_3_sa_Alignment, 1, "alignment", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_alignment, __pyx_v_by_slack_factor, __pyx_v_category, __pyx_v_max_chunks, __pyx_v_max_initial_size, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_max_target_chunks, __pyx_v_max_target_length, __pyx_v_min_gap_size, __pyx_v_precompute_file, __pyx_v_precompute_secondary_rank, __pyx_v_precompute_rank, __pyx_v_require_aligned_terminal, __pyx_v_require_aligned_chunks, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size, __pyx_v_tight_phrases, __pyx_v_use_baeza_yates, __pyx_v_use_collocations, __pyx_v_use_index);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":265
+ *     cdef IntList findexes1
+ * 
+ *     def __cinit__(self,             # <<<<<<<<<<<<<<
+ *             # compiled alignment object (REQUIRED)
+ *             Alignment alignment,
+ */
+
+static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_Alignment *__pyx_v_alignment, float __pyx_v_by_slack_factor, char *__pyx_v_category, PyObject *__pyx_v_max_chunks, unsigned int __pyx_v_max_initial_size, unsigned int __pyx_v_max_length, unsigned int __pyx_v_max_nonterminals, PyObject *__pyx_v_max_target_chunks, PyObject *__pyx_v_max_target_length, unsigned int __pyx_v_min_gap_size, PyObject *__pyx_v_precompute_file, unsigned int __pyx_v_precompute_secondary_rank, unsigned int __pyx_v_precompute_rank, int __pyx_v_require_aligned_terminal, int __pyx_v_require_aligned_chunks, unsigned int __pyx_v_train_max_initial_size, unsigned int __pyx_v_train_min_gap_size, int __pyx_v_tight_phrases, int __pyx_v_use_baeza_yates, int __pyx_v_use_collocations, int __pyx_v_use_index) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_t_3;
+  int __pyx_t_4;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":313
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":313
  *         respectively.    This is because Chiang's model does not require
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache             # <<<<<<<<<<<<<<
@@ -34679,7 +38051,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -34687,12 +38059,12 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->rules);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->rules));
+  __pyx_v_self->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":314
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":314
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
@@ -34705,16 +38077,16 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __Pyx_GOTREF(__pyx_t_2);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->rules->root = __pyx_t_2;
+  __Pyx_GOTREF(__pyx_v_self->rules->root);
+  __Pyx_DECREF(__pyx_v_self->rules->root);
+  __pyx_v_self->rules->root = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":315
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":315
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:             # <<<<<<<<<<<<<<
@@ -34724,7 +38096,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (((PyObject *)__pyx_v_alignment) == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":316
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":316
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
@@ -34736,11 +38108,11 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":317
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":317
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")
  *         self.alignment = alignment             # <<<<<<<<<<<<<<
@@ -34749,94 +38121,74 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_alignment));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_alignment));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->alignment = __pyx_v_alignment;
+  __Pyx_GOTREF(__pyx_v_self->alignment);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->alignment));
+  __pyx_v_self->alignment = __pyx_v_alignment;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":321
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":321
  *         # grammar parameters and settings
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length = __pyx_v_max_length;
+  __pyx_v_self->max_length = __pyx_v_max_length;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":322
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":322
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals = __pyx_v_max_nonterminals;
+  __pyx_v_self->max_nonterminals = __pyx_v_max_nonterminals;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":323
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":323
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size             # <<<<<<<<<<<<<<
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size = __pyx_v_max_initial_size;
+  __pyx_v_self->max_initial_size = __pyx_v_max_initial_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":324
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":324
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size = __pyx_v_train_max_initial_size;
+  __pyx_v_self->train_max_initial_size = __pyx_v_train_max_initial_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":325
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":325
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size             # <<<<<<<<<<<<<<
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->min_gap_size = __pyx_v_min_gap_size;
+  __pyx_v_self->min_gap_size = __pyx_v_min_gap_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":326
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":326
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size             # <<<<<<<<<<<<<<
  *         self.category = sym_fromstring(category, False)
  * 
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size = __pyx_v_train_min_gap_size;
+  __pyx_v_self->train_min_gap_size = __pyx_v_train_min_gap_size;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":327
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":327
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)             # <<<<<<<<<<<<<<
  * 
  *         if max_chunks is None:
  */
-  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = PyBytes_FromString(__pyx_v_category); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_4 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-  PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4);
-  __Pyx_GIVEREF(__pyx_t_4);
-  __pyx_t_1 = 0;
-  __pyx_t_4 = 0;
-  __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-  __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_4); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category = __pyx_t_6;
+  __pyx_v_self->category = __pyx_f_3_sa_sym_fromstring(__pyx_v_category, 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":329
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":329
  *         self.category = sym_fromstring(category, False)
  * 
  *         if max_chunks is None:             # <<<<<<<<<<<<<<
@@ -34846,31 +38198,31 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (__pyx_v_max_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":330
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":330
  * 
  *         if max_chunks is None:
  *             self.max_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_chunks = max_chunks
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_chunks = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals + 1);
-    goto __pyx_L7;
+    __pyx_v_self->max_chunks = (__pyx_v_self->max_nonterminals + 1);
+    goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":332
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":332
  *             self.max_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_chunks = max_chunks             # <<<<<<<<<<<<<<
  * 
  *         if max_target_chunks is None:
  */
-    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_chunks = __pyx_t_6;
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_self->max_chunks = __pyx_t_4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":334
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":334
  *             self.max_chunks = max_chunks
  * 
  *         if max_target_chunks is None:             # <<<<<<<<<<<<<<
@@ -34880,31 +38232,31 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (__pyx_v_max_target_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":335
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":335
  * 
  *         if max_target_chunks is None:
  *             self.max_target_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_target_chunks = max_target_chunks
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_chunks = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals + 1);
-    goto __pyx_L8;
+    __pyx_v_self->max_target_chunks = (__pyx_v_self->max_nonterminals + 1);
+    goto __pyx_L5;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":337
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":337
  *             self.max_target_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_target_chunks = max_target_chunks             # <<<<<<<<<<<<<<
  * 
  *         if max_target_length is None:
  */
-    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_chunks = __pyx_t_6;
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_self->max_target_chunks = __pyx_t_4;
   }
-  __pyx_L8:;
+  __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":339
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":339
  *             self.max_target_chunks = max_target_chunks
  * 
  *         if max_target_length is None:             # <<<<<<<<<<<<<<
@@ -34914,94 +38266,94 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   __pyx_t_3 = (__pyx_v_max_target_length == Py_None);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":340
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":340
  * 
  *         if max_target_length is None:
  *             self.max_target_length = max_initial_size             # <<<<<<<<<<<<<<
  *         else:
  *             self.max_target_length = max_target_length
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_length = __pyx_v_max_initial_size;
-    goto __pyx_L9;
+    __pyx_v_self->max_target_length = __pyx_v_max_initial_size;
+    goto __pyx_L6;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":342
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":342
  *             self.max_target_length = max_initial_size
  *         else:
  *             self.max_target_length = max_target_length             # <<<<<<<<<<<<<<
  * 
  *         # algorithmic parameters and settings
  */
-    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_target_length = __pyx_t_6;
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_self->max_target_length = __pyx_t_4;
   }
-  __pyx_L9:;
+  __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":345
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":345
  * 
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}             # <<<<<<<<<<<<<<
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  */
-  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations = ((PyObject *)__pyx_t_4);
-  __pyx_t_4 = 0;
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
+  __Pyx_DECREF(__pyx_v_self->precomputed_collocations);
+  __pyx_v_self->precomputed_collocations = ((PyObject *)__pyx_t_2);
+  __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":346
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":346
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}             # <<<<<<<<<<<<<<
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations
  */
-  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index = ((PyObject *)__pyx_t_4);
-  __pyx_t_4 = 0;
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_v_self->precomputed_index);
+  __Pyx_DECREF(__pyx_v_self->precomputed_index);
+  __pyx_v_self->precomputed_index = ((PyObject *)__pyx_t_2);
+  __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":347
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":347
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}
  *         self.use_index = use_index             # <<<<<<<<<<<<<<
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_index = __pyx_v_use_index;
+  __pyx_v_self->use_index = __pyx_v_use_index;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":348
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":348
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations             # <<<<<<<<<<<<<<
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_collocations = __pyx_v_use_collocations;
+  __pyx_v_self->use_collocations = __pyx_v_use_collocations;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":349
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":349
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}             # <<<<<<<<<<<<<<
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  */
-  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_rank = ((PyObject *)__pyx_t_4);
-  __pyx_t_4 = 0;
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_v_self->max_rank);
+  __Pyx_DECREF(__pyx_v_self->max_rank);
+  __pyx_v_self->max_rank = ((PyObject *)__pyx_t_2);
+  __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":350
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":350
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file             # <<<<<<<<<<<<<<
@@ -35010,47 +38362,47 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   __Pyx_INCREF(__pyx_v_precompute_file);
   __Pyx_GIVEREF(__pyx_v_precompute_file);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file = __pyx_v_precompute_file;
+  __Pyx_GOTREF(__pyx_v_self->precompute_file);
+  __Pyx_DECREF(__pyx_v_self->precompute_file);
+  __pyx_v_self->precompute_file = __pyx_v_precompute_file;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":351
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":351
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_rank = __pyx_v_precompute_rank;
+  __pyx_v_self->precompute_rank = __pyx_v_precompute_rank;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":352
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":352
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
+  __pyx_v_self->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":353
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":353
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates             # <<<<<<<<<<<<<<
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_baeza_yates = __pyx_v_use_baeza_yates;
+  __pyx_v_self->use_baeza_yates = __pyx_v_use_baeza_yates;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":354
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":354
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor             # <<<<<<<<<<<<<<
  *         if tight_phrases:
  *             self.tight_phrases = 1
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->by_slack_factor = __pyx_v_by_slack_factor;
+  __pyx_v_self->by_slack_factor = __pyx_v_by_slack_factor;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":355
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":355
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:             # <<<<<<<<<<<<<<
@@ -35059,30 +38411,30 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   if (__pyx_v_tight_phrases) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":356
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":356
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  *             self.tight_phrases = 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.tight_phrases = 0
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->tight_phrases = 1;
-    goto __pyx_L10;
+    __pyx_v_self->tight_phrases = 1;
+    goto __pyx_L7;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":358
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":358
  *             self.tight_phrases = 1
  *         else:
  *             self.tight_phrases = 0             # <<<<<<<<<<<<<<
  * 
  *         if require_aligned_chunks:
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->tight_phrases = 0;
+    __pyx_v_self->tight_phrases = 0;
   }
-  __pyx_L10:;
+  __pyx_L7:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":360
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":360
  *             self.tight_phrases = 0
  * 
  *         if require_aligned_chunks:             # <<<<<<<<<<<<<<
@@ -35091,27 +38443,27 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   if (__pyx_v_require_aligned_chunks) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":362
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":362
  *         if require_aligned_chunks:
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 1;
+    __pyx_v_self->require_aligned_chunks = 1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":363
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":363
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 1;
-    goto __pyx_L11;
+    __pyx_v_self->require_aligned_terminal = 1;
+    goto __pyx_L8;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":364
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":364
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -35120,48 +38472,48 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   if (__pyx_v_require_aligned_terminal) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":365
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":365
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 1
  *         else:
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 0;
+    __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":366
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":366
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
  *         else:
  *             self.require_aligned_chunks = 0
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 1;
-    goto __pyx_L11;
+    __pyx_v_self->require_aligned_terminal = 1;
+    goto __pyx_L8;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":368
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":368
  *             self.require_aligned_terminal = 1
  *         else:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
  *             self.require_aligned_terminal = 0
  * 
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_chunks = 0;
+    __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":369
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":369
  *         else:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 0             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->require_aligned_terminal = 0;
+    __pyx_v_self->require_aligned_terminal = 0;
   }
-  __pyx_L11:;
+  __pyx_L8:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":373
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":373
  * 
  *         # diagnostics
  *         self.prev_norm_prefix = ()             # <<<<<<<<<<<<<<
@@ -35170,55 +38522,53 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
  */
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
+  __Pyx_GOTREF(__pyx_v_self->prev_norm_prefix);
+  __Pyx_DECREF(__pyx_v_self->prev_norm_prefix);
+  __pyx_v_self->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":375
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":375
  *         self.prev_norm_prefix = ()
  * 
  *         self.findexes = IntList(initial_len=10)             # <<<<<<<<<<<<<<
  *         self.findexes1 = IntList(initial_len=10)
  * 
  */
-  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-  if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_5 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
-  __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-  __Pyx_GIVEREF(__pyx_t_5);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
-  __pyx_t_5 = 0;
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->findexes);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->findexes));
+  __pyx_v_self->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":376
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":376
  * 
  *         self.findexes = IntList(initial_len=10)
  *         self.findexes1 = IntList(initial_len=10)             # <<<<<<<<<<<<<<
  * 
  *     def configure(self, SuffixArray fsarray, DataArray edarray,
  */
-  __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-  if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
-  __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-  __Pyx_GIVEREF(__pyx_t_4);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_4);
-  __pyx_t_4 = 0;
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->findexes1);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->findexes1));
+  __pyx_v_self->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __pyx_t_2 = 0;
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_5);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   __pyx_L0:;
@@ -35226,35 +38576,24 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":378
- *         self.findexes1 = IntList(initial_len=10)
- * 
- *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
- *             Sampler sampler, Scorer scorer):
- *         '''This gives the RuleFactory access to the Context object.
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_23HieroCachingRuleFactory_1configure[] = "This gives the RuleFactory access to the Context object.\n        Here we also use it to precompute the most expensive intersections\n        in the corpus quickly.";
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_23HieroCachingRuleFactory_2configure[] = "This gives the RuleFactory access to the Context object.\n        Here we also use it to precompute the most expensive intersections\n        in the corpus quickly.";
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray = 0;
   struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray = 0;
   struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler = 0;
   struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer = 0;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
-  __Pyx_RefNannySetupContext("configure");
+  __Pyx_RefNannySetupContext("configure (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
     PyObject* values[4] = {0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
@@ -35263,32 +38602,28 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -35315,8 +38650,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_edarray), __pyx_ptype_3_sa_DataArray, 1, "edarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sampler), __pyx_ptype_3_sa_Sampler, 1, "sampler", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_scorer), __pyx_ptype_3_sa_Scorer, 1, "scorer", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_edarray, __pyx_v_sampler, __pyx_v_scorer);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":378
+ *         self.findexes1 = IntList(initial_len=10)
+ * 
+ *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
+ *             Sampler sampler, Scorer scorer):
+ *         '''This gives the RuleFactory access to the Context object.
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_fsarray, struct __pyx_obj_3_sa_DataArray *__pyx_v_edarray, struct __pyx_obj_3_sa_Sampler *__pyx_v_sampler, struct __pyx_obj_3_sa_Scorer *__pyx_v_scorer) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("configure", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":383
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":383
  *         Here we also use it to precompute the most expensive intersections
  *         in the corpus quickly.'''
  *         self.fsa = fsarray             # <<<<<<<<<<<<<<
@@ -35325,11 +38686,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fsa = __pyx_v_fsarray;
+  __Pyx_GOTREF(__pyx_v_self->fsa);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->fsa));
+  __pyx_v_self->fsa = __pyx_v_fsarray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":384
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":384
  *         in the corpus quickly.'''
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray             # <<<<<<<<<<<<<<
@@ -35338,11 +38699,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_fsarray->darray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_fsarray->darray));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda = __pyx_v_fsarray->darray;
+  __Pyx_GOTREF(__pyx_v_self->fda);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->fda));
+  __pyx_v_self->fda = __pyx_v_fsarray->darray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":385
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":385
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray
  *         self.eda = edarray             # <<<<<<<<<<<<<<
@@ -35351,63 +38712,63 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_edarray));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_edarray));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda = __pyx_v_edarray;
+  __Pyx_GOTREF(__pyx_v_self->eda);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->eda));
+  __pyx_v_self->eda = __pyx_v_edarray;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":386
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":386
  *         self.fda = fsarray.darray
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)             # <<<<<<<<<<<<<<
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  */
-  __pyx_t_1 = ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda);
+  __pyx_t_1 = ((PyObject *)__pyx_v_self->fda);
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->__pyx_vtab)->set_idmap(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->fid2symid);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->fid2symid));
+  __pyx_v_self->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":387
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":387
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)             # <<<<<<<<<<<<<<
  *         self.precompute()
  *         self.sampler = sampler
  */
-  __pyx_t_2 = ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eda);
+  __pyx_t_2 = ((PyObject *)__pyx_v_self->eda);
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->__pyx_vtab)->set_idmap(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_1);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
+  __Pyx_GOTREF(__pyx_v_self->eid2symid);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->eid2symid));
+  __pyx_v_self->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":388
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":388
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()             # <<<<<<<<<<<<<<
  *         self.sampler = sampler
  *         self.scorer = scorer
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":389
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":389
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  *         self.sampler = sampler             # <<<<<<<<<<<<<<
@@ -35416,11 +38777,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_sampler));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_sampler));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->sampler = __pyx_v_sampler;
+  __Pyx_GOTREF(__pyx_v_self->sampler);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sampler));
+  __pyx_v_self->sampler = __pyx_v_sampler;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":390
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":390
  *         self.precompute()
  *         self.sampler = sampler
  *         self.scorer = scorer             # <<<<<<<<<<<<<<
@@ -35429,9 +38790,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  */
   __Pyx_INCREF(((PyObject *)__pyx_v_scorer));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_scorer));
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer));
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->scorer = __pyx_v_scorer;
+  __Pyx_GOTREF(__pyx_v_self->scorer);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->scorer));
+  __pyx_v_self->scorer = __pyx_v_scorer;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -35446,7 +38807,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":392
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":392
  *         self.scorer = scorer
  * 
  *     cdef set_idmap(self, DataArray darray):             # <<<<<<<<<<<<<<
@@ -35454,7 +38815,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure(PyObject *__
  *         cdef IntList idmap
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_DataArray *__pyx_v_darray) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_DataArray *__pyx_v_darray) {
   int __pyx_v_word_id;
   int __pyx_v_new_word_id;
   int __pyx_v_N;
@@ -35465,15 +38826,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   Py_ssize_t __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
   int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  int __pyx_t_7;
+  char *__pyx_t_5;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("set_idmap");
+  __Pyx_RefNannySetupContext("set_idmap", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":396
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":396
  *         cdef IntList idmap
  * 
  *         N = len(darray.id2word)             # <<<<<<<<<<<<<<
@@ -35486,7 +38845,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_N = __pyx_t_2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":397
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":397
  * 
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -35499,13 +38858,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_idmap = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":398
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":398
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:             # <<<<<<<<<<<<<<
@@ -35515,36 +38874,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_word_id = 0; __pyx_v_word_id < __pyx_t_4; __pyx_v_word_id++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":399
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":399
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             idmap.arr[word_id] = new_word_id
  *         return idmap
  */
-    __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_darray->id2word, __pyx_v_word_id, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_darray->id2word, __pyx_v_word_id, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
-    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1);
-    __Pyx_GIVEREF(__pyx_t_1);
-    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
-    __Pyx_GIVEREF(__pyx_t_5);
-    __pyx_t_1 = 0;
-    __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_5 = PyBytes_AsString(__pyx_t_3); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
-    __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_v_new_word_id = __pyx_t_7;
+    __pyx_v_new_word_id = __pyx_f_3_sa_sym_fromstring(__pyx_t_5, 1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":400
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":400
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id             # <<<<<<<<<<<<<<
@@ -35554,7 +38897,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
     (__pyx_v_idmap->arr[__pyx_v_word_id]) = __pyx_v_new_word_id;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":401
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":401
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id
  *         return idmap             # <<<<<<<<<<<<<<
@@ -35571,8 +38914,6 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_6);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.set_idmap", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
@@ -35582,7 +38923,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":404
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("pattern2phrase (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":404
  * 
  * 
  *     def pattern2phrase(self, pattern):             # <<<<<<<<<<<<<<
@@ -35590,12 +38942,11 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(struct __pyx_o
  *         result = ()
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern) {
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_arity = NULL;
   PyObject *__pyx_v_word_id = NULL;
-  PyObject *__pyx_v_new_id = NULL;
+  int __pyx_v_new_id;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -35604,15 +38955,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   PyObject *__pyx_t_4 = NULL;
   int __pyx_t_5;
   int __pyx_t_6;
-  PyObject *__pyx_t_7 = NULL;
+  char *__pyx_t_7;
   PyObject *__pyx_t_8 = NULL;
-  PyObject *__pyx_t_9 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("pattern2phrase");
+  __Pyx_RefNannySetupContext("pattern2phrase", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":406
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":406
  *     def pattern2phrase(self, pattern):
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()             # <<<<<<<<<<<<<<
@@ -35622,7 +38972,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":407
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":407
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -35632,7 +38982,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":408
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":408
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -35648,12 +38998,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -35669,20 +39027,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":409
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":409
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":410
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":410
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
@@ -35695,7 +39052,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":411
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":411
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
@@ -35703,68 +39060,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_XDECREF(__pyx_v_new_id);
-      __pyx_v_new_id = __pyx_t_4;
-      __pyx_t_4 = 0;
-      goto __pyx_L7;
+      __pyx_v_new_id = __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6);
+      goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":413
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":413
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             result = result + (new_id,)
  *         return Phrase(result)
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
-      __Pyx_GIVEREF(__pyx_t_7);
-      PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
-      __Pyx_GIVEREF(__pyx_t_8);
-      __pyx_t_7 = 0;
-      __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = PyBytes_AsString(__pyx_t_4); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-      __Pyx_XDECREF(__pyx_v_new_id);
-      __pyx_v_new_id = __pyx_t_8;
-      __pyx_t_8 = 0;
+      __pyx_v_new_id = __pyx_f_3_sa_sym_fromstring(__pyx_t_7, 1);
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":414
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":414
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
  *         return Phrase(result)
  * 
  */
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_new_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-    __Pyx_INCREF(__pyx_v_new_id);
-    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_new_id);
-    __Pyx_GIVEREF(__pyx_v_new_id);
-    __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+    __Pyx_GOTREF(__pyx_t_8);
+    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_4);
+    __pyx_t_4 = 0;
+    __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_result));
-    __pyx_v_result = __pyx_t_9;
-    __pyx_t_9 = 0;
+    __pyx_v_result = __pyx_t_4;
+    __pyx_t_4 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":415
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":415
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         return Phrase(result)             # <<<<<<<<<<<<<<
@@ -35773,15 +39112,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_r = __pyx_t_9;
-  __pyx_t_9 = 0;
+  __pyx_r = __pyx_t_4;
+  __pyx_t_4 = 0;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
@@ -35789,22 +39128,30 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_XDECREF(__pyx_t_8);
-  __Pyx_XDECREF(__pyx_t_9);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.pattern2phrase", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_v_result);
   __Pyx_XDECREF(__pyx_v_arity);
   __Pyx_XDECREF(__pyx_v_word_id);
-  __Pyx_XDECREF(__pyx_v_new_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":417
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("pattern2phrase_plus (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_pattern));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":417
  *         return Phrase(result)
  * 
  *     def pattern2phrase_plus(self, pattern):             # <<<<<<<<<<<<<<
@@ -35812,13 +39159,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase(PyObjec
  *         # suffixed/prefixed with the NT category.
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(PyObject *__pyx_v_self, PyObject *__pyx_v_pattern) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_pattern) {
   PyObject *__pyx_v_patterns = NULL;
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_arity = NULL;
   PyObject *__pyx_v_word_id = NULL;
-  PyObject *__pyx_v_new_id = NULL;
+  int __pyx_v_new_id;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -35827,16 +39173,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   PyObject *__pyx_t_4 = NULL;
   int __pyx_t_5;
   int __pyx_t_6;
-  PyObject *__pyx_t_7 = NULL;
+  char *__pyx_t_7;
   PyObject *__pyx_t_8 = NULL;
-  PyObject *__pyx_t_9 = NULL;
-  int __pyx_t_10;
+  int __pyx_t_9;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("pattern2phrase_plus");
+  __Pyx_RefNannySetupContext("pattern2phrase_plus", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":420
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":420
  *         # returns a list containing both the pattern, and pattern
  *         # suffixed/prefixed with the NT category.
  *         patterns = []             # <<<<<<<<<<<<<<
@@ -35844,11 +39189,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
  *         arity = 0
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_patterns = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":421
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":421
  *         # suffixed/prefixed with the NT category.
  *         patterns = []
  *         result = ()             # <<<<<<<<<<<<<<
@@ -35858,7 +39203,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":422
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":422
  *         patterns = []
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -35868,7 +39213,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":423
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":423
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -35884,12 +39229,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -35905,20 +39258,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":424
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":424
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":425
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":425
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
@@ -35931,7 +39283,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":426
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":426
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
@@ -35939,151 +39291,124 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
       __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, __pyx_t_6)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_XDECREF(__pyx_v_new_id);
-      __pyx_v_new_id = __pyx_t_4;
-      __pyx_t_4 = 0;
-      goto __pyx_L7;
+      __pyx_v_new_id = __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6);
+      goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":428
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":428
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->fda->id2word, __pyx_v_word_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
-      __Pyx_GIVEREF(__pyx_t_7);
-      PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
-      __Pyx_GIVEREF(__pyx_t_8);
-      __pyx_t_7 = 0;
-      __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = PyBytes_AsString(__pyx_t_4); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-      __Pyx_XDECREF(__pyx_v_new_id);
-      __pyx_v_new_id = __pyx_t_8;
-      __pyx_t_8 = 0;
+      __pyx_v_new_id = __pyx_f_3_sa_sym_fromstring(__pyx_t_7, 1);
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":429
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":429
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  */
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_new_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-    __Pyx_INCREF(__pyx_v_new_id);
-    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_new_id);
-    __Pyx_GIVEREF(__pyx_v_new_id);
-    __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+    __Pyx_GOTREF(__pyx_t_8);
+    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
+    __Pyx_GIVEREF(__pyx_t_4);
+    __pyx_t_4 = 0;
+    __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_result));
-    __pyx_v_result = __pyx_t_9;
-    __pyx_t_9 = 0;
+    __pyx_v_result = __pyx_t_4;
+    __pyx_t_4 = 0;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":430
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":430
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  */
-  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":431
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":431
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns
  */
-  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9);
-  __Pyx_GIVEREF(__pyx_t_9);
-  __pyx_t_9 = 0;
-  __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+  __Pyx_GOTREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
+  __Pyx_GIVEREF(__pyx_t_4);
+  __pyx_t_4 = 0;
+  __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_9));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
-  __pyx_t_9 = 0;
-  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GOTREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
+  __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
+  __pyx_t_4 = 0;
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":432
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":432
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))             # <<<<<<<<<<<<<<
  *         return patterns
  * 
  */
-  if (unlikely(((PyObject *)__pyx_v_patterns) == Py_None)) {
-    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_9 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->category, 1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_9);
-  __Pyx_GIVEREF(__pyx_t_9);
-  __pyx_t_9 = 0;
-  __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_t_1), ((PyObject *)__pyx_v_result)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+  __Pyx_GOTREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
+  __Pyx_GIVEREF(__pyx_t_4);
+  __pyx_t_4 = 0;
+  __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_t_1), ((PyObject *)__pyx_v_result)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_9));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
-  __pyx_t_9 = 0;
-  __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GOTREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
+  __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
+  __pyx_t_4 = 0;
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_10 = PyList_Append(__pyx_v_patterns, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":433
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":433
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns             # <<<<<<<<<<<<<<
@@ -36100,9 +39425,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_XDECREF(__pyx_t_8);
-  __Pyx_XDECREF(__pyx_t_9);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.pattern2phrase_plus", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -36110,13 +39433,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
   __Pyx_XDECREF(__pyx_v_result);
   __Pyx_XDECREF(__pyx_v_arity);
   __Pyx_XDECREF(__pyx_v_word_id);
-  __Pyx_XDECREF(__pyx_v_new_id);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":435
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("precompute (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":435
  *         return patterns
  * 
  *     def precompute(self):             # <<<<<<<<<<<<<<
@@ -36124,8 +39457,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus(Py
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self) {
   struct __pyx_obj_3_sa_Precomputation *__pyx_v_pre = 0;
   PyObject *__pyx_v_start_time = NULL;
   PyObject *__pyx_v_pattern = NULL;
@@ -36141,27 +39473,27 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   Py_ssize_t __pyx_t_6;
-  PyObject *(*__pyx_t_7)(PyObject *);
-  PyObject *__pyx_t_8 = NULL;
-  PyObject *(*__pyx_t_9)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_t_9;
   Py_ssize_t __pyx_t_10;
   PyObject *(*__pyx_t_11)(PyObject *);
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("precompute");
+  __Pyx_RefNannySetupContext("precompute", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":438
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":438
  *         cdef Precomputation pre
  * 
  *         if self.precompute_file is not None:             # <<<<<<<<<<<<<<
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  */
-  __pyx_t_1 = (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file != Py_None);
+  __pyx_t_1 = (__pyx_v_self->precompute_file != Py_None);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":439
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":439
  * 
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -36173,7 +39505,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
     __pyx_v_start_time = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":440
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":440
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)             # <<<<<<<<<<<<<<
@@ -36186,20 +39518,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_109));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_109));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_109));
-    __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-    PyTuple_SET_ITEM(__pyx_t_2, 1, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
-    __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file);
+    __Pyx_INCREF(__pyx_v_self->precompute_file);
+    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->precompute_file);
+    __Pyx_GIVEREF(__pyx_v_self->precompute_file);
     __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":441
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":441
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  *             pre = Precomputation(from_binary=self.precompute_file)             # <<<<<<<<<<<<<<
@@ -36208,24 +39540,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  */
     __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), __pyx_v_self->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_v_pre = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_t_2);
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":443
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":443
  *             pre = Precomputation(from_binary=self.precompute_file)
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:             # <<<<<<<<<<<<<<
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  */
-    __pyx_t_1 = (__pyx_v_pre->max_nonterminals != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals);
+    __pyx_t_1 = (__pyx_v_pre->max_nonterminals != __pyx_v_self->max_nonterminals);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":444
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":444
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)             # <<<<<<<<<<<<<<
@@ -36239,10 +39571,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+      __Pyx_GOTREF(__pyx_t_5);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_s_110));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_110));
@@ -36257,21 +39589,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L6;
+      goto __pyx_L4;
     }
-    __pyx_L6:;
+    __pyx_L4:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":445
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":445
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:             # <<<<<<<<<<<<<<
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  */
-    __pyx_t_1 = (__pyx_v_pre->max_length != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length);
+    __pyx_t_1 = (__pyx_v_pre->max_length != __pyx_v_self->max_length);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":446
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":446
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)             # <<<<<<<<<<<<<<
@@ -36285,10 +39617,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_v_self->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_111));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_111));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_111));
@@ -36303,21 +39635,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      goto __pyx_L7;
+      goto __pyx_L5;
     }
-    __pyx_L7:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":447
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":447
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:             # <<<<<<<<<<<<<<
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  */
-    __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size);
+    __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != __pyx_v_self->train_max_initial_size);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":448
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":448
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))             # <<<<<<<<<<<<<<
@@ -36326,10 +39658,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  */
       __pyx_t_4 = PyInt_FromLong(__pyx_v_pre->train_max_initial_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+      __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
@@ -36340,7 +39672,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+      __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       __pyx_t_2 = 0;
@@ -36350,21 +39682,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_Raise(__pyx_t_2, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L8;
+      goto __pyx_L6;
     }
-    __pyx_L8:;
+    __pyx_L6:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":449
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":449
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:             # <<<<<<<<<<<<<<
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  */
-    __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size);
+    __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != __pyx_v_self->train_min_gap_size);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":450
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":450
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))             # <<<<<<<<<<<<<<
@@ -36373,10 +39705,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  */
       __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(__pyx_v_self->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5);
@@ -36387,7 +39719,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_5));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
       __pyx_t_5 = 0;
@@ -36397,20 +39729,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_Raise(__pyx_t_5, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L9;
+      goto __pyx_L7;
     }
-    __pyx_L9:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":451
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":451
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:             # <<<<<<<<<<<<<<
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  */
-    if (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_index) {
+    if (__pyx_v_self->use_index) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":452
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":452
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))             # <<<<<<<<<<<<<<
@@ -36429,7 +39761,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_114));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_114));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_114));
@@ -36442,117 +39774,59 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":453
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":453
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():             # <<<<<<<<<<<<<<
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  */
-      __pyx_t_5 = PyObject_GetAttr(__pyx_v_pre->precomputed_index, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
-        __pyx_t_5 = __pyx_t_2; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0;
-        __pyx_t_7 = NULL;
-      } else {
-        __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
+      __pyx_t_6 = 0;
+      if (unlikely(__pyx_v_pre->precomputed_index == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      for (;;) {
-        if (PyList_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_2 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++;
-        } else if (PyTuple_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++;
-        } else {
-          __pyx_t_2 = __pyx_t_7(__pyx_t_5);
-          if (unlikely(!__pyx_t_2)) {
-            if (PyErr_Occurred()) {
-              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            break;
-          }
-          __Pyx_GOTREF(__pyx_t_2);
-        }
-        if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
-          PyObject* sequence = __pyx_t_2;
-          if (likely(PyTuple_CheckExact(sequence))) {
-            if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-              if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
-            __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
-          } else {
-            if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-              if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
-            __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
-          }
-          __Pyx_INCREF(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_3);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        } else {
-          Py_ssize_t index = -1;
-          __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
-          index = 0; __pyx_t_4 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L13_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_4);
-          index = 1; __pyx_t_3 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_3)) goto __pyx_L13_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_3);
-          if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          goto __pyx_L14_unpacking_done;
-          __pyx_L13_unpacking_failed:;
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-          if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_L14_unpacking_done:;
-        }
+      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_index, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_XDECREF(__pyx_t_5);
+      __pyx_t_5 = __pyx_t_2;
+      __pyx_t_2 = 0;
+      while (1) {
+        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_7, &__pyx_t_6, &__pyx_t_2, &__pyx_t_4, NULL, __pyx_t_8);
+        if (unlikely(__pyx_t_9 == 0)) break;
+        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(__pyx_t_4);
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_4;
-        __pyx_t_4 = 0;
+        __pyx_v_pattern = __pyx_t_2;
+        __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_arr = __pyx_t_4;
+        __pyx_t_4 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":454
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":454
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)             # <<<<<<<<<<<<<<
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  */
-        __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_3));
         __Pyx_INCREF(__pyx_v_pattern);
-        PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_pattern);
+        PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
-        __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+        __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_v_phrases);
-        __pyx_v_phrases = __pyx_t_4;
-        __pyx_t_4 = 0;
+        __pyx_v_phrases = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":455
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":455
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:             # <<<<<<<<<<<<<<
@@ -36560,61 +39834,69 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  *             if self.use_collocations:
  */
         if (PyList_CheckExact(__pyx_v_phrases) || PyTuple_CheckExact(__pyx_v_phrases)) {
-          __pyx_t_4 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_4); __pyx_t_10 = 0;
+          __pyx_t_3 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
           __pyx_t_11 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_11 = Py_TYPE(__pyx_t_4)->tp_iternext;
+          __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
         }
         for (;;) {
-          if (PyList_CheckExact(__pyx_t_4)) {
-            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_4)) break;
-            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
-          } else if (PyTuple_CheckExact(__pyx_t_4)) {
-            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
+          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_3)) {
+            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_3)) {
+            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
           } else {
-            __pyx_t_3 = __pyx_t_11(__pyx_t_4);
-            if (unlikely(!__pyx_t_3)) {
+            __pyx_t_2 = __pyx_t_11(__pyx_t_3);
+            if (unlikely(!__pyx_t_2)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
                 else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
-            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_GOTREF(__pyx_t_2);
           }
           __Pyx_XDECREF(__pyx_v_phrase);
-          __pyx_v_phrase = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __pyx_v_phrase = __pyx_t_2;
+          __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":456
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":456
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr             # <<<<<<<<<<<<<<
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  */
-          if (PyObject_SetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyObject_SetItem(__pyx_v_self->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L10;
+      goto __pyx_L8;
     }
-    __pyx_L10:;
+    __pyx_L8:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":457
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":457
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:             # <<<<<<<<<<<<<<
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  */
-    if (((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->use_collocations) {
+    if (__pyx_v_self->use_collocations) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":458
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":458
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))             # <<<<<<<<<<<<<<
@@ -36623,128 +39905,70 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  */
       __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_5 = __pyx_v_pre->precomputed_collocations;
       __Pyx_INCREF(__pyx_t_5);
-      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_115));
+      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_115));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_115));
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":459
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":459
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():             # <<<<<<<<<<<<<<
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  */
-      __pyx_t_5 = PyObject_GetAttr(__pyx_v_pre->precomputed_collocations, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-        __pyx_t_5 = __pyx_t_3; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0;
-        __pyx_t_7 = NULL;
-      } else {
-        __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
+      __pyx_t_7 = 0;
+      if (unlikely(__pyx_v_pre->precomputed_collocations == Py_None)) {
+        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      for (;;) {
-        if (PyList_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
-        } else if (PyTuple_CheckExact(__pyx_t_5)) {
-          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
-        } else {
-          __pyx_t_3 = __pyx_t_7(__pyx_t_5);
-          if (unlikely(!__pyx_t_3)) {
-            if (PyErr_Occurred()) {
-              if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            break;
-          }
-          __Pyx_GOTREF(__pyx_t_3);
-        }
-        if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-          PyObject* sequence = __pyx_t_3;
-          if (likely(PyTuple_CheckExact(sequence))) {
-            if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-              if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
-            __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
-          } else {
-            if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-              if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-              else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            }
-            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
-            __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
-          }
-          __Pyx_INCREF(__pyx_t_4);
-          __Pyx_INCREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        } else {
-          Py_ssize_t index = -1;
-          __pyx_t_8 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_8);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
-          index = 0; __pyx_t_4 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_4)) goto __pyx_L20_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_4);
-          index = 1; __pyx_t_2 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_2)) goto __pyx_L20_unpacking_failed;
-          __Pyx_GOTREF(__pyx_t_2);
-          if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          goto __pyx_L21_unpacking_done;
-          __pyx_L20_unpacking_failed:;
-          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-          if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-          if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_L21_unpacking_done:;
-        }
+      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_6), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_XDECREF(__pyx_t_5);
+      __pyx_t_5 = __pyx_t_2;
+      __pyx_t_2 = 0;
+      while (1) {
+        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_6, &__pyx_t_7, &__pyx_t_2, &__pyx_t_3, NULL, __pyx_t_8);
+        if (unlikely(__pyx_t_9 == 0)) break;
+        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_GOTREF(__pyx_t_3);
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_4;
-        __pyx_t_4 = 0;
-        __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_2;
+        __pyx_v_pattern = __pyx_t_2;
         __pyx_t_2 = 0;
+        __Pyx_XDECREF(__pyx_v_arr);
+        __pyx_v_arr = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":460
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":460
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)             # <<<<<<<<<<<<<<
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  */
-        __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+        __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(__pyx_v_pattern);
         PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
@@ -36756,21 +39980,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
         __pyx_v_phrase = __pyx_t_4;
         __pyx_t_4 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":461
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":461
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr             # <<<<<<<<<<<<<<
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)
  */
-        if (PyObject_SetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L17;
+      goto __pyx_L13;
     }
-    __pyx_L17:;
+    __pyx_L13:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":462
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":462
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -36782,7 +40006,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
     __pyx_v_stop_time = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":463
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":463
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)             # <<<<<<<<<<<<<<
@@ -36797,7 +40021,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
     __pyx_t_5 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_116));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_116));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_116));
@@ -36809,9 +40033,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -36820,7 +40044,6 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.precompute", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -36836,7 +40059,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":466
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_precomputed_collocation (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_phrase));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":466
  * 
  * 
  *     def get_precomputed_collocation(self, phrase):             # <<<<<<<<<<<<<<
@@ -36844,8 +40078,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute(PyObject *_
  *             arr = self.precomputed_collocations[phrase]
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation(PyObject *__pyx_v_self, PyObject *__pyx_v_phrase) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collocation(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_phrase) {
   PyObject *__pyx_v_arr = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -36857,31 +40090,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_colloc
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_precomputed_collocation");
+  __Pyx_RefNannySetupContext("get_precomputed_collocation", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":467
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":467
  * 
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:             # <<<<<<<<<<<<<<
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  */
-  __pyx_t_1 = ((PySequence_Contains(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_phrase, __pyx_v_self->precomputed_collocations, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":468
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":468
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]             # <<<<<<<<<<<<<<
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None
  */
-    __pyx_t_2 = PyObject_GetItem(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_arr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":469
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":469
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)             # <<<<<<<<<<<<<<
@@ -36908,17 +40141,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_colloc
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
     goto __pyx_L0;
-    goto __pyx_L5;
+    goto __pyx_L3;
   }
-  __pyx_L5:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":470
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":470
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None             # <<<<<<<<<<<<<<
@@ -36945,7 +40178,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_colloc
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":473
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":473
  * 
  * 
  *     cdef int* baeza_yates_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -36989,9 +40222,9 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("baeza_yates_helper");
+  __Pyx_RefNannySetupContext("baeza_yates_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":486
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":486
  *         cdef Matching loc1, loc2
  * 
  *         result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -37000,7 +40233,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":488
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":488
  *         result = <int*> malloc(0*sizeof(int*))
  * 
  *         d_first = 0             # <<<<<<<<<<<<<<
@@ -37009,7 +40242,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_d_first = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":489
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":489
  * 
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:             # <<<<<<<<<<<<<<
@@ -37019,7 +40252,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_1 = ((__pyx_v_high1 - __pyx_v_low1) > (__pyx_v_high2 - __pyx_v_low2));
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":490
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":490
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:
  *             d_first = 1             # <<<<<<<<<<<<<<
@@ -37031,7 +40264,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":494
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":494
  *         # First, check to see if we are at any of the recursive base cases
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:             # <<<<<<<<<<<<<<
@@ -37047,7 +40280,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":495
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":495
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:
  *             return result             # <<<<<<<<<<<<<<
@@ -37060,7 +40293,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":498
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":498
  * 
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37069,7 +40302,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, (__pyx_v_high1 - __pyx_v_step1), __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":499
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":499
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37078,7 +40311,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_low2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":500
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":500
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:             # <<<<<<<<<<<<<<
@@ -37088,7 +40321,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == -1);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":501
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":501
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:
  *             return result             # <<<<<<<<<<<<<<
@@ -37101,7 +40334,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":503
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":503
  *             return result
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37110,7 +40343,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_low1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":504
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":504
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37119,7 +40352,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_high2 - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":505
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":505
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -37129,7 +40362,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":506
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":506
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *             return result             # <<<<<<<<<<<<<<
@@ -37142,7 +40375,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":510
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":510
  *         # Case 3: query set and data set do not meet size mismatch constraints;
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1             # <<<<<<<<<<<<<<
@@ -37160,7 +40393,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_v_qsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":511
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":511
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2             # <<<<<<<<<<<<<<
@@ -37178,7 +40411,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_v_dsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":512
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":512
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -37187,7 +40420,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":513
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":513
  *         dsetsize = (high2-low2) / step2
  *         if d_first:
  *             tmp = qsetsize             # <<<<<<<<<<<<<<
@@ -37196,7 +40429,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_qsetsize;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":514
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":514
  *         if d_first:
  *             tmp = qsetsize
  *             qsetsize = dsetsize             # <<<<<<<<<<<<<<
@@ -37205,7 +40438,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_qsetsize = __pyx_v_dsetsize;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":515
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":515
  *             tmp = qsetsize
  *             qsetsize = dsetsize
  *             dsetsize = tmp             # <<<<<<<<<<<<<<
@@ -37217,7 +40450,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L7:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":517
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":517
  *             dsetsize = tmp
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:             # <<<<<<<<<<<<<<
@@ -37233,7 +40466,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = ((__pyx_t_5 / __pyx_t_6) > __pyx_v_dsetsize);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":518
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":518
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)             # <<<<<<<<<<<<<<
@@ -37242,7 +40475,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     free(__pyx_v_result);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":519
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":519
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)
  *             return self.merge_helper(low1, high1, arr1, step1, low2, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -37255,7 +40488,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L8:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":523
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":523
  *         # binary search.    There are two flavors, depending on
  *         # whether the queryset or dataset is first
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -37264,7 +40497,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":524
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":524
  *         # whether the queryset or dataset is first
  *         if d_first:
  *             med2 = median(low2, high2, step2)             # <<<<<<<<<<<<<<
@@ -37273,7 +40506,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_low2, __pyx_v_high2, __pyx_v_step2);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":525
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":525
  *         if d_first:
  *             med2 = median(low2, high2, step2)
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37282,7 +40515,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":527
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":527
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  * 
  *             search_low = low1             # <<<<<<<<<<<<<<
@@ -37291,7 +40524,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":528
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":528
  * 
  *             search_low = low1
  *             search_high = high1             # <<<<<<<<<<<<<<
@@ -37300,7 +40533,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":529
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":529
  *             search_low = low1
  *             search_high = high1
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -37311,7 +40544,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":530
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":530
  *             search_high = high1
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)             # <<<<<<<<<<<<<<
@@ -37320,7 +40553,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step1);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":531
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":531
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -37329,7 +40562,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":532
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":532
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -37338,7 +40571,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":535
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":535
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37347,7 +40580,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":533
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":533
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37356,7 +40589,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":534
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":534
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_low = med1_plus             # <<<<<<<<<<<<<<
@@ -37366,7 +40599,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_low = __pyx_v_med1_plus;
         break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":535
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":535
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37375,7 +40608,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":536
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":536
  *                     search_low = med1_plus
  *                 elif comparison == 1:
  *                     search_high = med1_minus             # <<<<<<<<<<<<<<
@@ -37386,7 +40619,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":538
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":538
  *                     search_high = med1_minus
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -37402,7 +40635,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":540
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":540
  *                     break
  *         else:
  *             med1 = median(low1, high1, step1)             # <<<<<<<<<<<<<<
@@ -37411,7 +40644,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_low1, __pyx_v_high1, __pyx_v_step1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":541
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":541
  *         else:
  *             med1 = median(low1, high1, step1)
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -37420,7 +40653,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":543
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":543
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  * 
  *             search_low = low2             # <<<<<<<<<<<<<<
@@ -37429,7 +40662,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":544
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":544
  * 
  *             search_low = low2
  *             search_high = high2             # <<<<<<<<<<<<<<
@@ -37438,7 +40671,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":545
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":545
  *             search_low = low2
  *             search_high = high2
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -37449,7 +40682,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":546
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":546
  *             search_high = high2
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)             # <<<<<<<<<<<<<<
@@ -37458,7 +40691,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step2);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":547
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":547
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37467,7 +40700,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":548
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":548
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -37476,7 +40709,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":551
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":551
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37485,7 +40718,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":549
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":549
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37494,7 +40727,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":550
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":550
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_high = med2             # <<<<<<<<<<<<<<
@@ -37504,7 +40737,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_high = __pyx_v_med2;
         break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":551
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":551
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -37513,7 +40746,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":552
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":552
  *                     search_high = med2
  *                 elif comparison == 1:
  *                     search_low = med2 + step2             # <<<<<<<<<<<<<<
@@ -37524,7 +40757,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":554
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":554
  *                     search_low = med2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -37539,7 +40772,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L9:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":556
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":556
  *                     break
  * 
  *         med_result_len = 0             # <<<<<<<<<<<<<<
@@ -37548,7 +40781,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":557
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":557
  * 
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -37557,7 +40790,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":558
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":558
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))
  *         if search_high > search_low:             # <<<<<<<<<<<<<<
@@ -37567,7 +40800,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (__pyx_v_search_high > __pyx_v_search_low);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":564
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":564
  *             # want to store the bindings for all of those elements.    We can
  *             # subsequently throw all of them away.
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -37576,7 +40809,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":565
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":565
  *             # subsequently throw all of them away.
  *             med2_minus = med2
  *             med2_plus = med2 + step2             # <<<<<<<<<<<<<<
@@ -37585,7 +40818,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = (__pyx_v_med2 + __pyx_v_step2);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":566
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":566
  *             med2_minus = med2
  *             med2_plus = med2 + step2
  *             i1 = med1_minus             # <<<<<<<<<<<<<<
@@ -37594,7 +40827,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_i1 = __pyx_v_med1_minus;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":567
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":567
  *             med2_plus = med2 + step2
  *             i1 = med1_minus
  *             while i1 < med1_plus:             # <<<<<<<<<<<<<<
@@ -37605,7 +40838,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i1 < __pyx_v_med1_plus);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":568
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":568
  *             i1 = med1_minus
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37614,7 +40847,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":569
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":569
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:             # <<<<<<<<<<<<<<
@@ -37625,7 +40858,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = ((__pyx_v_med2_minus - __pyx_v_step2) >= __pyx_v_low2);
         if (!__pyx_t_3) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":570
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":570
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37634,7 +40867,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_med2_minus - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":571
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":571
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:             # <<<<<<<<<<<<<<
@@ -37644,7 +40877,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) < 1);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":572
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":572
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:
  *                         med2_minus = med2_minus - step2             # <<<<<<<<<<<<<<
@@ -37656,7 +40889,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":574
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":574
  *                         med2_minus = med2_minus - step2
  *                     else:
  *                         break             # <<<<<<<<<<<<<<
@@ -37669,7 +40902,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L18_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":575
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":575
  *                     else:
  *                         break
  *                 i2 = med2_minus             # <<<<<<<<<<<<<<
@@ -37678,7 +40911,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_i2 = __pyx_v_med2_minus;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":576
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":576
  *                         break
  *                 i2 = med2_minus
  *                 while i2 < high2:             # <<<<<<<<<<<<<<
@@ -37689,7 +40922,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
         if (!__pyx_t_3) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":577
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":577
  *                 i2 = med2_minus
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -37698,7 +40931,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":578
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":578
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -37707,7 +40940,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":579
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":579
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -37717,7 +40950,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == 0);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":581
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":581
  *                     if comparison == 0:
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)             # <<<<<<<<<<<<<<
@@ -37729,7 +40962,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L22:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":582
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":582
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37739,7 +40972,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == -1);
         if (__pyx_t_3) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":583
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":583
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -37751,7 +40984,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L23:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":584
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":584
  *                     if comparison == -1:
  *                         break
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -37762,7 +40995,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L21_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":585
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":585
  *                         break
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:             # <<<<<<<<<<<<<<
@@ -37772,7 +41005,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i2 > __pyx_v_med2_plus);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":586
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":586
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:
  *                     med2_plus = i2             # <<<<<<<<<<<<<<
@@ -37784,7 +41017,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L24:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":587
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":587
  *                 if i2 > med2_plus:
  *                     med2_plus = i2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -37794,7 +41027,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_v_i1 = (__pyx_v_i1 + __pyx_v_step1);
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":589
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":589
  *                 i1 = i1 + step1
  * 
  *             tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -37803,7 +41036,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_med1_minus;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":590
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":590
  * 
  *             tmp = med1_minus
  *             med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -37812,7 +41045,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":591
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":591
  *             tmp = med1_minus
  *             med1_minus = med1_plus
  *             med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -37824,7 +41057,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":594
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":594
  *         else:
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -37833,7 +41066,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":595
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":595
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2
  *             med2_plus = med2             # <<<<<<<<<<<<<<
@@ -37842,7 +41075,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = __pyx_v_med2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":596
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":596
  *             med2_minus = med2
  *             med2_plus = med2
  *             if d_first:             # <<<<<<<<<<<<<<
@@ -37851,7 +41084,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     if (__pyx_v_d_first) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":597
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":597
  *             med2_plus = med2
  *             if d_first:
  *                 med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -37860,7 +41093,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":598
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":598
  *             if d_first:
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -37870,7 +41103,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == -1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":599
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":599
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:
  *                     med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -37882,7 +41115,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L26:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":600
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":600
  *                 if comparison == -1:
  *                     med1_minus = med1_plus
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -37892,7 +41125,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":601
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":601
  *                     med1_minus = med1_plus
  *                 if comparison == 1:
  *                     med1_plus = med1_minus             # <<<<<<<<<<<<<<
@@ -37907,7 +41140,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":603
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":603
  *                     med1_plus = med1_minus
  *             else:
  *                 tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -37916,7 +41149,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_tmp = __pyx_v_med1_minus;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":604
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":604
  *             else:
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -37925,7 +41158,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":605
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":605
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -37934,7 +41167,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_plus = __pyx_v_tmp;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":606
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":606
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -37944,7 +41177,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":607
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":607
  *                 med1_plus = tmp
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -37953,7 +41186,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":608
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":608
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2
  *                     med2_plus = med2_plus + step2             # <<<<<<<<<<<<<<
@@ -37969,7 +41202,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L14:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":610
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":610
  *                     med2_plus = med2_plus + step2
  * 
  *         low_result_len = 0             # <<<<<<<<<<<<<<
@@ -37978,7 +41211,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":611
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":611
  * 
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)             # <<<<<<<<<<<<<<
@@ -37987,7 +41220,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_low1, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, __pyx_v_low2, __pyx_v_med2_plus, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_low_result_len));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":612
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":612
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0             # <<<<<<<<<<<<<<
@@ -37996,7 +41229,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":613
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":613
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)             # <<<<<<<<<<<<<<
@@ -38005,7 +41238,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med2_minus, __pyx_v_high2, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_high_result_len));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":615
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":615
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)             # <<<<<<<<<<<<<<
@@ -38014,7 +41247,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_low_result, __pyx_v_low_result_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":616
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":616
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)             # <<<<<<<<<<<<<<
@@ -38023,7 +41256,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_med_result, __pyx_v_med_result_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":617
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":617
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)             # <<<<<<<<<<<<<<
@@ -38032,7 +41265,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_high_result, __pyx_v_high_result_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":618
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":618
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)             # <<<<<<<<<<<<<<
@@ -38041,7 +41274,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_low_result);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":619
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":619
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)
  *         free(med_result)             # <<<<<<<<<<<<<<
@@ -38050,7 +41283,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_med_result);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":620
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":620
  *         free(low_result)
  *         free(med_result)
  *         free(high_result)             # <<<<<<<<<<<<<<
@@ -38059,7 +41292,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_high_result);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":622
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":622
  *         free(high_result)
  * 
  *         return result             # <<<<<<<<<<<<<<
@@ -38079,7 +41312,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":626
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":626
  * 
  * 
  *     cdef long compare_matchings_set(self, int i1_minus, int i1_plus, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -38096,9 +41329,9 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   long __pyx_r;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("compare_matchings_set");
+  __Pyx_RefNannySetupContext("compare_matchings_set", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":637
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":637
  *         cdef Matching* loc1
  * 
  *         loc1 = &l1_stack             # <<<<<<<<<<<<<<
@@ -38107,7 +41340,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_loc1 = (&__pyx_v_l1_stack);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":639
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":639
  *         loc1 = &l1_stack
  * 
  *         i1 = i1_minus             # <<<<<<<<<<<<<<
@@ -38116,7 +41349,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_i1 = __pyx_v_i1_minus;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":640
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":640
  * 
  *         i1 = i1_minus
  *         while i1 < i1_plus:             # <<<<<<<<<<<<<<
@@ -38127,7 +41360,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 < __pyx_v_i1_plus);
     if (!__pyx_t_1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":641
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":641
  *         i1 = i1_minus
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38136,7 +41369,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_f_3_sa_assign_matching(__pyx_v_loc1, __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":642
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":642
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -38145,7 +41378,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, __pyx_v_loc1, __pyx_v_loc2, __pyx_v_offset_by_one, __pyx_v_len_last);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":643
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":643
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:             # <<<<<<<<<<<<<<
@@ -38155,7 +41388,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_comparison == 0);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":644
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":644
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:
  *                 prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -38164,7 +41397,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
       __pyx_v_prev_comparison = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":645
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":645
  *             if comparison == 0:
  *                 prev_comparison = 0
  *                 break             # <<<<<<<<<<<<<<
@@ -38175,7 +41408,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       goto __pyx_L5;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":646
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":646
  *                 prev_comparison = 0
  *                 break
  *             elif i1 == i1_minus:             # <<<<<<<<<<<<<<
@@ -38185,7 +41418,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 == __pyx_v_i1_minus);
     if (__pyx_t_1) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":647
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":647
  *                 break
  *             elif i1 == i1_minus:
  *                 prev_comparison = comparison             # <<<<<<<<<<<<<<
@@ -38197,7 +41430,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":649
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":649
  *                 prev_comparison = comparison
  *             else:
  *                 if comparison != prev_comparison:             # <<<<<<<<<<<<<<
@@ -38207,7 +41440,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       __pyx_t_1 = (__pyx_v_comparison != __pyx_v_prev_comparison);
       if (__pyx_t_1) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":650
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":650
  *             else:
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -38216,7 +41449,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
         __pyx_v_prev_comparison = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":651
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":651
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -38230,7 +41463,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":652
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":652
  *                     prev_comparison = 0
  *                     break
  *             i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -38241,7 +41474,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   }
   __pyx_L4_break:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":653
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":653
  *                     break
  *             i1 = i1 + step1
  *         return prev_comparison             # <<<<<<<<<<<<<<
@@ -38257,7 +41490,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":656
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":656
  * 
  * 
  *     cdef long compare_matchings(self, Matching* loc1, Matching* loc2, int offset_by_one, int len_last):             # <<<<<<<<<<<<<<
@@ -38273,9 +41506,9 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("compare_matchings");
+  __Pyx_RefNannySetupContext("compare_matchings", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":659
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":659
  *         cdef int i
  * 
  *         if loc1.sent_id > loc2.sent_id:             # <<<<<<<<<<<<<<
@@ -38285,7 +41518,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc1->sent_id > __pyx_v_loc2->sent_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":660
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":660
  * 
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1             # <<<<<<<<<<<<<<
@@ -38298,7 +41531,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":661
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":661
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:             # <<<<<<<<<<<<<<
@@ -38308,7 +41541,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc2->sent_id > __pyx_v_loc1->sent_id);
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":662
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":662
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:
  *             return -1             # <<<<<<<<<<<<<<
@@ -38321,7 +41554,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":664
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":664
  *             return -1
  * 
  *         if loc1.size == 1 and loc2.size == 1:             # <<<<<<<<<<<<<<
@@ -38337,7 +41570,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":665
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":665
  * 
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:             # <<<<<<<<<<<<<<
@@ -38347,7 +41580,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc2->arr[__pyx_v_loc2->start]) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) <= __pyx_v_self->train_min_gap_size);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":666
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":666
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -38362,7 +41595,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     goto __pyx_L5;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":668
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":668
  *                 return 1
  * 
  *         elif offset_by_one:             # <<<<<<<<<<<<<<
@@ -38371,7 +41604,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
  */
   if (__pyx_v_offset_by_one) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":669
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":669
  * 
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -38381,7 +41614,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":670
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":670
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -38391,7 +41624,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":671
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":671
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -38404,7 +41637,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L9:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":672
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":672
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -38414,7 +41647,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":673
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":673
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -38431,7 +41664,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":676
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":676
  * 
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -38441,7 +41674,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) > (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":677
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":677
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -38454,7 +41687,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L11:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":678
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":678
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -38464,7 +41697,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) < (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":679
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":679
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -38477,7 +41710,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L12:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":681
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":681
  *                 return -1
  * 
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -38487,7 +41720,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":682
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":682
  * 
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -38497,7 +41730,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":683
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":683
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -38510,7 +41743,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L15:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":684
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":684
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -38520,7 +41753,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":685
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":685
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -38536,7 +41769,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":687
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":687
  *                     return -1
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -38546,7 +41779,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_3 = ((((__pyx_v_loc2->arr[(__pyx_v_loc2->end - 1)]) + __pyx_v_len_last) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) > __pyx_v_self->train_max_initial_size);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":688
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":688
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1             # <<<<<<<<<<<<<<
@@ -38559,7 +41792,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L17:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":689
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":689
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1
  *         return 0             # <<<<<<<<<<<<<<
@@ -38575,7 +41808,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":692
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":692
  * 
  * 
  *     cdef int* merge_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -38597,9 +41830,9 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   int __pyx_t_1;
   int __pyx_t_2;
   int __pyx_t_3;
-  __Pyx_RefNannySetupContext("merge_helper");
+  __Pyx_RefNannySetupContext("merge_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":700
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":700
  *         cdef Matching loc1, loc2
  * 
  *         result_len[0] = 0             # <<<<<<<<<<<<<<
@@ -38608,7 +41841,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   (__pyx_v_result_len[0]) = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":701
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":701
  * 
  *         result_len[0] = 0
  *         result = <int*> malloc(0*sizeof(int))             # <<<<<<<<<<<<<<
@@ -38617,7 +41850,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":703
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":703
  *         result = <int*> malloc(0*sizeof(int))
  * 
  *         i1 = low1             # <<<<<<<<<<<<<<
@@ -38626,7 +41859,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i1 = __pyx_v_low1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":704
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":704
  * 
  *         i1 = low1
  *         i2 = low2             # <<<<<<<<<<<<<<
@@ -38635,7 +41868,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i2 = __pyx_v_low2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":705
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":705
  *         i1 = low1
  *         i2 = low2
  *         while i1 < high1 and i2 < high2:             # <<<<<<<<<<<<<<
@@ -38652,7 +41885,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":708
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":708
  * 
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38661,7 +41894,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":709
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":709
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:             # <<<<<<<<<<<<<<
@@ -38672,7 +41905,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
       if (!__pyx_t_3) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":710
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":710
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38681,7 +41914,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":711
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":711
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -38691,7 +41924,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":712
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":712
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -38703,7 +41936,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":714
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":714
  *                     i2 = i2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -38716,7 +41949,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     __pyx_L6_break:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":717
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":717
  * 
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1             # <<<<<<<<<<<<<<
@@ -38725,7 +41958,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_v_j1 = __pyx_v_i1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":718
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":718
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:             # <<<<<<<<<<<<<<
@@ -38742,7 +41975,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       if (!__pyx_t_2) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":719
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":719
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38751,7 +41984,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":720
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":720
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2             # <<<<<<<<<<<<<<
@@ -38760,7 +41993,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_v_j2 = __pyx_v_i2;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":721
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":721
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2
  *                 while j2 < high2:             # <<<<<<<<<<<<<<
@@ -38771,7 +42004,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_j2 < __pyx_v_high2);
         if (!__pyx_t_2) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":722
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":722
  *                 j2 = i2
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -38780,7 +42013,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_j2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":723
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":723
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -38789,7 +42022,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":724
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":724
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -38799,7 +42032,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == 0);
         if (__pyx_t_2) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":725
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":725
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -38811,7 +42044,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L12:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":726
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":726
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)
  *                     if comparison == 1:             # <<<<<<<<<<<<<<
@@ -38824,7 +42057,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L13:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":728
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":728
  *                     if comparison == 1:
  *                         pass
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -38834,7 +42067,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == -1);
         if (__pyx_t_2) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":729
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":729
  *                         pass
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -38846,7 +42079,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":731
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":731
  *                         break
  *                     else:
  *                         j2 = j2 + step2             # <<<<<<<<<<<<<<
@@ -38859,7 +42092,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       __pyx_L11_break:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":732
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":732
  *                     else:
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -38870,7 +42103,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":733
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":733
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1
  *         return result             # <<<<<<<<<<<<<<
@@ -38886,7 +42119,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":736
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":736
  * 
  * 
  *     cdef void sort_phrase_loc(self, IntList arr, PhraseLocation loc, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -38906,19 +42139,19 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("sort_phrase_loc");
+  __Pyx_RefNannySetupContext("sort_phrase_loc", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":741
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":741
  *         cdef IntList result
  * 
  *         if phrase in self.precomputed_index:             # <<<<<<<<<<<<<<
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  */
-  __pyx_t_1 = ((PySequence_Contains(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_phrase), __pyx_v_self->precomputed_index, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":742
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":742
  * 
  *         if phrase in self.precomputed_index:
  *             loc.arr = self.precomputed_index[phrase]             # <<<<<<<<<<<<<<
@@ -38937,7 +42170,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":744
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":744
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)             # <<<<<<<<<<<<<<
@@ -38950,7 +42183,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __Pyx_GOTREF(__pyx_t_3);
     if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_GIVEREF(__pyx_t_3);
@@ -38959,7 +42192,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_v_loc->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":745
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":745
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)             # <<<<<<<<<<<<<<
@@ -38969,7 +42202,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_3 = PyInt_FromLong(__pyx_v_arr->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
@@ -38979,7 +42212,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":746
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":746
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:             # <<<<<<<<<<<<<<
@@ -38989,7 +42222,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = __pyx_v_loc->sa_high;
     for (__pyx_v_i = __pyx_v_loc->sa_low; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":747
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":747
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])             # <<<<<<<<<<<<<<
@@ -38999,7 +42232,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
       ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_v_veb->__pyx_vtab)->_insert(__pyx_v_veb, (__pyx_v_arr->arr[__pyx_v_i]));
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":748
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":748
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -39008,7 +42241,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
     __pyx_v_i = __pyx_v_veb->veb->min_val;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":749
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":749
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:             # <<<<<<<<<<<<<<
@@ -39018,7 +42251,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = (__pyx_v_loc->sa_high - __pyx_v_loc->sa_low);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":750
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":750
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i             # <<<<<<<<<<<<<<
@@ -39027,7 +42260,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
       (__pyx_v_loc->arr->arr[__pyx_v_j]) = __pyx_v_i;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":751
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":751
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -39039,7 +42272,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":752
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":752
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0             # <<<<<<<<<<<<<<
@@ -39048,7 +42281,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
   __pyx_v_loc->arr_low = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":753
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":753
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0
  *         loc.arr_high = loc.arr.len             # <<<<<<<<<<<<<<
@@ -39067,7 +42300,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":756
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":756
  * 
  * 
  *     cdef intersect_helper(self, Phrase prefix, Phrase suffix,             # <<<<<<<<<<<<<<
@@ -39102,9 +42335,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("intersect_helper");
+  __Pyx_RefNannySetupContext("intersect_helper", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":763
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":763
  *         cdef int* result_ptr
  * 
  *         result_len = 0             # <<<<<<<<<<<<<<
@@ -39113,7 +42346,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_result_len = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":765
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":765
  *         result_len = 0
  * 
  *         if sym_isvar(suffix[0]):             # <<<<<<<<<<<<<<
@@ -39127,7 +42360,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_t_2);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":766
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":766
  * 
  *         if sym_isvar(suffix[0]):
  *             offset_by_one = 1             # <<<<<<<<<<<<<<
@@ -39139,7 +42372,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":768
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":768
  *             offset_by_one = 1
  *         else:
  *             offset_by_one = 0             # <<<<<<<<<<<<<<
@@ -39150,7 +42383,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":770
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":770
  *             offset_by_one = 0
  * 
  *         len_last = len(suffix.getchunk(suffix.arity()))             # <<<<<<<<<<<<<<
@@ -39165,7 +42398,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
   __Pyx_GIVEREF(__pyx_t_5);
   __pyx_t_5 = 0;
@@ -39177,7 +42410,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_len_last = __pyx_t_6;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":772
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":772
  *         len_last = len(suffix.getchunk(suffix.arity()))
  * 
  *         if prefix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -39187,7 +42420,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_prefix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":773
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":773
  * 
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)             # <<<<<<<<<<<<<<
@@ -39202,7 +42435,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":774
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":774
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr             # <<<<<<<<<<<<<<
@@ -39212,7 +42445,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_prefix_loc->arr));
   __pyx_v_arr1 = __pyx_v_prefix_loc->arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":775
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":775
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -39221,7 +42454,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low1 = __pyx_v_prefix_loc->arr_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":776
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":776
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -39230,7 +42463,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high1 = __pyx_v_prefix_loc->arr_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":777
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":777
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high
  *         step1 = prefix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -39239,7 +42472,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step1 = __pyx_v_prefix_loc->num_subpatterns;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":779
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":779
  *         step1 = prefix_loc.num_subpatterns
  * 
  *         if suffix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -39249,7 +42482,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_suffix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":780
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":780
  * 
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)             # <<<<<<<<<<<<<<
@@ -39264,7 +42497,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L5:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":781
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":781
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr             # <<<<<<<<<<<<<<
@@ -39274,7 +42507,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_suffix_loc->arr));
   __pyx_v_arr2 = __pyx_v_suffix_loc->arr;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":782
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":782
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -39283,7 +42516,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low2 = __pyx_v_suffix_loc->arr_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":783
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":783
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -39292,7 +42525,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high2 = __pyx_v_suffix_loc->arr_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":784
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":784
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high
  *         step2 = suffix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -39301,7 +42534,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step2 = __pyx_v_suffix_loc->num_subpatterns;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":786
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":786
  *         step2 = suffix_loc.num_subpatterns
  * 
  *         num_subpatterns = prefix.arity()+1             # <<<<<<<<<<<<<<
@@ -39320,7 +42553,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_num_subpatterns = __pyx_t_3;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":788
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":788
  *         num_subpatterns = prefix.arity()+1
  * 
  *         if algorithm == MERGE:             # <<<<<<<<<<<<<<
@@ -39330,7 +42563,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_algorithm == __pyx_v_3_sa_MERGE);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":791
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":791
  *             result_ptr = self.merge_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -39342,7 +42575,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":795
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":795
  *             result_ptr = self.baeza_yates_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -39353,7 +42586,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":797
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":797
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)
  * 
  *         if result_len == 0:             # <<<<<<<<<<<<<<
@@ -39363,7 +42596,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_result_len == 0);
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":798
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":798
  * 
  *         if result_len == 0:
  *             free(result_ptr)             # <<<<<<<<<<<<<<
@@ -39372,7 +42605,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result_ptr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":799
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":799
  *         if result_len == 0:
  *             free(result_ptr)
  *             return None             # <<<<<<<<<<<<<<
@@ -39387,7 +42620,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":801
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":801
  *             return None
  *         else:
  *             result = IntList()             # <<<<<<<<<<<<<<
@@ -39399,7 +42632,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
     __pyx_v_result = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":802
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":802
  *         else:
  *             result = IntList()
  *             free(result.arr)             # <<<<<<<<<<<<<<
@@ -39408,7 +42641,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result->arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":803
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":803
  *             result = IntList()
  *             free(result.arr)
  *             result.arr = result_ptr             # <<<<<<<<<<<<<<
@@ -39417,7 +42650,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->arr = __pyx_v_result_ptr;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":804
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":804
  *             free(result.arr)
  *             result.arr = result_ptr
  *             result.len = result_len             # <<<<<<<<<<<<<<
@@ -39426,7 +42659,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->len = __pyx_v_result_len;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":805
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":805
  *             result.arr = result_ptr
  *             result.len = result_len
  *             result.size = result_len             # <<<<<<<<<<<<<<
@@ -39435,7 +42668,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->size = __pyx_v_result_len;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":806
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":806
  *             result.len = result_len
  *             result.size = result_len
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)             # <<<<<<<<<<<<<<
@@ -39455,7 +42688,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
     __Pyx_GOTREF(__pyx_t_4);
     if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_r = __pyx_t_4;
@@ -39481,7 +42714,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":808
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":808
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)
  * 
  *     cdef loc2str(self, PhraseLocation loc):             # <<<<<<<<<<<<<<
@@ -39489,7 +42722,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  *         result = "{"
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_loc) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_loc) {
   int __pyx_v_i;
   int __pyx_v_j;
   PyObject *__pyx_v_result = NULL;
@@ -39502,9 +42735,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("loc2str");
+  __Pyx_RefNannySetupContext("loc2str", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":810
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":810
  *     cdef loc2str(self, PhraseLocation loc):
  *         cdef int i, j
  *         result = "{"             # <<<<<<<<<<<<<<
@@ -39514,7 +42747,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_117));
   __pyx_v_result = ((PyObject *)__pyx_kp_s_117);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":811
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":811
  *         cdef int i, j
  *         result = "{"
  *         i = 0             # <<<<<<<<<<<<<<
@@ -39523,7 +42756,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":812
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":812
  *         result = "{"
  *         i = 0
  *         while i < loc.arr_high:             # <<<<<<<<<<<<<<
@@ -39534,7 +42767,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_t_1 = (__pyx_v_i < __pyx_v_loc->arr_high);
     if (!__pyx_t_1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":813
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":813
  *         i = 0
  *         while i < loc.arr_high:
  *             result = result + "("             # <<<<<<<<<<<<<<
@@ -39547,7 +42780,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":814
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":814
  *         while i < loc.arr_high:
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -39557,7 +42790,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_t_3 = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
     for (__pyx_v_j = __pyx_v_i; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":815
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":815
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])             # <<<<<<<<<<<<<<
@@ -39577,7 +42810,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
       __pyx_t_2 = 0;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":816
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":816
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"             # <<<<<<<<<<<<<<
@@ -39590,7 +42823,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":817
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":817
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"
  *             i = i + loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -39600,7 +42833,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":818
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":818
  *             result = result + ")"
  *             i = i + loc.num_subpatterns
  *         result = result + "}"             # <<<<<<<<<<<<<<
@@ -39613,7 +42846,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
   __pyx_v_result = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":819
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":819
  *             i = i + loc.num_subpatterns
  *         result = result + "}"
  *         return result             # <<<<<<<<<<<<<<
@@ -39639,7 +42872,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":821
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":821
  *         return result
  * 
  *     cdef PhraseLocation intersect(self, prefix_node, suffix_node, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -39653,7 +42886,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_prefix_loc = 0;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_suffix_loc = 0;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_v_result = 0;
-  PyObject *__pyx_v_intersect_method = NULL;
+  CYTHON_UNUSED PyObject *__pyx_v_intersect_method = NULL;
   struct __pyx_obj_3_sa_PhraseLocation *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -39663,9 +42896,9 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("intersect");
+  __Pyx_RefNannySetupContext("intersect", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":825
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":825
  *         cdef PhraseLocation prefix_loc, suffix_loc, result
  * 
  *         prefix = prefix_node.phrase             # <<<<<<<<<<<<<<
@@ -39678,7 +42911,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_prefix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":826
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":826
  * 
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase             # <<<<<<<<<<<<<<
@@ -39691,7 +42924,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_suffix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":827
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":827
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location             # <<<<<<<<<<<<<<
@@ -39704,7 +42937,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_prefix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":828
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":828
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location
  *         suffix_loc = suffix_node.phrase_location             # <<<<<<<<<<<<<<
@@ -39717,7 +42950,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_suffix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":830
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":830
  *         suffix_loc = suffix_node.phrase_location
  * 
  *         result = self.get_precomputed_collocation(phrase)             # <<<<<<<<<<<<<<
@@ -39727,7 +42960,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_120); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)__pyx_v_phrase));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_phrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_phrase));
@@ -39739,7 +42972,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":831
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":831
  * 
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:             # <<<<<<<<<<<<<<
@@ -39749,7 +42982,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) != Py_None);
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":832
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":832
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:
  *             intersect_method = "precomputed"             # <<<<<<<<<<<<<<
@@ -39762,7 +42995,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":834
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":834
  *             intersect_method = "precomputed"
  * 
  *         if result is None:             # <<<<<<<<<<<<<<
@@ -39772,7 +43005,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) == Py_None);
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":835
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":835
  * 
  *         if result is None:
  *             if self.use_baeza_yates:             # <<<<<<<<<<<<<<
@@ -39781,7 +43014,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
  */
     if (__pyx_v_self->use_baeza_yates) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":836
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":836
  *         if result is None:
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)             # <<<<<<<<<<<<<<
@@ -39795,7 +43028,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":837
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":837
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)
  *                 intersect_method="double binary"             # <<<<<<<<<<<<<<
@@ -39809,7 +43042,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":839
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":839
  *                 intersect_method="double binary"
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)             # <<<<<<<<<<<<<<
@@ -39823,7 +43056,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":840
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":840
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"             # <<<<<<<<<<<<<<
@@ -39839,7 +43072,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":841
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":841
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"
  *         return result             # <<<<<<<<<<<<<<
@@ -39871,56 +43104,22 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":843
- *         return result
- * 
- *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
- *         cdef unsigned na
- *         nf = []
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_frontier = 0;
   PyObject *__pyx_v_res = 0;
   PyObject *__pyx_v_fwords = 0;
-  unsigned int __pyx_v_na;
-  PyObject *__pyx_v_nf = NULL;
-  PyObject *__pyx_v_toskip = NULL;
-  PyObject *__pyx_v_i = NULL;
-  PyObject *__pyx_v_alt = NULL;
-  PyObject *__pyx_v_pathlen = NULL;
-  PyObject *__pyx_v_spanlen = NULL;
-  PyObject *__pyx_v_ni = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *(*__pyx_t_3)(PyObject *);
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  int __pyx_t_12;
-  Py_ssize_t __pyx_t_13;
-  int __pyx_t_14;
-  int __pyx_t_15;
-  unsigned int __pyx_t_16;
-  int __pyx_t_17;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
-  __Pyx_RefNannySetupContext("advance");
+  __Pyx_RefNannySetupContext("advance (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -39928,26 +43127,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__frontier);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__frontier)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -39968,8 +43164,53 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_frontier, __pyx_v_res, __pyx_v_fwords);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":843
+ *         return result
+ * 
+ *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
+ *         cdef unsigned na
+ *         nf = []
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_frontier, PyObject *__pyx_v_res, PyObject *__pyx_v_fwords) {
+  unsigned int __pyx_v_na;
+  PyObject *__pyx_v_nf = NULL;
+  PyObject *__pyx_v_toskip = NULL;
+  PyObject *__pyx_v_i = NULL;
+  PyObject *__pyx_v_alt = NULL;
+  PyObject *__pyx_v_pathlen = NULL;
+  PyObject *__pyx_v_spanlen = NULL;
+  PyObject *__pyx_v_ni = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *(*__pyx_t_3)(PyObject *);
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
+  Py_ssize_t __pyx_t_13;
+  int __pyx_t_14;
+  int __pyx_t_15;
+  unsigned int __pyx_t_16;
+  int __pyx_t_17;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("advance", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":845
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":845
  *     def advance(self, frontier, res, fwords):
  *         cdef unsigned na
  *         nf = []             # <<<<<<<<<<<<<<
@@ -39977,11 +43218,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
  *             spanlen = fwords[i][alt][2]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_nf = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":846
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":846
  *         cdef unsigned na
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:             # <<<<<<<<<<<<<<
@@ -39997,12 +43238,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -40016,66 +43265,74 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
       PyObject* sequence = __pyx_t_4;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 2)) {
+        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
+      #else
+      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
       __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
-      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L8_unpacking_failed;
+      index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_5);
-      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L8_unpacking_failed;
+      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L9_unpacking_done;
-      __pyx_L8_unpacking_failed:;
+      goto __pyx_L6_unpacking_done;
+      __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      __pyx_t_8 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L9_unpacking_done:;
+      __pyx_L6_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_toskip);
     __pyx_v_toskip = __pyx_t_5;
     __pyx_t_5 = 0;
     if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) {
       PyObject* sequence = __pyx_t_6;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 3)) {
+        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-          if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_7 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_9 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-          if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_7 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_9 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
@@ -40083,28 +43340,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_t_10);
+      #else
+      __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
       __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_11)->tp_iternext;
-      index = 0; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L10_unpacking_failed;
+      index = 0; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      index = 1; __pyx_t_9 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_9)) goto __pyx_L10_unpacking_failed;
+      index = 1; __pyx_t_9 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_9)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_9);
-      index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L10_unpacking_failed;
+      index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_10);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      goto __pyx_L11_unpacking_done;
-      __pyx_L10_unpacking_failed:;
+      goto __pyx_L8_unpacking_done;
+      __pyx_L7_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      __pyx_t_8 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_L11_unpacking_done:;
+      __pyx_L8_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_7;
@@ -40116,7 +43380,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_v_pathlen = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":847
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":847
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
@@ -40135,20 +43399,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_v_spanlen = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":848
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":848
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):             # <<<<<<<<<<<<<<
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":849
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":849
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))             # <<<<<<<<<<<<<<
@@ -40156,7 +43419,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  */
       __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_v_i);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
       __Pyx_GIVEREF(__pyx_v_i);
@@ -40170,11 +43433,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L12;
+      goto __pyx_L9;
     }
-    __pyx_L12:;
+    __pyx_L9:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":850
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":850
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen             # <<<<<<<<<<<<<<
@@ -40187,7 +43450,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_v_ni = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":851
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":851
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):             # <<<<<<<<<<<<<<
@@ -40197,18 +43460,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_t_13 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
       __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_6 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -40219,7 +43480,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     }
     if (__pyx_t_15) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":852
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":852
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):             # <<<<<<<<<<<<<<
@@ -40233,16 +43494,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
       for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_13; __pyx_t_16+=1) {
         __pyx_v_na = __pyx_t_16;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":853
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":853
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))             # <<<<<<<<<<<<<<
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)
  */
-        if (unlikely(((PyObject *)__pyx_v_nf) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_5 = PyNumber_Subtract(__pyx_v_toskip, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_na); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -40250,7 +43508,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
         __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+        __Pyx_GOTREF(__pyx_t_10);
         __Pyx_INCREF(__pyx_v_ni);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_ni);
         __Pyx_GIVEREF(__pyx_v_ni);
@@ -40261,7 +43519,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
         __pyx_t_6 = 0;
         __pyx_t_4 = 0;
         __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+        __Pyx_GOTREF(__pyx_t_4);
         PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_t_10));
@@ -40271,27 +43529,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
         __pyx_t_17 = PyList_Append(__pyx_v_nf, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       }
-      goto __pyx_L13;
+      goto __pyx_L10;
     }
-    __pyx_L13:;
+    __pyx_L10:;
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":854
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":854
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):             # <<<<<<<<<<<<<<
  *             return self.advance(nf, res, fwords)
  *         else:
  */
-  if (unlikely(((PyObject *)__pyx_v_nf) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
-  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); 
+  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_15 = (__pyx_t_2 > 0);
   if (__pyx_t_15) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":855
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":855
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)             # <<<<<<<<<<<<<<
@@ -40299,10 +43554,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
  *             return res
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_v_nf));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_nf));
     __Pyx_GIVEREF(((PyObject *)__pyx_v_nf));
@@ -40319,11 +43574,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_r = __pyx_t_10;
     __pyx_t_10 = 0;
     goto __pyx_L0;
-    goto __pyx_L16;
+    goto __pyx_L13;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":857
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":857
  *             return self.advance(nf, res, fwords)
  *         else:
  *             return res             # <<<<<<<<<<<<<<
@@ -40335,7 +43590,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
     __pyx_r = __pyx_v_res;
     goto __pyx_L0;
   }
-  __pyx_L16:;
+  __pyx_L13:;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -40363,16 +43618,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":859
- *             return res
- * 
- *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
- *         cdef unsigned alt_it
- *         frontier = []
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_skip = 0;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_spanlen = 0;
@@ -40380,39 +43628,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_next_states = 0;
   PyObject *__pyx_v_reachable_buffer = 0;
-  PyObject *__pyx_v_frontier = NULL;
-  PyObject *__pyx_v_key = NULL;
-  PyObject *__pyx_v_reachable = NULL;
-  PyObject *__pyx_v_nextreachable = NULL;
-  PyObject *__pyx_v_next_id = NULL;
-  PyObject *__pyx_v_jump = NULL;
-  Py_ssize_t __pyx_v_alt_id;
-  PyObject *__pyx_v_newel = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  Py_ssize_t __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  PyObject *(*__pyx_t_6)(PyObject *);
-  Py_ssize_t __pyx_t_7;
-  PyObject *(*__pyx_t_8)(PyObject *);
-  PyObject *__pyx_t_9 = NULL;
-  PyObject *__pyx_t_10 = NULL;
-  Py_ssize_t __pyx_t_11;
-  Py_ssize_t __pyx_t_12;
-  int __pyx_t_13;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__skip,&__pyx_n_s__i,&__pyx_n_s__spanlen,&__pyx_n_s__pathlen,&__pyx_n_s__fwords,&__pyx_n_s__next_states,&__pyx_n_s__reachable_buffer,0};
-  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away");
+  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__skip,&__pyx_n_s__i,&__pyx_n_s__spanlen,&__pyx_n_s__pathlen,&__pyx_n_s__fwords,&__pyx_n_s__next_states,&__pyx_n_s__reachable_buffer,0};
     PyObject* values[7] = {0,0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
         case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
         case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
@@ -40424,50 +43649,43 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__skip);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__skip)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen);
-        if (likely(values[3])) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
-        values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[4])) kw_args--;
+        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
-        values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states);
-        if (likely(values[5])) kw_args--;
+        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  6:
-        values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer);
-        if (likely(values[6])) kw_args--;
+        if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 7) {
       goto __pyx_L5_argtuple_error;
@@ -40496,8 +43714,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_skip, __pyx_v_i, __pyx_v_spanlen, __pyx_v_pathlen, __pyx_v_fwords, __pyx_v_next_states, __pyx_v_reachable_buffer);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":859
+ *             return res
+ * 
+ *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
+ *         cdef unsigned alt_it
+ *         frontier = []
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":861
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_away(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_skip, PyObject *__pyx_v_i, PyObject *__pyx_v_spanlen, PyObject *__pyx_v_pathlen, PyObject *__pyx_v_fwords, PyObject *__pyx_v_next_states, PyObject *__pyx_v_reachable_buffer) {
+  PyObject *__pyx_v_frontier = NULL;
+  PyObject *__pyx_v_key = NULL;
+  PyObject *__pyx_v_reachable = NULL;
+  PyObject *__pyx_v_nextreachable = NULL;
+  PyObject *__pyx_v_next_id = NULL;
+  PyObject *__pyx_v_jump = NULL;
+  PyObject *__pyx_v_alt_id = NULL;
+  PyObject *__pyx_v_newel = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  Py_ssize_t __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  int __pyx_t_5;
+  PyObject *(*__pyx_t_6)(PyObject *);
+  Py_ssize_t __pyx_t_7;
+  PyObject *(*__pyx_t_8)(PyObject *);
+  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_10 = NULL;
+  Py_ssize_t __pyx_t_11;
+  PyObject *(*__pyx_t_12)(PyObject *);
+  PyObject *__pyx_t_13 = NULL;
+  int __pyx_t_14;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("get_all_nodes_isteps_away", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":861
  *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):
  *         cdef unsigned alt_it
  *         frontier = []             # <<<<<<<<<<<<<<
@@ -40505,11 +43765,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  *             return frontier
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_frontier = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":862
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":862
  *         cdef unsigned alt_it
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):             # <<<<<<<<<<<<<<
@@ -40524,15 +43784,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __pyx_t_3 = PyObject_Length(__pyx_v_next_states); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":863
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":863
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier             # <<<<<<<<<<<<<<
@@ -40543,11 +43802,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __Pyx_INCREF(((PyObject *)__pyx_v_frontier));
     __pyx_r = ((PyObject *)__pyx_v_frontier);
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":864
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":864
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier
  *         key = tuple([i,spanlen])             # <<<<<<<<<<<<<<
@@ -40555,7 +43814,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  *         if (key in reachable_buffer):
  */
   __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+  __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(__pyx_v_i);
   PyList_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
   __Pyx_GIVEREF(__pyx_v_i);
@@ -40568,7 +43827,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __pyx_v_key = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":865
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":865
  *             return frontier
  *         key = tuple([i,spanlen])
  *         reachable = []             # <<<<<<<<<<<<<<
@@ -40576,21 +43835,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  *             reachable = reachable_buffer[key]
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_reachable = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":866
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":866
  *         key = tuple([i,spanlen])
  *         reachable = []
  *         if (key in reachable_buffer):             # <<<<<<<<<<<<<<
  *             reachable = reachable_buffer[key]
  *         else:
  */
-  __pyx_t_5 = ((PySequence_Contains(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_key), __pyx_v_reachable_buffer, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":867
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":867
  *         reachable = []
  *         if (key in reachable_buffer):
  *             reachable = reachable_buffer[key]             # <<<<<<<<<<<<<<
@@ -40602,21 +43861,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __Pyx_DECREF(__pyx_v_reachable);
     __pyx_v_reachable = __pyx_t_1;
     __pyx_t_1 = 0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":869
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":869
  *             reachable = reachable_buffer[key]
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)             # <<<<<<<<<<<<<<
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
@@ -40634,7 +43893,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __pyx_v_reachable = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":870
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":870
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable             # <<<<<<<<<<<<<<
@@ -40643,9 +43902,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  */
     if (PyObject_SetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key), __pyx_v_reachable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":871
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":871
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:             # <<<<<<<<<<<<<<
@@ -40661,12 +43920,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_2)) {
+    if (!__pyx_t_6 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
-    } else if (PyTuple_CheckExact(__pyx_t_2)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_6 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_6(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
@@ -40682,7 +43949,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     __pyx_v_nextreachable = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":872
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":872
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:             # <<<<<<<<<<<<<<
@@ -40701,12 +43968,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
     }
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_1)) {
+      if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
-        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
-      } else if (PyTuple_CheckExact(__pyx_t_1)) {
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
         __pyx_t_4 = __pyx_t_8(__pyx_t_1);
         if (unlikely(!__pyx_t_4)) {
@@ -40722,17 +43997,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
       __pyx_v_next_id = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":873
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":873
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)             # <<<<<<<<<<<<<<
  *                 if jump < skip:
  *                     continue
  */
-      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+      __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_fwords);
       __Pyx_GIVEREF(__pyx_v_fwords);
@@ -40750,32 +44025,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
       __pyx_v_jump = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":874
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":874
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:             # <<<<<<<<<<<<<<
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  */
-      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_10);
+      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":875
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":875
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:
  *                     continue             # <<<<<<<<<<<<<<
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  */
-        goto __pyx_L10_continue;
-        goto __pyx_L12;
+        goto __pyx_L7_continue;
+        goto __pyx_L9;
       }
-      __pyx_L12:;
+      __pyx_L9:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":876
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":876
  *                 if jump < skip:
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:             # <<<<<<<<<<<<<<
@@ -40784,17 +44058,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  */
       __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_9 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":877
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":877
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):             # <<<<<<<<<<<<<<
@@ -40805,10 +44078,56 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
         __Pyx_GOTREF(__pyx_t_4);
         __pyx_t_11 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
-          __pyx_v_alt_id = __pyx_t_12;
+        __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_9);
+        PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4);
+        __Pyx_GIVEREF(__pyx_t_4);
+        __pyx_t_4 = 0;
+        __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+        if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
+          __pyx_t_9 = __pyx_t_4; __Pyx_INCREF(__pyx_t_9); __pyx_t_11 = 0;
+          __pyx_t_12 = NULL;
+        } else {
+          __pyx_t_11 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_12 = Py_TYPE(__pyx_t_9)->tp_iternext;
+        }
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        for (;;) {
+          if (!__pyx_t_12 && PyList_CheckExact(__pyx_t_9)) {
+            if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_9)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else if (!__pyx_t_12 && PyTuple_CheckExact(__pyx_t_9)) {
+            if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else {
+            __pyx_t_4 = __pyx_t_12(__pyx_t_9);
+            if (unlikely(!__pyx_t_4)) {
+              if (PyErr_Occurred()) {
+                if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              break;
+            }
+            __Pyx_GOTREF(__pyx_t_4);
+          }
+          __Pyx_XDECREF(__pyx_v_alt_id);
+          __pyx_v_alt_id = __pyx_t_4;
+          __pyx_t_4 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":878
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":878
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
@@ -40817,102 +44136,95 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
  */
           __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_4, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_10 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt_id); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_9, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyObject_RichCompare(__pyx_t_4, __pyx_t_9, Py_NE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_13 = PyObject_RichCompare(__pyx_t_4, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
           if (__pyx_t_5) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":879
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":879
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)             # <<<<<<<<<<<<<<
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  */
-            __pyx_t_10 = PyInt_FromSsize_t(__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
+            __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_4));
             __Pyx_INCREF(__pyx_v_next_id);
-            PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_next_id);
+            PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
             __Pyx_GIVEREF(__pyx_v_next_id);
-            PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_9);
-            __Pyx_GIVEREF(__pyx_t_9);
-            __pyx_t_10 = 0;
-            __pyx_t_9 = 0;
+            __Pyx_INCREF(__pyx_v_alt_id);
+            PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_v_alt_id);
+            __Pyx_GIVEREF(__pyx_v_alt_id);
+            PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_13);
+            __Pyx_GIVEREF(__pyx_t_13);
+            __pyx_t_13 = 0;
             __Pyx_XDECREF(((PyObject *)__pyx_v_newel));
-            __pyx_v_newel = __pyx_t_4;
-            __pyx_t_4 = 0;
+            __pyx_v_newel = __pyx_t_10;
+            __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":880
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":880
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:             # <<<<<<<<<<<<<<
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier
  */
-            __pyx_t_5 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_frontier), ((PyObject *)__pyx_v_newel)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_newel), ((PyObject *)__pyx_v_frontier), Py_NE)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (__pyx_t_5) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":881
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":881
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))             # <<<<<<<<<<<<<<
  *         return frontier
  * 
  */
-              if (unlikely(((PyObject *)__pyx_v_frontier) == Py_None)) {
-                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-              }
-              __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_alt_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_4);
-              __pyx_t_9 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_9);
-              __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+              __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_10);
+              __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_13);
               __Pyx_INCREF(__pyx_v_next_id);
-              PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
+              PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_v_next_id);
               __Pyx_GIVEREF(__pyx_v_next_id);
-              PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_4);
-              __Pyx_GIVEREF(__pyx_t_4);
-              PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_9);
-              __Pyx_GIVEREF(__pyx_t_9);
-              __pyx_t_4 = 0;
-              __pyx_t_9 = 0;
-              __pyx_t_13 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_10)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-              goto __pyx_L17;
+              __Pyx_INCREF(__pyx_v_alt_id);
+              PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_v_alt_id);
+              __Pyx_GIVEREF(__pyx_v_alt_id);
+              PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
+              __Pyx_GIVEREF(__pyx_t_10);
+              __pyx_t_10 = 0;
+              __pyx_t_14 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+              goto __pyx_L14;
             }
-            __pyx_L17:;
-            goto __pyx_L16;
+            __pyx_L14:;
+            goto __pyx_L13;
           }
-          __pyx_L16:;
+          __pyx_L13:;
         }
-        goto __pyx_L13;
+        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        goto __pyx_L10;
       }
-      __pyx_L13:;
-      __pyx_L10_continue:;
+      __pyx_L10:;
+      __pyx_L7_continue:;
     }
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":882
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":882
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier             # <<<<<<<<<<<<<<
@@ -40932,6 +44244,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
+  __Pyx_XDECREF(__pyx_t_13);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_all_nodes_isteps_away", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -40941,50 +44254,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_a
   __Pyx_XDECREF(__pyx_v_nextreachable);
   __Pyx_XDECREF(__pyx_v_next_id);
   __Pyx_XDECREF(__pyx_v_jump);
+  __Pyx_XDECREF(__pyx_v_alt_id);
   __Pyx_XDECREF(__pyx_v_newel);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":884
- *         return frontier
- * 
- *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
- *         ret = []
- *         if (ifrom >= len(fwords)):
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_dist = 0;
-  PyObject *__pyx_v_ret = NULL;
-  Py_ssize_t __pyx_v_alt_id;
-  PyObject *__pyx_v_ifromchild = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  Py_ssize_t __pyx_t_5;
-  PyObject *__pyx_t_6 = NULL;
-  PyObject *__pyx_t_7 = NULL;
-  int __pyx_t_8;
-  Py_ssize_t __pyx_t_9;
-  PyObject *(*__pyx_t_10)(PyObject *);
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
-  __Pyx_RefNannySetupContext("reachable");
+  __Pyx_RefNannySetupContext("reachable (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -40992,26 +44284,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -41032,8 +44321,42 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_ifrom, __pyx_v_dist);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":884
+ *         return frontier
+ * 
+ *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
+ *         ret = []
+ *         if (ifrom >= len(fwords)):
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_dist) {
+  PyObject *__pyx_v_ret = NULL;
+  PyObject *__pyx_v_alt_id = NULL;
+  PyObject *__pyx_v_ifromchild = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_2;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  PyObject *(*__pyx_t_5)(PyObject *);
+  PyObject *__pyx_t_6 = NULL;
+  PyObject *__pyx_t_7 = NULL;
+  PyObject *__pyx_t_8 = NULL;
+  int __pyx_t_9;
+  Py_ssize_t __pyx_t_10;
+  PyObject *(*__pyx_t_11)(PyObject *);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("reachable", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":885
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":885
  * 
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []             # <<<<<<<<<<<<<<
@@ -41041,11 +44364,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
  *             return ret
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":886
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":886
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []
  *         if (ifrom >= len(fwords)):             # <<<<<<<<<<<<<<
@@ -41055,14 +44378,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
   __pyx_t_2 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":887
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":887
  *         ret = []
  *         if (ifrom >= len(fwords)):
  *             return ret             # <<<<<<<<<<<<<<
@@ -41073,11 +44395,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
     __Pyx_INCREF(((PyObject *)__pyx_v_ret));
     __pyx_r = ((PyObject *)__pyx_v_ret);
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":888
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":888
  *         if (ifrom >= len(fwords)):
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
@@ -41088,10 +44410,56 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_2 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_2; __pyx_t_5+=1) {
-    __pyx_v_alt_id = __pyx_t_5;
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+    __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+    __pyx_t_5 = NULL;
+  } else {
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext;
+  }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  for (;;) {
+    if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_1)) {
+      if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else {
+      __pyx_t_3 = __pyx_t_5(__pyx_t_1);
+      if (unlikely(!__pyx_t_3)) {
+        if (PyErr_Occurred()) {
+          if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    __Pyx_XDECREF(__pyx_v_alt_id);
+    __pyx_v_alt_id = __pyx_t_3;
+    __pyx_t_3 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":889
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":889
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):             # <<<<<<<<<<<<<<
@@ -41100,169 +44468,172 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
  */
     __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_6 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, __pyx_t_1, Py_EQ); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_6 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":890
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":890
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))             # <<<<<<<<<<<<<<
  *             else:
  *                 if (dist==0):
  */
-      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_8 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_8, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fwords);
       __Pyx_GIVEREF(__pyx_v_fwords);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7);
-      __Pyx_GIVEREF(__pyx_t_7);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_8);
+      __Pyx_GIVEREF(__pyx_t_8);
       __Pyx_INCREF(__pyx_v_dist);
       PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_dist);
       __Pyx_GIVEREF(__pyx_v_dist);
-      __pyx_t_7 = 0;
-      __pyx_t_7 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7);
-      __Pyx_GIVEREF(__pyx_t_7);
-      __pyx_t_7 = 0;
-      __pyx_t_7 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_8 = 0;
+      __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_8);
+      __Pyx_GIVEREF(__pyx_t_8);
+      __pyx_t_8 = 0;
+      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      goto __pyx_L9;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      goto __pyx_L6;
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":892
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":892
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  *             else:
  *                 if (dist==0):             # <<<<<<<<<<<<<<
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)
  */
-      __pyx_t_7 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      __pyx_t_8 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":893
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":893
  *             else:
  *                 if (dist==0):
  *                     if (ifrom not in ret):             # <<<<<<<<<<<<<<
  *                         ret.append(ifrom)
  *                 else:
  */
-        __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_ret), __pyx_v_ifrom))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifrom, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":894
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":894
  *                 if (dist==0):
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)             # <<<<<<<<<<<<<<
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  */
-          if (unlikely(((PyObject *)__pyx_v_ret) == Py_None)) {
-            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_8 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          goto __pyx_L11;
+          __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          goto __pyx_L8;
         }
-        __pyx_L11:;
-        goto __pyx_L10;
+        __pyx_L8:;
+        goto __pyx_L7;
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":896
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":896
  *                         ret.append(ifrom)
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):             # <<<<<<<<<<<<<<
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)
  */
-        __pyx_t_7 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__reachable); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_7);
+        __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
         __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_alt_id, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
+        __pyx_t_7 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+        __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __pyx_t_3 = PyNumber_Subtract(__pyx_v_dist, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+        __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
         __Pyx_INCREF(__pyx_v_fwords);
-        PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_fwords);
+        PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_fwords);
         __Pyx_GIVEREF(__pyx_v_fwords);
-        PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_6);
-        __Pyx_GIVEREF(__pyx_t_6);
-        PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_3);
+        PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7);
+        __Pyx_GIVEREF(__pyx_t_7);
+        PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
-        __pyx_t_6 = 0;
+        __pyx_t_7 = 0;
         __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
         if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-          __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_9 = 0;
-          __pyx_t_10 = NULL;
+          __pyx_t_6 = __pyx_t_3; __Pyx_INCREF(__pyx_t_6); __pyx_t_10 = 0;
+          __pyx_t_11 = NULL;
         } else {
-          __pyx_t_9 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_10 = Py_TYPE(__pyx_t_1)->tp_iternext;
+          __pyx_t_10 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext;
         }
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         for (;;) {
-          if (PyList_CheckExact(__pyx_t_1)) {
-            if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_1)) break;
-            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++;
-          } else if (PyTuple_CheckExact(__pyx_t_1)) {
-            if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++;
+          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_6)) {
+            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_6)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
+          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_6)) {
+            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
+            #if CYTHON_COMPILING_IN_CPYTHON
+            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #else
+            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            #endif
           } else {
-            __pyx_t_3 = __pyx_t_10(__pyx_t_1);
+            __pyx_t_3 = __pyx_t_11(__pyx_t_6);
             if (unlikely(!__pyx_t_3)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
@@ -41276,39 +44647,37 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
           __pyx_v_ifromchild = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":897
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":897
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):             # <<<<<<<<<<<<<<
  *                             ret.append(ifromchild)
  * 
  */
-          __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_ret), __pyx_v_ifromchild))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifromchild, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_4) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":898
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":898
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)             # <<<<<<<<<<<<<<
  * 
  *         return ret
  */
-            if (unlikely(((PyObject *)__pyx_v_ret) == Py_None)) {
-              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-            }
-            __pyx_t_8 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            goto __pyx_L14;
+            __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            goto __pyx_L11;
           }
-          __pyx_L14:;
+          __pyx_L11:;
         }
-        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       }
-      __pyx_L10:;
+      __pyx_L7:;
     }
-    __pyx_L9:;
+    __pyx_L6:;
   }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":900
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":900
  *                             ret.append(ifromchild)
  * 
  *         return ret             # <<<<<<<<<<<<<<
@@ -41327,50 +44696,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable(PyObject *__
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_6);
   __Pyx_XDECREF(__pyx_t_7);
+  __Pyx_XDECREF(__pyx_t_8);
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.reachable", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_v_ret);
+  __Pyx_XDECREF(__pyx_v_alt_id);
   __Pyx_XDECREF(__pyx_v_ifromchild);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":902
- *         return ret
- * 
- *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
- *         cdef unsigned alt_id
- *         min = 1000
- */
-
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_ito = 0;
-  unsigned int __pyx_v_alt_id;
-  PyObject *__pyx_v_min = NULL;
-  PyObject *__pyx_v_currmin = NULL;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  int __pyx_t_2;
-  Py_ssize_t __pyx_t_3;
-  unsigned int __pyx_t_4;
-  PyObject *__pyx_t_5 = NULL;
-  PyObject *__pyx_t_6 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
-  __Pyx_RefNannySetupContext("shortest");
+  __Pyx_RefNannySetupContext("shortest (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
@@ -41378,26 +44731,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito);
-        if (likely(values[2])) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -41418,8 +44768,37 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_ifrom, __pyx_v_ito);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":904
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":902
+ *         return ret
+ * 
+ *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
+ *         cdef unsigned alt_id
+ *         min = 1000
+ */
+
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_ifrom, PyObject *__pyx_v_ito) {
+  unsigned int __pyx_v_alt_id;
+  PyObject *__pyx_v_min = NULL;
+  PyObject *__pyx_v_currmin = NULL;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  int __pyx_t_2;
+  Py_ssize_t __pyx_t_3;
+  unsigned int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("shortest", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":904
  *     def shortest(self, fwords, ifrom, ito):
  *         cdef unsigned alt_id
  *         min = 1000             # <<<<<<<<<<<<<<
@@ -41429,20 +44808,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   __Pyx_INCREF(__pyx_int_1000);
   __pyx_v_min = __pyx_int_1000;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":905
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":905
  *         cdef unsigned alt_id
  *         min = 1000
  *         if (ifrom > ito):             # <<<<<<<<<<<<<<
  *             return min
  *         if (ifrom == ito):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":906
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":906
  *         min = 1000
  *         if (ifrom > ito):
  *             return min             # <<<<<<<<<<<<<<
@@ -41453,24 +44831,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __Pyx_INCREF(__pyx_v_min);
     __pyx_r = __pyx_v_min;
     goto __pyx_L0;
-    goto __pyx_L6;
+    goto __pyx_L3;
   }
-  __pyx_L6:;
+  __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":907
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":907
  *         if (ifrom > ito):
  *             return min
  *         if (ifrom == ito):             # <<<<<<<<<<<<<<
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":908
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":908
  *             return min
  *         if (ifrom == ito):
  *             return 0             # <<<<<<<<<<<<<<
@@ -41481,11 +44858,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __Pyx_INCREF(__pyx_int_0);
     __pyx_r = __pyx_int_0;
     goto __pyx_L0;
-    goto __pyx_L7;
+    goto __pyx_L4;
   }
-  __pyx_L7:;
+  __pyx_L4:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":909
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":909
  *         if (ifrom == ito):
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
@@ -41499,14 +44876,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_alt_id = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":910
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":910
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)             # <<<<<<<<<<<<<<
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
@@ -41520,7 +44897,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
@@ -41538,7 +44915,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __pyx_v_currmin = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":911
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":911
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
@@ -41555,15 +44932,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_5 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":912
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":912
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1             # <<<<<<<<<<<<<<
@@ -41575,24 +44951,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
       __Pyx_DECREF(__pyx_v_currmin);
       __pyx_v_currmin = __pyx_t_1;
       __pyx_t_1 = 0;
-      goto __pyx_L10;
+      goto __pyx_L7;
     }
-    __pyx_L10:;
+    __pyx_L7:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":913
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":913
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  *             if (currmin<min):             # <<<<<<<<<<<<<<
  *                 min = currmin
  *         return min
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":914
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":914
  *                 currmin += 1
  *             if (currmin<min):
  *                 min = currmin             # <<<<<<<<<<<<<<
@@ -41602,12 +44977,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
       __Pyx_INCREF(__pyx_v_currmin);
       __Pyx_DECREF(__pyx_v_min);
       __pyx_v_min = __pyx_v_currmin;
-      goto __pyx_L11;
+      goto __pyx_L8;
     }
-    __pyx_L11:;
+    __pyx_L8:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":915
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":915
  *             if (currmin<min):
  *                 min = currmin
  *         return min             # <<<<<<<<<<<<<<
@@ -41635,7 +45010,75 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":917
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v__columns = 0;
+  PyObject *__pyx_v_curr_idx = 0;
+  PyObject *__pyx_v_min_dist = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_next_states (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__min_dist,0};
+    PyObject* values[3] = {0,0,0};
+    values[2] = ((PyObject *)__pyx_int_2);
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s___columns)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__min_dist);
+          if (value) { values[2] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v__columns = values[0];
+    __pyx_v_curr_idx = values[1];
+    __pyx_v_min_dist = values[2];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_next_states", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v__columns, __pyx_v_curr_idx, __pyx_v_min_dist);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":917
  *         return min
  * 
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
@@ -41643,11 +45086,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest(PyObject *__p
  *         candidate = [[curr_idx,0]]
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v__columns = 0;
-  PyObject *__pyx_v_curr_idx = 0;
-  PyObject *__pyx_v_min_dist = 0;
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v__columns, PyObject *__pyx_v_curr_idx, PyObject *__pyx_v_min_dist) {
   PyObject *__pyx_v_result = NULL;
   PyObject *__pyx_v_candidate = NULL;
   PyObject *__pyx_v_curr = NULL;
@@ -41670,64 +45109,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__min_dist,0};
-  __Pyx_RefNannySetupContext("get_next_states");
-  {
-    PyObject* values[3] = {0,0,0};
-    values[2] = ((PyObject *)__pyx_int_2);
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s___columns);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  2:
-        if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__min_dist);
-          if (value) { values[2] = value; kw_args--; }
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    } else {
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
-        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-    }
-    __pyx_v__columns = values[0];
-    __pyx_v_curr_idx = values[1];
-    __pyx_v_min_dist = values[2];
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_next_states", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __Pyx_RefNannyFinishContext();
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
+  __Pyx_RefNannySetupContext("get_next_states", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":918
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":918
  * 
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []             # <<<<<<<<<<<<<<
@@ -41735,11 +45119,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":919
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":919
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []
  *         candidate = [[curr_idx,0]]             # <<<<<<<<<<<<<<
@@ -41747,7 +45131,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  *         while len(candidate) > 0:
  */
   __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_v_curr_idx);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_curr_idx);
   __Pyx_GIVEREF(__pyx_v_curr_idx);
@@ -41755,14 +45139,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
   PyList_SET_ITEM(__pyx_t_1, 1, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
   __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_t_1 = 0;
   __pyx_v_candidate = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":921
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":921
  *         candidate = [[curr_idx,0]]
  * 
  *         while len(candidate) > 0:             # <<<<<<<<<<<<<<
@@ -41770,14 +45154,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  *             if curr[0] >= len(_columns):
  */
   while (1) {
-    if (unlikely(((PyObject *)__pyx_v_candidate) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); 
+    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_4 = (__pyx_t_3 > 0);
     if (!__pyx_t_4) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":922
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":922
  * 
  *         while len(candidate) > 0:
  *             curr = candidate.pop()             # <<<<<<<<<<<<<<
@@ -41790,7 +45171,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
     __pyx_v_curr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":923
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":923
  *         while len(candidate) > 0:
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):             # <<<<<<<<<<<<<<
@@ -41802,27 +45183,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
     __pyx_t_3 = PyObject_Length(__pyx_v__columns); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":924
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":924
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):
  *                 continue             # <<<<<<<<<<<<<<
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  */
-      goto __pyx_L6_continue;
-      goto __pyx_L8;
+      goto __pyx_L3_continue;
+      goto __pyx_L5;
     }
-    __pyx_L8:;
+    __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":925
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":925
  *             if curr[0] >= len(_columns):
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:             # <<<<<<<<<<<<<<
@@ -41831,19 +45211,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  */
     __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_result), __pyx_t_5))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_t_5, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
       __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
         __Pyx_DECREF(__pyx_t_1);
-        __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -41855,25 +45233,22 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":926
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":926
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);             # <<<<<<<<<<<<<<
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  */
-      if (unlikely(((PyObject *)__pyx_v_result) == Py_None)) {
-        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-      }
       __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_8 = PyList_Append(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      goto __pyx_L9;
+      goto __pyx_L6;
     }
-    __pyx_L9:;
+    __pyx_L6:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":927
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":927
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]             # <<<<<<<<<<<<<<
@@ -41889,7 +45264,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
     __pyx_v_curr_col = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":928
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":928
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:             # <<<<<<<<<<<<<<
@@ -41905,12 +45280,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __pyx_t_9 = Py_TYPE(__pyx_t_5)->tp_iternext;
     }
     for (;;) {
-      if (PyList_CheckExact(__pyx_t_5)) {
+      if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_5)) break;
-        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
-      } else if (PyTuple_CheckExact(__pyx_t_5)) {
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
+      } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #else
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        #endif
       } else {
         __pyx_t_1 = __pyx_t_9(__pyx_t_5);
         if (unlikely(!__pyx_t_1)) {
@@ -41926,7 +45309,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __pyx_v_alt = __pyx_t_1;
       __pyx_t_1 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":929
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":929
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]             # <<<<<<<<<<<<<<
@@ -41945,7 +45328,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __pyx_v_next_id = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":930
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":930
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1             # <<<<<<<<<<<<<<
@@ -41956,7 +45339,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __Pyx_XDECREF(__pyx_v_jump);
       __pyx_v_jump = __pyx_int_1;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":931
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":931
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1
  *                 if (alt[0] == EPSILON):             # <<<<<<<<<<<<<<
@@ -41967,15 +45350,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       __Pyx_GOTREF(__pyx_t_10);
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":932
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":932
  *                 jump = 1
  *                 if (alt[0] == EPSILON):
  *                     jump = 0             # <<<<<<<<<<<<<<
@@ -41985,32 +45367,30 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
         __Pyx_INCREF(__pyx_int_0);
         __Pyx_DECREF(__pyx_v_jump);
         __pyx_v_jump = __pyx_int_0;
-        goto __pyx_L12;
+        goto __pyx_L9;
       }
-      __pyx_L12:;
+      __pyx_L9:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":933
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":933
  *                 if (alt[0] == EPSILON):
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:             # <<<<<<<<<<<<<<
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);
  */
-      __pyx_t_7 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_result), __pyx_v_next_id))); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = (__Pyx_PySequence_Contains(__pyx_v_next_id, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_7) {
         __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
           __Pyx_DECREF(__pyx_t_1);
-          __pyx_t_10 = PyInt_FromLong((((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self)->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_v_self->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -42022,23 +45402,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
       }
       if (__pyx_t_6) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":934
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":934
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])             # <<<<<<<<<<<<<<
  *         return sorted(result);
  * 
  */
-        if (unlikely(((PyObject *)__pyx_v_candidate) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+        __Pyx_GOTREF(__pyx_t_1);
         __Pyx_INCREF(__pyx_v_next_id);
         PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_next_id);
         __Pyx_GIVEREF(__pyx_v_next_id);
@@ -42047,15 +45424,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
         __pyx_t_2 = 0;
         __pyx_t_8 = PyList_Append(__pyx_v_candidate, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-        goto __pyx_L13;
+        goto __pyx_L10;
       }
-      __pyx_L13:;
+      __pyx_L10:;
     }
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_L6_continue:;
+    __pyx_L3_continue:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":935
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":935
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);             # <<<<<<<<<<<<<<
@@ -42064,7 +45441,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+  __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
@@ -42096,9 +45473,45 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states(PyObj
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1097
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
+static char __pyx_doc_3_sa_23HieroCachingRuleFactory_22input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("input (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_22input(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_fwords));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1 = {__Pyx_NAMESTR("lambda1"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1, METH_NOARGS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("lambda1 (wrapper)", 0);
+  __pyx_r = __pyx_lambda_funcdef_lambda1(__pyx_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2 = {__Pyx_NAMESTR("lambda2"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, METH_NOARGS, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("lambda2 (wrapper)", 0);
+  __pyx_r = __pyx_lambda_funcdef_lambda2(__pyx_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1097
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
@@ -42106,9 +45519,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                                 fcount[f] += count
  */
 
-static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_lambda_methdef_lambda2 = {__Pyx_NAMESTR("lambda2"), (PyCFunction)__pyx_lambda_funcdef_lambda2, METH_NOARGS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -42117,13 +45528,12 @@ static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSE
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda2");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("lambda2", 0);
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyList_Type))));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)(&PyList_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyList_Type))));
@@ -42141,7 +45551,7 @@ static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSE
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.input.lambda1.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda1.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -42149,9 +45559,7 @@ static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyMethodDef __pyx_lambda_methdef_lambda1 = {__Pyx_NAMESTR("lambda1"), (PyCFunction)__pyx_lambda_funcdef_lambda1, METH_NOARGS, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -42160,15 +45568,14 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda1");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("lambda1", 0);
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda2, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -42186,7 +45593,7 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.input.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -42194,7 +45601,19 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1103
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x); /*proto*/
+static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3 = {__Pyx_NAMESTR("lambda3"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3, METH_O, __Pyx_DOCSTR(0)};
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("lambda3 (wrapper)", 0);
+  __pyx_r = __pyx_lambda_funcdef_lambda3(__pyx_self, ((PyObject *)__pyx_v_x));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1103
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
@@ -42202,9 +45621,7 @@ static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, CYTHON_UNUSE
  *                                     # count = len(locs) # Should be?
  */
 
-static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x); /*proto*/
-static PyMethodDef __pyx_lambda_methdef_lambda3 = {__Pyx_NAMESTR("lambda3"), (PyCFunction)__pyx_lambda_funcdef_lambda3, METH_O, __Pyx_DOCSTR(0)};
-static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_x) {
+static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -42212,8 +45629,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("lambda3");
-  __pyx_self = __pyx_self;
+  __Pyx_RefNannySetupContext("lambda3", 0);
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
@@ -42229,7 +45645,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_sa.input.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -42237,7 +45653,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":937
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":937
  *         return sorted(result);
  * 
  *     def input(self, fwords):             # <<<<<<<<<<<<<<
@@ -42245,40 +45661,48 @@ static PyObject *__pyx_lambda_funcdef_lambda3(PyObject *__pyx_self, PyObject *__
  *         it looks up all of the rules that can be used to translate
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_11input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
-static char __pyx_doc_3_sa_23HieroCachingRuleFactory_11input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_11input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope;
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_15_input *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("input");
-  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)__pyx_ptype_3_sa___pyx_scope_struct_8_input->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_8_input, __pyx_empty_tuple, NULL);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("input", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_15_input *)__pyx_ptype_3_sa___pyx_scope_struct_15_input->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_15_input, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
-  __Pyx_INCREF(__pyx_v_fwords);
-  __pyx_cur_scope->__pyx_v_fwords = __pyx_v_fwords;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
+  __pyx_cur_scope->__pyx_v_fwords = __pyx_v_fwords;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __pyx_obj_3_sa___pyx_scope_struct_8_input *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_15_input *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_15_input *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
@@ -42302,15 +45726,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   PyObject *(*__pyx_t_20)(PyObject *);
   float __pyx_t_21;
   Py_ssize_t __pyx_t_22;
-  PyObject *(*__pyx_t_23)(PyObject *);
+  Py_ssize_t __pyx_t_23;
   Py_ssize_t __pyx_t_24;
-  int __pyx_t_25;
+  Py_ssize_t __pyx_t_25;
   int __pyx_t_26;
+  int __pyx_t_27;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
-    case 1: goto __pyx_L64_resume_from_yield;
+    case 1: goto __pyx_L60_resume_from_yield;
     default: /* CPython raises the right error here */
     __Pyx_RefNannyFinishContext();
     return NULL;
@@ -42318,7 +45743,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":948
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":948
  *         cdef Phrase hiero_phrase
  * 
  *         flen = len(fwords)             # <<<<<<<<<<<<<<
@@ -42328,7 +45753,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 948; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_cur_scope->__pyx_v_flen = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":949
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":949
  * 
  *         flen = len(fwords)
  *         start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -42337,16 +45762,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
   __pyx_cur_scope->__pyx_v_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":950
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":950
  *         flen = len(fwords)
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0             # <<<<<<<<<<<<<<
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  */
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time = 0.0;
+  __pyx_cur_scope->__pyx_v_self->extract_time = 0.0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":951
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":951
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}             # <<<<<<<<<<<<<<
@@ -42359,7 +45784,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":952
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":952
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}
  *         hit = 0             # <<<<<<<<<<<<<<
@@ -42368,7 +45793,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
   __pyx_cur_scope->__pyx_v_hit = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":953
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":953
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  *         reachable_buffer = {}             # <<<<<<<<<<<<<<
@@ -42381,7 +45806,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __pyx_cur_scope->__pyx_v_reachable_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":956
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":956
  * 
  *         # Do not cache between sentences
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
@@ -42394,16 +45819,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_GOTREF(__pyx_t_3);
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-  ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root = __pyx_t_3;
+  __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+  __Pyx_DECREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+  __pyx_cur_scope->__pyx_v_self->rules->root = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":958
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":958
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  * 
  *         frontier = []             # <<<<<<<<<<<<<<
@@ -42411,12 +45836,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             for alt in range(0, len(fwords[i])):
  */
   __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
   __pyx_cur_scope->__pyx_v_frontier = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":959
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":959
  * 
  *         frontier = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
@@ -42427,7 +45852,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":960
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":960
  *         frontier = []
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
@@ -42441,7 +45866,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":961
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":961
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
@@ -42458,24 +45883,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":962
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":962
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))             # <<<<<<<<<<<<<<
  * 
  *         xroot = None
  */
-        if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -42485,7 +45906,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_9 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __pyx_t_10 = PyTuple_New(7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+        __Pyx_GOTREF(__pyx_t_10);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
@@ -42495,9 +45916,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_INCREF(__pyx_int_0);
         PyTuple_SET_ITEM(__pyx_t_10, 3, __pyx_int_0);
         __Pyx_GIVEREF(__pyx_int_0);
-        __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-        PyTuple_SET_ITEM(__pyx_t_10, 4, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-        __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+        __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+        PyTuple_SET_ITEM(__pyx_t_10, 4, __pyx_cur_scope->__pyx_v_self->rules->root);
+        __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
         __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
         PyTuple_SET_ITEM(__pyx_t_10, 5, ((PyObject *)__pyx_empty_tuple));
         __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
@@ -42515,7 +45936,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":964
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":964
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
  * 
  *         xroot = None             # <<<<<<<<<<<<<<
@@ -42526,16 +45947,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_GIVEREF(Py_None);
   __pyx_cur_scope->__pyx_v_xroot = Py_None;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":965
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":965
  * 
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)             # <<<<<<<<<<<<<<
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]
  */
-  __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, 1);
+  __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":966
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":966
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:             # <<<<<<<<<<<<<<
@@ -42544,21 +45965,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
   __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_8 = ((PySequence_Contains(__pyx_t_9, __pyx_t_10))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_t_10, __pyx_t_9, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   if (__pyx_t_8) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":967
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":967
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]             # <<<<<<<<<<<<<<
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  */
-    __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
@@ -42572,7 +45993,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   }
   /*else*/ {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":969
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":969
  *             xroot = self.rules.root.children[x1]
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
@@ -42581,12 +46002,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
     __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-    __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
@@ -42595,21 +46016,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     __pyx_cur_scope->__pyx_v_xroot = __pyx_t_9;
     __pyx_t_9 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":970
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":970
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  *             self.rules.root.children[x1] = xroot             # <<<<<<<<<<<<<<
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  */
-    __pyx_t_9 = PyObject_GetAttr(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     if (__Pyx_SetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   }
   __pyx_L9:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":972
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":972
  *             self.rules.root.children[x1] = xroot
  * 
  *         for i in range(self.min_gap_size, len(fwords)):             # <<<<<<<<<<<<<<
@@ -42617,10 +46038,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                 if fwords[i][alt][0] != EPSILON:
  */
   __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  for (__pyx_t_4 = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
+  for (__pyx_t_4 = __pyx_cur_scope->__pyx_v_self->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":973
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":973
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
@@ -42634,7 +46055,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":974
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":974
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
@@ -42651,43 +46072,39 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":975
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":975
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))             # <<<<<<<<<<<<<<
  * 
  *         next_states = []
  */
-        if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
-        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+        __Pyx_GOTREF(__pyx_t_12);
         PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         __pyx_t_7 = 0;
         __pyx_t_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+        __Pyx_GOTREF(__pyx_t_13);
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
         PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_10);
@@ -42717,7 +46134,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":977
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":977
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
  * 
  *         next_states = []             # <<<<<<<<<<<<<<
@@ -42725,12 +46142,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  */
   __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
   __pyx_cur_scope->__pyx_v_next_states = __pyx_t_13;
   __pyx_t_13 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":978
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":978
  * 
  *         next_states = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
@@ -42741,24 +46158,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":979
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":979
  *         next_states = []
  *         for i in range(len(fwords)):
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))             # <<<<<<<<<<<<<<
  * 
  *         while len(frontier) > 0:
  */
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_next_states) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self, __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
     __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_12 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
     __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
@@ -42776,7 +46190,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":981
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":981
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  * 
  *         while len(frontier) > 0:             # <<<<<<<<<<<<<<
@@ -42784,14 +46198,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  */
   while (1) {
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
-    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); 
+    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_8 = (__pyx_t_1 > 0);
     if (!__pyx_t_8) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":982
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":982
  * 
  *         while len(frontier) > 0:
  *             new_frontier = []             # <<<<<<<<<<<<<<
@@ -42799,35 +46210,42 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                 word_id = fwords[i][alt][0]
  */
     __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+    __Pyx_GOTREF(__pyx_t_12);
     __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
     __pyx_cur_scope->__pyx_v_new_frontier = __pyx_t_12;
     __pyx_t_12 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":983
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":983
  *         while len(frontier) > 0:
  *             new_frontier = []
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:             # <<<<<<<<<<<<<<
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]
  */
-    if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_12 = ((PyObject *)__pyx_cur_scope->__pyx_v_frontier); __Pyx_INCREF(__pyx_t_12); __pyx_t_1 = 0;
     for (;;) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_12)) break;
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_12, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
         PyObject* sequence = __pyx_t_2;
+        #if CYTHON_COMPILING_IN_CPYTHON
+        Py_ssize_t size = Py_SIZE(sequence);
+        #else
+        Py_ssize_t size = PySequence_Size(sequence);
+        #endif
+        if (unlikely(size != 7)) {
+          if (size > 7) __Pyx_RaiseTooManyValuesError(7);
+          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
+        #if CYTHON_COMPILING_IN_CPYTHON
         if (likely(PyTuple_CheckExact(sequence))) {
-          if (unlikely(PyTuple_GET_SIZE(sequence) != 7)) {
-            if (PyTuple_GET_SIZE(sequence) > 7) __Pyx_RaiseTooManyValuesError(7);
-            else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          }
           __pyx_t_13 = PyTuple_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
           __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
@@ -42836,11 +46254,6 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_14 = PyTuple_GET_ITEM(sequence, 5); 
           __pyx_t_15 = PyTuple_GET_ITEM(sequence, 6); 
         } else {
-          if (unlikely(PyList_GET_SIZE(sequence) != 7)) {
-            if (PyList_GET_SIZE(sequence) > 7) __Pyx_RaiseTooManyValuesError(7);
-            else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          }
           __pyx_t_13 = PyList_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
           __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
@@ -42856,34 +46269,36 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_INCREF(__pyx_t_3);
         __Pyx_INCREF(__pyx_t_14);
         __Pyx_INCREF(__pyx_t_15);
+        #else
+        Py_ssize_t i;
+        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
+        for (i=0; i < 7; i++) {
+          PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          *(temps[i]) = item;
+        }
+        #endif
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      } else {
+      } else
+      {
         Py_ssize_t index = -1;
+        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
         __pyx_t_16 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_16);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-        index = 0; __pyx_t_13 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_13)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_13);
-        index = 1; __pyx_t_7 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_7)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_7);
-        index = 2; __pyx_t_9 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_9)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_9);
-        index = 3; __pyx_t_10 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_10);
-        index = 4; __pyx_t_3 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_3)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_3);
-        index = 5; __pyx_t_14 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_14)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_14);
-        index = 6; __pyx_t_15 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L21_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_15);
+        for (index=0; index < 7; index++) {
+          PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L21_unpacking_failed;
+          __Pyx_GOTREF(item);
+          *(temps[index]) = item;
+        }
         if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 7) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = NULL;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         goto __pyx_L22_unpacking_done;
         __pyx_L21_unpacking_failed:;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-        if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-        if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+        __pyx_t_17 = NULL;
+        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
         {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_L22_unpacking_done:;
       }
@@ -42917,7 +46332,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_is_shadow_path = __pyx_t_15;
       __pyx_t_15 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":984
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":984
  *             new_frontier = []
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]             # <<<<<<<<<<<<<<
@@ -42938,7 +46353,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_word_id = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":985
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":985
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
@@ -42959,7 +46374,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":987
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":987
  *                 spanlen = fwords[i][alt][2]
  *                 # TODO get rid of k -- pathlen is replacing it
  *                 if word_id == EPSILON:             # <<<<<<<<<<<<<<
@@ -42968,14 +46383,13 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
       __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
+      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":989
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":989
  *                 if word_id == EPSILON:
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):             # <<<<<<<<<<<<<<
@@ -42990,15 +46404,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_15 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_14);
+        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":990
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":990
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):
  *                         continue             # <<<<<<<<<<<<<<
@@ -43010,7 +46423,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         __pyx_L24:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":991
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":991
  *                     if i+spanlen >= len(fwords):
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
@@ -43030,16 +46443,13 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_nualt = __pyx_t_18;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":992
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":992
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     continue
  * 
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_frontier) == Py_None)) {
-            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
           __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -43050,7 +46460,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_14);
           __Pyx_GIVEREF(__pyx_t_14);
           PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -43076,7 +46486,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":993
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":993
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue             # <<<<<<<<<<<<<<
@@ -43088,7 +46498,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       __pyx_L23:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":995
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":995
  *                     continue
  * 
  *                 phrase = prefix + (word_id,)             # <<<<<<<<<<<<<<
@@ -43096,7 +46506,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                 arity = hiero_phrase.arity()
  */
       __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_word_id);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_word_id);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_word_id);
@@ -43109,7 +46519,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_phrase = __pyx_t_15;
       __pyx_t_15 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":996
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":996
  * 
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)             # <<<<<<<<<<<<<<
@@ -43117,7 +46527,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  * 
  */
       __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+      __Pyx_GOTREF(__pyx_t_15);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
@@ -43130,7 +46540,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __pyx_cur_scope->__pyx_v_hiero_phrase = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":997
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":997
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()             # <<<<<<<<<<<<<<
@@ -43146,7 +46556,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       __pyx_cur_scope->__pyx_v_arity = __pyx_t_18;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":999
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":999
  *                 arity = hiero_phrase.arity()
  * 
  *                 lookup_required = False             # <<<<<<<<<<<<<<
@@ -43155,7 +46565,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
       __pyx_cur_scope->__pyx_v_lookup_required = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1000
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1000
  * 
  *                 lookup_required = False
  *                 if word_id in node.children:             # <<<<<<<<<<<<<<
@@ -43164,11 +46574,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
       __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_8 = ((PySequence_Contains(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_15, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1001
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1001
  *                 lookup_required = False
  *                 if word_id in node.children:
  *                     if node.children[word_id] is None:             # <<<<<<<<<<<<<<
@@ -43184,7 +46594,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1003
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1003
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  *                         continue             # <<<<<<<<<<<<<<
@@ -43196,7 +46606,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1006
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1006
  *                     else:
  *                         # Path continues at this node
  *                         node = node.children[word_id]             # <<<<<<<<<<<<<<
@@ -43219,7 +46629,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1008
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1008
  *                         node = node.children[word_id]
  *                 else:
  *                     if node.suffix_link is None:             # <<<<<<<<<<<<<<
@@ -43232,7 +46642,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1010
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1010
  *                     if node.suffix_link is None:
  *                         # Current node is root; lookup required
  *                         lookup_required = True             # <<<<<<<<<<<<<<
@@ -43244,7 +46654,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1012
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1012
  *                         lookup_required = True
  *                     else:
  *                         if word_id in node.suffix_link.children:             # <<<<<<<<<<<<<<
@@ -43256,11 +46666,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_3 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_8 = ((PySequence_Contains(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1013
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1013
  *                     else:
  *                         if word_id in node.suffix_link.children:
  *                             if node.suffix_link.children[word_id] is None:             # <<<<<<<<<<<<<<
@@ -43279,7 +46689,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             if (__pyx_t_8) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1015
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1015
  *                             if node.suffix_link.children[word_id] is None:
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None             # <<<<<<<<<<<<<<
@@ -43291,7 +46701,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               if (PyObject_SetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1016
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1016
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None
  *                                 continue             # <<<<<<<<<<<<<<
@@ -43303,7 +46713,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             /*else*/ {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1019
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1019
  *                             else:
  *                                 # Suffix link indicates lookup is reqired
  *                                 lookup_required = True             # <<<<<<<<<<<<<<
@@ -43317,7 +46727,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1022
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1022
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
@@ -43336,7 +46746,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       __pyx_L27:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1024
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1024
  *                             raise Exception("Keyword trie error")
  *                 # checking whether lookup_required
  *                 if lookup_required:             # <<<<<<<<<<<<<<
@@ -43345,7 +46755,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
       if (__pyx_cur_scope->__pyx_v_lookup_required) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1025
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1025
  *                 # checking whether lookup_required
  *                 if lookup_required:
  *                     new_node = None             # <<<<<<<<<<<<<<
@@ -43358,7 +46768,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_GIVEREF(Py_None);
         __pyx_cur_scope->__pyx_v_new_node = Py_None;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1026
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1026
  *                 if lookup_required:
  *                     new_node = None
  *                     if is_shadow_path:             # <<<<<<<<<<<<<<
@@ -43368,7 +46778,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1029
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1029
  *                         # Extending shadow path
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,             # <<<<<<<<<<<<<<
@@ -43391,7 +46801,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1030
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1030
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],             # <<<<<<<<<<<<<<
@@ -43409,7 +46819,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1031
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1031
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
@@ -43417,7 +46827,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         if arity > 0:
  */
           if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_2 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -43429,7 +46839,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1033
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1033
  *                                 phrase=hiero_phrase)
  *                     else:
  *                         if arity > 0:             # <<<<<<<<<<<<<<
@@ -43439,7 +46849,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity > 0);
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1035
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1035
  *                         if arity > 0:
  *                             # Intersecting because of arity > 0
  *                             phrase_location = self.intersect(node, node.suffix_link.children[word_id], hiero_phrase)             # <<<<<<<<<<<<<<
@@ -43454,7 +46864,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_2 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->__pyx_vtab)->intersect(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->intersect(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -43466,7 +46876,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1038
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1038
  *                         else:
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location             # <<<<<<<<<<<<<<
@@ -43482,14 +46892,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_phrase_location = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1039
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1039
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)             # <<<<<<<<<<<<<<
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
@@ -43505,7 +46915,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+            __Pyx_GOTREF(__pyx_t_9);
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_2));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
             PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_15);
@@ -43528,7 +46938,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_sa_range = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1040
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1040
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:             # <<<<<<<<<<<<<<
@@ -43538,7 +46948,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_8 = (__pyx_cur_scope->__pyx_v_sa_range != Py_None);
             if (__pyx_t_8) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1041
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1041
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])             # <<<<<<<<<<<<<<
@@ -43555,7 +46965,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __Pyx_GOTREF(__pyx_t_9);
               if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
               __Pyx_GOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -43567,7 +46977,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             /*else*/ {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1043
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1043
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  *                             else:
  *                                 phrase_location = None             # <<<<<<<<<<<<<<
@@ -43584,7 +46994,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L34:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1045
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1045
  *                                 phrase_location = None
  * 
  *                         if phrase_location is None:             # <<<<<<<<<<<<<<
@@ -43594,7 +47004,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_8 = (((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location) == Py_None);
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1046
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1046
  * 
  *                         if phrase_location is None:
  *                             node.children[word_id] = None             # <<<<<<<<<<<<<<
@@ -43606,7 +47016,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             if (PyObject_SetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1048
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1048
  *                             node.children[word_id] = None
  *                             # Search failed
  *                             continue             # <<<<<<<<<<<<<<
@@ -43618,20 +47028,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L36:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1050
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1050
  *                             continue
  *                         # Search succeeded
  *                         suffix_link = self.rules.root             # <<<<<<<<<<<<<<
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  */
-          __Pyx_INCREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
+          __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_suffix_link);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_suffix_link);
-          __Pyx_GIVEREF(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root);
-          __pyx_cur_scope->__pyx_v_suffix_link = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->rules->root;
+          __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
+          __pyx_cur_scope->__pyx_v_suffix_link = __pyx_cur_scope->__pyx_v_self->rules->root;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1051
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1051
  *                         # Search succeeded
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:             # <<<<<<<<<<<<<<
@@ -43644,7 +47054,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1052
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1052
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]             # <<<<<<<<<<<<<<
@@ -43668,7 +47078,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L37:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1053
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1053
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,             # <<<<<<<<<<<<<<
@@ -43679,7 +47089,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GOTREF(((PyObject *)__pyx_t_9));
           if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1054
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1054
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,             # <<<<<<<<<<<<<<
@@ -43688,7 +47098,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
           if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1055
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1055
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
@@ -43696,7 +47106,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                     node = new_node
  */
           if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_10 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -43707,7 +47117,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         __pyx_L33:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1056
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1056
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node             # <<<<<<<<<<<<<<
@@ -43719,7 +47129,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         if (PyObject_SetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1057
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1057
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node
  *                     node = new_node             # <<<<<<<<<<<<<<
@@ -43732,17 +47142,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_new_node);
         __pyx_cur_scope->__pyx_v_node = __pyx_cur_scope->__pyx_v_new_node;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1062
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1062
  *                     This should happen before we get to extraction (so that
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:             # <<<<<<<<<<<<<<
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  */
-        __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_nonterminals);
+        __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1063
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1063
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1             # <<<<<<<<<<<<<<
@@ -43757,7 +47167,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_xcat_index = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1064
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1064
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)             # <<<<<<<<<<<<<<
@@ -43765,9 +47175,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         if is_shadow_path:
  */
           __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, __pyx_t_18);
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1065
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1065
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index             # <<<<<<<<<<<<<<
@@ -43780,7 +47190,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xcat_index);
           __pyx_cur_scope->__pyx_v_suffix_link_xcat_index = __pyx_cur_scope->__pyx_v_xcat_index;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1066
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1066
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:             # <<<<<<<<<<<<<<
@@ -43790,7 +47200,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1067
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1067
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1             # <<<<<<<<<<<<<<
@@ -43808,7 +47218,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_L39:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1068
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1068
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)             # <<<<<<<<<<<<<<
@@ -43816,9 +47226,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  */
           __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, __pyx_t_18);
+          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1069
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1069
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
@@ -43832,7 +47242,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1070
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1070
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],             # <<<<<<<<<<<<<<
@@ -43850,7 +47260,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1071
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1071
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))             # <<<<<<<<<<<<<<
@@ -43860,7 +47270,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
@@ -43868,7 +47278,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
@@ -43877,11 +47287,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1069
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1069
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
@@ -43897,7 +47307,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         }
         __pyx_L38:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1074
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1074
  * 
  *                     # sample from range
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
@@ -43908,19 +47318,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1075
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1075
  *                     # sample from range
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)             # <<<<<<<<<<<<<<
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  */
-          __pyx_t_9 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_t_10 = 0;
@@ -43935,7 +47345,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_10);
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1076
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1076
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns             # <<<<<<<<<<<<<<
@@ -43947,7 +47357,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_num_subpatterns = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_10)->num_subpatterns;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1077
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1077
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)             # <<<<<<<<<<<<<<
@@ -43960,7 +47370,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GOTREF(__pyx_t_3);
           if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_chunklen));
@@ -43969,7 +47379,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_chunklen = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1078
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1078
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:             # <<<<<<<<<<<<<<
@@ -43979,7 +47389,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_18 = __pyx_cur_scope->__pyx_v_num_subpatterns;
           for (__pyx_cur_scope->__pyx_v_j = 0; __pyx_cur_scope->__pyx_v_j < __pyx_t_18; __pyx_cur_scope->__pyx_v_j++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1079
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1079
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)             # <<<<<<<<<<<<<<
@@ -43989,7 +47399,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             (__pyx_cur_scope->__pyx_v_chunklen->arr[__pyx_cur_scope->__pyx_v_j]) = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_hiero_phrase->__pyx_vtab)->chunklen(__pyx_cur_scope->__pyx_v_hiero_phrase, __pyx_cur_scope->__pyx_v_j);
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1080
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1080
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []             # <<<<<<<<<<<<<<
@@ -43997,14 +47407,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         extract_start = monitor_cpu()
  */
           __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
           __pyx_cur_scope->__pyx_v_extracts = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1081
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1081
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []
  *                         j = 0             # <<<<<<<<<<<<<<
@@ -44013,7 +47423,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
           __pyx_cur_scope->__pyx_v_j = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1082
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1082
  *                         extracts = []
  *                         j = 0
  *                         extract_start = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -44028,7 +47438,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_extract_start = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1083
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1083
  *                         j = 0
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:             # <<<<<<<<<<<<<<
@@ -44039,7 +47449,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_19 = (__pyx_cur_scope->__pyx_v_j < __pyx_cur_scope->__pyx_v_sample->len);
             if (!__pyx_t_19) break;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1084
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1084
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:
  *                             extract = []             # <<<<<<<<<<<<<<
@@ -44047,23 +47457,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  */
             __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __Pyx_GOTREF(__pyx_t_3);
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
             __pyx_cur_scope->__pyx_v_extract = ((PyObject *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1086
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1086
  *                             extract = []
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  */
-            __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda->sent_id->arr);
+            __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, __pyx_cur_scope->__pyx_v_self->fda->sent_id->arr);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1087
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1087
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])             # <<<<<<<<<<<<<<
@@ -44073,7 +47483,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_3 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            __Pyx_GOTREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_t_3 = 0;
@@ -44086,14 +47496,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_loc = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1088
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1088
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)             # <<<<<<<<<<<<<<
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns
  */
-            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->__pyx_vtab)->extract(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self), __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->extract(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -44101,7 +47511,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_extract = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1089
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1089
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])             # <<<<<<<<<<<<<<
@@ -44111,7 +47521,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_10 = PyList_New(0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+            __Pyx_GOTREF(__pyx_t_10);
             if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_extract) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_extract)) {
               __pyx_t_9 = __pyx_cur_scope->__pyx_v_extract; __Pyx_INCREF(__pyx_t_9); __pyx_t_5 = 0;
               __pyx_t_20 = NULL;
@@ -44121,12 +47531,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __pyx_t_20 = Py_TYPE(__pyx_t_9)->tp_iternext;
             }
             for (;;) {
-              if (PyList_CheckExact(__pyx_t_9)) {
+              if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_9)) break;
-                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++;
-              } else if (PyTuple_CheckExact(__pyx_t_9)) {
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #else
+                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #endif
+              } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #else
+                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #endif
               } else {
                 __pyx_t_14 = __pyx_t_20(__pyx_t_9);
                 if (unlikely(!__pyx_t_14)) {
@@ -44144,19 +47562,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __pyx_cur_scope->__pyx_v_e = __pyx_t_14;
               __pyx_t_14 = 0;
               __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+              __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
               PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_cur_scope->__pyx_v_e);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loc);
               PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_cur_scope->__pyx_v_loc);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loc);
-              if (unlikely(PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (unlikely(__Pyx_PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
             }
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+            __Pyx_GOTREF(__pyx_t_9);
             __Pyx_INCREF(((PyObject *)__pyx_t_10));
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
@@ -44167,7 +47585,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1090
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1090
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns             # <<<<<<<<<<<<<<
@@ -44177,7 +47595,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns);
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1092
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1092
  *                             j = j + num_subpatterns
  * 
  *                         num_samples = sample.len/num_subpatterns             # <<<<<<<<<<<<<<
@@ -44194,7 +47612,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           }
           __pyx_cur_scope->__pyx_v_num_samples = __Pyx_div_int(__pyx_cur_scope->__pyx_v_sample->len, __pyx_cur_scope->__pyx_v_num_subpatterns);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1093
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1093
  * 
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -44209,14 +47627,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_cur_scope->__pyx_v_extract_stop = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1094
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1094
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start             # <<<<<<<<<<<<<<
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  */
-          __pyx_t_10 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
@@ -44224,25 +47642,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __pyx_t_10 = PyNumber_Subtract(__pyx_t_9, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_21 = __pyx_PyFloat_AsDouble(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_21 = __pyx_PyFloat_AsFloat(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time = __pyx_t_21;
+          __pyx_cur_scope->__pyx_v_self->extract_time = __pyx_t_21;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1095
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1095
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:             # <<<<<<<<<<<<<<
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_extracts) == Py_None)) {
-            PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); 
+          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_19 = (__pyx_t_5 > 0);
           if (__pyx_t_19) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1096
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1096
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:
  *                             fcount = Counter()             # <<<<<<<<<<<<<<
@@ -44260,7 +47675,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_fcount = __pyx_t_9;
             __pyx_t_9 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1097
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1097
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
@@ -44269,10 +47684,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
             __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda1, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+            __Pyx_GOTREF(__pyx_t_3);
             PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __pyx_t_10 = 0;
@@ -44286,43 +47701,50 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_fphrases = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1098
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1098
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:             # <<<<<<<<<<<<<<
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  */
-            if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_extracts) == Py_None)) {
-              PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-            }
             __pyx_t_10 = ((PyObject *)__pyx_cur_scope->__pyx_v_extracts); __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
             for (;;) {
               if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_3 = PySequence_ITEM(__pyx_t_10, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
               if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
                 PyObject* sequence = __pyx_t_3;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                Py_ssize_t size = Py_SIZE(sequence);
+                #else
+                Py_ssize_t size = PySequence_Size(sequence);
+                #endif
+                if (unlikely(size != 2)) {
+                  if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
+                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
                 }
                 __Pyx_INCREF(__pyx_t_9);
                 __Pyx_INCREF(__pyx_t_14);
+                #else
+                __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                #endif
                 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              } else {
+              } else
+              {
                 Py_ssize_t index = -1;
                 __pyx_t_15 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
@@ -44333,33 +47755,35 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_15); if (unlikely(!__pyx_t_14)) goto __pyx_L50_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_14);
                 if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_15), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 goto __pyx_L51_unpacking_done;
                 __pyx_L50_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                __pyx_t_17 = NULL;
+                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
                 {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L51_unpacking_done:;
               }
               if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
                 PyObject* sequence = __pyx_t_9;
+                #if CYTHON_COMPILING_IN_CPYTHON
+                Py_ssize_t size = Py_SIZE(sequence);
+                #else
+                Py_ssize_t size = PySequence_Size(sequence);
+                #endif
+                if (unlikely(size != 4)) {
+                  if (size > 4) __Pyx_RaiseTooManyValuesError(4);
+                  else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
+                #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 4)) {
-                    if (PyTuple_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   __pyx_t_7 = PyTuple_GET_ITEM(sequence, 2); 
                   __pyx_t_13 = PyTuple_GET_ITEM(sequence, 3); 
                 } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 4)) {
-                    if (PyList_GET_SIZE(sequence) > 4) __Pyx_RaiseTooManyValuesError(4);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
                   __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   __pyx_t_7 = PyList_GET_ITEM(sequence, 2); 
@@ -44369,28 +47793,36 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_INCREF(__pyx_t_2);
                 __Pyx_INCREF(__pyx_t_7);
                 __Pyx_INCREF(__pyx_t_13);
+                #else
+                Py_ssize_t i;
+                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
+                for (i=0; i < 4; i++) {
+                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  *(temps[i]) = item;
+                }
+                #endif
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              } else {
+              } else
+              {
                 Py_ssize_t index = -1;
+                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
                 __pyx_t_16 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
                 __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-                index = 0; __pyx_t_15 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_15);
-                index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_2)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_2);
-                index = 2; __pyx_t_7 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_7)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_7);
-                index = 3; __pyx_t_13 = __pyx_t_17(__pyx_t_16); if (unlikely(!__pyx_t_13)) goto __pyx_L52_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_13);
+                for (index=0; index < 4; index++) {
+                  PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L52_unpacking_failed;
+                  __Pyx_GOTREF(item);
+                  *(temps[index]) = item;
+                }
                 if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
                 goto __pyx_L53_unpacking_done;
                 __pyx_L52_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                __pyx_t_17 = NULL;
+                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
                 {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L53_unpacking_done:;
               }
@@ -44420,7 +47852,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __pyx_cur_scope->__pyx_v_loc = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1099
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1099
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count             # <<<<<<<<<<<<<<
@@ -44438,7 +47870,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1100
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1100
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)             # <<<<<<<<<<<<<<
@@ -44460,191 +47892,75 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1101
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1101
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():             # <<<<<<<<<<<<<<
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  */
-            __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_fphrases, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            if (PyList_CheckExact(__pyx_t_9) || PyTuple_CheckExact(__pyx_t_9)) {
-              __pyx_t_10 = __pyx_t_9; __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
-              __pyx_t_20 = NULL;
-            } else {
-              __pyx_t_5 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_20 = Py_TYPE(__pyx_t_10)->tp_iternext;
+            __pyx_t_5 = 0;
+            if (unlikely(__pyx_cur_scope->__pyx_v_fphrases == Py_None)) {
+              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
-            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            for (;;) {
-              if (PyList_CheckExact(__pyx_t_10)) {
-                if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
-                __pyx_t_9 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_9); __pyx_t_5++;
-              } else if (PyTuple_CheckExact(__pyx_t_10)) {
-                if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_10)) break;
-                __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_9); __pyx_t_5++;
-              } else {
-                __pyx_t_9 = __pyx_t_20(__pyx_t_10);
-                if (unlikely(!__pyx_t_9)) {
-                  if (PyErr_Occurred()) {
-                    if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  break;
-                }
-                __Pyx_GOTREF(__pyx_t_9);
-              }
-              if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
-                PyObject* sequence = __pyx_t_9;
-                if (likely(PyTuple_CheckExact(sequence))) {
-                  if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                    if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
-                  __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
-                } else {
-                  if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                    if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                    else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
-                  __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
-                }
-                __Pyx_INCREF(__pyx_t_3);
-                __Pyx_INCREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              } else {
-                Py_ssize_t index = -1;
-                __pyx_t_13 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-                __pyx_t_17 = Py_TYPE(__pyx_t_13)->tp_iternext;
-                index = 0; __pyx_t_3 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L56_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_3);
-                index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_14)) goto __pyx_L56_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_14);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                goto __pyx_L57_unpacking_done;
-                __pyx_L56_unpacking_failed:;
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_L57_unpacking_done:;
-              }
+            __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_fphrases, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_22), (&__pyx_t_18)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __Pyx_XDECREF(__pyx_t_10);
+            __pyx_t_10 = __pyx_t_9;
+            __pyx_t_9 = 0;
+            while (1) {
+              __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_10, __pyx_t_22, &__pyx_t_5, &__pyx_t_9, &__pyx_t_3, NULL, __pyx_t_18);
+              if (unlikely(__pyx_t_6 == 0)) break;
+              if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_9);
+              __Pyx_GOTREF(__pyx_t_3);
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_f);
-              __Pyx_GIVEREF(__pyx_t_3);
-              __pyx_cur_scope->__pyx_v_f = __pyx_t_3;
-              __pyx_t_3 = 0;
+              __Pyx_GIVEREF(__pyx_t_9);
+              __pyx_cur_scope->__pyx_v_f = __pyx_t_9;
+              __pyx_t_9 = 0;
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_elist);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_elist);
-              __Pyx_GIVEREF(__pyx_t_14);
-              __pyx_cur_scope->__pyx_v_elist = __pyx_t_14;
-              __pyx_t_14 = 0;
+              __Pyx_GIVEREF(__pyx_t_3);
+              __pyx_cur_scope->__pyx_v_elist = __pyx_t_3;
+              __pyx_t_3 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1102
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1102
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():             # <<<<<<<<<<<<<<
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  */
-              __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_elist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_23 = 0;
+              if (unlikely(__pyx_cur_scope->__pyx_v_elist == Py_None)) {
+                PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_elist, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_24), (&__pyx_t_6)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              __pyx_t_14 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              if (PyList_CheckExact(__pyx_t_14) || PyTuple_CheckExact(__pyx_t_14)) {
-                __pyx_t_9 = __pyx_t_14; __Pyx_INCREF(__pyx_t_9); __pyx_t_22 = 0;
-                __pyx_t_23 = NULL;
-              } else {
-                __pyx_t_22 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_XDECREF(__pyx_t_3);
+              __pyx_t_3 = __pyx_t_9;
+              __pyx_t_9 = 0;
+              while (1) {
+                __pyx_t_4 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_24, &__pyx_t_23, &__pyx_t_9, &__pyx_t_14, NULL, __pyx_t_6);
+                if (unlikely(__pyx_t_4 == 0)) break;
+                if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __pyx_t_23 = Py_TYPE(__pyx_t_9)->tp_iternext;
-              }
-              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-              for (;;) {
-                if (PyList_CheckExact(__pyx_t_9)) {
-                  if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_9)) break;
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_22); __Pyx_INCREF(__pyx_t_14); __pyx_t_22++;
-                } else if (PyTuple_CheckExact(__pyx_t_9)) {
-                  if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_22); __Pyx_INCREF(__pyx_t_14); __pyx_t_22++;
-                } else {
-                  __pyx_t_14 = __pyx_t_23(__pyx_t_9);
-                  if (unlikely(!__pyx_t_14)) {
-                    if (PyErr_Occurred()) {
-                      if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    break;
-                  }
-                  __Pyx_GOTREF(__pyx_t_14);
-                }
-                if ((likely(PyTuple_CheckExact(__pyx_t_14))) || (PyList_CheckExact(__pyx_t_14))) {
-                  PyObject* sequence = __pyx_t_14;
-                  if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
-                    __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
-                  } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
-                    __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
-                  }
-                  __Pyx_INCREF(__pyx_t_3);
-                  __Pyx_INCREF(__pyx_t_13);
-                  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                } else {
-                  Py_ssize_t index = -1;
-                  __pyx_t_7 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __Pyx_GOTREF(__pyx_t_7);
-                  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                  __pyx_t_17 = Py_TYPE(__pyx_t_7)->tp_iternext;
-                  index = 0; __pyx_t_3 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L60_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_3);
-                  index = 1; __pyx_t_13 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_13)) goto __pyx_L60_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_13);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  goto __pyx_L61_unpacking_done;
-                  __pyx_L60_unpacking_failed:;
-                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_L61_unpacking_done:;
-                }
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
-                __Pyx_GIVEREF(__pyx_t_3);
-                __pyx_cur_scope->__pyx_v_e = __pyx_t_3;
-                __pyx_t_3 = 0;
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_v_e = __pyx_t_9;
+                __pyx_t_9 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alslist);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alslist);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_13;
-                __pyx_t_13 = 0;
+                __Pyx_GIVEREF(__pyx_t_14);
+                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_14;
+                __pyx_t_14 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1103
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1103
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
@@ -44653,156 +47969,163 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
                 __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_13 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
+                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
-                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_t_13 = 0;
-                __pyx_t_13 = PyDict_New(); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-                __pyx_t_3 = __pyx_binding_PyCFunctionType_NewEx(&__pyx_lambda_methdef_lambda3, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
-                if (PyDict_SetItem(__pyx_t_13, ((PyObject *)__pyx_n_s__key), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                __pyx_t_3 = PyEval_CallObjectWithKeywords(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
+                __Pyx_GOTREF(__pyx_t_14);
+                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_t_9 = 0;
+                __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_9));
+                __pyx_t_13 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
+                if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__key), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __pyx_t_13 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-                if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
-                  PyObject* sequence = __pyx_t_3;
+                __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+                if ((likely(PyTuple_CheckExact(__pyx_t_13))) || (PyList_CheckExact(__pyx_t_13))) {
+                  PyObject* sequence = __pyx_t_13;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    __pyx_t_13 = PyTuple_GET_ITEM(sequence, 0); 
+                    __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
-                    __pyx_t_13 = PyList_GET_ITEM(sequence, 0); 
+                    __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
                   }
-                  __Pyx_INCREF(__pyx_t_13);
+                  __Pyx_INCREF(__pyx_t_9);
                   __Pyx_INCREF(__pyx_t_14);
-                  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                } else {
+                  #else
+                  __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                } else
+                {
                   Py_ssize_t index = -1;
-                  __pyx_t_7 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_7 = PyObject_GetIter(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_7);
-                  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_7)->tp_iternext;
-                  index = 0; __pyx_t_13 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_13)) goto __pyx_L62_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_13);
-                  index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_14)) goto __pyx_L62_unpacking_failed;
+                  index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_9)) goto __pyx_L58_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_9);
+                  index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_14)) goto __pyx_L58_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_14);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  goto __pyx_L63_unpacking_done;
-                  __pyx_L62_unpacking_failed:;
+                  goto __pyx_L59_unpacking_done;
+                  __pyx_L58_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_L63_unpacking_done:;
+                  __pyx_L59_unpacking_done:;
                 }
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alignment);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_13;
-                __pyx_t_13 = 0;
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_9;
+                __pyx_t_9 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_max_locs);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_max_locs);
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_cur_scope->__pyx_v_max_locs = __pyx_t_14;
                 __pyx_t_14 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1104
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1104
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))             # <<<<<<<<<<<<<<
  *                                     # count = len(locs) # Should be?
  *                                     count = len(max_locs) # Was
  */
-                __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
-                __pyx_t_14 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__chain); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
+                __pyx_t_14 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__chain); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
-                __pyx_t_13 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-                PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_13);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
+                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_t_9 = 0;
+                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-                __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-                PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_13);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+                __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_t_9 = 0;
+                __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
+                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_13);
-                __pyx_t_13 = 0;
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_9);
+                __pyx_t_9 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1106
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1106
  *                                     locs = tuple(itertools.chain(alslist.itervalues()))
  *                                     # count = len(locs) # Should be?
  *                                     count = len(max_locs) # Was             # <<<<<<<<<<<<<<
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  */
-                __pyx_t_24 = PyObject_Length(__pyx_cur_scope->__pyx_v_max_locs); if (unlikely(__pyx_t_24 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_13 = PyInt_FromSsize_t(__pyx_t_24); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
+                __pyx_t_25 = PyObject_Length(__pyx_cur_scope->__pyx_v_max_locs); if (unlikely(__pyx_t_25 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
-                __Pyx_GIVEREF(__pyx_t_13);
-                __pyx_cur_scope->__pyx_v_count = __pyx_t_13;
-                __pyx_t_13 = 0;
+                __Pyx_GIVEREF(__pyx_t_9);
+                __pyx_cur_scope->__pyx_v_count = __pyx_t_9;
+                __pyx_t_9 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1107
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1107
  *                                     # count = len(locs) # Should be?
  *                                     count = len(max_locs) # Was
  *                                     scores = self.scorer.score(FeatureContext(             # <<<<<<<<<<<<<<
  *                                                f, e, count, fcount[f], num_samples,
  *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  */
-                __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
+                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_9);
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1108
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1108
  *                                     count = len(max_locs) # Was
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,             # <<<<<<<<<<<<<<
  *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  *                                                ))
  */
-                __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_13 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
                 __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1109
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1109
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda             # <<<<<<<<<<<<<<
@@ -44817,7 +48140,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
                 __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+                __Pyx_GOTREF(__pyx_t_2);
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7);
                 __Pyx_GIVEREF(__pyx_t_7);
                 PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_15);
@@ -44825,7 +48148,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __pyx_t_7 = 0;
                 __pyx_t_15 = 0;
                 __pyx_t_15 = PyTuple_New(10); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+                __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                 PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_f);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f);
@@ -44835,8 +48158,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_count);
                 PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_cur_scope->__pyx_v_count);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_count);
-                PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_3);
-                __Pyx_GIVEREF(__pyx_t_3);
+                PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_13);
+                __Pyx_GIVEREF(__pyx_t_13);
                 PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_14);
                 __Pyx_GIVEREF(__pyx_t_14);
                 PyTuple_SET_ITEM(__pyx_t_15, 5, ((PyObject *)__pyx_t_2));
@@ -44847,20 +48170,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
                 PyTuple_SET_ITEM(__pyx_t_15, 7, __pyx_cur_scope->__pyx_v_fwords);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
-                __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda));
-                PyTuple_SET_ITEM(__pyx_t_15, 8, ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda));
-                __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->fda));
-                __Pyx_INCREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->eda));
-                PyTuple_SET_ITEM(__pyx_t_15, 9, ((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->eda));
-                __Pyx_GIVEREF(((PyObject *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->eda));
-                __pyx_t_3 = 0;
+                __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
+                PyTuple_SET_ITEM(__pyx_t_15, 8, ((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
+                __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
+                __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
+                PyTuple_SET_ITEM(__pyx_t_15, 9, ((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
+                __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
+                __pyx_t_13 = 0;
                 __pyx_t_14 = 0;
                 __pyx_t_2 = 0;
-                __pyx_t_2 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer->__pyx_vtab)->score(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
@@ -44869,17 +48192,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_15);
                 __pyx_t_15 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1111
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1111
  *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)             # <<<<<<<<<<<<<<
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  */
-                __pyx_t_15 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+                __Pyx_GOTREF(__pyx_t_2);
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_15);
                 __Pyx_GIVEREF(__pyx_t_15);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
@@ -44901,39 +48224,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
                 __pyx_r = __pyx_t_15;
                 __pyx_t_15 = 0;
                 __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
-                __pyx_cur_scope->__pyx_t_1 = __pyx_t_5;
-                __Pyx_XGIVEREF(__pyx_t_9);
-                __pyx_cur_scope->__pyx_t_2 = __pyx_t_9;
+                __Pyx_XGIVEREF(__pyx_t_3);
+                __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
+                __pyx_cur_scope->__pyx_t_2 = __pyx_t_5;
+                __pyx_cur_scope->__pyx_t_3 = __pyx_t_6;
                 __Pyx_XGIVEREF(__pyx_t_10);
-                __pyx_cur_scope->__pyx_t_3 = __pyx_t_10;
+                __pyx_cur_scope->__pyx_t_4 = __pyx_t_10;
                 __Pyx_XGIVEREF(__pyx_t_12);
-                __pyx_cur_scope->__pyx_t_4 = __pyx_t_12;
-                __pyx_cur_scope->__pyx_t_5 = __pyx_t_20;
-                __pyx_cur_scope->__pyx_t_6 = __pyx_t_22;
-                __pyx_cur_scope->__pyx_t_7 = __pyx_t_23;
+                __pyx_cur_scope->__pyx_t_5 = __pyx_t_12;
+                __pyx_cur_scope->__pyx_t_6 = __pyx_t_18;
+                __pyx_cur_scope->__pyx_t_7 = __pyx_t_22;
+                __pyx_cur_scope->__pyx_t_8 = __pyx_t_23;
+                __pyx_cur_scope->__pyx_t_9 = __pyx_t_24;
                 __Pyx_XGIVEREF(__pyx_r);
                 __Pyx_RefNannyFinishContext();
                 /* return from generator, yielding value */
-                __pyx_cur_scope->__pyx_base.resume_label = 1;
+                __pyx_generator->resume_label = 1;
                 return __pyx_r;
-                __pyx_L64_resume_from_yield:;
+                __pyx_L60_resume_from_yield:;
                 __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
-                __pyx_t_5 = __pyx_cur_scope->__pyx_t_1;
-                __pyx_t_9 = __pyx_cur_scope->__pyx_t_2;
-                __pyx_cur_scope->__pyx_t_2 = 0;
-                __Pyx_XGOTREF(__pyx_t_9);
-                __pyx_t_10 = __pyx_cur_scope->__pyx_t_3;
-                __pyx_cur_scope->__pyx_t_3 = 0;
-                __Pyx_XGOTREF(__pyx_t_10);
-                __pyx_t_12 = __pyx_cur_scope->__pyx_t_4;
+                __pyx_t_3 = __pyx_cur_scope->__pyx_t_1;
+                __pyx_cur_scope->__pyx_t_1 = 0;
+                __Pyx_XGOTREF(__pyx_t_3);
+                __pyx_t_5 = __pyx_cur_scope->__pyx_t_2;
+                __pyx_t_6 = __pyx_cur_scope->__pyx_t_3;
+                __pyx_t_10 = __pyx_cur_scope->__pyx_t_4;
                 __pyx_cur_scope->__pyx_t_4 = 0;
+                __Pyx_XGOTREF(__pyx_t_10);
+                __pyx_t_12 = __pyx_cur_scope->__pyx_t_5;
+                __pyx_cur_scope->__pyx_t_5 = 0;
                 __Pyx_XGOTREF(__pyx_t_12);
-                __pyx_t_20 = __pyx_cur_scope->__pyx_t_5;
-                __pyx_t_22 = __pyx_cur_scope->__pyx_t_6;
-                __pyx_t_23 = __pyx_cur_scope->__pyx_t_7;
+                __pyx_t_18 = __pyx_cur_scope->__pyx_t_6;
+                __pyx_t_22 = __pyx_cur_scope->__pyx_t_7;
+                __pyx_t_23 = __pyx_cur_scope->__pyx_t_8;
+                __pyx_t_24 = __pyx_cur_scope->__pyx_t_9;
                 if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
-              __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             goto __pyx_L47;
@@ -44946,83 +48273,78 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
       }
       __pyx_L32:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1113
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1113
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  */
-      __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (__pyx_t_5 < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_length);
+      __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = (__pyx_t_22 < __pyx_cur_scope->__pyx_v_self->max_length);
       if (__pyx_t_19) {
         __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_3 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_22); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_15 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_LT); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_15);
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __pyx_t_15 = PyObject_RichCompare(__pyx_t_3, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
           __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_9 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_3 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_25 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_25 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_26 = __pyx_t_25;
+          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __pyx_t_27 = __pyx_t_26;
         } else {
-          __pyx_t_26 = __pyx_t_8;
+          __pyx_t_27 = __pyx_t_8;
         }
-        __pyx_t_8 = __pyx_t_26;
+        __pyx_t_8 = __pyx_t_27;
       } else {
         __pyx_t_8 = __pyx_t_19;
       }
       if (__pyx_t_8) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1114
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1114
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  */
-        __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_10 = PyNumber_Add(__pyx_t_9, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_10 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        __pyx_t_9 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
+        __pyx_t_22 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_22; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_alt_id = __pyx_t_18;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1115
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1115
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
-            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_15 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -45032,34 +48354,34 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
-          PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
-          __Pyx_GIVEREF(__pyx_t_9);
-          PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_15);
+          __pyx_t_9 = PyTuple_New(7); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
+          __Pyx_GIVEREF(__pyx_t_3);
+          PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_15);
           __Pyx_GIVEREF(__pyx_t_15);
-          PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_13, 3, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_node);
-          PyTuple_SET_ITEM(__pyx_t_13, 4, __pyx_cur_scope->__pyx_v_node);
+          PyTuple_SET_ITEM(__pyx_t_9, 4, __pyx_cur_scope->__pyx_v_node);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_node);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
-          PyTuple_SET_ITEM(__pyx_t_13, 5, __pyx_cur_scope->__pyx_v_phrase);
+          PyTuple_SET_ITEM(__pyx_t_9, 5, __pyx_cur_scope->__pyx_v_phrase);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          PyTuple_SET_ITEM(__pyx_t_13, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
+          PyTuple_SET_ITEM(__pyx_t_9, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          __pyx_t_9 = 0;
+          __pyx_t_3 = 0;
           __pyx_t_15 = 0;
           __pyx_t_10 = 0;
           __pyx_t_2 = 0;
-          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_9)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1116
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1116
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity             # <<<<<<<<<<<<<<
@@ -45068,7 +48390,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
         __pyx_cur_scope->__pyx_v_num_subpatterns = __pyx_cur_scope->__pyx_v_arity;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1117
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1117
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
@@ -45079,7 +48401,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1118
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1118
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1             # <<<<<<<<<<<<<<
@@ -45087,77 +48409,77 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         xcat = sym_setindex(self.category, arity+1)
  */
           __pyx_cur_scope->__pyx_v_num_subpatterns = (__pyx_cur_scope->__pyx_v_num_subpatterns + 1);
-          goto __pyx_L68;
+          goto __pyx_L64;
         }
-        __pyx_L68:;
+        __pyx_L64:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1119
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1119
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:             # <<<<<<<<<<<<<<
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]
  */
-        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = ((__pyx_t_5 + 1) < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_length);
+        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = ((__pyx_t_22 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
         if (__pyx_t_19) {
-          __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_nonterminals);
+          __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
           if (__pyx_t_8) {
-            __pyx_t_26 = (__pyx_cur_scope->__pyx_v_num_subpatterns < ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->max_chunks);
-            __pyx_t_25 = __pyx_t_26;
+            __pyx_t_27 = (__pyx_cur_scope->__pyx_v_num_subpatterns < __pyx_cur_scope->__pyx_v_self->max_chunks);
+            __pyx_t_26 = __pyx_t_27;
           } else {
-            __pyx_t_25 = __pyx_t_8;
+            __pyx_t_26 = __pyx_t_8;
           }
-          __pyx_t_8 = __pyx_t_25;
+          __pyx_t_8 = __pyx_t_26;
         } else {
           __pyx_t_8 = __pyx_t_19;
         }
         if (__pyx_t_8) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1120
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1120
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)             # <<<<<<<<<<<<<<
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  */
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->category, (__pyx_cur_scope->__pyx_v_arity + 1));
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, (__pyx_cur_scope->__pyx_v_arity + 1));
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1121
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1121
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]             # <<<<<<<<<<<<<<
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  */
-          __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_13);
-          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_13, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
+          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xnode);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_xnode);
           __Pyx_GIVEREF(__pyx_t_2);
           __pyx_cur_scope->__pyx_v_xnode = __pyx_t_2;
           __pyx_t_2 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1123
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1123
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])             # <<<<<<<<<<<<<<
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  */
-          __pyx_t_2 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_13);
+          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+          __Pyx_GOTREF(__pyx_t_10);
           PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_13);
-          __Pyx_GIVEREF(__pyx_t_13);
+          PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_9);
+          __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_int_1);
           PyList_SET_ITEM(__pyx_t_10, 2, __pyx_int_1);
           __Pyx_GIVEREF(__pyx_int_1);
@@ -45165,77 +48487,74 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
           PyList_SET_ITEM(__pyx_t_10, 3, __pyx_cur_scope->__pyx_v_pathlen);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
           __pyx_t_2 = 0;
-          __pyx_t_13 = 0;
-          __pyx_t_13 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+          __pyx_t_9 = 0;
+          __pyx_t_9 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_9));
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
-          __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
-          __pyx_cur_scope->__pyx_v_key = __pyx_t_13;
-          __pyx_t_13 = 0;
+          __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
+          __pyx_cur_scope->__pyx_v_key = __pyx_t_9;
+          __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1124
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1124
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []             # <<<<<<<<<<<<<<
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  */
-          __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_13));
+          __pyx_t_9 = PyList_New(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
-          __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
-          __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_13);
-          __pyx_t_13 = 0;
+          __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
+          __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_9);
+          __pyx_t_9 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1125
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1125
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):             # <<<<<<<<<<<<<<
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  */
-          if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer) == Py_None)) {
-            PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-          }
-          __pyx_t_8 = ((PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1126
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1126
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]             # <<<<<<<<<<<<<<
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  */
-            __pyx_t_13 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_13);
+            __pyx_t_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
-            __Pyx_GIVEREF(__pyx_t_13);
-            __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_13;
-            __pyx_t_13 = 0;
-            goto __pyx_L70;
+            __Pyx_GIVEREF(__pyx_t_9);
+            __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_9;
+            __pyx_t_9 = 0;
+            goto __pyx_L66;
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1128
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1128
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)             # <<<<<<<<<<<<<<
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  */
-            __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self, __pyx_n_s_124); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_13);
-            __pyx_t_10 = PyInt_FromLong(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_124); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_15 = PyTuple_New(7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __Pyx_GOTREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
@@ -45257,9 +48576,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
             __pyx_t_10 = 0;
             __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
@@ -45267,7 +48586,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1129
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1129
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  *                             nodes_isteps_away_buffer[key] = frontier_nodes             # <<<<<<<<<<<<<<
@@ -45276,9 +48595,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  */
             if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
-          __pyx_L70:;
+          __pyx_L66:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1131
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1131
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:             # <<<<<<<<<<<<<<
@@ -45286,20 +48605,28 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *             frontier = new_frontier
  */
           if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes)) {
-            __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_5 = 0;
+            __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_22 = 0;
             __pyx_t_20 = NULL;
           } else {
-            __pyx_t_5 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_22 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_20 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_15); __pyx_t_5++;
-            } else if (PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_15); __pyx_t_5++;
+            if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
+            } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
             } else {
               __pyx_t_15 = __pyx_t_20(__pyx_t_2);
               if (unlikely(!__pyx_t_15)) {
@@ -45313,95 +48640,100 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
               PyObject* sequence = __pyx_t_15;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 3)) {
+                if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) {
-                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
-                __pyx_t_13 = PyTuple_GET_ITEM(sequence, 0); 
+                __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
-                __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
+                __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 3)) {
-                  if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
-                __pyx_t_13 = PyList_GET_ITEM(sequence, 0); 
+                __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
-                __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
+                __pyx_t_3 = PyList_GET_ITEM(sequence, 2); 
               }
-              __Pyx_INCREF(__pyx_t_13);
-              __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_9);
+              __Pyx_INCREF(__pyx_t_10);
+              __Pyx_INCREF(__pyx_t_3);
+              #else
+              __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-            } else {
+            } else
+            {
               Py_ssize_t index = -1;
               __pyx_t_14 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __pyx_t_17 = Py_TYPE(__pyx_t_14)->tp_iternext;
-              index = 0; __pyx_t_13 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_13)) goto __pyx_L73_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_13);
-              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_10)) goto __pyx_L73_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_9 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_9)) goto __pyx_L73_unpacking_failed;
+              index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_9)) goto __pyx_L69_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_9);
+              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_10)) goto __pyx_L69_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_10);
+              index = 2; __pyx_t_3 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_3)) goto __pyx_L69_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_3);
               if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_14), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-              goto __pyx_L74_unpacking_done;
-              __pyx_L73_unpacking_failed:;
+              goto __pyx_L70_unpacking_done;
+              __pyx_L69_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+              __pyx_t_17 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
               {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_L74_unpacking_done:;
+              __pyx_L70_unpacking_done:;
             }
-            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_13); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __pyx_cur_scope->__pyx_v_i = __pyx_t_18;
             __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_pathlen);
-            __Pyx_GIVEREF(__pyx_t_9);
-            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_9;
-            __pyx_t_9 = 0;
+            __Pyx_GIVEREF(__pyx_t_3);
+            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_3;
+            __pyx_t_3 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1132
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1132
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))             # <<<<<<<<<<<<<<
  *             frontier = new_frontier
  * 
  */
-            if (unlikely(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier) == Py_None)) {
-              PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-            }
             __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_9);
+            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_3);
             __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_13);
+            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_14));
-            PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_13);
-            __Pyx_GIVEREF(__pyx_t_13);
-            __pyx_t_13 = 0;
-            __pyx_t_13 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_13);
+            __Pyx_GOTREF(__pyx_t_14);
+            PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
+            __Pyx_GIVEREF(__pyx_t_9);
+            __pyx_t_9 = 0;
+            __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_9);
             __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
             __pyx_t_14 = PyTuple_New(7); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+            __Pyx_GOTREF(__pyx_t_14);
             PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_15);
             __Pyx_GIVEREF(__pyx_t_15);
-            PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_9);
-            __Pyx_GIVEREF(__pyx_t_9);
+            PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_3);
             PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
@@ -45410,30 +48742,30 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_xnode);
             PyTuple_SET_ITEM(__pyx_t_14, 4, __pyx_cur_scope->__pyx_v_xnode);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_14, 5, __pyx_t_13);
-            __Pyx_GIVEREF(__pyx_t_13);
+            PyTuple_SET_ITEM(__pyx_t_14, 5, __pyx_t_9);
+            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
             PyTuple_SET_ITEM(__pyx_t_14, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
             __pyx_t_15 = 0;
-            __pyx_t_9 = 0;
+            __pyx_t_3 = 0;
             __pyx_t_10 = 0;
-            __pyx_t_13 = 0;
+            __pyx_t_9 = 0;
             __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_14)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          goto __pyx_L69;
+          goto __pyx_L65;
         }
-        __pyx_L69:;
-        goto __pyx_L65;
+        __pyx_L65:;
+        goto __pyx_L61;
       }
-      __pyx_L65:;
+      __pyx_L61:;
       __pyx_L19_continue:;
     }
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1133
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1133
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
  *             frontier = new_frontier             # <<<<<<<<<<<<<<
@@ -45447,7 +48779,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
     __pyx_cur_scope->__pyx_v_frontier = __pyx_cur_scope->__pyx_v_new_frontier;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1135
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1135
  *             frontier = new_frontier
  * 
  *         stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -45460,7 +48792,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __pyx_cur_scope->__pyx_v_stop_time = __pyx_t_12;
   __pyx_t_12 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1136
  * 
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
@@ -45478,7 +48810,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_GOTREF(__pyx_t_14);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_12));
+  __Pyx_GOTREF(__pyx_t_12);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
   PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_125));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
@@ -45491,7 +48823,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1137
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1137
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()             # <<<<<<<<<<<<<<
@@ -45508,7 +48840,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1138
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1138
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)             # <<<<<<<<<<<<<<
@@ -45520,10 +48852,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __pyx_t_12 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-  __pyx_t_14 = PyFloat_FromDouble(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self)->extract_time); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_14 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_14);
   __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_126));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_126));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_126));
@@ -45535,7 +48867,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_2);
@@ -45551,12 +48883,13 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
   __Pyx_AddTraceback("input", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1141
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1141
  * 
  * 
  *     cdef int find_fixpoint(self,             # <<<<<<<<<<<<<<
@@ -45564,7 +48897,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_12generator4(struct __p
  *                         int* f_links_low, int* f_links_high,
  */
 
-static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_f_low, PyObject *__pyx_v_f_high, int *__pyx_v_f_links_low, int *__pyx_v_f_links_high, int *__pyx_v_e_links_low, int *__pyx_v_e_links_high, int __pyx_v_e_in_low, int __pyx_v_e_in_high, int *__pyx_v_e_low, int *__pyx_v_e_high, int *__pyx_v_f_back_low, int *__pyx_v_f_back_high, int __pyx_v_f_sent_len, int __pyx_v_e_sent_len, int __pyx_v_max_f_len, int __pyx_v_max_e_len, int __pyx_v_min_fx_size, int __pyx_v_min_ex_size, int __pyx_v_max_new_x, int __pyx_v_allow_low_x, int __pyx_v_allow_high_x, int __pyx_v_allow_arbitrary_x, int __pyx_v_write_log) {
+static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_f_low, PyObject *__pyx_v_f_high, int *__pyx_v_f_links_low, int *__pyx_v_f_links_high, int *__pyx_v_e_links_low, int *__pyx_v_e_links_high, int __pyx_v_e_in_low, int __pyx_v_e_in_high, int *__pyx_v_e_low, int *__pyx_v_e_high, int *__pyx_v_f_back_low, int *__pyx_v_f_back_high, int __pyx_v_f_sent_len, int __pyx_v_e_sent_len, int __pyx_v_max_f_len, int __pyx_v_max_e_len, int __pyx_v_min_fx_size, int __pyx_v_min_ex_size, int __pyx_v_max_new_x, int __pyx_v_allow_low_x, int __pyx_v_allow_high_x, int __pyx_v_allow_arbitrary_x, CYTHON_UNUSED int __pyx_v_write_log) {
   int __pyx_v_e_low_prev;
   int __pyx_v_e_high_prev;
   int __pyx_v_f_low_prev;
@@ -45584,9 +48917,9 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("find_fixpoint");
+  __Pyx_RefNannySetupContext("find_fixpoint", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1156
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1156
  *         cdef int e_low_prev, e_high_prev, f_low_prev, f_high_prev, new_x, new_low_x, new_high_x
  * 
  *         e_low[0] = e_in_low             # <<<<<<<<<<<<<<
@@ -45595,7 +48928,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_low[0]) = __pyx_v_e_in_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1157
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1157
  * 
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high             # <<<<<<<<<<<<<<
@@ -45604,7 +48937,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_high[0]) = __pyx_v_e_in_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1158
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
@@ -45616,7 +48949,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1159
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1159
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)
  *         if e_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -45626,7 +48959,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_3 = ((__pyx_v_e_low[0]) == -1);
   if (__pyx_t_3) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1165
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1165
  *             # rule X -> X_1 w X_2 / X_1 X_2.    This is probably
  *             # not worth the bother, though.
  *             return 0             # <<<<<<<<<<<<<<
@@ -45638,7 +48971,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L3;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1166
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1166
  *             # not worth the bother, though.
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:             # <<<<<<<<<<<<<<
@@ -45654,7 +48987,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1167
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1167
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:             # <<<<<<<<<<<<<<
@@ -45664,7 +48997,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = ((__pyx_v_e_in_low - (__pyx_v_e_low[0])) < __pyx_v_min_ex_size);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1168
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1168
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size             # <<<<<<<<<<<<<<
@@ -45673,7 +49006,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_low[0]) = (__pyx_v_e_in_low - __pyx_v_min_ex_size);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1169
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1169
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -45683,7 +49016,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_5 = ((__pyx_v_e_low[0]) < 0);
       if (__pyx_t_5) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1170
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1170
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -45702,7 +49035,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1172
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1172
  *                     return 0
  * 
  *         if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -45712,7 +49045,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_5 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
   if (__pyx_t_5) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1173
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1173
  * 
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0             # <<<<<<<<<<<<<<
@@ -45724,7 +49057,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L6;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1174
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1174
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:             # <<<<<<<<<<<<<<
@@ -45740,7 +49073,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_4) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1175
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1175
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:             # <<<<<<<<<<<<<<
@@ -45750,7 +49083,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (((__pyx_v_e_high[0]) - __pyx_v_e_in_high) < __pyx_v_min_ex_size);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1176
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1176
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size             # <<<<<<<<<<<<<<
@@ -45759,7 +49092,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_high[0]) = (__pyx_v_e_in_high + __pyx_v_min_ex_size);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1177
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1177
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:             # <<<<<<<<<<<<<<
@@ -45769,7 +49102,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_e_high[0]) > __pyx_v_e_sent_len);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1178
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1178
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -45788,7 +49121,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L6:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1180
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1180
  *                     return 0
  * 
  *         f_back_low[0] = -1             # <<<<<<<<<<<<<<
@@ -45797,7 +49130,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_low[0]) = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1181
  * 
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1             # <<<<<<<<<<<<<<
@@ -45806,7 +49139,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_high[0]) = -1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1182
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1182
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1
  *         f_low_prev = f_low             # <<<<<<<<<<<<<<
@@ -45815,7 +49148,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_f_low_prev = __pyx_v_f_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1183
  *         f_back_high[0] = -1
  *         f_low_prev = f_low
  *         f_high_prev = f_high             # <<<<<<<<<<<<<<
@@ -45825,7 +49158,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_f_high_prev = __pyx_t_1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1184
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1184
  *         f_low_prev = f_low
  *         f_high_prev = f_high
  *         new_x = 0             # <<<<<<<<<<<<<<
@@ -45834,7 +49167,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_x = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1185
  *         f_high_prev = f_high
  *         new_x = 0
  *         new_low_x = 0             # <<<<<<<<<<<<<<
@@ -45843,7 +49176,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_low_x = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1186
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1186
  *         new_x = 0
  *         new_low_x = 0
  *         new_high_x = 0             # <<<<<<<<<<<<<<
@@ -45852,7 +49185,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_high_x = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1188
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1188
  *         new_high_x = 0
  * 
  *         while True:             # <<<<<<<<<<<<<<
@@ -45862,7 +49195,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   while (1) {
     if (!1) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1190
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1190
  *         while True:
  * 
  *             if f_back_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -45872,7 +49205,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) == -1);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1191
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1191
  * 
  *             if f_back_low[0] == -1:
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
@@ -45886,7 +49219,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1193
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1193
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
@@ -45897,7 +49230,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1194
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1194
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
@@ -45910,7 +49243,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L11:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1196
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1196
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  *             if f_back_low[0] > f_low:             # <<<<<<<<<<<<<<
@@ -45920,7 +49253,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) > __pyx_v_f_low);
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1197
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1197
  * 
  *             if f_back_low[0] > f_low:
  *                 f_back_low[0] = f_low             # <<<<<<<<<<<<<<
@@ -45932,7 +49265,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L12:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1199
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1199
  *                 f_back_low[0] = f_low
  * 
  *             if f_back_high[0] < f_high:             # <<<<<<<<<<<<<<
@@ -45941,14 +49274,13 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1200
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1200
  * 
  *             if f_back_high[0] < f_high:
  *                 f_back_high[0] = f_high             # <<<<<<<<<<<<<<
@@ -45961,7 +49293,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L13:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1202
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1202
  *                 f_back_high[0] = f_high
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:             # <<<<<<<<<<<<<<
@@ -45977,7 +49309,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1203
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1203
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -45990,7 +49322,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1205
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1205
  *                 return 1
  * 
  *             if allow_low_x == 0 and f_back_low[0] < f_low:             # <<<<<<<<<<<<<<
@@ -46006,7 +49338,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1207
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1207
  *             if allow_low_x == 0 and f_back_low[0] < f_low:
  *                 # FAIL: f phrase is not tight
  *                 return 0             # <<<<<<<<<<<<<<
@@ -46019,7 +49351,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1209
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1209
  *                 return 0
  * 
  *             if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -46029,7 +49361,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
     if (__pyx_t_5) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1211
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1211
  *             if f_back_high[0] - f_back_low[0] > max_f_len:
  *                 # FAIL: f back projection is too wide
  *                 return 0             # <<<<<<<<<<<<<<
@@ -46042,7 +49374,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1213
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1213
  *                 return 0
  * 
  *             if allow_high_x == 0 and f_back_high[0] > f_high:             # <<<<<<<<<<<<<<
@@ -46053,8 +49385,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     if (__pyx_t_5) {
       __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -46064,7 +49395,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1215
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1215
  *             if allow_high_x == 0 and f_back_high[0] > f_high:
  *                 # FAIL: extension on high side not allowed
  *                 return 0             # <<<<<<<<<<<<<<
@@ -46077,7 +49408,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1217
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1217
  *                 return 0
  * 
  *             if f_low != f_back_low[0]:             # <<<<<<<<<<<<<<
@@ -46087,7 +49418,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (__pyx_v_f_low != (__pyx_v_f_back_low[0]));
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1218
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1218
  * 
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:             # <<<<<<<<<<<<<<
@@ -46097,7 +49428,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_low_x == 0);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1219
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1219
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -46107,7 +49438,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1221
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1221
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on low side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46120,7 +49451,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1223
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1223
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -46129,7 +49460,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1224
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1224
  *                     else:
  *                         new_x = new_x + 1
  *                         new_low_x = 1             # <<<<<<<<<<<<<<
@@ -46143,7 +49474,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L19:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1225
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1225
  *                         new_x = new_x + 1
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:             # <<<<<<<<<<<<<<
@@ -46153,7 +49484,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_f_low - (__pyx_v_f_back_low[0])) < __pyx_v_min_fx_size);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1226
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1226
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size             # <<<<<<<<<<<<<<
@@ -46162,7 +49493,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
         (__pyx_v_f_back_low[0]) = (__pyx_v_f_low - __pyx_v_min_fx_size);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1227
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1227
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -46172,7 +49503,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1229
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1229
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46185,7 +49516,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L22:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1230
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1230
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0
  *                     if f_back_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -46195,7 +49526,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_low[0]) < 0);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1232
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1232
  *                     if f_back_low[0] < 0:
  *                         # FAIL: extension required on low side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46214,7 +49545,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L18:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1234
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1234
  *                         return 0
  * 
  *             if f_high != f_back_high[0]:             # <<<<<<<<<<<<<<
@@ -46223,14 +49554,13 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
+    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1235
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1235
  * 
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:             # <<<<<<<<<<<<<<
@@ -46240,7 +49570,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_high_x == 0);
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1236
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1236
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -46250,7 +49580,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1238
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1238
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on high side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46263,7 +49593,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1240
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1240
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -46272,7 +49602,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1241
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1241
  *                     else:
  *                         new_x = new_x + 1
  *                         new_high_x = 1             # <<<<<<<<<<<<<<
@@ -46286,7 +49616,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L25:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1242
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1242
  *                         new_x = new_x + 1
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:             # <<<<<<<<<<<<<<
@@ -46300,15 +49630,14 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_7);
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1243
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1243
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size             # <<<<<<<<<<<<<<
@@ -46324,7 +49653,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         (__pyx_v_f_back_high[0]) = __pyx_t_1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1244
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1244
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -46334,7 +49663,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1246
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1246
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46347,7 +49676,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L28:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1247
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1247
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0
  *                     if f_back_high[0] > f_sent_len:             # <<<<<<<<<<<<<<
@@ -46357,7 +49686,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_high[0]) > __pyx_v_f_sent_len);
         if (__pyx_t_4) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1249
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1249
  *                     if f_back_high[0] > f_sent_len:
  *                         # FAIL: extension required on high side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -46376,7 +49705,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L24:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1251
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1251
  *                         return 0
  * 
  *             e_low_prev = e_low[0]             # <<<<<<<<<<<<<<
@@ -46385,7 +49714,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_low_prev = (__pyx_v_e_low[0]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1252
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1252
  * 
  *             e_low_prev = e_low[0]
  *             e_high_prev = e_high[0]             # <<<<<<<<<<<<<<
@@ -46394,7 +49723,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_high_prev = (__pyx_v_e_high[0]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1254
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1254
  *             e_high_prev = e_high[0]
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
@@ -46405,7 +49734,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1255
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1255
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
@@ -46416,7 +49745,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1256
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1256
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:             # <<<<<<<<<<<<<<
@@ -46432,7 +49761,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1257
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1257
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -46445,7 +49774,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L30:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1258
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1258
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  *             if allow_arbitrary_x == 0:             # <<<<<<<<<<<<<<
@@ -46455,7 +49784,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (__pyx_v_allow_arbitrary_x == 0);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1260
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1260
  *             if allow_arbitrary_x == 0:
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0             # <<<<<<<<<<<<<<
@@ -46468,7 +49797,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L31:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1261
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1261
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0
  *             if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -46478,7 +49807,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1263
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1263
  *             if e_high[0] - e_low[0] > max_e_len:
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0             # <<<<<<<<<<<<<<
@@ -46491,7 +49820,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L32:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1264
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1264
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0
  *             f_low_prev = f_back_low[0]             # <<<<<<<<<<<<<<
@@ -46500,7 +49829,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_f_low_prev = (__pyx_v_f_back_low[0]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1265
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1265
  *                 return 0
  *             f_low_prev = f_back_low[0]
  *             f_high_prev = f_back_high[0]             # <<<<<<<<<<<<<<
@@ -46523,7 +49852,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1268
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1268
  * 
  * 
  *     cdef find_projection(self, int in_low, int in_high, int* in_links_low, int* in_links_high,             # <<<<<<<<<<<<<<
@@ -46531,7 +49860,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  *         cdef int i
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_in_low, int __pyx_v_in_high, int *__pyx_v_in_links_low, int *__pyx_v_in_links_high, int *__pyx_v_out_low, int *__pyx_v_out_high) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_in_low, int __pyx_v_in_high, int *__pyx_v_in_links_low, int *__pyx_v_in_links_high, int *__pyx_v_out_low, int *__pyx_v_out_high) {
   int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -46539,9 +49868,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
   int __pyx_t_2;
   int __pyx_t_3;
   int __pyx_t_4;
-  __Pyx_RefNannySetupContext("find_projection");
+  __Pyx_RefNannySetupContext("find_projection", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1271
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1271
  *                         int* out_low, int* out_high):
  *         cdef int i
  *         for i from in_low <= i < in_high:             # <<<<<<<<<<<<<<
@@ -46551,7 +49880,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
   __pyx_t_1 = __pyx_v_in_high;
   for (__pyx_v_i = __pyx_v_in_low; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1272
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1272
  *         cdef int i
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:             # <<<<<<<<<<<<<<
@@ -46561,7 +49890,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
     __pyx_t_2 = ((__pyx_v_in_links_low[__pyx_v_i]) != -1);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1273
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1273
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:             # <<<<<<<<<<<<<<
@@ -46577,7 +49906,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
       }
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1274
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1274
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]             # <<<<<<<<<<<<<<
@@ -46589,7 +49918,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
       }
       __pyx_L6:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1275
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1275
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:             # <<<<<<<<<<<<<<
@@ -46605,7 +49934,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
       }
       if (__pyx_t_3) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1276
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1276
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:
  *                     out_high[0] = in_links_high[i]             # <<<<<<<<<<<<<<
@@ -46627,7 +49956,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1279
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1279
  * 
  * 
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):             # <<<<<<<<<<<<<<
@@ -46635,13 +49964,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(struct _
  *         new_len = arr_len[0] + data_len
  */
 
-static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_arr, int *__pyx_v_arr_len, int *__pyx_v_data, int __pyx_v_data_len) {
+static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_arr, int *__pyx_v_arr_len, int *__pyx_v_data, int __pyx_v_data_len) {
   int __pyx_v_new_len;
   int *__pyx_r;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("int_arr_extend");
+  __Pyx_RefNannySetupContext("int_arr_extend", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1281
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1281
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len             # <<<<<<<<<<<<<<
@@ -46650,7 +49979,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_data_len);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1282
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1282
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -46659,7 +49988,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1283
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1283
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -46668,7 +49997,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_data, (__pyx_v_data_len * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1284
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1284
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -46677,7 +50006,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1285
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1285
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len
  *         return arr             # <<<<<<<<<<<<<<
@@ -46693,7 +50022,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1288
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1288
  * 
  * 
  *     cdef extract_phrases(self, int e_low, int e_high, int* e_gap_low, int* e_gap_high, int* e_links_low, int num_gaps,             # <<<<<<<<<<<<<<
@@ -46701,7 +50030,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(struct __pyx_o
  *                         int sent_id, int e_sent_len, int e_sent_start):
  */
 
-static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_e_low, int __pyx_v_e_high, int *__pyx_v_e_gap_low, int *__pyx_v_e_gap_high, int *__pyx_v_e_links_low, int __pyx_v_num_gaps, int __pyx_v_f_low, int __pyx_v_f_high, int *__pyx_v_f_gap_low, int *__pyx_v_f_gap_high, int *__pyx_v_f_links_low, int __pyx_v_sent_id, int __pyx_v_e_sent_len, int __pyx_v_e_sent_start) {
+static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int __pyx_v_e_low, int __pyx_v_e_high, int *__pyx_v_e_gap_low, int *__pyx_v_e_gap_high, int *__pyx_v_e_links_low, int __pyx_v_num_gaps, CYTHON_UNUSED int __pyx_v_f_low, CYTHON_UNUSED int __pyx_v_f_high, CYTHON_UNUSED int *__pyx_v_f_gap_low, CYTHON_UNUSED int *__pyx_v_f_gap_high, CYTHON_UNUSED int *__pyx_v_f_links_low, CYTHON_UNUSED int __pyx_v_sent_id, int __pyx_v_e_sent_len, int __pyx_v_e_sent_start) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -46737,9 +50066,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extract_phrases");
+  __Pyx_RefNannySetupContext("extract_phrases", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1296
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1296
  *         cdef result
  * 
  *         result = []             # <<<<<<<<<<<<<<
@@ -46747,11 +50076,11 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         e_gaps1 = <int*> malloc(0)
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1297
  * 
  *         result = []
  *         len1 = 0             # <<<<<<<<<<<<<<
@@ -46760,7 +50089,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1298
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1298
  *         result = []
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -46769,7 +50098,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = ((int *)malloc(0));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1299
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1299
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  *         ephr_arr = IntList()             # <<<<<<<<<<<<<<
@@ -46781,7 +50110,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_v_ephr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1301
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1301
  *         ephr_arr = IntList()
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))             # <<<<<<<<<<<<<<
@@ -46790,7 +50119,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gap_order = ((int *)malloc((__pyx_v_num_gaps * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1302
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1302
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:             # <<<<<<<<<<<<<<
@@ -46800,7 +50129,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_num_gaps > 0);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1303
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1303
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0             # <<<<<<<<<<<<<<
@@ -46809,7 +50138,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     (__pyx_v_e_gap_order[0]) = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1304
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1304
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -46819,7 +50148,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_3 = __pyx_v_num_gaps;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1305
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1305
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:             # <<<<<<<<<<<<<<
@@ -46829,7 +50158,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = __pyx_v_i;
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1306
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1306
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -46839,7 +50168,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_2 = ((__pyx_v_e_gap_low[__pyx_v_i]) < (__pyx_v_e_gap_low[__pyx_v_j]));
         if (__pyx_t_2) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1307
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1307
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:             # <<<<<<<<<<<<<<
@@ -46849,7 +50178,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_i;
           for (__pyx_v_k = __pyx_v_j; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1308
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1308
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]             # <<<<<<<<<<<<<<
@@ -46859,7 +50188,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             (__pyx_v_e_gap_order[(__pyx_v_k + 1)]) = (__pyx_v_e_gap_order[__pyx_v_k]);
           }
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1309
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1309
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i             # <<<<<<<<<<<<<<
@@ -46868,7 +50197,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
           (__pyx_v_e_gap_order[__pyx_v_j]) = __pyx_v_i;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1310
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1310
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i
  *                         break             # <<<<<<<<<<<<<<
@@ -46882,7 +50211,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1312
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1312
  *                         break
  *                 else:
  *                     e_gap_order[i] = i             # <<<<<<<<<<<<<<
@@ -46897,7 +50226,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L3:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1314
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1314
  *                     e_gap_order[i] = i
  * 
  *         e_x_low = e_low             # <<<<<<<<<<<<<<
@@ -46906,7 +50235,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_low = __pyx_v_e_low;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1315
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1315
  * 
  *         e_x_low = e_low
  *         e_x_high = e_high             # <<<<<<<<<<<<<<
@@ -46915,7 +50244,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_high = __pyx_v_e_high;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1316
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1316
  *         e_x_low = e_low
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -46925,7 +50254,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
   if (__pyx_t_2) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1317
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1317
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -46948,7 +50277,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_6) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1318
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1318
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1             # <<<<<<<<<<<<<<
@@ -46958,7 +50287,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_e_x_low = (__pyx_v_e_x_low - 1);
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1319
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1319
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:             # <<<<<<<<<<<<<<
@@ -46981,7 +50310,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_2) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1320
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1320
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:
  *                 e_x_high = e_x_high + 1             # <<<<<<<<<<<<<<
@@ -46994,7 +50323,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L11:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1322
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1322
  *                 e_x_high = e_x_high + 1
  * 
  *         for i from e_x_low <= i <= e_low:             # <<<<<<<<<<<<<<
@@ -47004,7 +50333,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_low;
   for (__pyx_v_i = __pyx_v_e_x_low; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1323
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1323
  * 
  *         for i from e_x_low <= i <= e_low:
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)             # <<<<<<<<<<<<<<
@@ -47014,7 +50343,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_e_gaps1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps1, (&__pyx_v_len1), (&__pyx_v_i), 1);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1325
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1325
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)
  * 
  *         for i from 0 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -47024,7 +50353,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_num_gaps;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1326
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1326
  * 
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -47033,7 +50362,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1327
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1327
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)
  *             len2 = 0             # <<<<<<<<<<<<<<
@@ -47042,7 +50371,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_len2 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1329
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1329
  *             len2 = 0
  * 
  *             j = e_gap_order[i]             # <<<<<<<<<<<<<<
@@ -47051,7 +50380,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = (__pyx_v_e_gap_order[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1330
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1330
  * 
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]             # <<<<<<<<<<<<<<
@@ -47060,7 +50389,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_low = (__pyx_v_e_gap_low[__pyx_v_j]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1331
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1331
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]             # <<<<<<<<<<<<<<
@@ -47069,7 +50398,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_high = (__pyx_v_e_gap_high[__pyx_v_j]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1332
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1332
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -47079,7 +50408,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
     if (__pyx_t_2) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1333
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1333
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -47096,7 +50425,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_7) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1334
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1334
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1             # <<<<<<<<<<<<<<
@@ -47106,7 +50435,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_v_e_x_gap_low = (__pyx_v_e_x_gap_low - 1);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1335
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1335
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:             # <<<<<<<<<<<<<<
@@ -47123,7 +50452,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_6) break;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1336
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1336
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:
  *                     e_x_gap_high = e_x_gap_high + 1             # <<<<<<<<<<<<<<
@@ -47136,7 +50465,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     __pyx_L20:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1338
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1338
  *                     e_x_gap_high = e_x_gap_high + 1
  * 
  *             k = 0             # <<<<<<<<<<<<<<
@@ -47145,7 +50474,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_k = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1339
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1339
  * 
  *             k = 0
  *             step = 1+(i*2)             # <<<<<<<<<<<<<<
@@ -47154,7 +50483,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_step = (1 + (__pyx_v_i * 2));
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1340
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1340
  *             k = 0
  *             step = 1+(i*2)
  *             while k < len1:             # <<<<<<<<<<<<<<
@@ -47165,7 +50494,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_k < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1341
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1341
  *             step = 1+(i*2)
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -47175,7 +50504,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = (__pyx_v_e_gap_low[__pyx_v_j]);
       for (__pyx_v_m = __pyx_v_e_x_gap_low; __pyx_v_m <= __pyx_t_4; __pyx_v_m++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1342
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1342
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:             # <<<<<<<<<<<<<<
@@ -47185,7 +50514,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_6 = (__pyx_v_m >= (__pyx_v_e_gaps1[((__pyx_v_k + __pyx_v_step) - 1)]));
         if (__pyx_t_6) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1343
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1343
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:             # <<<<<<<<<<<<<<
@@ -47195,7 +50524,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_e_x_gap_high;
           for (__pyx_v_n = (__pyx_v_e_gap_high[__pyx_v_j]); __pyx_v_n <= __pyx_t_5; __pyx_v_n++) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1344
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1344
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length             # <<<<<<<<<<<<<<
@@ -47205,7 +50534,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             __pyx_t_6 = ((__pyx_v_n - __pyx_v_m) >= 1);
             if (__pyx_t_6) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1345
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1345
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)             # <<<<<<<<<<<<<<
@@ -47214,7 +50543,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_k), __pyx_v_step);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1346
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1346
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)             # <<<<<<<<<<<<<<
@@ -47223,7 +50552,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (&__pyx_v_m), 1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1347
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1347
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)             # <<<<<<<<<<<<<<
@@ -47240,7 +50569,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_L29:;
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1348
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1348
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step             # <<<<<<<<<<<<<<
@@ -47250,7 +50579,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_k = (__pyx_v_k + __pyx_v_step);
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1349
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1349
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step
  *             free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -47259,7 +50588,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     free(__pyx_v_e_gaps1);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1350
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1350
  *                 k = k + step
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -47268,7 +50597,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1351
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1351
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2
  *             len1 = len2             # <<<<<<<<<<<<<<
@@ -47278,7 +50607,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_len1 = __pyx_v_len2;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1353
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1353
  *             len1 = len2
  * 
  *         step = 1+(num_gaps*2)             # <<<<<<<<<<<<<<
@@ -47287,7 +50616,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = (1 + (__pyx_v_num_gaps * 2));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1354
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1354
  * 
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -47296,7 +50625,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1355
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1355
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0             # <<<<<<<<<<<<<<
@@ -47305,7 +50634,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1356
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1356
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:             # <<<<<<<<<<<<<<
@@ -47315,7 +50644,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_x_high;
   for (__pyx_v_i = __pyx_v_e_high; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1357
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1357
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:
  *             j = 0             # <<<<<<<<<<<<<<
@@ -47324,7 +50653,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1358
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1358
  *         for i from e_high <= i <= e_x_high:
  *             j = 0
  *             while j < len1:             # <<<<<<<<<<<<<<
@@ -47335,7 +50664,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_j < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1359
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1359
  *             j = 0
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:             # <<<<<<<<<<<<<<
@@ -47351,7 +50680,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (__pyx_t_2) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1360
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1360
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)             # <<<<<<<<<<<<<<
@@ -47360,7 +50689,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
         __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_j), __pyx_v_step);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1361
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1361
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)             # <<<<<<<<<<<<<<
@@ -47372,7 +50701,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L37:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1362
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1362
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step             # <<<<<<<<<<<<<<
@@ -47383,7 +50712,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1363
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1363
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -47392,7 +50721,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1364
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1364
  *                 j = j + step
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -47401,7 +50730,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1365
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1365
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2
  *         len1 = len2             # <<<<<<<<<<<<<<
@@ -47410,7 +50739,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = __pyx_v_len2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1367
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1367
  *         len1 = len2
  * 
  *         step = (num_gaps+1)*2             # <<<<<<<<<<<<<<
@@ -47419,7 +50748,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = ((__pyx_v_num_gaps + 1) * 2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1368
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1368
  * 
  *         step = (num_gaps+1)*2
  *         i = 0             # <<<<<<<<<<<<<<
@@ -47428,7 +50757,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_i = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1370
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1370
  *         i = 0
  * 
  *         while i < len1:             # <<<<<<<<<<<<<<
@@ -47439,7 +50768,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_i < __pyx_v_len1);
     if (!__pyx_t_2) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1371
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1371
  * 
  *         while i < len1:
  *             ephr_arr._clear()             # <<<<<<<<<<<<<<
@@ -47448,7 +50777,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_clear(__pyx_v_ephr_arr);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1372
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1372
  *         while i < len1:
  *             ephr_arr._clear()
  *             num_chunks = 0             # <<<<<<<<<<<<<<
@@ -47457,7 +50786,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_num_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1373
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1373
  *             ephr_arr._clear()
  *             num_chunks = 0
  *             indexes = []             # <<<<<<<<<<<<<<
@@ -47465,12 +50794,12 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  */
     __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(((PyObject *)__pyx_v_indexes));
     __pyx_v_indexes = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1374
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1374
  *             num_chunks = 0
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:             # <<<<<<<<<<<<<<
@@ -47480,7 +50809,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_9 = (__pyx_v_num_gaps + 1);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_9; __pyx_v_j++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1375
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1375
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -47490,7 +50819,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = ((__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]) < (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]));
       if (__pyx_t_2) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1376
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1376
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1             # <<<<<<<<<<<<<<
@@ -47502,7 +50831,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L42:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1377
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1377
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -47512,22 +50841,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_3 = (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]);
       for (__pyx_v_k = (__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1378
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1378
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  */
-        if (unlikely(((PyObject *)__pyx_v_indexes) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1379
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1379
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])             # <<<<<<<<<<<<<<
@@ -47542,7 +50868,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_append(__pyx_v_ephr_arr, __pyx_t_4);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1380
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1380
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:             # <<<<<<<<<<<<<<
@@ -47552,22 +50878,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = (__pyx_v_j < __pyx_v_num_gaps);
       if (__pyx_t_2) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1381
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1381
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  */
-        if (unlikely(((PyObject *)__pyx_v_indexes) == Py_None)) {
-          PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-        }
         __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1382
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1382
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
@@ -47580,7 +50903,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_L45:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1383
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1383
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step             # <<<<<<<<<<<<<<
@@ -47589,7 +50912,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_i = (__pyx_v_i + __pyx_v_step);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1384
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1384
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:             # <<<<<<<<<<<<<<
@@ -47605,7 +50928,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1385
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1385
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:
  *                 result.append((Phrase(ephr_arr),indexes))             # <<<<<<<<<<<<<<
@@ -47613,7 +50936,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         free(e_gaps1)
  */
       __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(((PyObject *)__pyx_v_ephr_arr));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_ephr_arr));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_ephr_arr));
@@ -47621,7 +50944,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+      __Pyx_GOTREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
       __Pyx_GIVEREF(__pyx_t_11);
       __Pyx_INCREF(((PyObject *)__pyx_v_indexes));
@@ -47637,7 +50960,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_L46:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1387
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1387
  *                 result.append((Phrase(ephr_arr),indexes))
  * 
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -47646,7 +50969,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1388
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1388
  * 
  *         free(e_gaps1)
  *         free(e_gap_order)             # <<<<<<<<<<<<<<
@@ -47655,7 +50978,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gap_order);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1389
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1389
  *         free(e_gaps1)
  *         free(e_gap_order)
  *         return result             # <<<<<<<<<<<<<<
@@ -47683,7 +51006,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1391
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1391
  *         return result
  * 
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):             # <<<<<<<<<<<<<<
@@ -47691,7 +51014,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *         cdef IntList ret = IntList()
  */
 
-static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_sent_links, int __pyx_v_num_links, PyObject *__pyx_v_findexes, PyObject *__pyx_v_eindexes) {
+static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments(CYTHON_UNUSED struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, int *__pyx_v_sent_links, int __pyx_v_num_links, PyObject *__pyx_v_findexes, PyObject *__pyx_v_eindexes) {
   unsigned int __pyx_v_i;
   struct __pyx_obj_3_sa_IntList *__pyx_v_ret = 0;
   PyObject *__pyx_v_s = NULL;
@@ -47709,9 +51032,9 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("create_alignments");
+  __Pyx_RefNannySetupContext("create_alignments", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1393
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1393
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):
  *         cdef unsigned i
  *         cdef IntList ret = IntList()             # <<<<<<<<<<<<<<
@@ -47723,7 +51046,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   __pyx_v_ret = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1394
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1394
  *         cdef unsigned i
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):             # <<<<<<<<<<<<<<
@@ -47734,7 +51057,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
     __pyx_v_i = __pyx_t_3;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1395
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1395
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):
  *             s = findexes[i]             # <<<<<<<<<<<<<<
@@ -47747,20 +51070,19 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __pyx_v_s = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1396
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1396
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  *             if (s<0):             # <<<<<<<<<<<<<<
  *                 continue
  *             idx = 0
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1397
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1397
  *             s = findexes[i]
  *             if (s<0):
  *                 continue             # <<<<<<<<<<<<<<
@@ -47772,7 +51094,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     }
     __pyx_L5:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1398
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1398
  *             if (s<0):
  *                 continue
  *             idx = 0             # <<<<<<<<<<<<<<
@@ -47783,7 +51105,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __Pyx_XDECREF(__pyx_v_idx);
     __pyx_v_idx = __pyx_int_0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1399
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1399
  *                 continue
  *             idx = 0
  *             while (idx < num_links*2):             # <<<<<<<<<<<<<<
@@ -47793,14 +51115,13 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     while (1) {
       __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (!__pyx_t_4) break;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1400
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1400
  *             idx = 0
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):             # <<<<<<<<<<<<<<
@@ -47810,14 +51131,13 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1401
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1401
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])             # <<<<<<<<<<<<<<
@@ -47833,7 +51153,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
         __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_7));
+        __Pyx_GOTREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         __pyx_t_5 = 0;
@@ -47845,7 +51165,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
         __pyx_v_j = __pyx_t_5;
         __pyx_t_5 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1402
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1402
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)             # <<<<<<<<<<<<<<
@@ -47865,7 +51185,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       }
       __pyx_L8:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1403
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1403
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  *                 idx += 2             # <<<<<<<<<<<<<<
@@ -47881,7 +51201,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __pyx_L3_continue:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1404
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1404
  *                     ret.append(i*65536+j)
  *                 idx += 2
  *         return ret             # <<<<<<<<<<<<<<
@@ -47911,7 +51231,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1406
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1406
  *         return ret
  * 
  *     cdef extract(self, Phrase phrase, Matching* matching, int* chunklen, int num_chunks):             # <<<<<<<<<<<<<<
@@ -47951,7 +51271,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_v_f_sent_end;
   int __pyx_v_e_sent_len;
   int __pyx_v_f_sent_len;
-  int __pyx_v_e_word_count;
+  CYTHON_UNUSED int __pyx_v_e_word_count;
   int __pyx_v_f_x_low;
   int __pyx_v_f_x_high;
   int __pyx_v_e_x_low;
@@ -47962,7 +51282,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   PyObject *__pyx_v_phrase_list = 0;
   struct __pyx_obj_3_sa_IntList *__pyx_v_fphr_arr = 0;
   struct __pyx_obj_3_sa_Phrase *__pyx_v_fphr = 0;
-  PyObject *__pyx_v_reason_for_failure = 0;
+  CYTHON_UNUSED PyObject *__pyx_v_reason_for_failure = 0;
   PyObject *__pyx_v_sofar = NULL;
   PyObject *__pyx_v_als = NULL;
   PyObject *__pyx_v_al = NULL;
@@ -48003,9 +51323,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("extract");
+  __Pyx_RefNannySetupContext("extract", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1419
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1419
  *         cdef reason_for_failure
  * 
  *         fphr_arr = IntList()             # <<<<<<<<<<<<<<
@@ -48017,7 +51337,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_v_fphr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1420
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1420
  * 
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n             # <<<<<<<<<<<<<<
@@ -48026,7 +51346,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_phrase_len = __pyx_v_phrase->n;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1421
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1421
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n
  *         extracts = []             # <<<<<<<<<<<<<<
@@ -48034,11 +51354,11 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_extracts = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1422
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1422
  *         phrase_len = phrase.n
  *         extracts = []
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -48047,7 +51367,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_sent_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->alignment->__pyx_vtab)->_get_sent_links(__pyx_v_self->alignment, __pyx_v_matching->sent_id, (&__pyx_v_num_links));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1424
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1424
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -48056,7 +51376,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_start = (__pyx_v_self->eda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1425
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1425
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -48065,7 +51385,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_end = (__pyx_v_self->eda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1426
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1426
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1             # <<<<<<<<<<<<<<
@@ -48074,7 +51394,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_len = ((__pyx_v_e_sent_end - __pyx_v_e_sent_start) - 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1427
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1427
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -48083,7 +51403,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_start = (__pyx_v_self->fda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1428
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1428
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -48092,7 +51412,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_end = (__pyx_v_self->fda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1429
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1429
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]
  *         f_sent_len = f_sent_end - f_sent_start - 1             # <<<<<<<<<<<<<<
@@ -48101,7 +51421,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_len = ((__pyx_v_f_sent_end - __pyx_v_f_sent_start) - 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1431
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1431
  *         f_sent_len = f_sent_end - f_sent_start - 1
  * 
  *         self.findexes1.reset()             # <<<<<<<<<<<<<<
@@ -48115,7 +51435,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1432
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1432
  * 
  *         self.findexes1.reset()
  *         sofar = 0             # <<<<<<<<<<<<<<
@@ -48125,7 +51445,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_sofar = __pyx_int_0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1433
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1433
  *         self.findexes1.reset()
  *         sofar = 0
  *         for i in range(num_chunks):             # <<<<<<<<<<<<<<
@@ -48136,7 +51456,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1434
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1434
  *         sofar = 0
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):             # <<<<<<<<<<<<<<
@@ -48147,7 +51467,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_v_j = __pyx_t_6;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1435
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1435
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);             # <<<<<<<<<<<<<<
@@ -48161,7 +51481,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1436
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1436
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1             # <<<<<<<<<<<<<<
@@ -48175,7 +51495,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_1 = 0;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1437
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1437
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1
  *             if (i+1<num_chunks):             # <<<<<<<<<<<<<<
@@ -48185,7 +51505,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = ((__pyx_v_i + 1) < __pyx_v_num_chunks);
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1438
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1438
  *                 sofar += 1
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])             # <<<<<<<<<<<<<<
@@ -48199,7 +51519,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1439
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1439
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  *                 sofar += 1             # <<<<<<<<<<<<<<
@@ -48216,7 +51536,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_L7:;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1442
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1442
  * 
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48225,7 +51545,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_low = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1443
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1443
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48234,7 +51554,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_high = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1444
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1444
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48243,7 +51563,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_low = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1445
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1445
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48252,7 +51572,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_high = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1446
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1446
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48261,7 +51581,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1447
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1447
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48270,7 +51590,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1448
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1448
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48279,7 +51599,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1449
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1449
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48288,7 +51608,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1450
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1450
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48297,7 +51617,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1451
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1451
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48306,7 +51626,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1452
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1452
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48315,7 +51635,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1453
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1453
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -48324,7 +51644,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1455
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1455
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))
  * 
  *         reason_for_failure = ""             # <<<<<<<<<<<<<<
@@ -48334,7 +51654,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_45);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1457
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1457
  *         reason_for_failure = ""
  * 
  *         for i from 0 <= i < e_sent_len:             # <<<<<<<<<<<<<<
@@ -48344,7 +51664,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_e_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1458
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1458
  * 
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -48353,7 +51673,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_e_links_low[__pyx_v_i]) = -1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1459
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1459
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -48363,7 +51683,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_e_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1460
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1460
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:             # <<<<<<<<<<<<<<
@@ -48373,7 +51693,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_f_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1461
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1461
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -48382,7 +51702,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_f_links_low[__pyx_v_i]) = -1;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1462
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1462
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1
  *             f_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -48392,7 +51712,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_f_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1468
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1468
  *         # links that we care about (but then how to look up
  *         # when we want to check something on the e side?)
  *         i = 0             # <<<<<<<<<<<<<<
@@ -48401,7 +51721,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1469
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1469
  *         # when we want to check something on the e side?)
  *         i = 0
  *         while i < num_links*2:             # <<<<<<<<<<<<<<
@@ -48412,7 +51732,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = (__pyx_v_i < (__pyx_v_num_links * 2));
     if (!__pyx_t_7) break;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1470
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1470
  *         i = 0
  *         while i < num_links*2:
  *             f_i = sent_links[i]             # <<<<<<<<<<<<<<
@@ -48421,7 +51741,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_f_i = (__pyx_v_sent_links[__pyx_v_i]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1471
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1471
  *         while i < num_links*2:
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]             # <<<<<<<<<<<<<<
@@ -48430,7 +51750,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_e_i = (__pyx_v_sent_links[(__pyx_v_i + 1)]);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1472
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1472
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:             # <<<<<<<<<<<<<<
@@ -48446,7 +51766,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1473
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1473
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i             # <<<<<<<<<<<<<<
@@ -48458,7 +51778,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1474
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1474
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:             # <<<<<<<<<<<<<<
@@ -48474,7 +51794,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_8) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1475
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1475
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1             # <<<<<<<<<<<<<<
@@ -48486,7 +51806,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1476
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1476
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:             # <<<<<<<<<<<<<<
@@ -48502,7 +51822,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1477
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1477
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i             # <<<<<<<<<<<<<<
@@ -48514,7 +51834,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1478
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1478
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:             # <<<<<<<<<<<<<<
@@ -48530,7 +51850,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1479
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1479
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1             # <<<<<<<<<<<<<<
@@ -48542,7 +51862,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1480
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1480
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1
  *             i = i + 2             # <<<<<<<<<<<<<<
@@ -48552,7 +51872,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + 2);
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1482
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1482
  *             i = i + 2
  * 
  *         als = []             # <<<<<<<<<<<<<<
@@ -48560,11 +51880,11 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  */
   __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_als = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1483
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1483
  * 
  *         als = []
  *         for x in range(matching.start,matching.end):             # <<<<<<<<<<<<<<
@@ -48575,7 +51895,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = __pyx_v_matching->start; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_x = __pyx_t_4;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1484
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1484
  *         als = []
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])             # <<<<<<<<<<<<<<
@@ -48587,7 +51907,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
+    __Pyx_GOTREF(__pyx_t_10);
     PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
@@ -48598,20 +51918,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_al = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1485
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1485
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  *             als.append(al)             # <<<<<<<<<<<<<<
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  */
-    if (unlikely(((PyObject *)__pyx_v_als) == Py_None)) {
-      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1485; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-    }
     __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1487
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1487
  *             als.append(al)
  *         # check all source-side alignment constraints
  *         met_constraints = 1             # <<<<<<<<<<<<<<
@@ -48620,7 +51937,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_met_constraints = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1488
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1488
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  *         if self.require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -48629,7 +51946,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_self->require_aligned_terminal) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1489
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1489
  *         met_constraints = 1
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -48638,7 +51955,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_num_aligned_chunks = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1490
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1490
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:             # <<<<<<<<<<<<<<
@@ -48648,7 +51965,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_3 = __pyx_v_num_chunks;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1491
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1491
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:             # <<<<<<<<<<<<<<
@@ -48658,7 +51975,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_chunklen[__pyx_v_i]);
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1492
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1492
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:             # <<<<<<<<<<<<<<
@@ -48668,7 +51985,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_9 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)]) > -1);
         if (__pyx_t_9) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1493
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1493
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1             # <<<<<<<<<<<<<<
@@ -48677,7 +51994,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_num_aligned_chunks = (__pyx_v_num_aligned_chunks + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1494
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1494
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break             # <<<<<<<<<<<<<<
@@ -48692,7 +52009,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_L24_break:;
     }
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1495
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1495
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break
  *             if num_aligned_chunks == 0:             # <<<<<<<<<<<<<<
@@ -48702,7 +52019,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_9 = (__pyx_v_num_aligned_chunks == 0);
     if (__pyx_t_9) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1496
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1496
  *                         break
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"             # <<<<<<<<<<<<<<
@@ -48713,7 +52030,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_127);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1497
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1497
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48725,7 +52042,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L26:;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1498
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1498
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:             # <<<<<<<<<<<<<<
@@ -48740,7 +52057,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1499
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1499
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"             # <<<<<<<<<<<<<<
@@ -48751,7 +52068,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1500
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1500
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48766,7 +52083,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L20:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1502
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1502
  *                 met_constraints = 0
  * 
  *         if met_constraints and self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -48780,7 +52097,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   if (__pyx_t_7) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1504
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1504
  *         if met_constraints and self.tight_phrases:
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:             # <<<<<<<<<<<<<<
@@ -48790,7 +52107,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_12 = (__pyx_v_num_chunks - 1);
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1505
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1505
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -48800,7 +52117,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1506
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1506
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -48811,7 +52128,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_129);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1507
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1507
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48820,7 +52137,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1508
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1508
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -48832,7 +52149,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L31:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1509
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1509
  *                     met_constraints = 0
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -48842,7 +52159,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - 1) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1510
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1510
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -48853,7 +52170,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_129);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1511
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1511
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -48862,7 +52179,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1512
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1512
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -48879,7 +52196,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L28:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1514
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1514
  *                     break
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start             # <<<<<<<<<<<<<<
@@ -48888,7 +52205,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_low = ((__pyx_v_matching->arr[__pyx_v_matching->start]) - __pyx_v_f_sent_start);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1515
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1515
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -48897,7 +52214,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_high = (((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_matching->size) - 1)]) + (__pyx_v_chunklen[(__pyx_v_num_chunks - 1)])) - __pyx_v_f_sent_start);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1516
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1516
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start
  *         if met_constraints:             # <<<<<<<<<<<<<<
@@ -48906,7 +52223,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_met_constraints) {
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1518
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1518
  *         if met_constraints:
  * 
  *             if self.find_fixpoint(f_low, f_high, f_links_low, f_links_high, e_links_low, e_links_high,             # <<<<<<<<<<<<<<
@@ -48916,7 +52233,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1522
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1522
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):             # <<<<<<<<<<<<<<
@@ -48927,7 +52244,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
     if (__pyx_t_3) {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1523
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1523
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0             # <<<<<<<<<<<<<<
@@ -48936,7 +52253,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_gap_error = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1524
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1524
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0
  *                 num_gaps = 0             # <<<<<<<<<<<<<<
@@ -48945,7 +52262,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_num_gaps = 0;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1526
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1526
  *                 num_gaps = 0
  * 
  *                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -48955,7 +52272,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1527
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1527
  * 
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low             # <<<<<<<<<<<<<<
@@ -48964,7 +52281,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[0]) = __pyx_v_f_back_low;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1528
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1528
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low             # <<<<<<<<<<<<<<
@@ -48973,7 +52290,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[0]) = __pyx_v_f_low;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1529
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1529
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1             # <<<<<<<<<<<<<<
@@ -48982,7 +52299,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1530
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1530
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1
  *                     gap_start = 0             # <<<<<<<<<<<<<<
@@ -48991,7 +52308,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1531
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1531
  *                     num_gaps = 1
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -49000,7 +52317,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1532
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1532
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -49010,7 +52327,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1533
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1533
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -49022,7 +52339,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L36:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1534
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1534
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -49031,7 +52348,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1535
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1535
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -49047,7 +52364,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_8) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1536
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1536
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -49056,7 +52373,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1537
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1537
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -49076,7 +52393,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1539
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1539
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"
  *                 else:
  *                     gap_start = 1             # <<<<<<<<<<<<<<
@@ -49085,7 +52402,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1540
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1540
  *                 else:
  *                     gap_start = 1
  *                     if self.tight_phrases and f_links_low[f_low] == -1:             # <<<<<<<<<<<<<<
@@ -49100,7 +52417,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1543
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1543
  *                         # this is not a hard error.    we can't extract this phrase
  *                         # but we still might be able to extract a superphrase
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -49114,7 +52431,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L35:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1545
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1545
  *                         met_constraints = 0
  * 
  *                 for i from 0 <= i < matching.size - 1:             # <<<<<<<<<<<<<<
@@ -49124,7 +52441,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_12 = (__pyx_v_matching->size - 1);
       for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1546
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1546
  * 
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start             # <<<<<<<<<<<<<<
@@ -49133,7 +52450,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(1 + __pyx_v_i)]) = (((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1547
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1547
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -49142,7 +52459,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(1 + __pyx_v_i)]) = ((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - __pyx_v_f_sent_start);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1548
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1548
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -49152,7 +52469,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
       }
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1550
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1550
  *                     num_gaps = num_gaps + 1
  * 
  *                 if f_high < f_back_high:             # <<<<<<<<<<<<<<
@@ -49162,7 +52479,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_high < __pyx_v_f_back_high);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1551
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1551
  * 
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high             # <<<<<<<<<<<<<<
@@ -49171,7 +52488,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_high;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1552
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1552
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high             # <<<<<<<<<<<<<<
@@ -49180,7 +52497,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_back_high;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1553
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1553
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -49189,7 +52506,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1554
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1554
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -49198,7 +52515,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1555
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1555
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -49208,7 +52525,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1556
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1556
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -49220,7 +52537,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L43:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1557
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1557
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -49229,7 +52546,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1558
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1558
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:             # <<<<<<<<<<<<<<
@@ -49245,7 +52562,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1559
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1559
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -49254,7 +52571,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1560
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1560
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -49274,7 +52591,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1562
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1562
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -49289,7 +52606,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1563
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1563
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -49303,7 +52620,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L42:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1565
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1565
  *                         met_constraints = 0
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -49313,7 +52630,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1566
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1566
  * 
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low             # <<<<<<<<<<<<<<
@@ -49322,7 +52639,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_e_word_count = (__pyx_v_e_high - __pyx_v_e_low);
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1567
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1567
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases             # <<<<<<<<<<<<<<
@@ -49332,7 +52649,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_num_gaps;
         for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1568
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1568
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases
  *                         if self.find_fixpoint(f_gap_low[gap_start+i], f_gap_high[gap_start+i],             # <<<<<<<<<<<<<<
@@ -49342,7 +52659,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1573
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1573
  *                                             f_gap_low+gap_start+i, f_gap_high+gap_start+i,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -49353,7 +52670,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1575
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1575
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -49362,7 +52679,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1576
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1576
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])             # <<<<<<<<<<<<<<
@@ -49374,7 +52691,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+            __Pyx_GOTREF(__pyx_t_2);
             PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
@@ -49388,7 +52705,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_reason_for_failure = ((PyObject *)__pyx_t_1);
             __pyx_t_1 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1577
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1577
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])
  *                             break             # <<<<<<<<<<<<<<
@@ -49405,7 +52722,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L47:;
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1579
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1579
  *                             break
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -49415,7 +52732,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1580
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1580
  * 
  *                 if gap_error == 0:
  *                     i = 1             # <<<<<<<<<<<<<<
@@ -49424,7 +52741,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_i = 1;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1581
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1581
  *                 if gap_error == 0:
  *                     i = 1
  *                     self.findexes.reset()             # <<<<<<<<<<<<<<
@@ -49438,7 +52755,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1582
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1582
  *                     i = 1
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -49448,7 +52765,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1583
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1583
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49457,7 +52774,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1584
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1584
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1             # <<<<<<<<<<<<<<
@@ -49466,7 +52783,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_i = (__pyx_v_i + 1);
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1585
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1585
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49483,7 +52800,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L52:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1586
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1586
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
@@ -49493,7 +52810,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+        __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->findexes1));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -49503,7 +52820,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1587
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1587
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -49513,7 +52830,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_phrase->n;
         for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1588
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1588
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -49523,7 +52840,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
           if (__pyx_t_4) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1589
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1589
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49532,7 +52849,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1590
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1590
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))
  *                             i = i + 1             # <<<<<<<<<<<<<<
@@ -49544,7 +52861,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1592
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1592
  *                             i = i + 1
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -49556,7 +52873,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_L55:;
         }
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1593
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1593
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -49566,7 +52883,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_high > __pyx_v_f_high);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1594
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1594
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49575,7 +52892,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1595
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1595
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -49592,7 +52909,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L56:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1597
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1597
  *                         self.findexes.append(sym_setindex(self.category, i))
  * 
  *                     fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
@@ -49600,7 +52917,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  */
         __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+        __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_fphr_arr));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -49610,7 +52927,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_10);
         __pyx_t_10 = 0;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1598
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1598
  * 
  *                     fphr = Phrase(fphr_arr)
  *                     if met_constraints:             # <<<<<<<<<<<<<<
@@ -49619,7 +52936,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_met_constraints) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1601
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1601
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
@@ -49631,7 +52948,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_v_phrase_list = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1602
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1602
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
@@ -49642,7 +52959,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_7 = (__pyx_t_13 > 0);
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1603
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1603
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
@@ -49659,7 +52976,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           /*else*/ {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1605
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1605
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  *                             pair_count = 0             # <<<<<<<<<<<<<<
@@ -49668,7 +52985,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_pair_count = 0.0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1606
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1606
  *                         else:
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)             # <<<<<<<<<<<<<<
@@ -49684,7 +53001,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
             __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __Pyx_GOTREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
@@ -49706,7 +53023,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L58:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1607
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1607
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:             # <<<<<<<<<<<<<<
@@ -49722,12 +53039,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
           }
           for (;;) {
-            if (PyList_CheckExact(__pyx_t_14)) {
+            if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
-            } else if (PyTuple_CheckExact(__pyx_t_14)) {
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
+            } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #else
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
             } else {
               __pyx_t_15 = __pyx_t_16(__pyx_t_14);
               if (unlikely(!__pyx_t_15)) {
@@ -49741,27 +53066,33 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
               PyObject* sequence = __pyx_t_15;
+              #if CYTHON_COMPILING_IN_CPYTHON
+              Py_ssize_t size = Py_SIZE(sequence);
+              #else
+              Py_ssize_t size = PySequence_Size(sequence);
+              #endif
+              if (unlikely(size != 2)) {
+                if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              }
+              #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
-                if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                  if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
                 __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
               } else {
-                if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                  if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                  else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
                 __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
               }
               __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_2);
+              #else
+              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-            } else {
+            } else
+            {
               Py_ssize_t index = -1;
               __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
@@ -49772,12 +53103,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L61_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_2);
               if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               goto __pyx_L62_unpacking_done;
               __pyx_L61_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+              __pyx_t_17 = NULL;
+              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
               {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L62_unpacking_done:;
             }
@@ -49788,7 +53120,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_eindexes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1608
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1608
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -49804,7 +53136,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_als1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
             __pyx_t_2 = 0;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1609
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1609
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))             # <<<<<<<<<<<<<<
@@ -49814,7 +53146,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_als1));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als1));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_als1));
@@ -49822,7 +53154,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+            __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -49845,7 +53177,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L57:;
 
-        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1611
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1611
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))
  * 
  *                     if (num_gaps < self.max_nonterminals and             # <<<<<<<<<<<<<<
@@ -49855,7 +53187,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_num_gaps < __pyx_v_self->max_nonterminals);
         if (__pyx_t_7) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1612
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1612
  * 
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and             # <<<<<<<<<<<<<<
@@ -49865,7 +53197,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_phrase_len < __pyx_v_self->max_length);
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1613
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1613
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):             # <<<<<<<<<<<<<<
@@ -49883,7 +53215,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_9) {
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1614
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1614
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -49893,7 +53225,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_low == __pyx_v_f_low);
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1615
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1615
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -49903,7 +53235,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1616
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1616
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):             # <<<<<<<<<<<<<<
@@ -49933,7 +53265,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1617
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1617
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -49942,7 +53274,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1618
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1618
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -49951,7 +53283,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1619
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1619
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -49960,7 +53292,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1620
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1620
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -49977,7 +53309,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1621
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1621
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -49990,7 +53322,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L65:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1622
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1622
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -50006,7 +53338,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1623
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1623
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -50018,7 +53350,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L68:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1625
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1625
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -50027,7 +53359,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1626
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1626
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_back_high,             # <<<<<<<<<<<<<<
@@ -50037,7 +53369,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1630
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1630
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -50047,7 +53379,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_14, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 1, 0, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1632
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1632
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and             # <<<<<<<<<<<<<<
@@ -50063,7 +53395,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1633
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1633
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and
  *                                 self.find_fixpoint(f_x_low, f_low,    # check integrity of new subphrase             # <<<<<<<<<<<<<<
@@ -50073,7 +53405,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_1);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1637
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1637
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -50096,7 +53428,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1639
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1639
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -50105,7 +53437,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1640
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1640
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -50114,7 +53446,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1641
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1641
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
@@ -50128,7 +53460,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1642
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1642
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50142,7 +53474,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1643
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1643
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50151,7 +53483,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1644
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1644
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -50160,7 +53492,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1645
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1645
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
@@ -50170,7 +53502,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+              __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -50180,7 +53512,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1646
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1646
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -50190,7 +53522,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1647
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1647
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -50200,7 +53532,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1648
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1648
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50209,7 +53541,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1649
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1649
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -50221,7 +53553,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1651
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1651
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -50233,7 +53565,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L72:;
               }
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1652
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1652
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -50243,7 +53575,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_high > __pyx_v_f_high);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1653
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1653
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50252,7 +53584,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1654
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1654
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50269,7 +53601,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L73:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1655
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1655
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
@@ -50277,7 +53609,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  */
               __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+              __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -50288,7 +53620,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_15);
               __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1658
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1658
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
@@ -50301,7 +53633,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_phrase_list = __pyx_t_15;
               __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1659
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1659
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
@@ -50312,7 +53644,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1660
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1660
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
@@ -50329,7 +53661,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               /*else*/ {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1662
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1662
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -50340,7 +53672,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L74:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1663
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1663
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -50356,12 +53688,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_16 = Py_TYPE(__pyx_t_15)->tp_iternext;
               }
               for (;;) {
-                if (PyList_CheckExact(__pyx_t_15)) {
+                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_15)) break;
-                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
-                } else if (PyTuple_CheckExact(__pyx_t_15)) {
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
-                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                 } else {
                   __pyx_t_1 = __pyx_t_16(__pyx_t_15);
                   if (unlikely(!__pyx_t_1)) {
@@ -50375,27 +53715,33 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
                   PyObject* sequence = __pyx_t_1;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_14 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_14 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_14);
                   __Pyx_INCREF(__pyx_t_2);
+                  #else
+                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-                } else {
+                } else
+                {
                   Py_ssize_t index = -1;
                   __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
@@ -50406,12 +53752,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L77_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L78_unpacking_done;
                   __pyx_L77_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L78_unpacking_done:;
                 }
@@ -50422,7 +53769,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1664
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1664
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -50438,7 +53785,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_als2 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1665
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1665
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))             # <<<<<<<<<<<<<<
@@ -50448,7 +53795,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+                __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als2));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_als2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als2));
@@ -50456,7 +53803,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
                 __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+                __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -50482,7 +53829,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L64:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1667
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1667
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))
  * 
  *                         if (f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -50492,7 +53839,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_high == __pyx_v_f_high);
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1668
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1668
  * 
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -50502,7 +53849,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_f_sent_len - __pyx_v_f_high) >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1669
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1669
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):             # <<<<<<<<<<<<<<
@@ -50532,7 +53879,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1670
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1670
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -50541,7 +53888,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1671
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1671
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -50550,7 +53897,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1672
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1672
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -50559,7 +53906,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1673
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1673
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -50576,7 +53923,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1674
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1674
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -50589,7 +53936,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L80:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1675
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1675
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -50605,7 +53952,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1676
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1676
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -50617,7 +53964,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L83:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1678
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1678
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -50626,7 +53973,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1679
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1679
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_back_low, f_x_high,             # <<<<<<<<<<<<<<
@@ -50636,7 +53983,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1679; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1683
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1683
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -50646,7 +53993,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_back_low, __pyx_t_15, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 0, 1, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1685
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1685
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and             # <<<<<<<<<<<<<<
@@ -50662,7 +54009,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1686
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1686
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
@@ -50672,7 +54019,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_14);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1691
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1691
  *                                             f_gap_low+gap_start+num_gaps, f_gap_high+gap_start+num_gaps,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -50695,7 +54042,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1693
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1693
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -50704,7 +54051,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1694
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1694
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -50713,7 +54060,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1695
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1695
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
@@ -50727,7 +54074,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1696
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1696
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -50737,7 +54084,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_low < __pyx_v_f_low);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1697
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1697
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50746,7 +54093,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1698
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1698
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1             # <<<<<<<<<<<<<<
@@ -50755,7 +54102,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_v_i = (__pyx_v_i + 1);
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1699
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1699
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50772,7 +54119,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L85:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1700
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1700
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
@@ -50782,7 +54129,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+              __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -50792,7 +54139,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1701
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1701
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -50802,7 +54149,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1702
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1702
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -50812,7 +54159,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1703
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1703
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50821,7 +54168,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1704
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1704
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -50833,7 +54180,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1706
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1706
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -50845,7 +54192,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L88:;
               }
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1707
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1707
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50854,7 +54201,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1708
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1708
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -50868,7 +54215,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1709
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1709
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
@@ -50876,7 +54223,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  */
               __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+              __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -50887,7 +54234,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
               __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1712
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1712
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
@@ -50900,7 +54247,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_phrase_list = __pyx_t_1;
               __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1713
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1713
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
@@ -50911,7 +54258,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1714
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1714
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
@@ -50928,7 +54275,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               /*else*/ {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1716
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1716
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -50939,7 +54286,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L89:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1717
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1717
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -50955,12 +54302,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_16 = Py_TYPE(__pyx_t_1)->tp_iternext;
               }
               for (;;) {
-                if (PyList_CheckExact(__pyx_t_1)) {
+                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_1)) break;
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
-                } else if (PyTuple_CheckExact(__pyx_t_1)) {
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                 } else {
                   __pyx_t_14 = __pyx_t_16(__pyx_t_1);
                   if (unlikely(!__pyx_t_14)) {
@@ -50974,27 +54329,33 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_14))) || (PyList_CheckExact(__pyx_t_14))) {
                   PyObject* sequence = __pyx_t_14;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_15);
                   __Pyx_INCREF(__pyx_t_2);
+                  #else
+                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                } else {
+                } else
+                {
                   Py_ssize_t index = -1;
                   __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
@@ -51005,12 +54366,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L92_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L93_unpacking_done;
                   __pyx_L92_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L93_unpacking_done:;
                 }
@@ -51021,7 +54383,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1718
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1718
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -51037,7 +54399,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_als3 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1719
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1719
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))             # <<<<<<<<<<<<<<
@@ -51047,7 +54409,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als3));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_als3));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als3));
@@ -51055,7 +54417,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_14));
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -51081,7 +54443,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L79:;
 
-          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1720
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1720
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and             # <<<<<<<<<<<<<<
@@ -51091,7 +54453,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_num_gaps < (__pyx_v_self->max_nonterminals - 1));
           if (__pyx_t_9) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1721
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1721
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and             # <<<<<<<<<<<<<<
@@ -51101,7 +54463,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_phrase_len + 1) < __pyx_v_self->max_length);
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1722
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1722
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -51111,7 +54473,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_18 = (__pyx_v_f_back_high == __pyx_v_f_high);
               if (__pyx_t_18) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1723
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1723
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -51121,7 +54483,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_8 = (__pyx_v_f_back_low == __pyx_v_f_low);
                 if (__pyx_t_8) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1724
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1724
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
@@ -51131,7 +54493,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_19 = (((__pyx_v_f_back_high - __pyx_v_f_back_low) + (2 * __pyx_v_self->train_min_gap_size)) <= __pyx_v_self->train_max_initial_size);
                   if (__pyx_t_19) {
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1725
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1725
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -51141,7 +54503,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                     __pyx_t_20 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
                     if (__pyx_t_20) {
 
-                      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1726
+                      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1726
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -51151,7 +54513,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                       __pyx_t_21 = (__pyx_v_f_high <= (__pyx_v_f_sent_len - __pyx_v_self->train_min_gap_size));
                       if (__pyx_t_21) {
 
-                        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1727
+                        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1727
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):             # <<<<<<<<<<<<<<
@@ -51201,7 +54563,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1729
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1729
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):
  * 
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -51210,7 +54572,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1730
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1730
  * 
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -51219,7 +54581,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1731
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1731
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -51228,7 +54590,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1732
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1732
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -51245,7 +54607,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1733
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1733
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -51258,7 +54620,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L95:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1734
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1734
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:             # <<<<<<<<<<<<<<
@@ -51268,7 +54630,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_18 = (__pyx_v_f_x_low < 0);
             if (__pyx_t_18) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1735
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1735
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -51280,7 +54642,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L98:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1737
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1737
  *                                 met_constraints = 0
  * 
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -51289,7 +54651,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1738
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1738
  * 
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -51298,7 +54660,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1739
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1739
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -51315,7 +54677,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_9) break;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1740
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1740
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -51328,7 +54690,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L99:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1741
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1741
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -51344,7 +54706,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1742
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1742
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -51356,7 +54718,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L102:;
 
-            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1744
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1744
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -51365,7 +54727,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1745
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1745
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_x_high,             # <<<<<<<<<<<<<<
@@ -51375,7 +54737,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1749
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1749
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -51385,7 +54747,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 2, 1, 1, 1, 1)) {
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1751
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1751
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and             # <<<<<<<<<<<<<<
@@ -51407,7 +54769,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_9) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1752
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1752
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and
  *                                 self.find_fixpoint(f_x_low, f_low,             # <<<<<<<<<<<<<<
@@ -51417,7 +54779,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_15);
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1756
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1756
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -51428,7 +54790,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   if (__pyx_t_3) {
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1758
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1758
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
@@ -51438,7 +54800,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                     __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1758; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     __Pyx_GOTREF(__pyx_t_15);
 
-                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1763
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1763
  *                                                 f_gap_low+1+num_gaps, f_gap_high+1+num_gaps,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -51466,7 +54828,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_8) {
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1765
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1765
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -51475,7 +54837,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1766
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1766
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -51484,7 +54846,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1767
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1767
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
@@ -51498,7 +54860,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1768
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1768
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51512,7 +54874,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1769
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1769
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51521,7 +54883,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1770
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1770
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -51530,7 +54892,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1771
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1771
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
@@ -51540,7 +54902,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+              __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
@@ -51550,7 +54912,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1772
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1772
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -51560,7 +54922,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1773
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1773
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -51570,7 +54932,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1774
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1774
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51579,7 +54941,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1775
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1775
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -51591,7 +54953,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1777
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1777
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -51603,7 +54965,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L106:;
               }
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1778
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1778
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51612,7 +54974,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1779
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1779
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -51626,7 +54988,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1780
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1780
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
@@ -51634,7 +54996,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  */
               __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+              __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
@@ -51645,7 +55007,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_14);
               __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1783
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1783
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
@@ -51658,7 +55020,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_v_phrase_list = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1784
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1784
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
@@ -51669,7 +55031,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_8 = (__pyx_t_13 > 0);
               if (__pyx_t_8) {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1785
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1785
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
@@ -51686,7 +55048,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               /*else*/ {
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1787
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1787
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -51697,7 +55059,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L107:;
 
-              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1788
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1788
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -51713,12 +55075,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
               }
               for (;;) {
-                if (PyList_CheckExact(__pyx_t_14)) {
+                if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
-                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
-                } else if (PyTuple_CheckExact(__pyx_t_14)) {
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
+                } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #else
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                 } else {
                   __pyx_t_15 = __pyx_t_16(__pyx_t_14);
                   if (unlikely(!__pyx_t_15)) {
@@ -51732,27 +55102,33 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
                   PyObject* sequence = __pyx_t_15;
+                  #if CYTHON_COMPILING_IN_CPYTHON
+                  Py_ssize_t size = Py_SIZE(sequence);
+                  #else
+                  Py_ssize_t size = PySequence_Size(sequence);
+                  #endif
+                  if (unlikely(size != 2)) {
+                    if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+                    else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
-                    if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-                      if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
-                    if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-                      if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-                      else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-                      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                    }
                     __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_1);
                   __Pyx_INCREF(__pyx_t_2);
+                  #else
+                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  #endif
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                } else {
+                } else
+                {
                   Py_ssize_t index = -1;
                   __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
@@ -51763,12 +55139,13 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L110_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
                   if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L111_unpacking_done;
                   __pyx_L110_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                  __pyx_t_17 = NULL;
+                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
                   {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L111_unpacking_done:;
                 }
@@ -51779,7 +55156,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1789
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1789
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -51795,7 +55172,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_als4 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1790
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1790
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))             # <<<<<<<<<<<<<<
@@ -51805,7 +55182,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+                __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als4));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als4));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als4));
@@ -51813,7 +55190,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_15));
+                __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr));
@@ -51848,7 +55225,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     /*else*/ {
 
-      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1792
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1792
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"             # <<<<<<<<<<<<<<
@@ -51864,7 +55241,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L33:;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1794
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1794
  *                 reason_for_failure = "Unable to extract basic phrase"
  * 
  *         free(sent_links)             # <<<<<<<<<<<<<<
@@ -51873,7 +55250,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_sent_links);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1795
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1795
  * 
  *         free(sent_links)
  *         free(f_links_low)             # <<<<<<<<<<<<<<
@@ -51882,7 +55259,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1796
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1796
  *         free(sent_links)
  *         free(f_links_low)
  *         free(f_links_high)             # <<<<<<<<<<<<<<
@@ -51891,7 +55268,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1797
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1797
  *         free(f_links_low)
  *         free(f_links_high)
  *         free(e_links_low)             # <<<<<<<<<<<<<<
@@ -51900,7 +55277,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1798
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1798
  *         free(f_links_high)
  *         free(e_links_low)
  *         free(e_links_high)             # <<<<<<<<<<<<<<
@@ -51909,7 +55286,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1799
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1799
  *         free(e_links_low)
  *         free(e_links_high)
  *         free(f_gap_low)             # <<<<<<<<<<<<<<
@@ -51918,7 +55295,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1800
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1800
  *         free(e_links_high)
  *         free(f_gap_low)
  *         free(f_gap_high)             # <<<<<<<<<<<<<<
@@ -51927,7 +55304,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1801
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1801
  *         free(f_gap_low)
  *         free(f_gap_high)
  *         free(e_gap_low)             # <<<<<<<<<<<<<<
@@ -51936,7 +55313,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_low);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1802
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1802
  *         free(f_gap_high)
  *         free(e_gap_low)
  *         free(e_gap_high)             # <<<<<<<<<<<<<<
@@ -51945,7 +55322,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_high);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1804
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1804
  *         free(e_gap_high)
  * 
  *         return extracts             # <<<<<<<<<<<<<<
@@ -51985,7 +55362,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":7
+/* Python wrapper */
+static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
+  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
+    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector___cinit__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":7
  * 
  * cdef class FeatureVector:
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -51993,8 +55384,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
  */
 
-static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -52003,12 +55393,9 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__cinit__");
-  if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) {
-    __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;}
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1;
+  __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":8
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":8
  * cdef class FeatureVector:
  *     def __cinit__(self):
  *         self.names = IntList(INITIAL_CAPACITY, INCREMENT)             # <<<<<<<<<<<<<<
@@ -52020,7 +55407,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__INCREMENT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
@@ -52031,12 +55418,12 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names));
-  ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
+  __Pyx_GOTREF(__pyx_v_self->names);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->names));
+  __pyx_v_self->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":9
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":9
  *     def __cinit__(self):
  *         self.names = IntList(INITIAL_CAPACITY, INCREMENT)
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)             # <<<<<<<<<<<<<<
@@ -52048,7 +55435,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__INCREMENT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3);
@@ -52059,9 +55446,9 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values);
-  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values));
-  ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_3);
+  __Pyx_GOTREF(__pyx_v_self->values);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->values));
+  __pyx_v_self->values = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
   __pyx_r = 0;
@@ -52077,52 +55464,39 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":11
- *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
- * 
- *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
- *         self.names.append(name)
- *         self.values.append(value)
- */
-
-static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   unsigned int __pyx_v_name;
   float __pyx_v_value;
-  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
-  __Pyx_RefNannySetupContext("set");
+  __Pyx_RefNannySetupContext("set (wrapper)", 0);
   {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
         case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
         case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
         case  0: break;
         default: goto __pyx_L5_argtuple_error;
       }
       kw_args = PyDict_Size(__pyx_kwds);
-      switch (PyTuple_GET_SIZE(__pyx_args)) {
+      switch (pos_args) {
         case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__name);
-        if (likely(values[0])) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__name)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value);
-        if (likely(values[1])) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("set", 1, 2, 2, 1); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "set") < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set") < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -52131,7 +55505,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
     __pyx_v_name = __Pyx_PyInt_AsUnsignedInt(values[0]); if (unlikely((__pyx_v_name == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_value = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_value == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_value = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_value == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -52141,8 +55515,30 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector_2set(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self), __pyx_v_name, __pyx_v_value);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":11
+ *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
+ * 
+ *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
+ *         self.names.append(name)
+ *         self.values.append(value)
+ */
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":12
+static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("set", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":12
  * 
  *     def set(self, unsigned name, float value):
  *         self.names.append(name)             # <<<<<<<<<<<<<<
@@ -52151,12 +55547,12 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
  */
   __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_name); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->names), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->names), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":13
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":13
  *     def set(self, unsigned name, float value):
  *         self.names.append(name)
  *         self.values.append(value)             # <<<<<<<<<<<<<<
@@ -52165,7 +55561,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
  */
   __pyx_t_2 = PyFloat_FromDouble(__pyx_v_value); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self)->values), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->values), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -52182,9 +55578,20 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_1set(PyObject *__pyx_v_self, PyOb
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
-static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector_4__iter__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":15
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -52192,36 +55599,45 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
  *         for i in range(self.names.len):
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_2__iter__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_13FeatureVector_2__iter__(PyObject *__pyx_v_self) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope;
+static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__iter__");
-  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_9___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_9___iter__, __pyx_empty_tuple, NULL);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__iter__", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *)__pyx_ptype_3_sa___pyx_scope_struct_16___iter__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_16___iter__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_3generator5;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_6generator5, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.FeatureVector.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   unsigned int __pyx_t_2;
@@ -52230,8 +55646,8 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -52241,34 +55657,34 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":17
  *     def __iter__(self):
  *         cdef unsigned i
  *         for i in range(self.names.len):             # <<<<<<<<<<<<<<
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  */
-  __pyx_t_1 = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->names->len;
+  __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->names->len;
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":18
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":18
  *         cdef unsigned i
  *         for i in range(self.names.len):
  *             yield (FD.word(self.names[i]), self.values[i])             # <<<<<<<<<<<<<<
  * 
  *     def __str__(self):
  */
-    __pyx_t_3 = __Pyx_GetItemInt(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->names), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_self->names), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = PyBytes_FromString(((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_3_sa_FD->__pyx_vtab)->word(__pyx_v_3_sa_FD, __pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)((struct __pyx_obj_3_sa_FeatureVector *)__pyx_cur_scope->__pyx_v_self)->values), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_self->values), __pyx_cur_scope->__pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
@@ -52282,14 +55698,14 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
@@ -52298,13 +55714,25 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_3generator5(struct __pyx_obj_3_sa
   __Pyx_AddTraceback("__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
-static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_13FeatureVector_7__str__(((struct __pyx_obj_3_sa_FeatureVector *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator12(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -52312,45 +55740,53 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
  * cdef class Scorer:
  */
 
-static PyObject *__pyx_pf_3_sa_7__str___2genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_3_sa_7__str___2genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope;
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str___genexpr(PyObject *__pyx_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("genexpr");
-  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_11_genexpr, __pyx_empty_tuple, NULL);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("genexpr", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *)__pyx_ptype_3_sa___pyx_scope_struct_18_genexpr->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_18_genexpr, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)__pyx_self;
+  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *) __pyx_self;
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
-  __pyx_self = __pyx_self;
-  __pyx_cur_scope->__pyx_base.resume_label = 0;
-  __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_3_sa_7__str___3generator8;
-  __Pyx_GIVEREF(__pyx_cur_scope);
-  __Pyx_RefNannyFinishContext();
-  return (PyObject *) __pyx_cur_scope;
+  {
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_13FeatureVector_7__str___2generator12, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_cur_scope);
+    __Pyx_RefNannyFinishContext();
+    return (PyObject *) gen;
+  }
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.FeatureVector.__str__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
   __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */
+static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator12(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
 {
+  struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *__pyx_cur_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *)__pyx_generator->closure);
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   Py_ssize_t __pyx_t_2;
   PyObject *(*__pyx_t_3)(PyObject *);
   PyObject *__pyx_t_4 = NULL;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("None");
-  switch (__pyx_cur_scope->__pyx_base.resume_label) {
+  __Pyx_RefNannySetupContext("None", 0);
+  switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
     case 1: goto __pyx_L6_resume_from_yield;
     default: /* CPython raises the right error here */
@@ -52359,21 +55795,30 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
   }
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) {
-    __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (PyList_CheckExact(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) || PyTuple_CheckExact(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self))) {
+    __pyx_t_1 = ((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -52401,7 +55846,7 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
     __Pyx_XGIVEREF(__pyx_r);
     __Pyx_RefNannyFinishContext();
     /* return from generator, yielding value */
-    __pyx_cur_scope->__pyx_base.resume_label = 1;
+    __pyx_generator->resume_label = 1;
     return __pyx_r;
     __pyx_L6_resume_from_yield:;
     __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
@@ -52412,7 +55857,7 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
     if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -52420,12 +55865,13 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
   __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_cur_scope->__pyx_base.resume_label = -1;
+  __pyx_generator->resume_label = -1;
+  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":20
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":20
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -52433,9 +55879,8 @@ static PyObject *__pyx_gb_3_sa_7__str___3generator8(struct __pyx_obj_3_sa___pyx_
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *__pyx_cur_scope;
+static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -52444,18 +55889,18 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__str__");
-  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_10___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_10___str__, __pyx_empty_tuple, NULL);
+  __Pyx_RefNannySetupContext("__str__", 0);
+  __pyx_cur_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *)__pyx_ptype_3_sa___pyx_scope_struct_17___str__->tp_new(__pyx_ptype_3_sa___pyx_scope_struct_17___str__, __pyx_empty_tuple, NULL);
   if (unlikely(!__pyx_cur_scope)) {
     __Pyx_RefNannyFinishContext();
     return NULL;
   }
   __Pyx_GOTREF(__pyx_cur_scope);
-  __Pyx_INCREF(__pyx_v_self);
   __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
+  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -52465,10 +55910,10 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_pf_3_sa_7__str___2genexpr(((PyObject*)__pyx_cur_scope), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __pyx_pf_3_sa_13FeatureVector_7__str___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
@@ -52495,7 +55940,23 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":25
+/* Python wrapper */
+static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_models = 0;
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
+  __Pyx_INCREF(__pyx_args);
+  __pyx_v_models = __pyx_args;
+  __pyx_r = __pyx_pf_3_sa_6Scorer___init__(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self), __pyx_v_models);
+  __Pyx_XDECREF(__pyx_v_models);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":25
  * cdef class Scorer:
  *     cdef models
  *     def __init__(self, *models):             # <<<<<<<<<<<<<<
@@ -52503,9 +55964,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_4__str__(PyObject *__pyx_v_self)
  *         self.models = zip(names, models)
  */
 
-static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_models = 0;
+static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_self, PyObject *__pyx_v_models) {
   PyObject *__pyx_v_names = NULL;
   PyObject *__pyx_v_model = NULL;
   int __pyx_r;
@@ -52518,12 +55977,9 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("__init__");
-  if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__init__", 0))) return -1;
-  __Pyx_INCREF(__pyx_args);
-  __pyx_v_models = __pyx_args;
+  __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":26
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":26
  *     cdef models
  *     def __init__(self, *models):
  *         names = [FD.index(<char *>model.__name__) for model in models]             # <<<<<<<<<<<<<<
@@ -52531,14 +55987,15 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
  * 
  */
   __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (unlikely(((PyObject *)__pyx_v_models) == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
-  }
+  __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = ((PyObject *)__pyx_v_models); __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
   for (;;) {
     if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-    __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
+    #if CYTHON_COMPILING_IN_CPYTHON
+    __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #else
+    __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    #endif
     __Pyx_XDECREF(__pyx_v_model);
     __pyx_v_model = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -52548,7 +56005,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __pyx_t_4 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_3_sa_FD->__pyx_vtab)->index(__pyx_v_3_sa_FD, ((char *)__pyx_t_5))); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -52556,7 +56013,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   __pyx_v_names = __pyx_t_1;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":27
  *     def __init__(self, *models):
  *         names = [FD.index(<char *>model.__name__) for model in models]
  *         self.models = zip(names, models)             # <<<<<<<<<<<<<<
@@ -52564,7 +56021,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
  *     cdef FeatureVector score(self, ctx):
  */
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_names));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_names));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_names));
@@ -52575,9 +56032,9 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
-  __Pyx_GOTREF(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models);
-  __Pyx_DECREF(((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models);
-  ((struct __pyx_obj_3_sa_Scorer *)__pyx_v_self)->models = __pyx_t_2;
+  __Pyx_GOTREF(__pyx_v_self->models);
+  __Pyx_DECREF(__pyx_v_self->models);
+  __pyx_v_self->models = __pyx_t_2;
   __pyx_t_2 = 0;
 
   __pyx_r = 0;
@@ -52589,14 +56046,13 @@ static int __pyx_pf_3_sa_6Scorer___init__(PyObject *__pyx_v_self, PyObject *__py
   __Pyx_AddTraceback("_sa.Scorer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   __pyx_L0:;
-  __Pyx_XDECREF(__pyx_v_models);
   __Pyx_XDECREF(__pyx_v_names);
   __Pyx_XDECREF(__pyx_v_model);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":29
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":29
  *         self.models = zip(names, models)
  * 
  *     cdef FeatureVector score(self, ctx):             # <<<<<<<<<<<<<<
@@ -52621,9 +56077,9 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("score");
+  __Pyx_RefNannySetupContext("score", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":30
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":30
  * 
  *     cdef FeatureVector score(self, ctx):
  *         cdef FeatureVector scores = FeatureVector()             # <<<<<<<<<<<<<<
@@ -52635,7 +56091,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   __pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":31
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":31
  *     cdef FeatureVector score(self, ctx):
  *         cdef FeatureVector scores = FeatureVector()
  *         for name, model in self.models:             # <<<<<<<<<<<<<<
@@ -52651,12 +56107,20 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
-    if (PyList_CheckExact(__pyx_t_1)) {
+    if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
-    } else if (PyTuple_CheckExact(__pyx_t_1)) {
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
+    } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #else
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
@@ -52670,27 +56134,33 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     }
     if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
       PyObject* sequence = __pyx_t_4;
+      #if CYTHON_COMPILING_IN_CPYTHON
+      Py_ssize_t size = Py_SIZE(sequence);
+      #else
+      Py_ssize_t size = PySequence_Size(sequence);
+      #endif
+      if (unlikely(size != 2)) {
+        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
+        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+        {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
-        if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) {
-          if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
       } else {
-        if (unlikely(PyList_GET_SIZE(sequence) != 2)) {
-          if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2);
-          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
-          {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
+      #else
+      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    } else {
+    } else
+    {
       Py_ssize_t index = -1;
       __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
@@ -52701,12 +56171,13 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
       index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L6_unpacking_done;
       __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
-      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      __pyx_t_8 = NULL;
+      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[13]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L6_unpacking_done:;
     }
@@ -52717,7 +56188,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_v_model = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":32
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":32
  *         cdef FeatureVector scores = FeatureVector()
  *         for name, model in self.models:
  *             scores.set(name, model(ctx))             # <<<<<<<<<<<<<<
@@ -52726,7 +56197,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_scores), __pyx_n_s__set); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_INCREF(__pyx_v_ctx);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_ctx);
     __Pyx_GIVEREF(__pyx_v_ctx);
@@ -52734,7 +56205,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_INCREF(__pyx_v_name);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_name);
     __Pyx_GIVEREF(__pyx_v_name);
@@ -52749,7 +56220,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":33
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":33
  *         for name, model in self.models:
  *             scores.set(name, model(ctx))
  *         return scores             # <<<<<<<<<<<<<<
@@ -52779,57 +56250,1341 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
 }
 static struct __pyx_vtabstruct_3_sa_FloatList __pyx_vtable_3_sa_FloatList;
 
-static PyObject *__pyx_tp_new_3_sa_FloatList(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_FloatList *p;
+static PyObject *__pyx_tp_new_3_sa_FloatList(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_FloatList *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
+  if (!o) return 0;
+  p = ((struct __pyx_obj_3_sa_FloatList *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_FloatList;
+  if (__pyx_pw_3_sa_9FloatList_1__cinit__(o, a, k) < 0) {
+    Py_DECREF(o); o = 0;
+  }
+  return o;
+}
+
+static void __pyx_tp_dealloc_3_sa_FloatList(PyObject *o) {
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    ++Py_REFCNT(o);
+    __pyx_pw_3_sa_9FloatList_3__dealloc__(o);
+    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
+    --Py_REFCNT(o);
+    PyErr_Restore(etype, eval, etb);
+  }
+  (*Py_TYPE(o)->tp_free)(o);
+}
+static PyObject *__pyx_sq_item_3_sa_FloatList(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
+
+static int __pyx_mp_ass_subscript_3_sa_FloatList(PyObject *o, PyObject *i, PyObject *v) {
+  if (v) {
+    return __pyx_pw_3_sa_9FloatList_7__setitem__(o, i, v);
+  }
+  else {
+    PyErr_Format(PyExc_NotImplementedError,
+      "Subscript deletion not supported by %s", Py_TYPE(o)->tp_name);
+    return -1;
+  }
+}
+
+static PyMethodDef __pyx_methods_3_sa_FloatList[] = {
+  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pw_3_sa_9FloatList_11append, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pw_3_sa_9FloatList_13write, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pw_3_sa_9FloatList_15read, METH_O, __Pyx_DOCSTR(0)},
+  {0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_FloatList = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_divide*/
+  #endif
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_nonzero*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_coerce*/
+  #endif
+  0, /*nb_int*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_long*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*nb_float*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_oct*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_hex*/
+  #endif
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_inplace_divide*/
+  #endif
+  0, /*nb_inplace_remainder*/
+  0, /*nb_inplace_power*/
+  0, /*nb_inplace_lshift*/
+  0, /*nb_inplace_rshift*/
+  0, /*nb_inplace_and*/
+  0, /*nb_inplace_xor*/
+  0, /*nb_inplace_or*/
+  0, /*nb_floor_divide*/
+  0, /*nb_true_divide*/
+  0, /*nb_inplace_floor_divide*/
+  0, /*nb_inplace_true_divide*/
+  #if PY_VERSION_HEX >= 0x02050000
+  0, /*nb_index*/
+  #endif
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
+  __pyx_pw_3_sa_9FloatList_9__len__, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  __pyx_sq_item_3_sa_FloatList, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_FloatList = {
+  __pyx_pw_3_sa_9FloatList_9__len__, /*mp_length*/
+  __pyx_pw_3_sa_9FloatList_5__getitem__, /*mp_subscript*/
+  __pyx_mp_ass_subscript_3_sa_FloatList, /*mp_ass_subscript*/
+};
+
+static PyBufferProcs __pyx_tp_as_buffer_FloatList = {
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getreadbuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getwritebuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getsegcount*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getcharbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_getbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_releasebuffer*/
+  #endif
+};
+
+static PyTypeObject __pyx_type_3_sa_FloatList = {
+  PyVarObject_HEAD_INIT(0, 0)
+  __Pyx_NAMESTR("_sa.FloatList"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_FloatList), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_3_sa_FloatList, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  &__pyx_tp_as_number_FloatList, /*tp_as_number*/
+  &__pyx_tp_as_sequence_FloatList, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_FloatList, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  &__pyx_tp_as_buffer_FloatList, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_3_sa_FloatList, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_3_sa_FloatList, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
+};
+static struct __pyx_vtabstruct_3_sa_IntList __pyx_vtable_3_sa_IntList;
+
+static PyObject *__pyx_tp_new_3_sa_IntList(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_IntList *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
+  if (!o) return 0;
+  p = ((struct __pyx_obj_3_sa_IntList *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_IntList;
+  if (__pyx_pw_3_sa_7IntList_1__cinit__(o, a, k) < 0) {
+    Py_DECREF(o); o = 0;
+  }
+  return o;
+}
+
+static void __pyx_tp_dealloc_3_sa_IntList(PyObject *o) {
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    ++Py_REFCNT(o);
+    __pyx_pw_3_sa_7IntList_15__dealloc__(o);
+    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
+    --Py_REFCNT(o);
+    PyErr_Restore(etype, eval, etb);
+  }
+  (*Py_TYPE(o)->tp_free)(o);
+}
+static PyObject *__pyx_sq_item_3_sa_IntList(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
+
+static int __pyx_mp_ass_subscript_3_sa_IntList(PyObject *o, PyObject *i, PyObject *v) {
+  if (v) {
+    return __pyx_pw_3_sa_7IntList_22__setitem__(o, i, v);
+  }
+  else {
+    PyErr_Format(PyExc_NotImplementedError,
+      "Subscript deletion not supported by %s", Py_TYPE(o)->tp_name);
+    return -1;
+  }
+}
+
+static PyMethodDef __pyx_methods_3_sa_IntList[] = {
+  {__Pyx_NAMESTR("index"), (PyCFunction)__pyx_pw_3_sa_7IntList_5index, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("partition"), (PyCFunction)__pyx_pw_3_sa_7IntList_7partition, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("_doquicksort"), (PyCFunction)__pyx_pw_3_sa_7IntList_9_doquicksort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("sort"), (PyCFunction)__pyx_pw_3_sa_7IntList_11sort, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pw_3_sa_7IntList_13reset, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_size"), (PyCFunction)__pyx_pw_3_sa_7IntList_26get_size, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pw_3_sa_7IntList_28append, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("extend"), (PyCFunction)__pyx_pw_3_sa_7IntList_30extend, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pw_3_sa_7IntList_32write, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pw_3_sa_7IntList_34read, METH_O, __Pyx_DOCSTR(0)},
+  {0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_IntList = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_divide*/
+  #endif
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_nonzero*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_coerce*/
+  #endif
+  0, /*nb_int*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_long*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*nb_float*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_oct*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_hex*/
+  #endif
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_inplace_divide*/
+  #endif
+  0, /*nb_inplace_remainder*/
+  0, /*nb_inplace_power*/
+  0, /*nb_inplace_lshift*/
+  0, /*nb_inplace_rshift*/
+  0, /*nb_inplace_and*/
+  0, /*nb_inplace_xor*/
+  0, /*nb_inplace_or*/
+  0, /*nb_floor_divide*/
+  0, /*nb_true_divide*/
+  0, /*nb_inplace_floor_divide*/
+  0, /*nb_inplace_true_divide*/
+  #if PY_VERSION_HEX >= 0x02050000
+  0, /*nb_index*/
+  #endif
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_IntList = {
+  __pyx_pw_3_sa_7IntList_24__len__, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  __pyx_sq_item_3_sa_IntList, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_IntList = {
+  __pyx_pw_3_sa_7IntList_24__len__, /*mp_length*/
+  __pyx_pw_3_sa_7IntList_20__getitem__, /*mp_subscript*/
+  __pyx_mp_ass_subscript_3_sa_IntList, /*mp_ass_subscript*/
+};
+
+static PyBufferProcs __pyx_tp_as_buffer_IntList = {
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getreadbuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getwritebuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getsegcount*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getcharbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_getbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_releasebuffer*/
+  #endif
+};
+
+static PyTypeObject __pyx_type_3_sa_IntList = {
+  PyVarObject_HEAD_INIT(0, 0)
+  __Pyx_NAMESTR("_sa.IntList"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_IntList), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_3_sa_IntList, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  &__pyx_tp_as_number_IntList, /*tp_as_number*/
+  &__pyx_tp_as_sequence_IntList, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_IntList, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  __pyx_pw_3_sa_7IntList_3__str__, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  &__pyx_tp_as_buffer_IntList, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  __pyx_pw_3_sa_7IntList_17__iter__, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_3_sa_IntList, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_3_sa_IntList, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa_FeatureVector *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
+  if (!o) return 0;
+  p = ((struct __pyx_obj_3_sa_FeatureVector *)o);
+  p->names = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->values = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_13FeatureVector_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+    Py_DECREF(o); o = 0;
+  }
+  return o;
+}
+
+static void __pyx_tp_dealloc_3_sa_FeatureVector(PyObject *o) {
+  struct __pyx_obj_3_sa_FeatureVector *p = (struct __pyx_obj_3_sa_FeatureVector *)o;
+  Py_CLEAR(p->names);
+  Py_CLEAR(p->values);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_3_sa_FeatureVector(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_3_sa_FeatureVector *p = (struct __pyx_obj_3_sa_FeatureVector *)o;
+  if (p->names) {
+    e = (*v)(((PyObject*)p->names), a); if (e) return e;
+  }
+  if (p->values) {
+    e = (*v)(((PyObject*)p->values), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_3_sa_FeatureVector(PyObject *o) {
+  struct __pyx_obj_3_sa_FeatureVector *p = (struct __pyx_obj_3_sa_FeatureVector *)o;
+  PyObject* tmp;
+  tmp = ((PyObject*)p->names);
+  p->names = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->values);
+  p->values = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_3_sa_FeatureVector[] = {
+  {__Pyx_NAMESTR("set"), (PyCFunction)__pyx_pw_3_sa_13FeatureVector_3set, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_FeatureVector = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_divide*/
+  #endif
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_nonzero*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_coerce*/
+  #endif
+  0, /*nb_int*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_long*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*nb_float*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_oct*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_hex*/
+  #endif
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_inplace_divide*/
+  #endif
+  0, /*nb_inplace_remainder*/
+  0, /*nb_inplace_power*/
+  0, /*nb_inplace_lshift*/
+  0, /*nb_inplace_rshift*/
+  0, /*nb_inplace_and*/
+  0, /*nb_inplace_xor*/
+  0, /*nb_inplace_or*/
+  0, /*nb_floor_divide*/
+  0, /*nb_true_divide*/
+  0, /*nb_inplace_floor_divide*/
+  0, /*nb_inplace_true_divide*/
+  #if PY_VERSION_HEX >= 0x02050000
+  0, /*nb_index*/
+  #endif
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_FeatureVector = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  0, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_FeatureVector = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyBufferProcs __pyx_tp_as_buffer_FeatureVector = {
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getreadbuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getwritebuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getsegcount*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getcharbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_getbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_releasebuffer*/
+  #endif
+};
+
+static PyTypeObject __pyx_type_3_sa_FeatureVector = {
+  PyVarObject_HEAD_INIT(0, 0)
+  __Pyx_NAMESTR("_sa.FeatureVector"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_FeatureVector), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_3_sa_FeatureVector, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  &__pyx_tp_as_number_FeatureVector, /*tp_as_number*/
+  &__pyx_tp_as_sequence_FeatureVector, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_FeatureVector, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  __pyx_pw_3_sa_13FeatureVector_8__str__, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  &__pyx_tp_as_buffer_FeatureVector, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_3_sa_FeatureVector, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_FeatureVector, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  __pyx_pw_3_sa_13FeatureVector_5__iter__, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_3_sa_FeatureVector, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_3_sa_FeatureVector, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
+};
+static struct __pyx_vtabstruct_3_sa_Phrase __pyx_vtable_3_sa_Phrase;
+
+static PyObject *__pyx_tp_new_3_sa_Phrase(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_Phrase *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
+  if (!o) return 0;
+  p = ((struct __pyx_obj_3_sa_Phrase *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_Phrase;
+  if (__pyx_pw_3_sa_6Phrase_1__cinit__(o, a, k) < 0) {
+    Py_DECREF(o); o = 0;
+  }
+  return o;
+}
+
+static void __pyx_tp_dealloc_3_sa_Phrase(PyObject *o) {
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    ++Py_REFCNT(o);
+    __pyx_pw_3_sa_6Phrase_3__dealloc__(o);
+    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
+    --Py_REFCNT(o);
+    PyErr_Restore(etype, eval, etb);
+  }
+  (*Py_TYPE(o)->tp_free)(o);
+}
+static PyObject *__pyx_sq_item_3_sa_Phrase(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
+
+static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_6Phrase_5words_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_3_sa_Phrase[] = {
+  {__Pyx_NAMESTR("handle"), (PyCFunction)__pyx_pw_3_sa_6Phrase_7handle, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_3_sa_6Phrase_6handle)},
+  {__Pyx_NAMESTR("strhandle"), (PyCFunction)__pyx_pw_3_sa_6Phrase_9strhandle, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pw_3_sa_6Phrase_11arity, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getvarpos"), (PyCFunction)__pyx_pw_3_sa_6Phrase_13getvarpos, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getvar"), (PyCFunction)__pyx_pw_3_sa_6Phrase_15getvar, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("clen"), (PyCFunction)__pyx_pw_3_sa_6Phrase_17clen, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("getchunk"), (PyCFunction)__pyx_pw_3_sa_6Phrase_19getchunk, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("subst"), (PyCFunction)__pyx_pw_3_sa_6Phrase_32subst, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_3_sa_Phrase[] = {
+  {(char *)"words", __pyx_getprop_3_sa_6Phrase_words, 0, 0, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_Phrase = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_divide*/
+  #endif
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_nonzero*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_coerce*/
+  #endif
+  0, /*nb_int*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_long*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*nb_float*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_oct*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_hex*/
+  #endif
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_inplace_divide*/
+  #endif
+  0, /*nb_inplace_remainder*/
+  0, /*nb_inplace_power*/
+  0, /*nb_inplace_lshift*/
+  0, /*nb_inplace_rshift*/
+  0, /*nb_inplace_and*/
+  0, /*nb_inplace_xor*/
+  0, /*nb_inplace_or*/
+  0, /*nb_floor_divide*/
+  0, /*nb_true_divide*/
+  0, /*nb_inplace_floor_divide*/
+  0, /*nb_inplace_true_divide*/
+  #if PY_VERSION_HEX >= 0x02050000
+  0, /*nb_index*/
+  #endif
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
+  __pyx_pw_3_sa_6Phrase_25__len__, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  __pyx_sq_item_3_sa_Phrase, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_Phrase = {
+  __pyx_pw_3_sa_6Phrase_25__len__, /*mp_length*/
+  __pyx_pw_3_sa_6Phrase_27__getitem__, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyBufferProcs __pyx_tp_as_buffer_Phrase = {
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getreadbuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getwritebuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getsegcount*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getcharbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_getbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_releasebuffer*/
+  #endif
+};
+
+static PyTypeObject __pyx_type_3_sa_Phrase = {
+  PyVarObject_HEAD_INIT(0, 0)
+  __Pyx_NAMESTR("_sa.Phrase"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_Phrase), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_3_sa_Phrase, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  __pyx_pw_3_sa_6Phrase_21__cmp__, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  &__pyx_tp_as_number_Phrase, /*tp_as_number*/
+  &__pyx_tp_as_sequence_Phrase, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_Phrase, /*tp_as_mapping*/
+  __pyx_pw_3_sa_6Phrase_23__hash__, /*tp_hash*/
+  0, /*tp_call*/
+  __pyx_pw_3_sa_6Phrase_5__str__, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  &__pyx_tp_as_buffer_Phrase, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  __pyx_pw_3_sa_6Phrase_29__iter__, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_3_sa_Phrase, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_3_sa_Phrase, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_3_sa_Phrase, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
+};
+
+static PyObject *__pyx_tp_new_3_sa_Rule(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_Rule *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
+  if (!o) return 0;
+  p = ((struct __pyx_obj_3_sa_Rule *)o);
+  p->f = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
+  p->e = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
+  p->scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
+  p->word_alignments = Py_None; Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_4Rule_1__cinit__(o, a, k) < 0) {
+    Py_DECREF(o); o = 0;
+  }
+  return o;
+}
+
+static void __pyx_tp_dealloc_3_sa_Rule(PyObject *o) {
+  struct __pyx_obj_3_sa_Rule *p = (struct __pyx_obj_3_sa_Rule *)o;
+  Py_CLEAR(p->f);
+  Py_CLEAR(p->e);
+  Py_CLEAR(p->scores);
+  Py_CLEAR(p->word_alignments);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_3_sa_Rule(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_3_sa_Rule *p = (struct __pyx_obj_3_sa_Rule *)o;
+  if (p->f) {
+    e = (*v)(((PyObject*)p->f), a); if (e) return e;
+  }
+  if (p->e) {
+    e = (*v)(((PyObject*)p->e), a); if (e) return e;
+  }
+  if (p->scores) {
+    e = (*v)(((PyObject*)p->scores), a); if (e) return e;
+  }
+  if (p->word_alignments) {
+    e = (*v)(p->word_alignments, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_3_sa_Rule(PyObject *o) {
+  struct __pyx_obj_3_sa_Rule *p = (struct __pyx_obj_3_sa_Rule *)o;
+  PyObject* tmp;
+  tmp = ((PyObject*)p->f);
+  p->f = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->e);
+  p->e = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->scores);
+  p->scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->word_alignments);
+  p->word_alignments = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_4Rule_1f_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_4Rule_1e_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_3_sa_Rule[] = {
+  {__Pyx_NAMESTR("fmerge"), (PyCFunction)__pyx_pw_3_sa_4Rule_7fmerge, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pw_3_sa_4Rule_9arity, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("alignments"), (PyCFunction)__pyx_pw_3_sa_4Rule_13alignments, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {0, 0, 0, 0}
+};
+
+static struct PyGetSetDef __pyx_getsets_3_sa_Rule[] = {
+  {(char *)"f", __pyx_getprop_3_sa_4Rule_f, 0, 0, 0},
+  {(char *)"e", __pyx_getprop_3_sa_4Rule_e, 0, 0, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_Rule = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_divide*/
+  #endif
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_nonzero*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_coerce*/
+  #endif
+  0, /*nb_int*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_long*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*nb_float*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_oct*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_hex*/
+  #endif
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_inplace_divide*/
+  #endif
+  0, /*nb_inplace_remainder*/
+  0, /*nb_inplace_power*/
+  0, /*nb_inplace_lshift*/
+  0, /*nb_inplace_rshift*/
+  0, /*nb_inplace_and*/
+  0, /*nb_inplace_xor*/
+  0, /*nb_inplace_or*/
+  0, /*nb_floor_divide*/
+  0, /*nb_true_divide*/
+  0, /*nb_inplace_floor_divide*/
+  0, /*nb_inplace_true_divide*/
+  #if PY_VERSION_HEX >= 0x02050000
+  0, /*nb_index*/
+  #endif
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_Rule = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  0, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_Rule = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyBufferProcs __pyx_tp_as_buffer_Rule = {
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getreadbuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getwritebuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getsegcount*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getcharbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_getbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_releasebuffer*/
+  #endif
+};
+
+static PyTypeObject __pyx_type_3_sa_Rule = {
+  PyVarObject_HEAD_INIT(0, 0)
+  __Pyx_NAMESTR("_sa.Rule"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_Rule), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_3_sa_Rule, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  __pyx_pw_3_sa_4Rule_5__cmp__, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  &__pyx_tp_as_number_Rule, /*tp_as_number*/
+  &__pyx_tp_as_sequence_Rule, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_Rule, /*tp_as_mapping*/
+  __pyx_pw_3_sa_4Rule_3__hash__, /*tp_hash*/
+  0, /*tp_call*/
+  __pyx_pw_3_sa_4Rule_11__str__, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  &__pyx_tp_as_buffer_Rule, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_3_sa_Rule, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_Rule, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_3_sa_Rule, /*tp_methods*/
+  0, /*tp_members*/
+  __pyx_getsets_3_sa_Rule, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_3_sa_Rule, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
+};
+static struct __pyx_vtabstruct_3_sa_StringMap __pyx_vtable_3_sa_StringMap;
+
+static PyObject *__pyx_tp_new_3_sa_StringMap(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa_StringMap *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
+  if (!o) return 0;
+  p = ((struct __pyx_obj_3_sa_StringMap *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_StringMap;
+  if (__pyx_pw_3_sa_9StringMap_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+    Py_DECREF(o); o = 0;
+  }
+  return o;
+}
+
+static void __pyx_tp_dealloc_3_sa_StringMap(PyObject *o) {
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    ++Py_REFCNT(o);
+    __pyx_pw_3_sa_9StringMap_3__dealloc__(o);
+    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
+    --Py_REFCNT(o);
+    PyErr_Restore(etype, eval, etb);
+  }
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static PyMethodDef __pyx_methods_3_sa_StringMap[] = {
+  {0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_StringMap = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_divide*/
+  #endif
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_nonzero*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_coerce*/
+  #endif
+  0, /*nb_int*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_long*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*nb_float*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_oct*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_hex*/
+  #endif
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*nb_inplace_divide*/
+  #endif
+  0, /*nb_inplace_remainder*/
+  0, /*nb_inplace_power*/
+  0, /*nb_inplace_lshift*/
+  0, /*nb_inplace_rshift*/
+  0, /*nb_inplace_and*/
+  0, /*nb_inplace_xor*/
+  0, /*nb_inplace_or*/
+  0, /*nb_floor_divide*/
+  0, /*nb_true_divide*/
+  0, /*nb_inplace_floor_divide*/
+  0, /*nb_inplace_true_divide*/
+  #if PY_VERSION_HEX >= 0x02050000
+  0, /*nb_index*/
+  #endif
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_StringMap = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  0, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_StringMap = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyBufferProcs __pyx_tp_as_buffer_StringMap = {
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getreadbuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getwritebuffer*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getsegcount*/
+  #endif
+  #if PY_MAJOR_VERSION < 3
+  0, /*bf_getcharbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_getbuffer*/
+  #endif
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*bf_releasebuffer*/
+  #endif
+};
+
+static PyTypeObject __pyx_type_3_sa_StringMap = {
+  PyVarObject_HEAD_INIT(0, 0)
+  __Pyx_NAMESTR("_sa.StringMap"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_StringMap), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_3_sa_StringMap, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
+  0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
+  0, /*tp_repr*/
+  &__pyx_tp_as_number_StringMap, /*tp_as_number*/
+  &__pyx_tp_as_sequence_StringMap, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_StringMap, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  &__pyx_tp_as_buffer_StringMap, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  0, /*tp_doc*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_3_sa_StringMap, /*tp_methods*/
+  0, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  0, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_3_sa_StringMap, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
+};
+static struct __pyx_vtabstruct_3_sa_DataArray __pyx_vtable_3_sa_DataArray;
+
+static PyObject *__pyx_tp_new_3_sa_DataArray(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_DataArray *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_FloatList *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_FloatList;
-  if (__pyx_pf_3_sa_9FloatList___cinit__(o, a, k) < 0) {
+  p = ((struct __pyx_obj_3_sa_DataArray *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_DataArray;
+  p->word2id = Py_None; Py_INCREF(Py_None);
+  p->id2word = Py_None; Py_INCREF(Py_None);
+  p->data = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->sent_id = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_9DataArray_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_FloatList(PyObject *o) {
-  {
-    PyObject *etype, *eval, *etb;
-    PyErr_Fetch(&etype, &eval, &etb);
-    ++Py_REFCNT(o);
-    __pyx_pf_3_sa_9FloatList_1__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
-    --Py_REFCNT(o);
-    PyErr_Restore(etype, eval, etb);
-  }
+static void __pyx_tp_dealloc_3_sa_DataArray(PyObject *o) {
+  struct __pyx_obj_3_sa_DataArray *p = (struct __pyx_obj_3_sa_DataArray *)o;
+  Py_CLEAR(p->word2id);
+  Py_CLEAR(p->id2word);
+  Py_CLEAR(p->data);
+  Py_CLEAR(p->sent_id);
+  Py_CLEAR(p->sent_index);
   (*Py_TYPE(o)->tp_free)(o);
 }
-static PyObject *__pyx_sq_item_3_sa_FloatList(PyObject *o, Py_ssize_t i) {
-  PyObject *r;
-  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
-  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
-  Py_DECREF(x);
-  return r;
-}
 
-static int __pyx_mp_ass_subscript_3_sa_FloatList(PyObject *o, PyObject *i, PyObject *v) {
-  if (v) {
-    return __pyx_pf_3_sa_9FloatList_3__setitem__(o, i, v);
+static int __pyx_tp_traverse_3_sa_DataArray(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_3_sa_DataArray *p = (struct __pyx_obj_3_sa_DataArray *)o;
+  if (p->word2id) {
+    e = (*v)(p->word2id, a); if (e) return e;
   }
-  else {
-    PyErr_Format(PyExc_NotImplementedError,
-      "Subscript deletion not supported by %s", Py_TYPE(o)->tp_name);
-    return -1;
+  if (p->id2word) {
+    e = (*v)(p->id2word, a); if (e) return e;
+  }
+  if (p->data) {
+    e = (*v)(((PyObject*)p->data), a); if (e) return e;
+  }
+  if (p->sent_id) {
+    e = (*v)(((PyObject*)p->sent_id), a); if (e) return e;
+  }
+  if (p->sent_index) {
+    e = (*v)(((PyObject*)p->sent_index), a); if (e) return e;
   }
+  return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_FloatList[] = {
-  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pf_3_sa_9FloatList_5append, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pf_3_sa_9FloatList_6write, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pf_3_sa_9FloatList_7read, METH_O, __Pyx_DOCSTR(0)},
+static int __pyx_tp_clear_3_sa_DataArray(PyObject *o) {
+  struct __pyx_obj_3_sa_DataArray *p = (struct __pyx_obj_3_sa_DataArray *)o;
+  PyObject* tmp;
+  tmp = ((PyObject*)p->word2id);
+  p->word2id = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->id2word);
+  p->id2word = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->data);
+  p->data = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->sent_id);
+  p->sent_id = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->sent_index);
+  p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_3_sa_DataArray[] = {
+  {__Pyx_NAMESTR("get_data"), (PyCFunction)__pyx_pw_3_sa_9DataArray_5get_data, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_7get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pw_3_sa_9DataArray_9get_sentence, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pw_3_sa_9DataArray_11get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_13get_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pw_3_sa_9DataArray_15get_word, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_17write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_19read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pw_3_sa_9DataArray_21read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pw_3_sa_9DataArray_23read_text_data, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_25read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_27write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pw_3_sa_9DataArray_29write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9DataArray_31write_enhanced, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_FloatList = {
+static PyNumberMethods __pyx_tp_as_number_DataArray = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -52887,11 +57642,11 @@ static PyNumberMethods __pyx_tp_as_number_FloatList = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
-  __pyx_pf_3_sa_9FloatList_4__len__, /*sq_length*/
+static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
+  __pyx_pw_3_sa_9DataArray_3__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
-  __pyx_sq_item_3_sa_FloatList, /*sq_item*/
+  0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
@@ -52900,13 +57655,13 @@ static PySequenceMethods __pyx_tp_as_sequence_FloatList = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_FloatList = {
-  __pyx_pf_3_sa_9FloatList_4__len__, /*mp_length*/
-  __pyx_pf_3_sa_9FloatList_2__getitem__, /*mp_subscript*/
-  __pyx_mp_ass_subscript_3_sa_FloatList, /*mp_ass_subscript*/
+static PyMappingMethods __pyx_tp_as_mapping_DataArray = {
+  __pyx_pw_3_sa_9DataArray_3__len__, /*mp_length*/
+  0, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_FloatList = {
+static PyBufferProcs __pyx_tp_as_buffer_DataArray = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -52927,12 +57682,12 @@ static PyBufferProcs __pyx_tp_as_buffer_FloatList = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_FloatList = {
+static PyTypeObject __pyx_type_3_sa_DataArray = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.FloatList"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_FloatList), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.DataArray"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_DataArray), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_FloatList, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_DataArray, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -52942,24 +57697,24 @@ static PyTypeObject __pyx_type_3_sa_FloatList = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_FloatList, /*tp_as_number*/
-  &__pyx_tp_as_sequence_FloatList, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_FloatList, /*tp_as_mapping*/
+  &__pyx_tp_as_number_DataArray, /*tp_as_number*/
+  &__pyx_tp_as_sequence_DataArray, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_DataArray, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_FloatList, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  &__pyx_tp_as_buffer_DataArray, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  0, /*tp_traverse*/
-  0, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_DataArray, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_DataArray, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_FloatList, /*tp_methods*/
+  __pyx_methods_3_sa_DataArray, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -52969,7 +57724,7 @@ static PyTypeObject __pyx_type_3_sa_FloatList = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_FloatList, /*tp_new*/
+  __pyx_tp_new_3_sa_DataArray, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -52982,66 +57737,66 @@ static PyTypeObject __pyx_type_3_sa_FloatList = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_IntList __pyx_vtable_3_sa_IntList;
+static struct __pyx_vtabstruct_3_sa_Alignment __pyx_vtable_3_sa_Alignment;
 
-static PyObject *__pyx_tp_new_3_sa_IntList(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_IntList *p;
+static PyObject *__pyx_tp_new_3_sa_Alignment(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_Alignment *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_IntList *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_IntList;
-  if (__pyx_pf_3_sa_7IntList___cinit__(o, a, k) < 0) {
+  p = ((struct __pyx_obj_3_sa_Alignment *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_Alignment;
+  p->links = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_9Alignment_5__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_IntList(PyObject *o) {
-  {
-    PyObject *etype, *eval, *etb;
-    PyErr_Fetch(&etype, &eval, &etb);
-    ++Py_REFCNT(o);
-    __pyx_pf_3_sa_7IntList_7__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
-    --Py_REFCNT(o);
-    PyErr_Restore(etype, eval, etb);
-  }
+static void __pyx_tp_dealloc_3_sa_Alignment(PyObject *o) {
+  struct __pyx_obj_3_sa_Alignment *p = (struct __pyx_obj_3_sa_Alignment *)o;
+  Py_CLEAR(p->links);
+  Py_CLEAR(p->sent_index);
   (*Py_TYPE(o)->tp_free)(o);
 }
-static PyObject *__pyx_sq_item_3_sa_IntList(PyObject *o, Py_ssize_t i) {
-  PyObject *r;
-  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
-  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
-  Py_DECREF(x);
-  return r;
-}
 
-static int __pyx_mp_ass_subscript_3_sa_IntList(PyObject *o, PyObject *i, PyObject *v) {
-  if (v) {
-    return __pyx_pf_3_sa_7IntList_11__setitem__(o, i, v);
+static int __pyx_tp_traverse_3_sa_Alignment(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_3_sa_Alignment *p = (struct __pyx_obj_3_sa_Alignment *)o;
+  if (p->links) {
+    e = (*v)(((PyObject*)p->links), a); if (e) return e;
   }
-  else {
-    PyErr_Format(PyExc_NotImplementedError,
-      "Subscript deletion not supported by %s", Py_TYPE(o)->tp_name);
-    return -1;
+  if (p->sent_index) {
+    e = (*v)(((PyObject*)p->sent_index), a); if (e) return e;
   }
+  return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_IntList[] = {
-  {__Pyx_NAMESTR("index"), (PyCFunction)__pyx_pf_3_sa_7IntList_2index, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("partition"), (PyCFunction)__pyx_pf_3_sa_7IntList_3partition, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("_doquicksort"), (PyCFunction)__pyx_pf_3_sa_7IntList_4_doquicksort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("sort"), (PyCFunction)__pyx_pf_3_sa_7IntList_5sort, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pf_3_sa_7IntList_6reset, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_size"), (PyCFunction)__pyx_pf_3_sa_7IntList_13get_size, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("append"), (PyCFunction)__pyx_pf_3_sa_7IntList_14append, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("extend"), (PyCFunction)__pyx_pf_3_sa_7IntList_15extend, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write"), (PyCFunction)__pyx_pf_3_sa_7IntList_16write, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read"), (PyCFunction)__pyx_pf_3_sa_7IntList_17read, METH_O, __Pyx_DOCSTR(0)},
+static int __pyx_tp_clear_3_sa_Alignment(PyObject *o) {
+  struct __pyx_obj_3_sa_Alignment *p = (struct __pyx_obj_3_sa_Alignment *)o;
+  PyObject* tmp;
+  tmp = ((PyObject*)p->links);
+  p->links = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->sent_index);
+  p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_3_sa_Alignment[] = {
+  {__Pyx_NAMESTR("unlink"), (PyCFunction)__pyx_pw_3_sa_9Alignment_1unlink, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_unlink)},
+  {__Pyx_NAMESTR("get_sent_links"), (PyCFunction)__pyx_pw_3_sa_9Alignment_3get_sent_links, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9Alignment_7read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9Alignment_9read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9Alignment_11write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9Alignment_13write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9Alignment_15write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("alignment"), (PyCFunction)__pyx_pw_3_sa_9Alignment_17alignment, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_16alignment)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_IntList = {
+static PyNumberMethods __pyx_tp_as_number_Alignment = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -53099,11 +57854,11 @@ static PyNumberMethods __pyx_tp_as_number_IntList = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_IntList = {
-  __pyx_pf_3_sa_7IntList_12__len__, /*sq_length*/
+static PySequenceMethods __pyx_tp_as_sequence_Alignment = {
+  0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
-  __pyx_sq_item_3_sa_IntList, /*sq_item*/
+  0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
@@ -53112,13 +57867,13 @@ static PySequenceMethods __pyx_tp_as_sequence_IntList = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_IntList = {
-  __pyx_pf_3_sa_7IntList_12__len__, /*mp_length*/
-  __pyx_pf_3_sa_7IntList_10__getitem__, /*mp_subscript*/
-  __pyx_mp_ass_subscript_3_sa_IntList, /*mp_ass_subscript*/
+static PyMappingMethods __pyx_tp_as_mapping_Alignment = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_IntList = {
+static PyBufferProcs __pyx_tp_as_buffer_Alignment = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -53139,12 +57894,12 @@ static PyBufferProcs __pyx_tp_as_buffer_IntList = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_IntList = {
+static PyTypeObject __pyx_type_3_sa_Alignment = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.IntList"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_IntList), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.Alignment"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_Alignment), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_IntList, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_Alignment, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -53154,24 +57909,24 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_IntList, /*tp_as_number*/
-  &__pyx_tp_as_sequence_IntList, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_IntList, /*tp_as_mapping*/
+  &__pyx_tp_as_number_Alignment, /*tp_as_number*/
+  &__pyx_tp_as_sequence_Alignment, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_Alignment, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_7IntList_1__str__, /*tp_str*/
+  0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_IntList, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  &__pyx_tp_as_buffer_Alignment, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  0, /*tp_traverse*/
-  0, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_Alignment, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_Alignment, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_7IntList_8__iter__, /*tp_iter*/
+  0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_IntList, /*tp_methods*/
+  __pyx_methods_3_sa_Alignment, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -53181,7 +57936,7 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_IntList, /*tp_new*/
+  __pyx_tp_new_3_sa_Alignment, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -53194,57 +57949,114 @@ static PyTypeObject __pyx_type_3_sa_IntList = {
   0, /*tp_version_tag*/
   #endif
 };
+static struct __pyx_vtabstruct_3_sa_BiLex __pyx_vtable_3_sa_BiLex;
 
-static PyObject *__pyx_tp_new_3_sa_FeatureVector(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_FeatureVector *p;
+static PyObject *__pyx_tp_new_3_sa_BiLex(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_BiLex *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_FeatureVector *)o);
-  p->names = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  p->values = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_13FeatureVector___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  p = ((struct __pyx_obj_3_sa_BiLex *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_BiLex;
+  p->col1 = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
+  p->col2 = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
+  p->f_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->e_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->id2eword = Py_None; Py_INCREF(Py_None);
+  p->id2fword = Py_None; Py_INCREF(Py_None);
+  p->eword2id = Py_None; Py_INCREF(Py_None);
+  p->fword2id = Py_None; Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_5BiLex_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_FeatureVector(PyObject *o) {
-  struct __pyx_obj_3_sa_FeatureVector *p = (struct __pyx_obj_3_sa_FeatureVector *)o;
-  Py_XDECREF(((PyObject *)p->names));
-  Py_XDECREF(((PyObject *)p->values));
+static void __pyx_tp_dealloc_3_sa_BiLex(PyObject *o) {
+  struct __pyx_obj_3_sa_BiLex *p = (struct __pyx_obj_3_sa_BiLex *)o;
+  Py_CLEAR(p->col1);
+  Py_CLEAR(p->col2);
+  Py_CLEAR(p->f_index);
+  Py_CLEAR(p->e_index);
+  Py_CLEAR(p->id2eword);
+  Py_CLEAR(p->id2fword);
+  Py_CLEAR(p->eword2id);
+  Py_CLEAR(p->fword2id);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_FeatureVector(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa_BiLex(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_FeatureVector *p = (struct __pyx_obj_3_sa_FeatureVector *)o;
-  if (p->names) {
-    e = (*v)(((PyObject*)p->names), a); if (e) return e;
+  struct __pyx_obj_3_sa_BiLex *p = (struct __pyx_obj_3_sa_BiLex *)o;
+  if (p->col1) {
+    e = (*v)(((PyObject*)p->col1), a); if (e) return e;
   }
-  if (p->values) {
-    e = (*v)(((PyObject*)p->values), a); if (e) return e;
+  if (p->col2) {
+    e = (*v)(((PyObject*)p->col2), a); if (e) return e;
+  }
+  if (p->f_index) {
+    e = (*v)(((PyObject*)p->f_index), a); if (e) return e;
+  }
+  if (p->e_index) {
+    e = (*v)(((PyObject*)p->e_index), a); if (e) return e;
+  }
+  if (p->id2eword) {
+    e = (*v)(p->id2eword, a); if (e) return e;
+  }
+  if (p->id2fword) {
+    e = (*v)(p->id2fword, a); if (e) return e;
+  }
+  if (p->eword2id) {
+    e = (*v)(p->eword2id, a); if (e) return e;
+  }
+  if (p->fword2id) {
+    e = (*v)(p->fword2id, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_FeatureVector(PyObject *o) {
-  struct __pyx_obj_3_sa_FeatureVector *p = (struct __pyx_obj_3_sa_FeatureVector *)o;
+static int __pyx_tp_clear_3_sa_BiLex(PyObject *o) {
+  struct __pyx_obj_3_sa_BiLex *p = (struct __pyx_obj_3_sa_BiLex *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->names);
-  p->names = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->col1);
+  p->col1 = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->values);
-  p->values = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->col2);
+  p->col2 = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->f_index);
+  p->f_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->e_index);
+  p->e_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->id2eword);
+  p->id2eword = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->id2fword);
+  p->id2fword = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->eword2id);
+  p->eword2id = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->fword2id);
+  p->fword2id = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_FeatureVector[] = {
-  {__Pyx_NAMESTR("set"), (PyCFunction)__pyx_pf_3_sa_13FeatureVector_1set, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+static PyMethodDef __pyx_methods_3_sa_BiLex[] = {
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_5BiLex_3write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_5BiLex_5read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_e_id"), (PyCFunction)__pyx_pw_3_sa_5BiLex_7get_e_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_f_id"), (PyCFunction)__pyx_pw_3_sa_5BiLex_9get_f_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_5BiLex_11read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_5BiLex_13write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_score"), (PyCFunction)__pyx_pw_3_sa_5BiLex_15get_score, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_5BiLex_17write_text, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_5BiLex_16write_text)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_FeatureVector = {
+static PyNumberMethods __pyx_tp_as_number_BiLex = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -53302,7 +58114,7 @@ static PyNumberMethods __pyx_tp_as_number_FeatureVector = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_FeatureVector = {
+static PySequenceMethods __pyx_tp_as_sequence_BiLex = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -53315,13 +58127,13 @@ static PySequenceMethods __pyx_tp_as_sequence_FeatureVector = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_FeatureVector = {
+static PyMappingMethods __pyx_tp_as_mapping_BiLex = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_FeatureVector = {
+static PyBufferProcs __pyx_tp_as_buffer_BiLex = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -53342,12 +58154,12 @@ static PyBufferProcs __pyx_tp_as_buffer_FeatureVector = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_FeatureVector = {
+static PyTypeObject __pyx_type_3_sa_BiLex = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.FeatureVector"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_FeatureVector), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.BiLex"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_BiLex), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_FeatureVector, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_BiLex, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -53357,24 +58169,24 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_FeatureVector, /*tp_as_number*/
-  &__pyx_tp_as_sequence_FeatureVector, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_FeatureVector, /*tp_as_mapping*/
+  &__pyx_tp_as_number_BiLex, /*tp_as_number*/
+  &__pyx_tp_as_sequence_BiLex, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_BiLex, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_13FeatureVector_4__str__, /*tp_str*/
+  0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_FeatureVector, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_BiLex, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_FeatureVector, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_FeatureVector, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_BiLex, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_BiLex, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_13FeatureVector_2__iter__, /*tp_iter*/
+  0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_FeatureVector, /*tp_methods*/
+  __pyx_methods_3_sa_BiLex, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -53384,7 +58196,7 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_FeatureVector, /*tp_new*/
+  __pyx_tp_new_3_sa_BiLex, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -53397,62 +58209,23 @@ static PyTypeObject __pyx_type_3_sa_FeatureVector = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_Phrase __pyx_vtable_3_sa_Phrase;
 
-static PyObject *__pyx_tp_new_3_sa_Phrase(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_Phrase *p;
+static PyObject *__pyx_tp_new_3_sa_BitSetIterator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_Phrase *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_Phrase;
-  if (__pyx_pf_3_sa_6Phrase___cinit__(o, a, k) < 0) {
-    Py_DECREF(o); o = 0;
-  }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_Phrase(PyObject *o) {
-  {
-    PyObject *etype, *eval, *etb;
-    PyErr_Fetch(&etype, &eval, &etb);
-    ++Py_REFCNT(o);
-    __pyx_pf_3_sa_6Phrase_1__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
-    --Py_REFCNT(o);
-    PyErr_Restore(etype, eval, etb);
-  }
+static void __pyx_tp_dealloc_3_sa_BitSetIterator(PyObject *o) {
   (*Py_TYPE(o)->tp_free)(o);
 }
-static PyObject *__pyx_sq_item_3_sa_Phrase(PyObject *o, Py_ssize_t i) {
-  PyObject *r;
-  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
-  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
-  Py_DECREF(x);
-  return r;
-}
-
-static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_6Phrase_5words___get__(o);
-}
 
-static PyMethodDef __pyx_methods_3_sa_Phrase[] = {
-  {__Pyx_NAMESTR("handle"), (PyCFunction)__pyx_pf_3_sa_6Phrase_3handle, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_3_sa_6Phrase_3handle)},
-  {__Pyx_NAMESTR("strhandle"), (PyCFunction)__pyx_pf_3_sa_6Phrase_4strhandle, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pf_3_sa_6Phrase_5arity, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getvarpos"), (PyCFunction)__pyx_pf_3_sa_6Phrase_6getvarpos, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getvar"), (PyCFunction)__pyx_pf_3_sa_6Phrase_7getvar, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("clen"), (PyCFunction)__pyx_pf_3_sa_6Phrase_8clen, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("getchunk"), (PyCFunction)__pyx_pf_3_sa_6Phrase_9getchunk, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("subst"), (PyCFunction)__pyx_pf_3_sa_6Phrase_16subst, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+static PyMethodDef __pyx_methods_3_sa_BitSetIterator[] = {
+  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pw_3_sa_14BitSetIterator_1__next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
-static struct PyGetSetDef __pyx_getsets_3_sa_Phrase[] = {
-  {(char *)"words", __pyx_getprop_3_sa_6Phrase_words, 0, 0, 0},
-  {0, 0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number_Phrase = {
+static PyNumberMethods __pyx_tp_as_number_BitSetIterator = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -53510,11 +58283,11 @@ static PyNumberMethods __pyx_tp_as_number_Phrase = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
-  __pyx_pf_3_sa_6Phrase_12__len__, /*sq_length*/
+static PySequenceMethods __pyx_tp_as_sequence_BitSetIterator = {
+  0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
-  __pyx_sq_item_3_sa_Phrase, /*sq_item*/
+  0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
@@ -53523,13 +58296,13 @@ static PySequenceMethods __pyx_tp_as_sequence_Phrase = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_Phrase = {
-  __pyx_pf_3_sa_6Phrase_12__len__, /*mp_length*/
-  __pyx_pf_3_sa_6Phrase_13__getitem__, /*mp_subscript*/
+static PyMappingMethods __pyx_tp_as_mapping_BitSetIterator = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_Phrase = {
+static PyBufferProcs __pyx_tp_as_buffer_BitSetIterator = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -53550,41 +58323,41 @@ static PyBufferProcs __pyx_tp_as_buffer_Phrase = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_Phrase = {
+static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.Phrase"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_Phrase), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.BitSetIterator"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_BitSetIterator), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_Phrase, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_BitSetIterator, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_pf_3_sa_6Phrase_10__cmp__, /*tp_compare*/
+  0, /*tp_compare*/
   #else
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_Phrase, /*tp_as_number*/
-  &__pyx_tp_as_sequence_Phrase, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_Phrase, /*tp_as_mapping*/
-  __pyx_pf_3_sa_6Phrase_11__hash__, /*tp_hash*/
+  &__pyx_tp_as_number_BitSetIterator, /*tp_as_number*/
+  &__pyx_tp_as_sequence_BitSetIterator, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_BitSetIterator, /*tp_as_mapping*/
+  0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_6Phrase_2__str__, /*tp_str*/
+  0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_Phrase, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_BitSetIterator, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
   0, /*tp_doc*/
   0, /*tp_traverse*/
   0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_6Phrase_14__iter__, /*tp_iter*/
-  0, /*tp_iternext*/
-  __pyx_methods_3_sa_Phrase, /*tp_methods*/
+  0, /*tp_iter*/
+  __pyx_pw_3_sa_14BitSetIterator_1__next__, /*tp_iternext*/
+  __pyx_methods_3_sa_BitSetIterator, /*tp_methods*/
   0, /*tp_members*/
-  __pyx_getsets_3_sa_Phrase, /*tp_getset*/
+  0, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
@@ -53592,7 +58365,7 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_Phrase, /*tp_new*/
+  __pyx_tp_new_3_sa_BitSetIterator, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -53606,88 +58379,37 @@ static PyTypeObject __pyx_type_3_sa_Phrase = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_Rule(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_Rule *p;
+static PyObject *__pyx_tp_new_3_sa_BitSet(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_Rule *)o);
-  p->f = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
-  p->e = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
-  p->scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
-  p->word_alignments = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_4Rule___cinit__(o, a, k) < 0) {
+  if (__pyx_pw_3_sa_6BitSet_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_Rule(PyObject *o) {
-  struct __pyx_obj_3_sa_Rule *p = (struct __pyx_obj_3_sa_Rule *)o;
-  Py_XDECREF(((PyObject *)p->f));
-  Py_XDECREF(((PyObject *)p->e));
-  Py_XDECREF(((PyObject *)p->scores));
-  Py_XDECREF(p->word_alignments);
-  (*Py_TYPE(o)->tp_free)(o);
-}
-
-static int __pyx_tp_traverse_3_sa_Rule(PyObject *o, visitproc v, void *a) {
-  int e;
-  struct __pyx_obj_3_sa_Rule *p = (struct __pyx_obj_3_sa_Rule *)o;
-  if (p->f) {
-    e = (*v)(((PyObject*)p->f), a); if (e) return e;
-  }
-  if (p->e) {
-    e = (*v)(((PyObject*)p->e), a); if (e) return e;
-  }
-  if (p->scores) {
-    e = (*v)(((PyObject*)p->scores), a); if (e) return e;
-  }
-  if (p->word_alignments) {
-    e = (*v)(p->word_alignments, a); if (e) return e;
+static void __pyx_tp_dealloc_3_sa_BitSet(PyObject *o) {
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    ++Py_REFCNT(o);
+    __pyx_pw_3_sa_6BitSet_3__dealloc__(o);
+    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
+    --Py_REFCNT(o);
+    PyErr_Restore(etype, eval, etb);
   }
-  return 0;
-}
-
-static int __pyx_tp_clear_3_sa_Rule(PyObject *o) {
-  struct __pyx_obj_3_sa_Rule *p = (struct __pyx_obj_3_sa_Rule *)o;
-  PyObject* tmp;
-  tmp = ((PyObject*)p->f);
-  p->f = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->e);
-  p->e = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->scores);
-  p->scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->word_alignments);
-  p->word_alignments = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  return 0;
-}
-
-static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_4Rule_1f___get__(o);
-}
-
-static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_4Rule_1e___get__(o);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static PyMethodDef __pyx_methods_3_sa_Rule[] = {
-  {__Pyx_NAMESTR("fmerge"), (PyCFunction)__pyx_pf_3_sa_4Rule_3fmerge, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("arity"), (PyCFunction)__pyx_pf_3_sa_4Rule_4arity, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("alignments"), (PyCFunction)__pyx_pf_3_sa_4Rule_6alignments, METH_NOARGS, __Pyx_DOCSTR(0)},
+static PyMethodDef __pyx_methods_3_sa_BitSet[] = {
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_6BitSet_7insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pw_3_sa_6BitSet_9findsucc, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("min"), (PyCFunction)__pyx_pw_3_sa_6BitSet_13min, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("max"), (PyCFunction)__pyx_pw_3_sa_6BitSet_15max, METH_NOARGS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
-static struct PyGetSetDef __pyx_getsets_3_sa_Rule[] = {
-  {(char *)"f", __pyx_getprop_3_sa_4Rule_f, 0, 0, 0},
-  {(char *)"e", __pyx_getprop_3_sa_4Rule_e, 0, 0, 0},
-  {0, 0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number_Rule = {
+static PyNumberMethods __pyx_tp_as_number_BitSet = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -53745,26 +58467,26 @@ static PyNumberMethods __pyx_tp_as_number_Rule = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_Rule = {
-  0, /*sq_length*/
+static PySequenceMethods __pyx_tp_as_sequence_BitSet = {
+  __pyx_pw_3_sa_6BitSet_17__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  0, /*sq_contains*/
+  __pyx_pw_3_sa_6BitSet_19__contains__, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_Rule = {
-  0, /*mp_length*/
+static PyMappingMethods __pyx_tp_as_mapping_BitSet = {
+  __pyx_pw_3_sa_6BitSet_17__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_Rule = {
+static PyBufferProcs __pyx_tp_as_buffer_BitSet = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -53785,41 +58507,41 @@ static PyBufferProcs __pyx_tp_as_buffer_Rule = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_Rule = {
+static PyTypeObject __pyx_type_3_sa_BitSet = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.Rule"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_Rule), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.BitSet"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_BitSet), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_Rule, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_BitSet, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_pf_3_sa_4Rule_2__cmp__, /*tp_compare*/
+  0, /*tp_compare*/
   #else
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_Rule, /*tp_as_number*/
-  &__pyx_tp_as_sequence_Rule, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_Rule, /*tp_as_mapping*/
-  __pyx_pf_3_sa_4Rule_1__hash__, /*tp_hash*/
+  &__pyx_tp_as_number_BitSet, /*tp_as_number*/
+  &__pyx_tp_as_sequence_BitSet, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_BitSet, /*tp_as_mapping*/
+  0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_4Rule_5__str__, /*tp_str*/
+  __pyx_pw_3_sa_6BitSet_11__str__, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_Rule, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  &__pyx_tp_as_buffer_BitSet, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_Rule, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_Rule, /*tp_clear*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  0, /*tp_iter*/
+  __pyx_pw_3_sa_6BitSet_5__iter__, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_Rule, /*tp_methods*/
+  __pyx_methods_3_sa_BitSet, /*tp_methods*/
   0, /*tp_members*/
-  __pyx_getsets_3_sa_Rule, /*tp_getset*/
+  0, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
@@ -53827,7 +58549,7 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_Rule, /*tp_new*/
+  __pyx_tp_new_3_sa_BitSet, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -53840,38 +58562,23 @@ static PyTypeObject __pyx_type_3_sa_Rule = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_StringMap __pyx_vtable_3_sa_StringMap;
 
-static PyObject *__pyx_tp_new_3_sa_StringMap(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_StringMap *p;
+static PyObject *__pyx_tp_new_3_sa_VEBIterator(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_StringMap *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_StringMap;
-  if (__pyx_pf_3_sa_9StringMap___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
-    Py_DECREF(o); o = 0;
-  }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_StringMap(PyObject *o) {
-  {
-    PyObject *etype, *eval, *etb;
-    PyErr_Fetch(&etype, &eval, &etb);
-    ++Py_REFCNT(o);
-    __pyx_pf_3_sa_9StringMap_1__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
-    --Py_REFCNT(o);
-    PyErr_Restore(etype, eval, etb);
-  }
+static void __pyx_tp_dealloc_3_sa_VEBIterator(PyObject *o) {
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static PyMethodDef __pyx_methods_3_sa_StringMap[] = {
+static PyMethodDef __pyx_methods_3_sa_VEBIterator[] = {
+  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pw_3_sa_11VEBIterator_1__next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_StringMap = {
+static PyNumberMethods __pyx_tp_as_number_VEBIterator = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -53929,7 +58636,7 @@ static PyNumberMethods __pyx_tp_as_number_StringMap = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_StringMap = {
+static PySequenceMethods __pyx_tp_as_sequence_VEBIterator = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -53942,13 +58649,13 @@ static PySequenceMethods __pyx_tp_as_sequence_StringMap = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_StringMap = {
+static PyMappingMethods __pyx_tp_as_mapping_VEBIterator = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_StringMap = {
+static PyBufferProcs __pyx_tp_as_buffer_VEBIterator = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -53969,12 +58676,12 @@ static PyBufferProcs __pyx_tp_as_buffer_StringMap = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_StringMap = {
+static PyTypeObject __pyx_type_3_sa_VEBIterator = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.StringMap"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_StringMap), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.VEBIterator"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_VEBIterator), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_StringMap, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_VEBIterator, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -53984,15 +58691,15 @@ static PyTypeObject __pyx_type_3_sa_StringMap = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_StringMap, /*tp_as_number*/
-  &__pyx_tp_as_sequence_StringMap, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_StringMap, /*tp_as_mapping*/
+  &__pyx_tp_as_number_VEBIterator, /*tp_as_number*/
+  &__pyx_tp_as_sequence_VEBIterator, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_VEBIterator, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_StringMap, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_VEBIterator, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
   0, /*tp_doc*/
   0, /*tp_traverse*/
@@ -54000,8 +58707,8 @@ static PyTypeObject __pyx_type_3_sa_StringMap = {
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  0, /*tp_iternext*/
-  __pyx_methods_3_sa_StringMap, /*tp_methods*/
+  __pyx_pw_3_sa_11VEBIterator_1__next__, /*tp_iternext*/
+  __pyx_methods_3_sa_VEBIterator, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -54011,7 +58718,7 @@ static PyTypeObject __pyx_type_3_sa_StringMap = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_StringMap, /*tp_new*/
+  __pyx_tp_new_3_sa_VEBIterator, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -54024,96 +58731,40 @@ static PyTypeObject __pyx_type_3_sa_StringMap = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_DataArray __pyx_vtable_3_sa_DataArray;
+static struct __pyx_vtabstruct_3_sa_VEB __pyx_vtable_3_sa_VEB;
 
-static PyObject *__pyx_tp_new_3_sa_DataArray(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_DataArray *p;
+static PyObject *__pyx_tp_new_3_sa_VEB(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_VEB *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_DataArray *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_DataArray;
-  p->word2id = Py_None; Py_INCREF(Py_None);
-  p->id2word = Py_None; Py_INCREF(Py_None);
-  p->data = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  p->sent_id = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_9DataArray___cinit__(o, a, k) < 0) {
+  p = ((struct __pyx_obj_3_sa_VEB *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_VEB;
+  if (__pyx_pw_3_sa_3VEB_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_DataArray(PyObject *o) {
-  struct __pyx_obj_3_sa_DataArray *p = (struct __pyx_obj_3_sa_DataArray *)o;
-  Py_XDECREF(p->word2id);
-  Py_XDECREF(p->id2word);
-  Py_XDECREF(((PyObject *)p->data));
-  Py_XDECREF(((PyObject *)p->sent_id));
-  Py_XDECREF(((PyObject *)p->sent_index));
-  (*Py_TYPE(o)->tp_free)(o);
-}
-
-static int __pyx_tp_traverse_3_sa_DataArray(PyObject *o, visitproc v, void *a) {
-  int e;
-  struct __pyx_obj_3_sa_DataArray *p = (struct __pyx_obj_3_sa_DataArray *)o;
-  if (p->word2id) {
-    e = (*v)(p->word2id, a); if (e) return e;
-  }
-  if (p->id2word) {
-    e = (*v)(p->id2word, a); if (e) return e;
-  }
-  if (p->data) {
-    e = (*v)(((PyObject*)p->data), a); if (e) return e;
-  }
-  if (p->sent_id) {
-    e = (*v)(((PyObject*)p->sent_id), a); if (e) return e;
-  }
-  if (p->sent_index) {
-    e = (*v)(((PyObject*)p->sent_index), a); if (e) return e;
+static void __pyx_tp_dealloc_3_sa_VEB(PyObject *o) {
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    ++Py_REFCNT(o);
+    __pyx_pw_3_sa_3VEB_3__dealloc__(o);
+    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
+    --Py_REFCNT(o);
+    PyErr_Restore(etype, eval, etb);
   }
-  return 0;
-}
-
-static int __pyx_tp_clear_3_sa_DataArray(PyObject *o) {
-  struct __pyx_obj_3_sa_DataArray *p = (struct __pyx_obj_3_sa_DataArray *)o;
-  PyObject* tmp;
-  tmp = ((PyObject*)p->word2id);
-  p->word2id = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->id2word);
-  p->id2word = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->data);
-  p->data = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->sent_id);
-  p->sent_id = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->sent_index);
-  p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  return 0;
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static PyMethodDef __pyx_methods_3_sa_DataArray[] = {
-  {__Pyx_NAMESTR("get_data"), (PyCFunction)__pyx_pf_3_sa_9DataArray_2get_data, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pf_3_sa_9DataArray_3get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pf_3_sa_9DataArray_4get_sentence, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pf_3_sa_9DataArray_5get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pf_3_sa_9DataArray_6get_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pf_3_sa_9DataArray_7get_word, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_9DataArray_8write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_9DataArray_9read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pf_3_sa_9DataArray_10read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pf_3_sa_9DataArray_11read_text_data, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_9DataArray_12read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_9DataArray_13write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pf_3_sa_9DataArray_14write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_9DataArray_15write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+static PyMethodDef __pyx_methods_3_sa_VEB[] = {
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_3VEB_7insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pw_3_sa_3VEB_9findsucc, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_DataArray = {
+static PyNumberMethods __pyx_tp_as_number_VEB = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -54171,26 +58822,26 @@ static PyNumberMethods __pyx_tp_as_number_DataArray = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
-  __pyx_pf_3_sa_9DataArray_1__len__, /*sq_length*/
+static PySequenceMethods __pyx_tp_as_sequence_VEB = {
+  __pyx_pw_3_sa_3VEB_11__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  0, /*sq_contains*/
+  __pyx_pw_3_sa_3VEB_13__contains__, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_DataArray = {
-  __pyx_pf_3_sa_9DataArray_1__len__, /*mp_length*/
+static PyMappingMethods __pyx_tp_as_mapping_VEB = {
+  __pyx_pw_3_sa_3VEB_11__len__, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_DataArray = {
+static PyBufferProcs __pyx_tp_as_buffer_VEB = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -54211,12 +58862,12 @@ static PyBufferProcs __pyx_tp_as_buffer_DataArray = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_DataArray = {
+static PyTypeObject __pyx_type_3_sa_VEB = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.DataArray"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_DataArray), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.VEB"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_VEB), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_DataArray, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_VEB, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -54226,24 +58877,24 @@ static PyTypeObject __pyx_type_3_sa_DataArray = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_DataArray, /*tp_as_number*/
-  &__pyx_tp_as_sequence_DataArray, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_DataArray, /*tp_as_mapping*/
+  &__pyx_tp_as_number_VEB, /*tp_as_number*/
+  &__pyx_tp_as_sequence_VEB, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_VEB, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_DataArray, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  &__pyx_tp_as_buffer_VEB, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_DataArray, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_DataArray, /*tp_clear*/
+  0, /*tp_traverse*/
+  0, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  0, /*tp_iter*/
+  __pyx_pw_3_sa_3VEB_5__iter__, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_DataArray, /*tp_methods*/
+  __pyx_methods_3_sa_VEB, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -54253,7 +58904,7 @@ static PyTypeObject __pyx_type_3_sa_DataArray = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_DataArray, /*tp_new*/
+  __pyx_tp_new_3_sa_VEB, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -54266,66 +58917,57 @@ static PyTypeObject __pyx_type_3_sa_DataArray = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_Alignment __pyx_vtable_3_sa_Alignment;
 
-static PyObject *__pyx_tp_new_3_sa_Alignment(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_Alignment *p;
+static PyObject *__pyx_tp_new_3_sa_LCP(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_LCP *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_Alignment *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_Alignment;
-  p->links = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_9Alignment_2__cinit__(o, a, k) < 0) {
+  p = ((struct __pyx_obj_3_sa_LCP *)o);
+  p->sa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
+  p->lcp = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_3LCP_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_Alignment(PyObject *o) {
-  struct __pyx_obj_3_sa_Alignment *p = (struct __pyx_obj_3_sa_Alignment *)o;
-  Py_XDECREF(((PyObject *)p->links));
-  Py_XDECREF(((PyObject *)p->sent_index));
+static void __pyx_tp_dealloc_3_sa_LCP(PyObject *o) {
+  struct __pyx_obj_3_sa_LCP *p = (struct __pyx_obj_3_sa_LCP *)o;
+  Py_CLEAR(p->sa);
+  Py_CLEAR(p->lcp);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_Alignment(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa_LCP(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_Alignment *p = (struct __pyx_obj_3_sa_Alignment *)o;
-  if (p->links) {
-    e = (*v)(((PyObject*)p->links), a); if (e) return e;
+  struct __pyx_obj_3_sa_LCP *p = (struct __pyx_obj_3_sa_LCP *)o;
+  if (p->sa) {
+    e = (*v)(((PyObject*)p->sa), a); if (e) return e;
   }
-  if (p->sent_index) {
-    e = (*v)(((PyObject*)p->sent_index), a); if (e) return e;
+  if (p->lcp) {
+    e = (*v)(((PyObject*)p->lcp), a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_Alignment(PyObject *o) {
-  struct __pyx_obj_3_sa_Alignment *p = (struct __pyx_obj_3_sa_Alignment *)o;
+static int __pyx_tp_clear_3_sa_LCP(PyObject *o) {
+  struct __pyx_obj_3_sa_LCP *p = (struct __pyx_obj_3_sa_LCP *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->links);
-  p->links = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->sa);
+  p->sa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->sent_index);
-  p->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->lcp);
+  p->lcp = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_Alignment[] = {
-  {__Pyx_NAMESTR("unlink"), (PyCFunction)__pyx_pf_3_sa_9Alignment_unlink, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_unlink)},
-  {__Pyx_NAMESTR("get_sent_links"), (PyCFunction)__pyx_pf_3_sa_9Alignment_1get_sent_links, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_9Alignment_3read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_9Alignment_4read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_9Alignment_5write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_9Alignment_6write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_9Alignment_7write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("alignment"), (PyCFunction)__pyx_pf_3_sa_9Alignment_8alignment, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_9Alignment_8alignment)},
+static PyMethodDef __pyx_methods_3_sa_LCP[] = {
+  {__Pyx_NAMESTR("compute_stats"), (PyCFunction)__pyx_pw_3_sa_3LCP_3compute_stats, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_3LCP_2compute_stats)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_Alignment = {
+static PyNumberMethods __pyx_tp_as_number_LCP = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -54383,7 +59025,7 @@ static PyNumberMethods __pyx_tp_as_number_Alignment = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_Alignment = {
+static PySequenceMethods __pyx_tp_as_sequence_LCP = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -54396,13 +59038,13 @@ static PySequenceMethods __pyx_tp_as_sequence_Alignment = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_Alignment = {
+static PyMappingMethods __pyx_tp_as_mapping_LCP = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_Alignment = {
+static PyBufferProcs __pyx_tp_as_buffer_LCP = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -54423,12 +59065,12 @@ static PyBufferProcs __pyx_tp_as_buffer_Alignment = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_Alignment = {
+static PyTypeObject __pyx_type_3_sa_LCP = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.Alignment"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_Alignment), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.LCP"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_LCP), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_Alignment, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_LCP, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -54438,24 +59080,24 @@ static PyTypeObject __pyx_type_3_sa_Alignment = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_Alignment, /*tp_as_number*/
-  &__pyx_tp_as_sequence_Alignment, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_Alignment, /*tp_as_mapping*/
+  &__pyx_tp_as_number_LCP, /*tp_as_number*/
+  &__pyx_tp_as_sequence_LCP, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_LCP, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_Alignment, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_LCP, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_Alignment, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_Alignment, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_LCP, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_LCP, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_Alignment, /*tp_methods*/
+  __pyx_methods_3_sa_LCP, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -54465,7 +59107,7 @@ static PyTypeObject __pyx_type_3_sa_Alignment = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_Alignment, /*tp_new*/
+  __pyx_tp_new_3_sa_LCP, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -54478,114 +59120,89 @@ static PyTypeObject __pyx_type_3_sa_Alignment = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_BiLex __pyx_vtable_3_sa_BiLex;
+static struct __pyx_vtabstruct_3_sa_Alphabet __pyx_vtable_3_sa_Alphabet;
 
-static PyObject *__pyx_tp_new_3_sa_BiLex(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_BiLex *p;
+static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa_Alphabet *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_BiLex *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_BiLex;
-  p->col1 = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
-  p->col2 = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
-  p->f_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  p->e_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  p->id2eword = Py_None; Py_INCREF(Py_None);
-  p->id2fword = Py_None; Py_INCREF(Py_None);
-  p->eword2id = Py_None; Py_INCREF(Py_None);
-  p->fword2id = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_5BiLex___cinit__(o, a, k) < 0) {
+  p = ((struct __pyx_obj_3_sa_Alphabet *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_Alphabet;
+  p->terminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
+  p->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
+  p->id2sym = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_8Alphabet_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_BiLex(PyObject *o) {
-  struct __pyx_obj_3_sa_BiLex *p = (struct __pyx_obj_3_sa_BiLex *)o;
-  Py_XDECREF(((PyObject *)p->col1));
-  Py_XDECREF(((PyObject *)p->col2));
-  Py_XDECREF(((PyObject *)p->f_index));
-  Py_XDECREF(((PyObject *)p->e_index));
-  Py_XDECREF(p->id2eword);
-  Py_XDECREF(p->id2fword);
-  Py_XDECREF(p->eword2id);
-  Py_XDECREF(p->fword2id);
+static void __pyx_tp_dealloc_3_sa_Alphabet(PyObject *o) {
+  struct __pyx_obj_3_sa_Alphabet *p = (struct __pyx_obj_3_sa_Alphabet *)o;
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    ++Py_REFCNT(o);
+    __pyx_pw_3_sa_8Alphabet_3__dealloc__(o);
+    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
+    --Py_REFCNT(o);
+    PyErr_Restore(etype, eval, etb);
+  }
+  Py_CLEAR(p->terminals);
+  Py_CLEAR(p->nonterminals);
+  Py_CLEAR(p->id2sym);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_BiLex(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa_Alphabet(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_BiLex *p = (struct __pyx_obj_3_sa_BiLex *)o;
-  if (p->col1) {
-    e = (*v)(((PyObject*)p->col1), a); if (e) return e;
-  }
-  if (p->col2) {
-    e = (*v)(((PyObject*)p->col2), a); if (e) return e;
-  }
-  if (p->f_index) {
-    e = (*v)(((PyObject*)p->f_index), a); if (e) return e;
-  }
-  if (p->e_index) {
-    e = (*v)(((PyObject*)p->e_index), a); if (e) return e;
-  }
-  if (p->id2eword) {
-    e = (*v)(p->id2eword, a); if (e) return e;
-  }
-  if (p->id2fword) {
-    e = (*v)(p->id2fword, a); if (e) return e;
+  struct __pyx_obj_3_sa_Alphabet *p = (struct __pyx_obj_3_sa_Alphabet *)o;
+  if (p->terminals) {
+    e = (*v)(((PyObject*)p->terminals), a); if (e) return e;
   }
-  if (p->eword2id) {
-    e = (*v)(p->eword2id, a); if (e) return e;
+  if (p->nonterminals) {
+    e = (*v)(((PyObject*)p->nonterminals), a); if (e) return e;
   }
-  if (p->fword2id) {
-    e = (*v)(p->fword2id, a); if (e) return e;
+  if (p->id2sym) {
+    e = (*v)(p->id2sym, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_BiLex(PyObject *o) {
-  struct __pyx_obj_3_sa_BiLex *p = (struct __pyx_obj_3_sa_BiLex *)o;
+static int __pyx_tp_clear_3_sa_Alphabet(PyObject *o) {
+  struct __pyx_obj_3_sa_Alphabet *p = (struct __pyx_obj_3_sa_Alphabet *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->col1);
-  p->col1 = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->col2);
-  p->col2 = ((struct __pyx_obj_3_sa_FloatList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->f_index);
-  p->f_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->e_index);
-  p->e_index = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->id2eword);
-  p->id2eword = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->id2fword);
-  p->id2fword = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->terminals);
+  p->terminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->eword2id);
-  p->eword2id = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->nonterminals);
+  p->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->fword2id);
-  p->fword2id = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->id2sym);
+  p->id2sym = ((PyObject*)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_BiLex[] = {
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_5BiLex_1write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_5BiLex_2read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_e_id"), (PyCFunction)__pyx_pf_3_sa_5BiLex_3get_e_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_f_id"), (PyCFunction)__pyx_pf_3_sa_5BiLex_4get_f_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_5BiLex_5read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_5BiLex_6write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_score"), (PyCFunction)__pyx_pf_3_sa_5BiLex_7get_score, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_5BiLex_8write_text, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_5BiLex_8write_text)},
+static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_8Alphabet_9terminals_1__get__(o);
+}
+
+static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(o);
+}
+
+static PyMethodDef __pyx_methods_3_sa_Alphabet[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_BiLex = {
+static struct PyGetSetDef __pyx_getsets_3_sa_Alphabet[] = {
+  {(char *)"terminals", __pyx_getprop_3_sa_8Alphabet_terminals, 0, 0, 0},
+  {(char *)"nonterminals", __pyx_getprop_3_sa_8Alphabet_nonterminals, 0, 0, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_Alphabet = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -54643,7 +59260,7 @@ static PyNumberMethods __pyx_tp_as_number_BiLex = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_BiLex = {
+static PySequenceMethods __pyx_tp_as_sequence_Alphabet = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -54656,13 +59273,13 @@ static PySequenceMethods __pyx_tp_as_sequence_BiLex = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_BiLex = {
+static PyMappingMethods __pyx_tp_as_mapping_Alphabet = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_BiLex = {
+static PyBufferProcs __pyx_tp_as_buffer_Alphabet = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -54683,12 +59300,12 @@ static PyBufferProcs __pyx_tp_as_buffer_BiLex = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_BiLex = {
+static PyTypeObject __pyx_type_3_sa_Alphabet = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.BiLex"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_BiLex), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.Alphabet"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_Alphabet), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_BiLex, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_Alphabet, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -54698,26 +59315,26 @@ static PyTypeObject __pyx_type_3_sa_BiLex = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_BiLex, /*tp_as_number*/
-  &__pyx_tp_as_sequence_BiLex, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_BiLex, /*tp_as_mapping*/
+  &__pyx_tp_as_number_Alphabet, /*tp_as_number*/
+  &__pyx_tp_as_sequence_Alphabet, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_Alphabet, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_BiLex, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_Alphabet, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_BiLex, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_BiLex, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_Alphabet, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_Alphabet, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_BiLex, /*tp_methods*/
+  __pyx_methods_3_sa_Alphabet, /*tp_methods*/
   0, /*tp_members*/
-  0, /*tp_getset*/
+  __pyx_getsets_3_sa_Alphabet, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
@@ -54725,7 +59342,7 @@ static PyTypeObject __pyx_type_3_sa_BiLex = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_BiLex, /*tp_new*/
+  __pyx_tp_new_3_sa_Alphabet, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -54738,23 +59355,41 @@ static PyTypeObject __pyx_type_3_sa_BiLex = {
   0, /*tp_version_tag*/
   #endif
 };
+static struct __pyx_vtabstruct_3_sa_TrieMap __pyx_vtable_3_sa_TrieMap;
 
-static PyObject *__pyx_tp_new_3_sa_BitSetIterator(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_TrieMap(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_TrieMap *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
+  p = ((struct __pyx_obj_3_sa_TrieMap *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_TrieMap;
+  if (__pyx_pw_3_sa_7TrieMap_1__cinit__(o, a, k) < 0) {
+    Py_DECREF(o); o = 0;
+  }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_BitSetIterator(PyObject *o) {
+static void __pyx_tp_dealloc_3_sa_TrieMap(PyObject *o) {
+  {
+    PyObject *etype, *eval, *etb;
+    PyErr_Fetch(&etype, &eval, &etb);
+    ++Py_REFCNT(o);
+    __pyx_pw_3_sa_7TrieMap_3__dealloc__(o);
+    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
+    --Py_REFCNT(o);
+    PyErr_Restore(etype, eval, etb);
+  }
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static PyMethodDef __pyx_methods_3_sa_BitSetIterator[] = {
-  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pf_3_sa_14BitSetIterator___next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
+static PyMethodDef __pyx_methods_3_sa_TrieMap[] = {
+  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_5insert, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("contains"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_7contains, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("toMap"), (PyCFunction)__pyx_pw_3_sa_7TrieMap_9toMap, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_BitSetIterator = {
+static PyNumberMethods __pyx_tp_as_number_TrieMap = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -54812,7 +59447,7 @@ static PyNumberMethods __pyx_tp_as_number_BitSetIterator = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_BitSetIterator = {
+static PySequenceMethods __pyx_tp_as_sequence_TrieMap = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -54825,13 +59460,13 @@ static PySequenceMethods __pyx_tp_as_sequence_BitSetIterator = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_BitSetIterator = {
+static PyMappingMethods __pyx_tp_as_mapping_TrieMap = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_BitSetIterator = {
+static PyBufferProcs __pyx_tp_as_buffer_TrieMap = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -54852,12 +59487,12 @@ static PyBufferProcs __pyx_tp_as_buffer_BitSetIterator = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
+static PyTypeObject __pyx_type_3_sa_TrieMap = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.BitSetIterator"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_BitSetIterator), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.TrieMap"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_TrieMap), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_BitSetIterator, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_TrieMap, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -54867,15 +59502,15 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_BitSetIterator, /*tp_as_number*/
-  &__pyx_tp_as_sequence_BitSetIterator, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_BitSetIterator, /*tp_as_mapping*/
+  &__pyx_tp_as_number_TrieMap, /*tp_as_number*/
+  &__pyx_tp_as_sequence_TrieMap, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_TrieMap, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_BitSetIterator, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_TrieMap, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
   0, /*tp_doc*/
   0, /*tp_traverse*/
@@ -54883,8 +59518,8 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  __pyx_pf_3_sa_14BitSetIterator___next__, /*tp_iternext*/
-  __pyx_methods_3_sa_BitSetIterator, /*tp_methods*/
+  0, /*tp_iternext*/
+  __pyx_methods_3_sa_TrieMap, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -54894,7 +59529,7 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_BitSetIterator, /*tp_new*/
+  __pyx_tp_new_3_sa_TrieMap, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -54907,38 +59542,61 @@ static PyTypeObject __pyx_type_3_sa_BitSetIterator = {
   0, /*tp_version_tag*/
   #endif
 };
+static struct __pyx_vtabstruct_3_sa_Precomputation __pyx_vtable_3_sa_Precomputation;
 
-static PyObject *__pyx_tp_new_3_sa_BitSet(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_Precomputation(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_Precomputation *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  if (__pyx_pf_3_sa_6BitSet___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  p = ((struct __pyx_obj_3_sa_Precomputation *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_Precomputation;
+  p->precomputed_index = Py_None; Py_INCREF(Py_None);
+  p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_14Precomputation_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_BitSet(PyObject *o) {
-  {
-    PyObject *etype, *eval, *etb;
-    PyErr_Fetch(&etype, &eval, &etb);
-    ++Py_REFCNT(o);
-    __pyx_pf_3_sa_6BitSet_1__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
-    --Py_REFCNT(o);
-    PyErr_Restore(etype, eval, etb);
-  }
+static void __pyx_tp_dealloc_3_sa_Precomputation(PyObject *o) {
+  struct __pyx_obj_3_sa_Precomputation *p = (struct __pyx_obj_3_sa_Precomputation *)o;
+  Py_CLEAR(p->precomputed_index);
+  Py_CLEAR(p->precomputed_collocations);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static PyMethodDef __pyx_methods_3_sa_BitSet[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_6BitSet_3insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pf_3_sa_6BitSet_4findsucc, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("min"), (PyCFunction)__pyx_pf_3_sa_6BitSet_6min, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("max"), (PyCFunction)__pyx_pf_3_sa_6BitSet_7max, METH_NOARGS, __Pyx_DOCSTR(0)},
+static int __pyx_tp_traverse_3_sa_Precomputation(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_3_sa_Precomputation *p = (struct __pyx_obj_3_sa_Precomputation *)o;
+  if (p->precomputed_index) {
+    e = (*v)(p->precomputed_index, a); if (e) return e;
+  }
+  if (p->precomputed_collocations) {
+    e = (*v)(p->precomputed_collocations, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_3_sa_Precomputation(PyObject *o) {
+  struct __pyx_obj_3_sa_Precomputation *p = (struct __pyx_obj_3_sa_Precomputation *)o;
+  PyObject* tmp;
+  tmp = ((PyObject*)p->precomputed_index);
+  p->precomputed_index = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->precomputed_collocations);
+  p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_3_sa_Precomputation[] = {
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_3read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_5write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pw_3_sa_14Precomputation_7precompute, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_BitSet = {
+static PyNumberMethods __pyx_tp_as_number_Precomputation = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -54996,26 +59654,26 @@ static PyNumberMethods __pyx_tp_as_number_BitSet = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_BitSet = {
-  __pyx_pf_3_sa_6BitSet_8__len__, /*sq_length*/
+static PySequenceMethods __pyx_tp_as_sequence_Precomputation = {
+  0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  __pyx_pf_3_sa_6BitSet_9__contains__, /*sq_contains*/
+  0, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_BitSet = {
-  __pyx_pf_3_sa_6BitSet_8__len__, /*mp_length*/
+static PyMappingMethods __pyx_tp_as_mapping_Precomputation = {
+  0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_BitSet = {
+static PyBufferProcs __pyx_tp_as_buffer_Precomputation = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -55036,12 +59694,12 @@ static PyBufferProcs __pyx_tp_as_buffer_BitSet = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_BitSet = {
+static PyTypeObject __pyx_type_3_sa_Precomputation = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.BitSet"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_BitSet), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.Precomputation"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_Precomputation), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_BitSet, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_Precomputation, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -55051,24 +59709,24 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_BitSet, /*tp_as_number*/
-  &__pyx_tp_as_sequence_BitSet, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_BitSet, /*tp_as_mapping*/
+  &__pyx_tp_as_number_Precomputation, /*tp_as_number*/
+  &__pyx_tp_as_sequence_Precomputation, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_Precomputation, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
-  __pyx_pf_3_sa_6BitSet_5__str__, /*tp_str*/
+  0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_BitSet, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  &__pyx_tp_as_buffer_Precomputation, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  0, /*tp_traverse*/
-  0, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_Precomputation, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_Precomputation, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_6BitSet_2__iter__, /*tp_iter*/
+  0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_BitSet, /*tp_methods*/
+  __pyx_methods_3_sa_Precomputation, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -55078,7 +59736,7 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_BitSet, /*tp_new*/
+  __pyx_tp_new_3_sa_Precomputation, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -55091,23 +59749,83 @@ static PyTypeObject __pyx_type_3_sa_BitSet = {
   0, /*tp_version_tag*/
   #endif
 };
+static struct __pyx_vtabstruct_3_sa_SuffixArray __pyx_vtable_3_sa_SuffixArray;
 
-static PyObject *__pyx_tp_new_3_sa_VEBIterator(PyTypeObject *t, PyObject *a, PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa_SuffixArray(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_SuffixArray *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
+  p = ((struct __pyx_obj_3_sa_SuffixArray *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_SuffixArray;
+  p->darray = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
+  p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->ha = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_11SuffixArray_1__cinit__(o, a, k) < 0) {
+    Py_DECREF(o); o = 0;
+  }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_VEBIterator(PyObject *o) {
+static void __pyx_tp_dealloc_3_sa_SuffixArray(PyObject *o) {
+  struct __pyx_obj_3_sa_SuffixArray *p = (struct __pyx_obj_3_sa_SuffixArray *)o;
+  Py_CLEAR(p->darray);
+  Py_CLEAR(p->sa);
+  Py_CLEAR(p->ha);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static PyMethodDef __pyx_methods_3_sa_VEBIterator[] = {
-  {__Pyx_NAMESTR("__next__"), (PyCFunction)__pyx_pf_3_sa_11VEBIterator___next__, METH_NOARGS|METH_COEXIST, __Pyx_DOCSTR(0)},
+static int __pyx_tp_traverse_3_sa_SuffixArray(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_3_sa_SuffixArray *p = (struct __pyx_obj_3_sa_SuffixArray *)o;
+  if (p->darray) {
+    e = (*v)(((PyObject*)p->darray), a); if (e) return e;
+  }
+  if (p->sa) {
+    e = (*v)(((PyObject*)p->sa), a); if (e) return e;
+  }
+  if (p->ha) {
+    e = (*v)(((PyObject*)p->ha), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_3_sa_SuffixArray(PyObject *o) {
+  struct __pyx_obj_3_sa_SuffixArray *p = (struct __pyx_obj_3_sa_SuffixArray *)o;
+  PyObject* tmp;
+  tmp = ((PyObject*)p->darray);
+  p->darray = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->sa);
+  p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->ha);
+  p->ha = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+static PyObject *__pyx_sq_item_3_sa_SuffixArray(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
+
+static PyMethodDef __pyx_methods_3_sa_SuffixArray[] = {
+  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_5get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_7get_sentence, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_9get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_11read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_10read_text)},
+  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_13q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_12q3sort)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_17read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_19write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_21write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_23lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_VEBIterator = {
+static PyNumberMethods __pyx_tp_as_number_SuffixArray = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -55165,11 +59883,11 @@ static PyNumberMethods __pyx_tp_as_number_VEBIterator = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_VEBIterator = {
+static PySequenceMethods __pyx_tp_as_sequence_SuffixArray = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
-  0, /*sq_item*/
+  __pyx_sq_item_3_sa_SuffixArray, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
@@ -55178,13 +59896,13 @@ static PySequenceMethods __pyx_tp_as_sequence_VEBIterator = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_VEBIterator = {
+static PyMappingMethods __pyx_tp_as_mapping_SuffixArray = {
   0, /*mp_length*/
-  0, /*mp_subscript*/
+  __pyx_pw_3_sa_11SuffixArray_3__getitem__, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_VEBIterator = {
+static PyBufferProcs __pyx_tp_as_buffer_SuffixArray = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -55205,12 +59923,12 @@ static PyBufferProcs __pyx_tp_as_buffer_VEBIterator = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_VEBIterator = {
+static PyTypeObject __pyx_type_3_sa_SuffixArray = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.VEBIterator"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_VEBIterator), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.SuffixArray"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_SuffixArray), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_VEBIterator, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_SuffixArray, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -55220,24 +59938,24 @@ static PyTypeObject __pyx_type_3_sa_VEBIterator = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_VEBIterator, /*tp_as_number*/
-  &__pyx_tp_as_sequence_VEBIterator, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_VEBIterator, /*tp_as_mapping*/
+  &__pyx_tp_as_number_SuffixArray, /*tp_as_number*/
+  &__pyx_tp_as_sequence_SuffixArray, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_SuffixArray, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_VEBIterator, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  &__pyx_tp_as_buffer_SuffixArray, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  0, /*tp_traverse*/
-  0, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_SuffixArray, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_SuffixArray, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
-  __pyx_pf_3_sa_11VEBIterator___next__, /*tp_iternext*/
-  __pyx_methods_3_sa_VEBIterator, /*tp_methods*/
+  0, /*tp_iternext*/
+  __pyx_methods_3_sa_SuffixArray, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -55247,7 +59965,7 @@ static PyTypeObject __pyx_type_3_sa_VEBIterator = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_VEBIterator, /*tp_new*/
+  __pyx_tp_new_3_sa_SuffixArray, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -55260,40 +59978,66 @@ static PyTypeObject __pyx_type_3_sa_VEBIterator = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_VEB __pyx_vtable_3_sa_VEB;
 
-static PyObject *__pyx_tp_new_3_sa_VEB(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_VEB *p;
+static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa_TrieNode *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_VEB *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_VEB;
-  if (__pyx_pf_3_sa_3VEB___cinit__(o, a, k) < 0) {
+  p = ((struct __pyx_obj_3_sa_TrieNode *)o);
+  p->children = Py_None; Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_8TrieNode_1__cinit__(o, __pyx_empty_tuple, NULL) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_VEB(PyObject *o) {
-  {
-    PyObject *etype, *eval, *etb;
-    PyErr_Fetch(&etype, &eval, &etb);
-    ++Py_REFCNT(o);
-    __pyx_pf_3_sa_3VEB_1__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
-    --Py_REFCNT(o);
-    PyErr_Restore(etype, eval, etb);
-  }
+static void __pyx_tp_dealloc_3_sa_TrieNode(PyObject *o) {
+  struct __pyx_obj_3_sa_TrieNode *p = (struct __pyx_obj_3_sa_TrieNode *)o;
+  Py_CLEAR(p->children);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static PyMethodDef __pyx_methods_3_sa_VEB[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_3VEB_3insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("findsucc"), (PyCFunction)__pyx_pf_3_sa_3VEB_4findsucc, METH_O, __Pyx_DOCSTR(0)},
+static int __pyx_tp_traverse_3_sa_TrieNode(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_3_sa_TrieNode *p = (struct __pyx_obj_3_sa_TrieNode *)o;
+  if (p->children) {
+    e = (*v)(p->children, a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_3_sa_TrieNode(PyObject *o) {
+  struct __pyx_obj_3_sa_TrieNode *p = (struct __pyx_obj_3_sa_TrieNode *)o;
+  PyObject* tmp;
+  tmp = ((PyObject*)p->children);
+  p->children = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_8TrieNode_8children_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_8TrieNode_children(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_8TrieNode_8children_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_3_sa_8TrieNode_8children_5__del__(o);
+  }
+}
+
+static PyMethodDef __pyx_methods_3_sa_TrieNode[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_VEB = {
+static struct PyGetSetDef __pyx_getsets_3_sa_TrieNode[] = {
+  {(char *)"children", __pyx_getprop_3_sa_8TrieNode_children, __pyx_setprop_3_sa_8TrieNode_children, 0, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_TrieNode = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -55351,26 +60095,26 @@ static PyNumberMethods __pyx_tp_as_number_VEB = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_VEB = {
-  __pyx_pf_3_sa_3VEB_5__len__, /*sq_length*/
+static PySequenceMethods __pyx_tp_as_sequence_TrieNode = {
+  0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
   0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
-  __pyx_pf_3_sa_3VEB_6__contains__, /*sq_contains*/
+  0, /*sq_contains*/
   0, /*sq_inplace_concat*/
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_VEB = {
-  __pyx_pf_3_sa_3VEB_5__len__, /*mp_length*/
+static PyMappingMethods __pyx_tp_as_mapping_TrieNode = {
+  0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_VEB = {
+static PyBufferProcs __pyx_tp_as_buffer_TrieNode = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -55391,12 +60135,12 @@ static PyBufferProcs __pyx_tp_as_buffer_VEB = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_VEB = {
+static PyTypeObject __pyx_type_3_sa_TrieNode = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.VEB"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_VEB), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.TrieNode"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_TrieNode), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_VEB, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_TrieNode, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -55406,26 +60150,26 @@ static PyTypeObject __pyx_type_3_sa_VEB = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_VEB, /*tp_as_number*/
-  &__pyx_tp_as_sequence_VEB, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_VEB, /*tp_as_mapping*/
+  &__pyx_tp_as_number_TrieNode, /*tp_as_number*/
+  &__pyx_tp_as_sequence_TrieNode, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_TrieNode, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_VEB, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  &__pyx_tp_as_buffer_TrieNode, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  0, /*tp_traverse*/
-  0, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_TrieNode, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_TrieNode, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  __pyx_pf_3_sa_3VEB_2__iter__, /*tp_iter*/
+  0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_VEB, /*tp_methods*/
+  __pyx_methods_3_sa_TrieNode, /*tp_methods*/
   0, /*tp_members*/
-  0, /*tp_getset*/
+  __pyx_getsets_3_sa_TrieNode, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
@@ -55433,7 +60177,7 @@ static PyTypeObject __pyx_type_3_sa_VEB = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_VEB, /*tp_new*/
+  __pyx_tp_new_3_sa_TrieNode, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -55447,56 +60191,111 @@ static PyTypeObject __pyx_type_3_sa_VEB = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_LCP(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_LCP *p;
-  PyObject *o = (*t->tp_alloc)(t, 0);
+static PyObject *__pyx_tp_new_3_sa_ExtendedTrieNode(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_ExtendedTrieNode *p;
+  PyObject *o = __pyx_tp_new_3_sa_TrieNode(t, a, k);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_LCP *)o);
-  p->sa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
-  p->lcp = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_3LCP___cinit__(o, a, k) < 0) {
+  p = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)o);
+  p->phrase = Py_None; Py_INCREF(Py_None);
+  p->phrase_location = Py_None; Py_INCREF(Py_None);
+  p->suffix_link = Py_None; Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_LCP(PyObject *o) {
-  struct __pyx_obj_3_sa_LCP *p = (struct __pyx_obj_3_sa_LCP *)o;
-  Py_XDECREF(((PyObject *)p->sa));
-  Py_XDECREF(((PyObject *)p->lcp));
-  (*Py_TYPE(o)->tp_free)(o);
+static void __pyx_tp_dealloc_3_sa_ExtendedTrieNode(PyObject *o) {
+  struct __pyx_obj_3_sa_ExtendedTrieNode *p = (struct __pyx_obj_3_sa_ExtendedTrieNode *)o;
+  Py_CLEAR(p->phrase);
+  Py_CLEAR(p->phrase_location);
+  Py_CLEAR(p->suffix_link);
+  __pyx_tp_dealloc_3_sa_TrieNode(o);
 }
 
-static int __pyx_tp_traverse_3_sa_LCP(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa_ExtendedTrieNode(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_LCP *p = (struct __pyx_obj_3_sa_LCP *)o;
-  if (p->sa) {
-    e = (*v)(((PyObject*)p->sa), a); if (e) return e;
+  struct __pyx_obj_3_sa_ExtendedTrieNode *p = (struct __pyx_obj_3_sa_ExtendedTrieNode *)o;
+  e = __pyx_tp_traverse_3_sa_TrieNode(o, v, a); if (e) return e;
+  if (p->phrase) {
+    e = (*v)(p->phrase, a); if (e) return e;
   }
-  if (p->lcp) {
-    e = (*v)(((PyObject*)p->lcp), a); if (e) return e;
+  if (p->phrase_location) {
+    e = (*v)(p->phrase_location, a); if (e) return e;
+  }
+  if (p->suffix_link) {
+    e = (*v)(p->suffix_link, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_LCP(PyObject *o) {
-  struct __pyx_obj_3_sa_LCP *p = (struct __pyx_obj_3_sa_LCP *)o;
+static int __pyx_tp_clear_3_sa_ExtendedTrieNode(PyObject *o) {
+  struct __pyx_obj_3_sa_ExtendedTrieNode *p = (struct __pyx_obj_3_sa_ExtendedTrieNode *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->sa);
-  p->sa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
+  __pyx_tp_clear_3_sa_TrieNode(o);
+  tmp = ((PyObject*)p->phrase);
+  p->phrase = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->lcp);
-  p->lcp = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->phrase_location);
+  p->phrase_location = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->suffix_link);
+  p->suffix_link = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_LCP[] = {
-  {__Pyx_NAMESTR("compute_stats"), (PyCFunction)__pyx_pf_3_sa_3LCP_1compute_stats, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_3LCP_1compute_stats)},
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_3_sa_16ExtendedTrieNode_6phrase_5__del__(o);
+  }
+}
+
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_5__del__(o);
+  }
+}
+
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_5__del__(o);
+  }
+}
+
+static PyMethodDef __pyx_methods_3_sa_ExtendedTrieNode[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_LCP = {
+static struct PyGetSetDef __pyx_getsets_3_sa_ExtendedTrieNode[] = {
+  {(char *)"phrase", __pyx_getprop_3_sa_16ExtendedTrieNode_phrase, __pyx_setprop_3_sa_16ExtendedTrieNode_phrase, 0, 0},
+  {(char *)"phrase_location", __pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location, __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location, 0, 0},
+  {(char *)"suffix_link", __pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link, __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link, 0, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_ExtendedTrieNode = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -55554,7 +60353,7 @@ static PyNumberMethods __pyx_tp_as_number_LCP = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_LCP = {
+static PySequenceMethods __pyx_tp_as_sequence_ExtendedTrieNode = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -55567,13 +60366,13 @@ static PySequenceMethods __pyx_tp_as_sequence_LCP = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_LCP = {
+static PyMappingMethods __pyx_tp_as_mapping_ExtendedTrieNode = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_LCP = {
+static PyBufferProcs __pyx_tp_as_buffer_ExtendedTrieNode = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -55594,12 +60393,12 @@ static PyBufferProcs __pyx_tp_as_buffer_LCP = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_LCP = {
+static PyTypeObject __pyx_type_3_sa_ExtendedTrieNode = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.LCP"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_LCP), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.ExtendedTrieNode"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_ExtendedTrieNode), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_LCP, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_ExtendedTrieNode, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -55609,26 +60408,26 @@ static PyTypeObject __pyx_type_3_sa_LCP = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_LCP, /*tp_as_number*/
-  &__pyx_tp_as_sequence_LCP, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_LCP, /*tp_as_mapping*/
+  &__pyx_tp_as_number_ExtendedTrieNode, /*tp_as_number*/
+  &__pyx_tp_as_sequence_ExtendedTrieNode, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_ExtendedTrieNode, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_LCP, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_ExtendedTrieNode, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_LCP, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_LCP, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_ExtendedTrieNode, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_ExtendedTrieNode, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_LCP, /*tp_methods*/
+  __pyx_methods_3_sa_ExtendedTrieNode, /*tp_methods*/
   0, /*tp_members*/
-  0, /*tp_getset*/
+  __pyx_getsets_3_sa_ExtendedTrieNode, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
@@ -55636,7 +60435,7 @@ static PyTypeObject __pyx_type_3_sa_LCP = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_LCP, /*tp_new*/
+  __pyx_tp_new_3_sa_ExtendedTrieNode, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -55649,89 +60448,96 @@ static PyTypeObject __pyx_type_3_sa_LCP = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_Alphabet __pyx_vtable_3_sa_Alphabet;
 
-static PyObject *__pyx_tp_new_3_sa_Alphabet(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_Alphabet *p;
+static PyObject *__pyx_tp_new_3_sa_TrieTable(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_TrieTable *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_Alphabet *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_Alphabet;
-  p->terminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
-  p->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
-  p->id2sym = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_8Alphabet___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
+  p = ((struct __pyx_obj_3_sa_TrieTable *)o);
+  p->root = Py_None; Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_9TrieTable_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_Alphabet(PyObject *o) {
-  struct __pyx_obj_3_sa_Alphabet *p = (struct __pyx_obj_3_sa_Alphabet *)o;
-  {
-    PyObject *etype, *eval, *etb;
-    PyErr_Fetch(&etype, &eval, &etb);
-    ++Py_REFCNT(o);
-    __pyx_pf_3_sa_8Alphabet_1__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
-    --Py_REFCNT(o);
-    PyErr_Restore(etype, eval, etb);
-  }
-  Py_XDECREF(((PyObject *)p->terminals));
-  Py_XDECREF(((PyObject *)p->nonterminals));
-  Py_XDECREF(((PyObject *)p->id2sym));
+static void __pyx_tp_dealloc_3_sa_TrieTable(PyObject *o) {
+  struct __pyx_obj_3_sa_TrieTable *p = (struct __pyx_obj_3_sa_TrieTable *)o;
+  Py_CLEAR(p->root);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_Alphabet(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa_TrieTable(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_Alphabet *p = (struct __pyx_obj_3_sa_Alphabet *)o;
-  if (p->terminals) {
-    e = (*v)(((PyObject*)p->terminals), a); if (e) return e;
-  }
-  if (p->nonterminals) {
-    e = (*v)(((PyObject*)p->nonterminals), a); if (e) return e;
-  }
-  if (p->id2sym) {
-    e = (*v)(p->id2sym, a); if (e) return e;
+  struct __pyx_obj_3_sa_TrieTable *p = (struct __pyx_obj_3_sa_TrieTable *)o;
+  if (p->root) {
+    e = (*v)(p->root, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_Alphabet(PyObject *o) {
-  struct __pyx_obj_3_sa_Alphabet *p = (struct __pyx_obj_3_sa_Alphabet *)o;
+static int __pyx_tp_clear_3_sa_TrieTable(PyObject *o) {
+  struct __pyx_obj_3_sa_TrieTable *p = (struct __pyx_obj_3_sa_TrieTable *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->terminals);
-  p->terminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->nonterminals);
-  p->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->id2sym);
-  p->id2sym = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->root);
+  p->root = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_8Alphabet_9terminals___get__(o);
+static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9TrieTable_8extended_1__get__(o);
 }
 
-static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_8Alphabet_12nonterminals___get__(o);
+static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_9TrieTable_8extended_3__set__(o, v);
+  }
+  else {
+    PyErr_SetString(PyExc_NotImplementedError, "__del__");
+    return -1;
+  }
 }
 
-static PyMethodDef __pyx_methods_3_sa_Alphabet[] = {
+static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9TrieTable_5count_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_9TrieTable_5count_3__set__(o, v);
+  }
+  else {
+    PyErr_SetString(PyExc_NotImplementedError, "__del__");
+    return -1;
+  }
+}
+
+static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9TrieTable_4root_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_9TrieTable_root(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_9TrieTable_4root_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_3_sa_9TrieTable_4root_5__del__(o);
+  }
+}
+
+static PyMethodDef __pyx_methods_3_sa_TrieTable[] = {
   {0, 0, 0, 0}
 };
 
-static struct PyGetSetDef __pyx_getsets_3_sa_Alphabet[] = {
-  {(char *)"terminals", __pyx_getprop_3_sa_8Alphabet_terminals, 0, 0, 0},
-  {(char *)"nonterminals", __pyx_getprop_3_sa_8Alphabet_nonterminals, 0, 0, 0},
+static struct PyGetSetDef __pyx_getsets_3_sa_TrieTable[] = {
+  {(char *)"extended", __pyx_getprop_3_sa_9TrieTable_extended, __pyx_setprop_3_sa_9TrieTable_extended, 0, 0},
+  {(char *)"count", __pyx_getprop_3_sa_9TrieTable_count, __pyx_setprop_3_sa_9TrieTable_count, 0, 0},
+  {(char *)"root", __pyx_getprop_3_sa_9TrieTable_root, __pyx_setprop_3_sa_9TrieTable_root, 0, 0},
   {0, 0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_Alphabet = {
+static PyNumberMethods __pyx_tp_as_number_TrieTable = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -55789,7 +60595,7 @@ static PyNumberMethods __pyx_tp_as_number_Alphabet = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_Alphabet = {
+static PySequenceMethods __pyx_tp_as_sequence_TrieTable = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -55802,13 +60608,13 @@ static PySequenceMethods __pyx_tp_as_sequence_Alphabet = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_Alphabet = {
+static PyMappingMethods __pyx_tp_as_mapping_TrieTable = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_Alphabet = {
+static PyBufferProcs __pyx_tp_as_buffer_TrieTable = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -55829,12 +60635,12 @@ static PyBufferProcs __pyx_tp_as_buffer_Alphabet = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_Alphabet = {
+static PyTypeObject __pyx_type_3_sa_TrieTable = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.Alphabet"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_Alphabet), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.TrieTable"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_TrieTable), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_Alphabet, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_TrieTable, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -55844,26 +60650,26 @@ static PyTypeObject __pyx_type_3_sa_Alphabet = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_Alphabet, /*tp_as_number*/
-  &__pyx_tp_as_sequence_Alphabet, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_Alphabet, /*tp_as_mapping*/
+  &__pyx_tp_as_number_TrieTable, /*tp_as_number*/
+  &__pyx_tp_as_sequence_TrieTable, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_TrieTable, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_Alphabet, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_TrieTable, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_Alphabet, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_Alphabet, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_TrieTable, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_TrieTable, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_Alphabet, /*tp_methods*/
+  __pyx_methods_3_sa_TrieTable, /*tp_methods*/
   0, /*tp_members*/
-  __pyx_getsets_3_sa_Alphabet, /*tp_getset*/
+  __pyx_getsets_3_sa_TrieTable, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
@@ -55871,7 +60677,7 @@ static PyTypeObject __pyx_type_3_sa_Alphabet = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_Alphabet, /*tp_new*/
+  __pyx_tp_new_3_sa_TrieTable, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -55884,41 +60690,50 @@ static PyTypeObject __pyx_type_3_sa_Alphabet = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_TrieMap __pyx_vtable_3_sa_TrieMap;
+static struct __pyx_vtabstruct_3_sa_PhraseLocation __pyx_vtable_3_sa_PhraseLocation;
 
-static PyObject *__pyx_tp_new_3_sa_TrieMap(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_TrieMap *p;
+static PyObject *__pyx_tp_new_3_sa_PhraseLocation(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_PhraseLocation *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_TrieMap *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_TrieMap;
-  if (__pyx_pf_3_sa_7TrieMap___cinit__(o, a, k) < 0) {
+  p = ((struct __pyx_obj_3_sa_PhraseLocation *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_PhraseLocation;
+  p->arr = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_14PhraseLocation_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_TrieMap(PyObject *o) {
-  {
-    PyObject *etype, *eval, *etb;
-    PyErr_Fetch(&etype, &eval, &etb);
-    ++Py_REFCNT(o);
-    __pyx_pf_3_sa_7TrieMap_1__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
-    --Py_REFCNT(o);
-    PyErr_Restore(etype, eval, etb);
-  }
+static void __pyx_tp_dealloc_3_sa_PhraseLocation(PyObject *o) {
+  struct __pyx_obj_3_sa_PhraseLocation *p = (struct __pyx_obj_3_sa_PhraseLocation *)o;
+  Py_CLEAR(p->arr);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static PyMethodDef __pyx_methods_3_sa_TrieMap[] = {
-  {__Pyx_NAMESTR("insert"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_2insert, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("contains"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_3contains, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("toMap"), (PyCFunction)__pyx_pf_3_sa_7TrieMap_4toMap, METH_O, __Pyx_DOCSTR(0)},
+static int __pyx_tp_traverse_3_sa_PhraseLocation(PyObject *o, visitproc v, void *a) {
+  int e;
+  struct __pyx_obj_3_sa_PhraseLocation *p = (struct __pyx_obj_3_sa_PhraseLocation *)o;
+  if (p->arr) {
+    e = (*v)(((PyObject*)p->arr), a); if (e) return e;
+  }
+  return 0;
+}
+
+static int __pyx_tp_clear_3_sa_PhraseLocation(PyObject *o) {
+  struct __pyx_obj_3_sa_PhraseLocation *p = (struct __pyx_obj_3_sa_PhraseLocation *)o;
+  PyObject* tmp;
+  tmp = ((PyObject*)p->arr);
+  p->arr = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  return 0;
+}
+
+static PyMethodDef __pyx_methods_3_sa_PhraseLocation[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_TrieMap = {
+static PyNumberMethods __pyx_tp_as_number_PhraseLocation = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -55976,7 +60791,7 @@ static PyNumberMethods __pyx_tp_as_number_TrieMap = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_TrieMap = {
+static PySequenceMethods __pyx_tp_as_sequence_PhraseLocation = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -55989,13 +60804,13 @@ static PySequenceMethods __pyx_tp_as_sequence_TrieMap = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_TrieMap = {
+static PyMappingMethods __pyx_tp_as_mapping_PhraseLocation = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_TrieMap = {
+static PyBufferProcs __pyx_tp_as_buffer_PhraseLocation = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -56016,12 +60831,12 @@ static PyBufferProcs __pyx_tp_as_buffer_TrieMap = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_TrieMap = {
+static PyTypeObject __pyx_type_3_sa_PhraseLocation = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.TrieMap"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_TrieMap), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.PhraseLocation"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_PhraseLocation), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_TrieMap, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_PhraseLocation, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -56031,24 +60846,24 @@ static PyTypeObject __pyx_type_3_sa_TrieMap = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_TrieMap, /*tp_as_number*/
-  &__pyx_tp_as_sequence_TrieMap, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_TrieMap, /*tp_as_mapping*/
+  &__pyx_tp_as_number_PhraseLocation, /*tp_as_number*/
+  &__pyx_tp_as_sequence_PhraseLocation, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_PhraseLocation, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_TrieMap, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+  &__pyx_tp_as_buffer_PhraseLocation, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  0, /*tp_traverse*/
-  0, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_PhraseLocation, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_PhraseLocation, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_TrieMap, /*tp_methods*/
+  __pyx_methods_3_sa_PhraseLocation, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -56058,7 +60873,7 @@ static PyTypeObject __pyx_type_3_sa_TrieMap = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_TrieMap, /*tp_new*/
+  __pyx_tp_new_3_sa_PhraseLocation, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -56071,61 +60886,49 @@ static PyTypeObject __pyx_type_3_sa_TrieMap = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_Precomputation __pyx_vtable_3_sa_Precomputation;
 
-static PyObject *__pyx_tp_new_3_sa_Precomputation(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_Precomputation *p;
+static PyObject *__pyx_tp_new_3_sa_Sampler(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_Sampler *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_Precomputation *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_Precomputation;
-  p->precomputed_index = Py_None; Py_INCREF(Py_None);
-  p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_14Precomputation___cinit__(o, a, k) < 0) {
+  p = ((struct __pyx_obj_3_sa_Sampler *)o);
+  p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_7Sampler_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_Precomputation(PyObject *o) {
-  struct __pyx_obj_3_sa_Precomputation *p = (struct __pyx_obj_3_sa_Precomputation *)o;
-  Py_XDECREF(p->precomputed_index);
-  Py_XDECREF(p->precomputed_collocations);
+static void __pyx_tp_dealloc_3_sa_Sampler(PyObject *o) {
+  struct __pyx_obj_3_sa_Sampler *p = (struct __pyx_obj_3_sa_Sampler *)o;
+  Py_CLEAR(p->sa);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_Precomputation(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa_Sampler(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_Precomputation *p = (struct __pyx_obj_3_sa_Precomputation *)o;
-  if (p->precomputed_index) {
-    e = (*v)(p->precomputed_index, a); if (e) return e;
-  }
-  if (p->precomputed_collocations) {
-    e = (*v)(p->precomputed_collocations, a); if (e) return e;
+  struct __pyx_obj_3_sa_Sampler *p = (struct __pyx_obj_3_sa_Sampler *)o;
+  if (p->sa) {
+    e = (*v)(((PyObject*)p->sa), a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_Precomputation(PyObject *o) {
-  struct __pyx_obj_3_sa_Precomputation *p = (struct __pyx_obj_3_sa_Precomputation *)o;
+static int __pyx_tp_clear_3_sa_Sampler(PyObject *o) {
+  struct __pyx_obj_3_sa_Sampler *p = (struct __pyx_obj_3_sa_Sampler *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->precomputed_index);
-  p->precomputed_index = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->precomputed_collocations);
-  p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->sa);
+  p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_Precomputation[] = {
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_1read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_2write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pf_3_sa_14Precomputation_3precompute, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+static PyMethodDef __pyx_methods_3_sa_Sampler[] = {
+  {__Pyx_NAMESTR("sample"), (PyCFunction)__pyx_pw_3_sa_7Sampler_3sample, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_7Sampler_2sample)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_Precomputation = {
+static PyNumberMethods __pyx_tp_as_number_Sampler = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -56183,7 +60986,7 @@ static PyNumberMethods __pyx_tp_as_number_Precomputation = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_Precomputation = {
+static PySequenceMethods __pyx_tp_as_sequence_Sampler = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -56196,13 +60999,13 @@ static PySequenceMethods __pyx_tp_as_sequence_Precomputation = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_Precomputation = {
+static PyMappingMethods __pyx_tp_as_mapping_Sampler = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_Precomputation = {
+static PyBufferProcs __pyx_tp_as_buffer_Sampler = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -56223,12 +61026,12 @@ static PyBufferProcs __pyx_tp_as_buffer_Precomputation = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_Precomputation = {
+static PyTypeObject __pyx_type_3_sa_Sampler = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.Precomputation"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_Precomputation), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.Sampler"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_Sampler), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_Precomputation, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_Sampler, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -56238,24 +61041,24 @@ static PyTypeObject __pyx_type_3_sa_Precomputation = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_Precomputation, /*tp_as_number*/
-  &__pyx_tp_as_sequence_Precomputation, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_Precomputation, /*tp_as_mapping*/
+  &__pyx_tp_as_number_Sampler, /*tp_as_number*/
+  &__pyx_tp_as_sequence_Sampler, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_Sampler, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_Precomputation, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_Sampler, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_Precomputation, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_Precomputation, /*tp_clear*/
+  __Pyx_DOCSTR("A Sampler implements a logic for choosing\n    samples from a population range"), /*tp_doc*/
+  __pyx_tp_traverse_3_sa_Sampler, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_Sampler, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_Precomputation, /*tp_methods*/
+  __pyx_methods_3_sa_Sampler, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -56265,7 +61068,7 @@ static PyTypeObject __pyx_type_3_sa_Precomputation = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_Precomputation, /*tp_new*/
+  __pyx_tp_new_3_sa_Sampler, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -56278,83 +61081,181 @@ static PyTypeObject __pyx_type_3_sa_Precomputation = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_SuffixArray __pyx_vtable_3_sa_SuffixArray;
+static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory __pyx_vtable_3_sa_HieroCachingRuleFactory;
 
-static PyObject *__pyx_tp_new_3_sa_SuffixArray(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_SuffixArray *p;
+static PyObject *__pyx_tp_new_3_sa_HieroCachingRuleFactory(PyTypeObject *t, PyObject *a, PyObject *k) {
+  struct __pyx_obj_3_sa_HieroCachingRuleFactory *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_SuffixArray *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_SuffixArray;
-  p->darray = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
-  p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  p->ha = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_11SuffixArray___cinit__(o, a, k) < 0) {
+  p = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_HieroCachingRuleFactory;
+  p->rules = ((struct __pyx_obj_3_sa_TrieTable *)Py_None); Py_INCREF(Py_None);
+  p->sampler = ((struct __pyx_obj_3_sa_Sampler *)Py_None); Py_INCREF(Py_None);
+  p->scorer = ((struct __pyx_obj_3_sa_Scorer *)Py_None); Py_INCREF(Py_None);
+  p->precomputed_index = Py_None; Py_INCREF(Py_None);
+  p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
+  p->precompute_file = Py_None; Py_INCREF(Py_None);
+  p->max_rank = Py_None; Py_INCREF(Py_None);
+  p->prev_norm_prefix = Py_None; Py_INCREF(Py_None);
+  p->fsa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
+  p->fda = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
+  p->eda = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
+  p->alignment = ((struct __pyx_obj_3_sa_Alignment *)Py_None); Py_INCREF(Py_None);
+  p->eid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->fid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->findexes = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  p->findexes1 = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  if (__pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(o, a, k) < 0) {
     Py_DECREF(o); o = 0;
   }
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_SuffixArray(PyObject *o) {
-  struct __pyx_obj_3_sa_SuffixArray *p = (struct __pyx_obj_3_sa_SuffixArray *)o;
-  Py_XDECREF(((PyObject *)p->darray));
-  Py_XDECREF(((PyObject *)p->sa));
-  Py_XDECREF(((PyObject *)p->ha));
+static void __pyx_tp_dealloc_3_sa_HieroCachingRuleFactory(PyObject *o) {
+  struct __pyx_obj_3_sa_HieroCachingRuleFactory *p = (struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o;
+  Py_CLEAR(p->rules);
+  Py_CLEAR(p->sampler);
+  Py_CLEAR(p->scorer);
+  Py_CLEAR(p->precomputed_index);
+  Py_CLEAR(p->precomputed_collocations);
+  Py_CLEAR(p->precompute_file);
+  Py_CLEAR(p->max_rank);
+  Py_CLEAR(p->prev_norm_prefix);
+  Py_CLEAR(p->fsa);
+  Py_CLEAR(p->fda);
+  Py_CLEAR(p->eda);
+  Py_CLEAR(p->alignment);
+  Py_CLEAR(p->eid2symid);
+  Py_CLEAR(p->fid2symid);
+  Py_CLEAR(p->findexes);
+  Py_CLEAR(p->findexes1);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_SuffixArray(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa_HieroCachingRuleFactory(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_SuffixArray *p = (struct __pyx_obj_3_sa_SuffixArray *)o;
-  if (p->darray) {
-    e = (*v)(((PyObject*)p->darray), a); if (e) return e;
+  struct __pyx_obj_3_sa_HieroCachingRuleFactory *p = (struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o;
+  if (p->rules) {
+    e = (*v)(((PyObject*)p->rules), a); if (e) return e;
   }
-  if (p->sa) {
-    e = (*v)(((PyObject*)p->sa), a); if (e) return e;
+  if (p->sampler) {
+    e = (*v)(((PyObject*)p->sampler), a); if (e) return e;
   }
-  if (p->ha) {
-    e = (*v)(((PyObject*)p->ha), a); if (e) return e;
+  if (p->scorer) {
+    e = (*v)(((PyObject*)p->scorer), a); if (e) return e;
+  }
+  if (p->precomputed_index) {
+    e = (*v)(p->precomputed_index, a); if (e) return e;
+  }
+  if (p->precomputed_collocations) {
+    e = (*v)(p->precomputed_collocations, a); if (e) return e;
+  }
+  if (p->precompute_file) {
+    e = (*v)(p->precompute_file, a); if (e) return e;
+  }
+  if (p->max_rank) {
+    e = (*v)(p->max_rank, a); if (e) return e;
+  }
+  if (p->prev_norm_prefix) {
+    e = (*v)(p->prev_norm_prefix, a); if (e) return e;
+  }
+  if (p->fsa) {
+    e = (*v)(((PyObject*)p->fsa), a); if (e) return e;
+  }
+  if (p->fda) {
+    e = (*v)(((PyObject*)p->fda), a); if (e) return e;
+  }
+  if (p->eda) {
+    e = (*v)(((PyObject*)p->eda), a); if (e) return e;
+  }
+  if (p->alignment) {
+    e = (*v)(((PyObject*)p->alignment), a); if (e) return e;
+  }
+  if (p->eid2symid) {
+    e = (*v)(((PyObject*)p->eid2symid), a); if (e) return e;
+  }
+  if (p->fid2symid) {
+    e = (*v)(((PyObject*)p->fid2symid), a); if (e) return e;
+  }
+  if (p->findexes) {
+    e = (*v)(((PyObject*)p->findexes), a); if (e) return e;
+  }
+  if (p->findexes1) {
+    e = (*v)(((PyObject*)p->findexes1), a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_SuffixArray(PyObject *o) {
-  struct __pyx_obj_3_sa_SuffixArray *p = (struct __pyx_obj_3_sa_SuffixArray *)o;
+static int __pyx_tp_clear_3_sa_HieroCachingRuleFactory(PyObject *o) {
+  struct __pyx_obj_3_sa_HieroCachingRuleFactory *p = (struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->darray);
-  p->darray = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->rules);
+  p->rules = ((struct __pyx_obj_3_sa_TrieTable *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->sa);
-  p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->sampler);
+  p->sampler = ((struct __pyx_obj_3_sa_Sampler *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->ha);
-  p->ha = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->scorer);
+  p->scorer = ((struct __pyx_obj_3_sa_Scorer *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->precomputed_index);
+  p->precomputed_index = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->precomputed_collocations);
+  p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->precompute_file);
+  p->precompute_file = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->max_rank);
+  p->max_rank = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->prev_norm_prefix);
+  p->prev_norm_prefix = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->fsa);
+  p->fsa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->fda);
+  p->fda = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->eda);
+  p->eda = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->alignment);
+  p->alignment = ((struct __pyx_obj_3_sa_Alignment *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->eid2symid);
+  p->eid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->fid2symid);
+  p->fid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->findexes);
+  p->findexes = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->findexes1);
+  p->findexes1 = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
-static PyObject *__pyx_sq_item_3_sa_SuffixArray(PyObject *o, Py_ssize_t i) {
-  PyObject *r;
-  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
-  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
-  Py_DECREF(x);
-  return r;
-}
 
-static PyMethodDef __pyx_methods_3_sa_SuffixArray[] = {
-  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_2get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_3get_sentence, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_4get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_5read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_5read_text)},
-  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_6q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_6q3sort)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_7write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_8read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_9write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_10write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pf_3_sa_11SuffixArray_11lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+static PyMethodDef __pyx_methods_3_sa_HieroCachingRuleFactory[] = {
+  {__Pyx_NAMESTR("configure"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_2configure)},
+  {__Pyx_NAMESTR("pattern2phrase"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("pattern2phrase_plus"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_precomputed_collocation"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collocation, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("advance"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_all_nodes_isteps_away"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_away, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_23input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_22input)},
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_SuffixArray = {
+static PyNumberMethods __pyx_tp_as_number_HieroCachingRuleFactory = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -56412,11 +61313,11 @@ static PyNumberMethods __pyx_tp_as_number_SuffixArray = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_SuffixArray = {
+static PySequenceMethods __pyx_tp_as_sequence_HieroCachingRuleFactory = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
-  __pyx_sq_item_3_sa_SuffixArray, /*sq_item*/
+  0, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
@@ -56425,13 +61326,13 @@ static PySequenceMethods __pyx_tp_as_sequence_SuffixArray = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_SuffixArray = {
+static PyMappingMethods __pyx_tp_as_mapping_HieroCachingRuleFactory = {
   0, /*mp_length*/
-  __pyx_pf_3_sa_11SuffixArray_1__getitem__, /*mp_subscript*/
+  0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_SuffixArray = {
+static PyBufferProcs __pyx_tp_as_buffer_HieroCachingRuleFactory = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -56452,12 +61353,12 @@ static PyBufferProcs __pyx_tp_as_buffer_SuffixArray = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_SuffixArray = {
+static PyTypeObject __pyx_type_3_sa_HieroCachingRuleFactory = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.SuffixArray"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_SuffixArray), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.HieroCachingRuleFactory"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_HieroCachingRuleFactory), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_SuffixArray, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_HieroCachingRuleFactory, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -56467,24 +61368,24 @@ static PyTypeObject __pyx_type_3_sa_SuffixArray = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_SuffixArray, /*tp_as_number*/
-  &__pyx_tp_as_sequence_SuffixArray, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_SuffixArray, /*tp_as_mapping*/
+  &__pyx_tp_as_number_HieroCachingRuleFactory, /*tp_as_number*/
+  &__pyx_tp_as_sequence_HieroCachingRuleFactory, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_HieroCachingRuleFactory, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_SuffixArray, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_HieroCachingRuleFactory, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_SuffixArray, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_SuffixArray, /*tp_clear*/
+  __Pyx_DOCSTR("This RuleFactory implements a caching \n    method using TrieTable, which makes phrase\n    generation somewhat speedier -- phrases only\n    need to be extracted once (however, it is\n    quite possible they need to be scored \n    for each input sentence, for contextual models)"), /*tp_doc*/
+  __pyx_tp_traverse_3_sa_HieroCachingRuleFactory, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_HieroCachingRuleFactory, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_SuffixArray, /*tp_methods*/
+  __pyx_methods_3_sa_HieroCachingRuleFactory, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -56494,7 +61395,7 @@ static PyTypeObject __pyx_type_3_sa_SuffixArray = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_SuffixArray, /*tp_new*/
+  __pyx_tp_new_3_sa_HieroCachingRuleFactory, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -56507,66 +61408,47 @@ static PyTypeObject __pyx_type_3_sa_SuffixArray = {
   0, /*tp_version_tag*/
   #endif
 };
+static struct __pyx_vtabstruct_3_sa_Scorer __pyx_vtable_3_sa_Scorer;
 
-static PyObject *__pyx_tp_new_3_sa_TrieNode(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_TrieNode *p;
+static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa_Scorer *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_TrieNode *)o);
-  p->children = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_8TrieNode___cinit__(o, __pyx_empty_tuple, NULL) < 0) {
-    Py_DECREF(o); o = 0;
-  }
+  p = ((struct __pyx_obj_3_sa_Scorer *)o);
+  p->__pyx_vtab = __pyx_vtabptr_3_sa_Scorer;
+  p->models = Py_None; Py_INCREF(Py_None);
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_TrieNode(PyObject *o) {
-  struct __pyx_obj_3_sa_TrieNode *p = (struct __pyx_obj_3_sa_TrieNode *)o;
-  Py_XDECREF(p->children);
+static void __pyx_tp_dealloc_3_sa_Scorer(PyObject *o) {
+  struct __pyx_obj_3_sa_Scorer *p = (struct __pyx_obj_3_sa_Scorer *)o;
+  Py_CLEAR(p->models);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_TrieNode(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa_Scorer(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_TrieNode *p = (struct __pyx_obj_3_sa_TrieNode *)o;
-  if (p->children) {
-    e = (*v)(p->children, a); if (e) return e;
+  struct __pyx_obj_3_sa_Scorer *p = (struct __pyx_obj_3_sa_Scorer *)o;
+  if (p->models) {
+    e = (*v)(p->models, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_TrieNode(PyObject *o) {
-  struct __pyx_obj_3_sa_TrieNode *p = (struct __pyx_obj_3_sa_TrieNode *)o;
+static int __pyx_tp_clear_3_sa_Scorer(PyObject *o) {
+  struct __pyx_obj_3_sa_Scorer *p = (struct __pyx_obj_3_sa_Scorer *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->children);
-  p->children = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->models);
+  p->models = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_8TrieNode_8children___get__(o);
-}
-
-static int __pyx_setprop_3_sa_8TrieNode_children(PyObject *o, PyObject *v, void *x) {
-  if (v) {
-    return __pyx_pf_3_sa_8TrieNode_8children_1__set__(o, v);
-  }
-  else {
-    return __pyx_pf_3_sa_8TrieNode_8children_2__del__(o);
-  }
-}
-
-static PyMethodDef __pyx_methods_3_sa_TrieNode[] = {
+static PyMethodDef __pyx_methods_3_sa_Scorer[] = {
   {0, 0, 0, 0}
 };
 
-static struct PyGetSetDef __pyx_getsets_3_sa_TrieNode[] = {
-  {(char *)"children", __pyx_getprop_3_sa_8TrieNode_children, __pyx_setprop_3_sa_8TrieNode_children, 0, 0},
-  {0, 0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number_TrieNode = {
+static PyNumberMethods __pyx_tp_as_number_Scorer = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -56624,7 +61506,7 @@ static PyNumberMethods __pyx_tp_as_number_TrieNode = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_TrieNode = {
+static PySequenceMethods __pyx_tp_as_sequence_Scorer = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -56637,13 +61519,13 @@ static PySequenceMethods __pyx_tp_as_sequence_TrieNode = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_TrieNode = {
+static PyMappingMethods __pyx_tp_as_mapping_Scorer = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_TrieNode = {
+static PyBufferProcs __pyx_tp_as_buffer_Scorer = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -56664,12 +61546,12 @@ static PyBufferProcs __pyx_tp_as_buffer_TrieNode = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_TrieNode = {
+static PyTypeObject __pyx_type_3_sa_Scorer = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.TrieNode"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_TrieNode), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.Scorer"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa_Scorer), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_TrieNode, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa_Scorer, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -56679,34 +61561,34 @@ static PyTypeObject __pyx_type_3_sa_TrieNode = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_TrieNode, /*tp_as_number*/
-  &__pyx_tp_as_sequence_TrieNode, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_TrieNode, /*tp_as_mapping*/
+  &__pyx_tp_as_number_Scorer, /*tp_as_number*/
+  &__pyx_tp_as_sequence_Scorer, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_Scorer, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_TrieNode, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer_Scorer, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_TrieNode, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_TrieNode, /*tp_clear*/
+  __pyx_tp_traverse_3_sa_Scorer, /*tp_traverse*/
+  __pyx_tp_clear_3_sa_Scorer, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_TrieNode, /*tp_methods*/
+  __pyx_methods_3_sa_Scorer, /*tp_methods*/
   0, /*tp_members*/
-  __pyx_getsets_3_sa_TrieNode, /*tp_getset*/
+  0, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  0, /*tp_init*/
+  __pyx_pw_3_sa_6Scorer_1__init__, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_TrieNode, /*tp_new*/
+  __pyx_tp_new_3_sa_Scorer, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -56720,111 +61602,44 @@ static PyTypeObject __pyx_type_3_sa_TrieNode = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_ExtendedTrieNode(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_ExtendedTrieNode *p;
-  PyObject *o = __pyx_tp_new_3_sa_TrieNode(t, a, k);
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_ExtendedTrieNode *)o);
-  p->phrase = Py_None; Py_INCREF(Py_None);
-  p->phrase_location = Py_None; Py_INCREF(Py_None);
-  p->suffix_link = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_16ExtendedTrieNode___cinit__(o, a, k) < 0) {
-    Py_DECREF(o); o = 0;
-  }
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o);
+  p->__pyx_v_self = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_ExtendedTrieNode(PyObject *o) {
-  struct __pyx_obj_3_sa_ExtendedTrieNode *p = (struct __pyx_obj_3_sa_ExtendedTrieNode *)o;
-  Py_XDECREF(p->phrase);
-  Py_XDECREF(p->phrase_location);
-  Py_XDECREF(p->suffix_link);
-  __pyx_tp_dealloc_3_sa_TrieNode(o);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct____iter__(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
+  Py_CLEAR(p->__pyx_v_self);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_ExtendedTrieNode(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_ExtendedTrieNode *p = (struct __pyx_obj_3_sa_ExtendedTrieNode *)o;
-  e = __pyx_tp_traverse_3_sa_TrieNode(o, v, a); if (e) return e;
-  if (p->phrase) {
-    e = (*v)(p->phrase, a); if (e) return e;
-  }
-  if (p->phrase_location) {
-    e = (*v)(p->phrase_location, a); if (e) return e;
-  }
-  if (p->suffix_link) {
-    e = (*v)(p->suffix_link, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_ExtendedTrieNode(PyObject *o) {
-  struct __pyx_obj_3_sa_ExtendedTrieNode *p = (struct __pyx_obj_3_sa_ExtendedTrieNode *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct____iter__(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa_TrieNode(o);
-  tmp = ((PyObject*)p->phrase);
-  p->phrase = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->phrase_location);
-  p->phrase_location = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->suffix_link);
-  p->suffix_link = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v_self);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase___get__(o);
-}
-
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v, void *x) {
-  if (v) {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_1__set__(o, v);
-  }
-  else {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_6phrase_2__del__(o);
-  }
-}
-
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location___get__(o);
-}
-
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, PyObject *v, void *x) {
-  if (v) {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_1__set__(o, v);
-  }
-  else {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_15phrase_location_2__del__(o);
-  }
-}
-
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link___get__(o);
-}
-
-static int __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, PyObject *v, void *x) {
-  if (v) {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_1__set__(o, v);
-  }
-  else {
-    return __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_2__del__(o);
-  }
-}
-
-static PyMethodDef __pyx_methods_3_sa_ExtendedTrieNode[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct____iter__[] = {
   {0, 0, 0, 0}
 };
 
-static struct PyGetSetDef __pyx_getsets_3_sa_ExtendedTrieNode[] = {
-  {(char *)"phrase", __pyx_getprop_3_sa_16ExtendedTrieNode_phrase, __pyx_setprop_3_sa_16ExtendedTrieNode_phrase, 0, 0},
-  {(char *)"phrase_location", __pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location, __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location, 0, 0},
-  {(char *)"suffix_link", __pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link, __pyx_setprop_3_sa_16ExtendedTrieNode_suffix_link, 0, 0},
-  {0, 0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number_ExtendedTrieNode = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct____iter__ = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -56882,7 +61697,7 @@ static PyNumberMethods __pyx_tp_as_number_ExtendedTrieNode = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_ExtendedTrieNode = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct____iter__ = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -56895,13 +61710,13 @@ static PySequenceMethods __pyx_tp_as_sequence_ExtendedTrieNode = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_ExtendedTrieNode = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct____iter__ = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_ExtendedTrieNode = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct____iter__ = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -56922,12 +61737,12 @@ static PyBufferProcs __pyx_tp_as_buffer_ExtendedTrieNode = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_ExtendedTrieNode = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct____iter__ = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.ExtendedTrieNode"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_ExtendedTrieNode), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct____iter__"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct____iter__), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_ExtendedTrieNode, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct____iter__, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -56937,26 +61752,26 @@ static PyTypeObject __pyx_type_3_sa_ExtendedTrieNode = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_ExtendedTrieNode, /*tp_as_number*/
-  &__pyx_tp_as_sequence_ExtendedTrieNode, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_ExtendedTrieNode, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct____iter__, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct____iter__, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct____iter__, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_ExtendedTrieNode, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  &__pyx_tp_as_buffer___pyx_scope_struct____iter__, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_ExtendedTrieNode, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_ExtendedTrieNode, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct____iter__, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_ExtendedTrieNode, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct____iter__, /*tp_methods*/
   0, /*tp_members*/
-  __pyx_getsets_3_sa_ExtendedTrieNode, /*tp_getset*/
+  0, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
@@ -56964,7 +61779,7 @@ static PyTypeObject __pyx_type_3_sa_ExtendedTrieNode = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_ExtendedTrieNode, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct____iter__, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -56978,95 +61793,44 @@ static PyTypeObject __pyx_type_3_sa_ExtendedTrieNode = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_TrieTable(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_TrieTable *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_TrieTable *)o);
-  p->root = Py_None; Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_9TrieTable___cinit__(o, a, k) < 0) {
-    Py_DECREF(o); o = 0;
-  }
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o);
+  p->__pyx_v_fp = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_TrieTable(PyObject *o) {
-  struct __pyx_obj_3_sa_TrieTable *p = (struct __pyx_obj_3_sa_TrieTable *)o;
-  Py_XDECREF(p->root);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_1_read_bitext(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o;
+  Py_CLEAR(p->__pyx_v_fp);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_TrieTable(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_1_read_bitext(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_TrieTable *p = (struct __pyx_obj_3_sa_TrieTable *)o;
-  if (p->root) {
-    e = (*v)(p->root, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o;
+  if (p->__pyx_v_fp) {
+    e = (*v)(p->__pyx_v_fp, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_TrieTable(PyObject *o) {
-  struct __pyx_obj_3_sa_TrieTable *p = (struct __pyx_obj_3_sa_TrieTable *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_1_read_bitext(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->root);
-  p->root = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v_fp);
+  p->__pyx_v_fp = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_9TrieTable_8extended___get__(o);
-}
-
-static int __pyx_setprop_3_sa_9TrieTable_extended(PyObject *o, PyObject *v, void *x) {
-  if (v) {
-    return __pyx_pf_3_sa_9TrieTable_8extended_1__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
-
-static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_9TrieTable_5count___get__(o);
-}
-
-static int __pyx_setprop_3_sa_9TrieTable_count(PyObject *o, PyObject *v, void *x) {
-  if (v) {
-    return __pyx_pf_3_sa_9TrieTable_5count_1__set__(o, v);
-  }
-  else {
-    PyErr_SetString(PyExc_NotImplementedError, "__del__");
-    return -1;
-  }
-}
-
-static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, void *x) {
-  return __pyx_pf_3_sa_9TrieTable_4root___get__(o);
-}
-
-static int __pyx_setprop_3_sa_9TrieTable_root(PyObject *o, PyObject *v, void *x) {
-  if (v) {
-    return __pyx_pf_3_sa_9TrieTable_4root_1__set__(o, v);
-  }
-  else {
-    return __pyx_pf_3_sa_9TrieTable_4root_2__del__(o);
-  }
-}
-
-static PyMethodDef __pyx_methods_3_sa_TrieTable[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_1_read_bitext[] = {
   {0, 0, 0, 0}
 };
 
-static struct PyGetSetDef __pyx_getsets_3_sa_TrieTable[] = {
-  {(char *)"extended", __pyx_getprop_3_sa_9TrieTable_extended, __pyx_setprop_3_sa_9TrieTable_extended, 0, 0},
-  {(char *)"count", __pyx_getprop_3_sa_9TrieTable_count, __pyx_setprop_3_sa_9TrieTable_count, 0, 0},
-  {(char *)"root", __pyx_getprop_3_sa_9TrieTable_root, __pyx_setprop_3_sa_9TrieTable_root, 0, 0},
-  {0, 0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number_TrieTable = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_1_read_bitext = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -57124,7 +61888,7 @@ static PyNumberMethods __pyx_tp_as_number_TrieTable = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_TrieTable = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_1_read_bitext = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -57137,13 +61901,13 @@ static PySequenceMethods __pyx_tp_as_sequence_TrieTable = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_TrieTable = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_1_read_bitext = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_TrieTable = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_1_read_bitext = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -57164,12 +61928,12 @@ static PyBufferProcs __pyx_tp_as_buffer_TrieTable = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_TrieTable = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_1_read_bitext = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.TrieTable"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_TrieTable), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_1_read_bitext"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_TrieTable, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_1_read_bitext, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -57179,26 +61943,26 @@ static PyTypeObject __pyx_type_3_sa_TrieTable = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_TrieTable, /*tp_as_number*/
-  &__pyx_tp_as_sequence_TrieTable, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_TrieTable, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_1_read_bitext, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_1_read_bitext, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_1_read_bitext, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_TrieTable, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_1_read_bitext, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_TrieTable, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_TrieTable, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_1_read_bitext, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_1_read_bitext, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_TrieTable, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_1_read_bitext, /*tp_methods*/
   0, /*tp_members*/
-  __pyx_getsets_3_sa_TrieTable, /*tp_getset*/
+  0, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
@@ -57206,7 +61970,7 @@ static PyTypeObject __pyx_type_3_sa_TrieTable = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_TrieTable, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -57219,50 +61983,61 @@ static PyTypeObject __pyx_type_3_sa_TrieTable = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_PhraseLocation __pyx_vtable_3_sa_PhraseLocation;
 
-static PyObject *__pyx_tp_new_3_sa_PhraseLocation(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_PhraseLocation *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_PhraseLocation *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_PhraseLocation;
-  p->arr = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_14PhraseLocation___cinit__(o, a, k) < 0) {
-    Py_DECREF(o); o = 0;
-  }
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o);
+  p->__pyx_outer_scope = 0;
+  p->__pyx_v_line = 0;
+  p->__pyx_t_0 = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_PhraseLocation(PyObject *o) {
-  struct __pyx_obj_3_sa_PhraseLocation *p = (struct __pyx_obj_3_sa_PhraseLocation *)o;
-  Py_XDECREF(((PyObject *)p->arr));
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_line);
+  Py_CLEAR(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_PhraseLocation(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_PhraseLocation *p = (struct __pyx_obj_3_sa_PhraseLocation *)o;
-  if (p->arr) {
-    e = (*v)(((PyObject*)p->arr), a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
+  if (p->__pyx_outer_scope) {
+    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
+  }
+  if (p->__pyx_v_line) {
+    e = (*v)(p->__pyx_v_line, a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_PhraseLocation(PyObject *o) {
-  struct __pyx_obj_3_sa_PhraseLocation *p = (struct __pyx_obj_3_sa_PhraseLocation *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->arr);
-  p->arr = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_outer_scope);
+  p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_line);
+  p->__pyx_v_line = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_0);
+  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_PhraseLocation[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_2_genexpr[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_PhraseLocation = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_2_genexpr = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -57320,7 +62095,7 @@ static PyNumberMethods __pyx_tp_as_number_PhraseLocation = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_PhraseLocation = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_2_genexpr = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -57333,13 +62108,13 @@ static PySequenceMethods __pyx_tp_as_sequence_PhraseLocation = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_PhraseLocation = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_2_genexpr = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_PhraseLocation = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_2_genexpr = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -57360,12 +62135,12 @@ static PyBufferProcs __pyx_tp_as_buffer_PhraseLocation = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_PhraseLocation = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_2_genexpr = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.PhraseLocation"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_PhraseLocation), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_2_genexpr"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_PhraseLocation, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_2_genexpr, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -57375,24 +62150,24 @@ static PyTypeObject __pyx_type_3_sa_PhraseLocation = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_PhraseLocation, /*tp_as_number*/
-  &__pyx_tp_as_sequence_PhraseLocation, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_PhraseLocation, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_2_genexpr, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_2_genexpr, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_2_genexpr, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_PhraseLocation, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_2_genexpr, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_PhraseLocation, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_PhraseLocation, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_2_genexpr, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_PhraseLocation, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_2_genexpr, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -57402,7 +62177,7 @@ static PyTypeObject __pyx_type_3_sa_PhraseLocation = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_PhraseLocation, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -57416,48 +62191,84 @@ static PyTypeObject __pyx_type_3_sa_PhraseLocation = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa_Sampler(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_Sampler *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_Sampler *)o);
-  p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_7Sampler___cinit__(o, a, k) < 0) {
-    Py_DECREF(o); o = 0;
-  }
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o);
+  p->__pyx_v_ngram = 0;
+  p->__pyx_v_ngram_start = 0;
+  p->__pyx_v_ngram_starts = 0;
+  p->__pyx_v_run_start = 0;
+  p->__pyx_v_self = 0;
+  p->__pyx_v_veb = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_Sampler(PyObject *o) {
-  struct __pyx_obj_3_sa_Sampler *p = (struct __pyx_obj_3_sa_Sampler *)o;
-  Py_XDECREF(((PyObject *)p->sa));
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
+  Py_CLEAR(p->__pyx_v_ngram);
+  Py_CLEAR(p->__pyx_v_ngram_start);
+  Py_CLEAR(p->__pyx_v_ngram_starts);
+  Py_CLEAR(p->__pyx_v_run_start);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_veb);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_Sampler(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_Sampler *p = (struct __pyx_obj_3_sa_Sampler *)o;
-  if (p->sa) {
-    e = (*v)(((PyObject*)p->sa), a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
+  if (p->__pyx_v_ngram) {
+    e = (*v)(p->__pyx_v_ngram, a); if (e) return e;
+  }
+  if (p->__pyx_v_ngram_start) {
+    e = (*v)(((PyObject*)p->__pyx_v_ngram_start), a); if (e) return e;
+  }
+  if (p->__pyx_v_ngram_starts) {
+    e = (*v)(p->__pyx_v_ngram_starts, a); if (e) return e;
+  }
+  if (p->__pyx_v_run_start) {
+    e = (*v)(((PyObject*)p->__pyx_v_run_start), a); if (e) return e;
+  }
+  if (p->__pyx_v_self) {
+    e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
+  }
+  if (p->__pyx_v_veb) {
+    e = (*v)(((PyObject*)p->__pyx_v_veb), a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_Sampler(PyObject *o) {
-  struct __pyx_obj_3_sa_Sampler *p = (struct __pyx_obj_3_sa_Sampler *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->sa);
-  p->sa = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v_ngram);
+  p->__pyx_v_ngram = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_ngram_start);
+  p->__pyx_v_ngram_start = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_ngram_starts);
+  p->__pyx_v_ngram_starts = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_run_start);
+  p->__pyx_v_run_start = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_self);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_LCP *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_veb);
+  p->__pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_Sampler[] = {
-  {__Pyx_NAMESTR("sample"), (PyCFunction)__pyx_pf_3_sa_7Sampler_1sample, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_7Sampler_1sample)},
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_3_compute_stats[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_Sampler = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_3_compute_stats = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -57515,7 +62326,7 @@ static PyNumberMethods __pyx_tp_as_number_Sampler = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_Sampler = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_3_compute_stats = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -57528,13 +62339,13 @@ static PySequenceMethods __pyx_tp_as_sequence_Sampler = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_Sampler = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_3_compute_stats = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_Sampler = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_3_compute_stats = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -57555,12 +62366,12 @@ static PyBufferProcs __pyx_tp_as_buffer_Sampler = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_Sampler = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_3_compute_stats = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.Sampler"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_Sampler), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_3_compute_stats"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_Sampler, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_3_compute_stats, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -57570,24 +62381,24 @@ static PyTypeObject __pyx_type_3_sa_Sampler = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_Sampler, /*tp_as_number*/
-  &__pyx_tp_as_sequence_Sampler, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_Sampler, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_3_compute_stats, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_3_compute_stats, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_3_compute_stats, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_Sampler, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  __Pyx_DOCSTR("A Sampler implements a logic for choosing\n    samples from a population range"), /*tp_doc*/
-  __pyx_tp_traverse_3_sa_Sampler, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_Sampler, /*tp_clear*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_3_compute_stats, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_Sampler, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_3_compute_stats, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -57597,7 +62408,7 @@ static PyTypeObject __pyx_type_3_sa_Sampler = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_Sampler, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -57610,181 +62421,53 @@ static PyTypeObject __pyx_type_3_sa_Sampler = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory __pyx_vtable_3_sa_HieroCachingRuleFactory;
 
-static PyObject *__pyx_tp_new_3_sa_HieroCachingRuleFactory(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_HieroCachingRuleFactory *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4_make_lattice(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_HieroCachingRuleFactory;
-  p->rules = ((struct __pyx_obj_3_sa_TrieTable *)Py_None); Py_INCREF(Py_None);
-  p->sampler = ((struct __pyx_obj_3_sa_Sampler *)Py_None); Py_INCREF(Py_None);
-  p->scorer = ((struct __pyx_obj_3_sa_Scorer *)Py_None); Py_INCREF(Py_None);
-  p->precomputed_index = Py_None; Py_INCREF(Py_None);
-  p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
-  p->precompute_file = Py_None; Py_INCREF(Py_None);
-  p->max_rank = Py_None; Py_INCREF(Py_None);
-  p->prev_norm_prefix = Py_None; Py_INCREF(Py_None);
-  p->fsa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
-  p->fda = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
-  p->eda = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
-  p->alignment = ((struct __pyx_obj_3_sa_Alignment *)Py_None); Py_INCREF(Py_None);
-  p->eid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  p->fid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  p->findexes = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  p->findexes1 = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  if (__pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(o, a, k) < 0) {
-    Py_DECREF(o); o = 0;
-  }
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *)o);
+  p->__pyx_v_word_ids = 0;
+  p->__pyx_v_words = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_HieroCachingRuleFactory(PyObject *o) {
-  struct __pyx_obj_3_sa_HieroCachingRuleFactory *p = (struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o;
-  Py_XDECREF(((PyObject *)p->rules));
-  Py_XDECREF(((PyObject *)p->sampler));
-  Py_XDECREF(((PyObject *)p->scorer));
-  Py_XDECREF(p->precomputed_index);
-  Py_XDECREF(p->precomputed_collocations);
-  Py_XDECREF(p->precompute_file);
-  Py_XDECREF(p->max_rank);
-  Py_XDECREF(p->prev_norm_prefix);
-  Py_XDECREF(((PyObject *)p->fsa));
-  Py_XDECREF(((PyObject *)p->fda));
-  Py_XDECREF(((PyObject *)p->eda));
-  Py_XDECREF(((PyObject *)p->alignment));
-  Py_XDECREF(((PyObject *)p->eid2symid));
-  Py_XDECREF(((PyObject *)p->fid2symid));
-  Py_XDECREF(((PyObject *)p->findexes));
-  Py_XDECREF(((PyObject *)p->findexes1));
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_4_make_lattice(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *)o;
+  Py_CLEAR(p->__pyx_v_word_ids);
+  Py_CLEAR(p->__pyx_v_words);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_HieroCachingRuleFactory(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_4_make_lattice(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_HieroCachingRuleFactory *p = (struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o;
-  if (p->rules) {
-    e = (*v)(((PyObject*)p->rules), a); if (e) return e;
-  }
-  if (p->sampler) {
-    e = (*v)(((PyObject*)p->sampler), a); if (e) return e;
-  }
-  if (p->scorer) {
-    e = (*v)(((PyObject*)p->scorer), a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *)o;
+  if (p->__pyx_v_word_ids) {
+    e = (*v)(p->__pyx_v_word_ids, a); if (e) return e;
   }
-  if (p->precomputed_index) {
-    e = (*v)(p->precomputed_index, a); if (e) return e;
-  }
-  if (p->precomputed_collocations) {
-    e = (*v)(p->precomputed_collocations, a); if (e) return e;
-  }
-  if (p->precompute_file) {
-    e = (*v)(p->precompute_file, a); if (e) return e;
-  }
-  if (p->max_rank) {
-    e = (*v)(p->max_rank, a); if (e) return e;
-  }
-  if (p->prev_norm_prefix) {
-    e = (*v)(p->prev_norm_prefix, a); if (e) return e;
-  }
-  if (p->fsa) {
-    e = (*v)(((PyObject*)p->fsa), a); if (e) return e;
-  }
-  if (p->fda) {
-    e = (*v)(((PyObject*)p->fda), a); if (e) return e;
-  }
-  if (p->eda) {
-    e = (*v)(((PyObject*)p->eda), a); if (e) return e;
-  }
-  if (p->alignment) {
-    e = (*v)(((PyObject*)p->alignment), a); if (e) return e;
-  }
-  if (p->eid2symid) {
-    e = (*v)(((PyObject*)p->eid2symid), a); if (e) return e;
-  }
-  if (p->fid2symid) {
-    e = (*v)(((PyObject*)p->fid2symid), a); if (e) return e;
-  }
-  if (p->findexes) {
-    e = (*v)(((PyObject*)p->findexes), a); if (e) return e;
-  }
-  if (p->findexes1) {
-    e = (*v)(((PyObject*)p->findexes1), a); if (e) return e;
+  if (p->__pyx_v_words) {
+    e = (*v)(p->__pyx_v_words, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_HieroCachingRuleFactory(PyObject *o) {
-  struct __pyx_obj_3_sa_HieroCachingRuleFactory *p = (struct __pyx_obj_3_sa_HieroCachingRuleFactory *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_4_make_lattice(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->rules);
-  p->rules = ((struct __pyx_obj_3_sa_TrieTable *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->sampler);
-  p->sampler = ((struct __pyx_obj_3_sa_Sampler *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->scorer);
-  p->scorer = ((struct __pyx_obj_3_sa_Scorer *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->precomputed_index);
-  p->precomputed_index = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->precomputed_collocations);
-  p->precomputed_collocations = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->precompute_file);
-  p->precompute_file = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->max_rank);
-  p->max_rank = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->prev_norm_prefix);
-  p->prev_norm_prefix = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->fsa);
-  p->fsa = ((struct __pyx_obj_3_sa_SuffixArray *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->fda);
-  p->fda = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v_word_ids);
+  p->__pyx_v_word_ids = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->eda);
-  p->eda = ((struct __pyx_obj_3_sa_DataArray *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->alignment);
-  p->alignment = ((struct __pyx_obj_3_sa_Alignment *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->eid2symid);
-  p->eid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->fid2symid);
-  p->fid2symid = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->findexes);
-  p->findexes = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->findexes1);
-  p->findexes1 = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v_words);
+  p->__pyx_v_words = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_HieroCachingRuleFactory[] = {
-  {__Pyx_NAMESTR("configure"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_1configure, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_1configure)},
-  {__Pyx_NAMESTR("pattern2phrase"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_2pattern2phrase, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("pattern2phrase_plus"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_3pattern2phrase_plus, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("precompute"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_4precompute, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_precomputed_collocation"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_5get_precomputed_collocation, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("advance"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_6advance, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_all_nodes_isteps_away"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_7get_all_nodes_isteps_away, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_8reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_9shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pf_3_sa_23HieroCachingRuleFactory_11input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_11input)},
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_4_make_lattice[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_HieroCachingRuleFactory = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_4_make_lattice = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -57842,7 +62525,7 @@ static PyNumberMethods __pyx_tp_as_number_HieroCachingRuleFactory = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_HieroCachingRuleFactory = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_4_make_lattice = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -57855,13 +62538,13 @@ static PySequenceMethods __pyx_tp_as_sequence_HieroCachingRuleFactory = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_HieroCachingRuleFactory = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_4_make_lattice = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_HieroCachingRuleFactory = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_4_make_lattice = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -57882,12 +62565,12 @@ static PyBufferProcs __pyx_tp_as_buffer_HieroCachingRuleFactory = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_HieroCachingRuleFactory = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_4_make_lattice = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.HieroCachingRuleFactory"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_HieroCachingRuleFactory), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_4_make_lattice"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_HieroCachingRuleFactory, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_4_make_lattice, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -57897,24 +62580,24 @@ static PyTypeObject __pyx_type_3_sa_HieroCachingRuleFactory = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_HieroCachingRuleFactory, /*tp_as_number*/
-  &__pyx_tp_as_sequence_HieroCachingRuleFactory, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_HieroCachingRuleFactory, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_4_make_lattice, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_4_make_lattice, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_4_make_lattice, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_HieroCachingRuleFactory, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  __Pyx_DOCSTR("This RuleFactory implements a caching \n    method using TrieTable, which makes phrase\n    generation somewhat speedier -- phrases only\n    need to be extracted once (however, it is\n    quite possible they need to be scored \n    for each input sentence, for contextual models)"), /*tp_doc*/
-  __pyx_tp_traverse_3_sa_HieroCachingRuleFactory, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_HieroCachingRuleFactory, /*tp_clear*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_4_make_lattice, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_4_make_lattice, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_4_make_lattice, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_HieroCachingRuleFactory, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_4_make_lattice, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -57924,7 +62607,7 @@ static PyTypeObject __pyx_type_3_sa_HieroCachingRuleFactory = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_HieroCachingRuleFactory, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_4_make_lattice, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -57937,47 +62620,61 @@ static PyTypeObject __pyx_type_3_sa_HieroCachingRuleFactory = {
   0, /*tp_version_tag*/
   #endif
 };
-static struct __pyx_vtabstruct_3_sa_Scorer __pyx_vtable_3_sa_Scorer;
 
-static PyObject *__pyx_tp_new_3_sa_Scorer(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa_Scorer *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa_Scorer *)o);
-  p->__pyx_vtab = __pyx_vtabptr_3_sa_Scorer;
-  p->models = Py_None; Py_INCREF(Py_None);
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *)o);
+  p->__pyx_outer_scope = 0;
+  p->__pyx_v_word = 0;
+  p->__pyx_t_0 = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa_Scorer(PyObject *o) {
-  struct __pyx_obj_3_sa_Scorer *p = (struct __pyx_obj_3_sa_Scorer *)o;
-  Py_XDECREF(p->models);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_5_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *)o;
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_word);
+  Py_CLEAR(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa_Scorer(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_5_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa_Scorer *p = (struct __pyx_obj_3_sa_Scorer *)o;
-  if (p->models) {
-    e = (*v)(p->models, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *)o;
+  if (p->__pyx_outer_scope) {
+    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
+  }
+  if (p->__pyx_v_word) {
+    e = (*v)(p->__pyx_v_word, a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa_Scorer(PyObject *o) {
-  struct __pyx_obj_3_sa_Scorer *p = (struct __pyx_obj_3_sa_Scorer *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_5_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->models);
-  p->models = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_outer_scope);
+  p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_word);
+  p->__pyx_v_word = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_0);
+  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa_Scorer[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_5_genexpr[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number_Scorer = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_5_genexpr = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -58035,7 +62732,7 @@ static PyNumberMethods __pyx_tp_as_number_Scorer = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence_Scorer = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_5_genexpr = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -58048,13 +62745,13 @@ static PySequenceMethods __pyx_tp_as_sequence_Scorer = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping_Scorer = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_5_genexpr = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer_Scorer = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_5_genexpr = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -58075,12 +62772,12 @@ static PyBufferProcs __pyx_tp_as_buffer_Scorer = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa_Scorer = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_5_genexpr = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.Scorer"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa_Scorer), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_5_genexpr"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa_Scorer, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_5_genexpr, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -58090,24 +62787,24 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number_Scorer, /*tp_as_number*/
-  &__pyx_tp_as_sequence_Scorer, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_Scorer, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_5_genexpr, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_5_genexpr, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_5_genexpr, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_Scorer, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_5_genexpr, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa_Scorer, /*tp_traverse*/
-  __pyx_tp_clear_3_sa_Scorer, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_5_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_5_genexpr, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa_Scorer, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_5_genexpr, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -58115,9 +62812,9 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  __pyx_pf_3_sa_6Scorer___init__, /*tp_init*/
+  0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa_Scorer, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_5_genexpr, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -58131,63 +62828,60 @@ static PyTypeObject __pyx_type_3_sa_Scorer = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_Generator(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_Generator_object *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_Generator_object *)o);
-  p->exc_type = 0;
-  p->exc_value = 0;
-  p->exc_traceback = 0;
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o);
+  p->__pyx_outer_scope = 0;
+  p->__pyx_v_word = 0;
+  p->__pyx_t_0 = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_Generator(PyObject *o) {
-  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
-  Py_XDECREF(p->exc_type);
-  Py_XDECREF(p->exc_value);
-  Py_XDECREF(p->exc_traceback);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_word);
+  Py_CLEAR(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_Generator(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
-  if (p->exc_type) {
-    e = (*v)(p->exc_type, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
+  if (p->__pyx_outer_scope) {
+    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
-  if (p->exc_value) {
-    e = (*v)(p->exc_value, a); if (e) return e;
+  if (p->__pyx_v_word) {
+    e = (*v)(p->__pyx_v_word, a); if (e) return e;
   }
-  if (p->exc_traceback) {
-    e = (*v)(p->exc_traceback, a); if (e) return e;
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_Generator(PyObject *o) {
-  struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->exc_type);
-  p->exc_type = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_outer_scope);
+  p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->exc_value);
-  p->exc_value = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v_word);
+  p->__pyx_v_word = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->exc_traceback);
-  p->exc_traceback = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_t_0);
+  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_Generator[] = {
-  {__Pyx_NAMESTR("send"), (PyCFunction)__Pyx_Generator_Send, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("close"), (PyCFunction)__Pyx_Generator_Close, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("throw"), (PyCFunction)__Pyx_Generator_Throw, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_6_genexpr[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_Generator = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_6_genexpr = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -58245,7 +62939,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_Generator = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_Generator = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_6_genexpr = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -58258,13 +62952,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_Generator = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_Generator = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_6_genexpr = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_Generator = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_6_genexpr = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -58285,12 +62979,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_Generator = {
   #endif
 };
 
-static PyTypeObject __pyx_Generator_type = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_6_genexpr = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_Generator"), /*tp_name*/
-  sizeof(struct __pyx_Generator_object), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_6_genexpr"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_Generator, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_6_genexpr, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -58300,24 +62994,24 @@ static PyTypeObject __pyx_Generator_type = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_Generator, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_Generator, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_Generator, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_6_genexpr, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_6_genexpr, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_6_genexpr, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_Generator, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_6_genexpr, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_Generator, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_Generator, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_6_genexpr, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
-  PyObject_SelfIter, /*tp_iter*/
-  __Pyx_Generator_Next, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_Generator, /*tp_methods*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_3_sa___pyx_scope_struct_6_genexpr, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -58327,7 +63021,7 @@ static PyTypeObject __pyx_Generator_type = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_Generator, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -58341,46 +63035,44 @@ static PyTypeObject __pyx_Generator_type = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct____iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_decode_lattice(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o);
-  p->__pyx_v_self = 0;
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *)o);
+  p->__pyx_v_lattice = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct____iter__(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_7_decode_lattice(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *)o;
+  Py_CLEAR(p->__pyx_v_lattice);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_decode_lattice(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
-  if (p->__pyx_v_self) {
-    e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *)o;
+  if (p->__pyx_v_lattice) {
+    e = (*v)(p->__pyx_v_lattice, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct____iter__(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct____iter__ *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_7_decode_lattice(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
-  tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v_lattice);
+  p->__pyx_v_lattice = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct____iter__[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_7_decode_lattice[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct____iter__ = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_7_decode_lattice = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -58438,7 +63130,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct____iter__ = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct____iter__ = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_7_decode_lattice = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -58451,13 +63143,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct____iter__ = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct____iter__ = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_7_decode_lattice = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct____iter__ = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_7_decode_lattice = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -58478,12 +63170,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct____iter__ = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct____iter__ = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_7_decode_lattice = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct____iter__"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct____iter__), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_7_decode_lattice"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct____iter__, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_7_decode_lattice, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -58493,24 +63185,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct____iter__ = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct____iter__, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct____iter__, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct____iter__, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_7_decode_lattice, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_7_decode_lattice, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_7_decode_lattice, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct____iter__, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_7_decode_lattice, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct____iter__, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct____iter__, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_7_decode_lattice, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_7_decode_lattice, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct____iter__, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_7_decode_lattice, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -58520,7 +63212,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct____iter__ = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct____iter__, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_7_decode_lattice, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -58534,44 +63226,108 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct____iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o);
-  p->__pyx_v_fp = 0;
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *)o);
+  p->__pyx_outer_scope = 0;
+  p->__pyx_v_arc = 0;
+  p->__pyx_v_dist = 0;
+  p->__pyx_v_node = 0;
+  p->__pyx_v_sym = 0;
+  p->__pyx_v_weight = 0;
+  p->__pyx_t_0 = 0;
+  p->__pyx_t_3 = 0;
+  p->__pyx_t_4 = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_1_read_bitext(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o;
-  Py_XDECREF(p->__pyx_v_fp);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_8_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *)o;
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_arc);
+  Py_CLEAR(p->__pyx_v_dist);
+  Py_CLEAR(p->__pyx_v_node);
+  Py_CLEAR(p->__pyx_v_sym);
+  Py_CLEAR(p->__pyx_v_weight);
+  Py_CLEAR(p->__pyx_t_0);
+  Py_CLEAR(p->__pyx_t_3);
+  Py_CLEAR(p->__pyx_t_4);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_1_read_bitext(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o;
-  if (p->__pyx_v_fp) {
-    e = (*v)(p->__pyx_v_fp, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *)o;
+  if (p->__pyx_outer_scope) {
+    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
+  }
+  if (p->__pyx_v_arc) {
+    e = (*v)(p->__pyx_v_arc, a); if (e) return e;
+  }
+  if (p->__pyx_v_dist) {
+    e = (*v)(p->__pyx_v_dist, a); if (e) return e;
+  }
+  if (p->__pyx_v_node) {
+    e = (*v)(p->__pyx_v_node, a); if (e) return e;
+  }
+  if (p->__pyx_v_sym) {
+    e = (*v)(p->__pyx_v_sym, a); if (e) return e;
+  }
+  if (p->__pyx_v_weight) {
+    e = (*v)(p->__pyx_v_weight, a); if (e) return e;
+  }
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  }
+  if (p->__pyx_t_3) {
+    e = (*v)(p->__pyx_t_3, a); if (e) return e;
+  }
+  if (p->__pyx_t_4) {
+    e = (*v)(p->__pyx_t_4, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_1_read_bitext(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *p = (struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *)o;
   PyObject* tmp;
-  tmp = ((PyObject*)p->__pyx_v_fp);
-  p->__pyx_v_fp = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_outer_scope);
+  p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_arc);
+  p->__pyx_v_arc = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_dist);
+  p->__pyx_v_dist = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_node);
+  p->__pyx_v_node = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_sym);
+  p->__pyx_v_sym = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_weight);
+  p->__pyx_v_weight = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_0);
+  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_3);
+  p->__pyx_t_3 = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_4);
+  p->__pyx_t_4 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_1_read_bitext[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_8_genexpr[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_1_read_bitext = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_8_genexpr = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -58629,7 +63385,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_1_read_bitext = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_1_read_bitext = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_8_genexpr = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -58642,13 +63398,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_1_read_bitext =
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_1_read_bitext = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_8_genexpr = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_1_read_bitext = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_8_genexpr = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -58669,12 +63425,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_1_read_bitext = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_1_read_bitext = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_8_genexpr = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_1_read_bitext"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_8_genexpr"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_1_read_bitext, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_8_genexpr, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -58684,24 +63440,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_1_read_bitext = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_1_read_bitext, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_1_read_bitext, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_1_read_bitext, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_8_genexpr, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_8_genexpr, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_8_genexpr, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_1_read_bitext, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_8_genexpr, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_1_read_bitext, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_1_read_bitext, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_8_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_8_genexpr, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_1_read_bitext, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_8_genexpr, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -58711,7 +63467,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_1_read_bitext = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_1_read_bitext, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_8_genexpr, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -58725,62 +63481,44 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_1_read_bitext = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9_decode_sentence(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o);
-  p->__pyx_outer_scope = 0;
-  p->__pyx_v_line = 0;
-  p->__pyx_t_0 = 0;
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *)o);
+  p->__pyx_v_lattice = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
-  Py_XDECREF(p->__pyx_v_line);
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_9_decode_sentence(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *)o;
+  Py_CLEAR(p->__pyx_v_lattice);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_9_decode_sentence(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
-  if (p->__pyx_outer_scope) {
-    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
-  }
-  if (p->__pyx_v_line) {
-    e = (*v)(p->__pyx_v_line, a); if (e) return e;
-  }
-  if (p->__pyx_t_0) {
-    e = (*v)(p->__pyx_t_0, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *)o;
+  if (p->__pyx_v_lattice) {
+    e = (*v)(p->__pyx_v_lattice, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_2_genexpr(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_9_decode_sentence(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
-  tmp = ((PyObject*)p->__pyx_outer_scope);
-  p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_v_line);
-  p->__pyx_v_line = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_0);
-  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v_lattice);
+  p->__pyx_v_lattice = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_2_genexpr[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_9_decode_sentence[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_2_genexpr = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_9_decode_sentence = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -58838,7 +63576,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_2_genexpr = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_2_genexpr = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_9_decode_sentence = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -58851,13 +63589,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_2_genexpr = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_2_genexpr = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_9_decode_sentence = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_2_genexpr = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_9_decode_sentence = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -58878,12 +63616,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_2_genexpr = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_2_genexpr = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_9_decode_sentence = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_2_genexpr"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_9_decode_sentence"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_2_genexpr, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_9_decode_sentence, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -58893,24 +63631,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_2_genexpr = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_2_genexpr, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_2_genexpr, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_2_genexpr, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_9_decode_sentence, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_9_decode_sentence, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_9_decode_sentence, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_2_genexpr, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_9_decode_sentence, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_2_genexpr, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_2_genexpr, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_9_decode_sentence, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_9_decode_sentence, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_2_genexpr, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_9_decode_sentence, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -58920,7 +63658,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_2_genexpr = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_2_genexpr, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_9_decode_sentence, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -58934,86 +63672,68 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_2_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o);
-  p->__pyx_v_ngram = 0;
-  p->__pyx_v_ngram_start = 0;
-  p->__pyx_v_ngram_starts = 0;
-  p->__pyx_v_run_start = 0;
-  p->__pyx_v_self = 0;
-  p->__pyx_v_veb = 0;
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *)o);
+  p->__pyx_outer_scope = 0;
+  p->__pyx_v__ = 0;
+  p->__pyx_v_sym = 0;
+  p->__pyx_t_0 = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_ngram));
-  Py_XDECREF(((PyObject *)p->__pyx_v_ngram_start));
-  Py_XDECREF(((PyObject *)p->__pyx_v_ngram_starts));
-  Py_XDECREF(((PyObject *)p->__pyx_v_run_start));
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  Py_XDECREF(((PyObject *)p->__pyx_v_veb));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_10_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *)o;
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v__);
+  Py_CLEAR(p->__pyx_v_sym);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_10_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
-  if (p->__pyx_v_ngram) {
-    e = (*v)(p->__pyx_v_ngram, a); if (e) return e;
-  }
-  if (p->__pyx_v_ngram_start) {
-    e = (*v)(((PyObject*)p->__pyx_v_ngram_start), a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *)o;
+  if (p->__pyx_outer_scope) {
+    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
-  if (p->__pyx_v_ngram_starts) {
-    e = (*v)(p->__pyx_v_ngram_starts, a); if (e) return e;
+  if (p->__pyx_v__) {
+    e = (*v)(p->__pyx_v__, a); if (e) return e;
   }
-  if (p->__pyx_v_run_start) {
-    e = (*v)(((PyObject*)p->__pyx_v_run_start), a); if (e) return e;
-  }
-  if (p->__pyx_v_self) {
-    e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
+  if (p->__pyx_v_sym) {
+    e = (*v)(p->__pyx_v_sym, a); if (e) return e;
   }
-  if (p->__pyx_v_veb) {
-    e = (*v)(((PyObject*)p->__pyx_v_veb), a); if (e) return e;
+  if (p->__pyx_t_0) {
+    e = (*v)(p->__pyx_t_0, a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *p = (struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_10_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
-  tmp = ((PyObject*)p->__pyx_v_ngram);
-  p->__pyx_v_ngram = ((PyObject*)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_v_ngram_start);
-  p->__pyx_v_ngram_start = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_v_ngram_starts);
-  p->__pyx_v_ngram_starts = ((PyObject*)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_outer_scope);
+  p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_v_run_start);
-  p->__pyx_v_run_start = ((struct __pyx_obj_3_sa_IntList *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v__);
+  p->__pyx_v__ = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_v_sym);
+  p->__pyx_v_sym = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_v_veb);
-  p->__pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)Py_None); Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_t_0);
+  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_3_compute_stats[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_10_genexpr[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_3_compute_stats = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_10_genexpr = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -59071,7 +63791,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_3_compute_stats = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_3_compute_stats = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_10_genexpr = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -59084,13 +63804,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_3_compute_stats
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_3_compute_stats = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_10_genexpr = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_3_compute_stats = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_10_genexpr = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -59111,12 +63831,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_3_compute_stats = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_3_compute_stats = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_10_genexpr = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_3_compute_stats"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_10_genexpr"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_3_compute_stats, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_10_genexpr, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -59126,24 +63846,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_3_compute_stats = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_3_compute_stats, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_3_compute_stats, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_3_compute_stats, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_10_genexpr, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_10_genexpr, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_10_genexpr, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_3_compute_stats, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_10_genexpr, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_3_compute_stats, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_3_compute_stats, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_10_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_10_genexpr, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_3_compute_stats, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_10_genexpr, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -59153,7 +63873,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_3_compute_stats = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_3_compute_stats, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_10_genexpr, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -59167,46 +63887,44 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_3_compute_stats = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o);
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *)o);
   p->__pyx_v_self = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_4___iter__(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_11___iter__(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *)o;
+  Py_CLEAR(p->__pyx_v_self);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_4___iter__(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11___iter__(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *)o;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_4___iter__(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__ *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_11___iter__(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_4___iter__[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_11___iter__[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_4___iter__ = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_11___iter__ = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -59264,7 +63982,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_4___iter__ = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_4___iter__ = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_11___iter__ = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -59277,13 +63995,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_4___iter__ = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_4___iter__ = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_11___iter__ = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_4___iter__ = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_11___iter__ = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -59304,12 +64022,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_4___iter__ = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_4___iter__ = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_11___iter__ = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_4___iter__"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_4___iter__), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_11___iter__"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_4___iter__, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_11___iter__, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -59319,24 +64037,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_4___iter__ = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_4___iter__, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_4___iter__, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_4___iter__, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_11___iter__, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_11___iter__, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_11___iter__, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_4___iter__, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_11___iter__, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_4___iter__, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_4___iter__, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_11___iter__, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_11___iter__, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_4___iter__, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_11___iter__, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -59346,7 +64064,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_4___iter__ = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_4___iter__, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_11___iter__, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -59360,44 +64078,44 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_4___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_12___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o);
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *)o);
   p->__pyx_v_self = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_5___str__(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_12___str__(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *)o;
+  Py_CLEAR(p->__pyx_v_self);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_5___str__(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_12___str__(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
+  struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *)o;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_5___str__(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_12___str__(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *)o;
   PyObject* tmp;
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Rule *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_5___str__[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_12___str__[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_5___str__ = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_12___str__ = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -59455,7 +64173,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_5___str__ = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_5___str__ = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_12___str__ = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -59468,13 +64186,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_5___str__ = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_5___str__ = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_12___str__ = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_5___str__ = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_12___str__ = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -59495,12 +64213,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_5___str__ = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_5___str__ = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_12___str__ = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_5___str__"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_5___str__), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_12___str__"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_12___str__), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_5___str__, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_12___str__, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -59510,24 +64228,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_5___str__ = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_5___str__, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_5___str__, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_5___str__, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_12___str__, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_12___str__, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_12___str__, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_5___str__, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_12___str__, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_5___str__, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_5___str__, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_12___str__, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_12___str__, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_5___str__, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_12___str__, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -59537,7 +64255,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_5___str__ = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_5___str__, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_12___str__, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -59551,29 +64269,28 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_5___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_13_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o);
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *)o);
   p->__pyx_outer_scope = 0;
   p->__pyx_v_a = 0;
   p->__pyx_t_0 = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
-  Py_XDECREF(p->__pyx_v_a);
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_13_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *)o;
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_a);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_13_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *)o;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -59586,12 +64303,11 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr(PyObject *o, visi
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_13_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
-  p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_5___str__ *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_a);
   p->__pyx_v_a = Py_None; Py_INCREF(Py_None);
@@ -59602,11 +64318,11 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_6_genexpr(PyObject *o) {
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_6_genexpr[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_13_genexpr[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_6_genexpr = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_13_genexpr = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -59664,7 +64380,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_6_genexpr = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_6_genexpr = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_13_genexpr = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -59677,13 +64393,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_6_genexpr = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_6_genexpr = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_13_genexpr = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_6_genexpr = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_13_genexpr = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -59704,12 +64420,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_6_genexpr = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_6_genexpr = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_13_genexpr = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_6_genexpr"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_13_genexpr"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_13_genexpr), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_6_genexpr, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_13_genexpr, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -59719,24 +64435,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_6_genexpr = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_6_genexpr, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_6_genexpr, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_6_genexpr, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_13_genexpr, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_13_genexpr, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_13_genexpr, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_6_genexpr, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_13_genexpr, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_6_genexpr, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_6_genexpr, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_13_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_13_genexpr, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_6_genexpr, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_13_genexpr, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -59746,7 +64462,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_6_genexpr = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_6_genexpr, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_13_genexpr, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -59760,29 +64476,28 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_6_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_alignments(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_14_alignments(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o);
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *)o);
   p->__pyx_v_point = 0;
   p->__pyx_v_self = 0;
   p->__pyx_t_0 = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
-  Py_XDECREF(p->__pyx_v_point);
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_14_alignments(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *)o;
+  Py_CLEAR(p->__pyx_v_point);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_14_alignments(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *)o;
   if (p->__pyx_v_point) {
     e = (*v)(p->__pyx_v_point, a); if (e) return e;
   }
@@ -59795,15 +64510,14 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments(PyObject *o, v
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_14_alignments(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_point);
   p->__pyx_v_point = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_Rule *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_t_0);
   p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
@@ -59811,11 +64525,11 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_7_alignments(PyObject *o) {
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_7_alignments[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_14_alignments[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_7_alignments = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_14_alignments = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -59873,7 +64587,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_7_alignments = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_7_alignments = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_14_alignments = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -59886,13 +64600,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_7_alignments =
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_7_alignments = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_14_alignments = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_7_alignments = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_14_alignments = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -59913,12 +64627,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_7_alignments = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_7_alignments = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_14_alignments = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_7_alignments"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_7_alignments), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_14_alignments"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_7_alignments, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_14_alignments, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -59928,24 +64642,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_7_alignments = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_7_alignments, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_7_alignments, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_7_alignments, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_14_alignments, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_14_alignments, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_14_alignments, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_7_alignments, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_14_alignments, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_7_alignments, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_7_alignments, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_14_alignments, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_14_alignments, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_7_alignments, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_14_alignments, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -59955,7 +64669,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_7_alignments = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_7_alignments, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_14_alignments, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -59969,11 +64683,11 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_7_alignments = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_15_input(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_15_input *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o);
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_15_input *)o);
   p->__pyx_v_alignment = 0;
   p->__pyx_v_als = 0;
   p->__pyx_v_alslist = 0;
@@ -60019,69 +64733,68 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_input(PyTypeObject *t, P
   p->__pyx_v_xcat_index = 0;
   p->__pyx_v_xnode = 0;
   p->__pyx_v_xroot = 0;
-  p->__pyx_t_2 = 0;
-  p->__pyx_t_3 = 0;
+  p->__pyx_t_1 = 0;
   p->__pyx_t_4 = 0;
+  p->__pyx_t_5 = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_8_input(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
-  Py_XDECREF(p->__pyx_v_alignment);
-  Py_XDECREF(p->__pyx_v_als);
-  Py_XDECREF(p->__pyx_v_alslist);
-  Py_XDECREF(((PyObject *)p->__pyx_v_chunklen));
-  Py_XDECREF(p->__pyx_v_count);
-  Py_XDECREF(p->__pyx_v_e);
-  Py_XDECREF(p->__pyx_v_elist);
-  Py_XDECREF(p->__pyx_v_extract);
-  Py_XDECREF(p->__pyx_v_extract_start);
-  Py_XDECREF(p->__pyx_v_extract_stop);
-  Py_XDECREF(((PyObject *)p->__pyx_v_extracts));
-  Py_XDECREF(p->__pyx_v_f);
-  Py_XDECREF(p->__pyx_v_fcount);
-  Py_XDECREF(p->__pyx_v_fphrases);
-  Py_XDECREF(((PyObject *)p->__pyx_v_frontier));
-  Py_XDECREF(p->__pyx_v_frontier_nodes);
-  Py_XDECREF(p->__pyx_v_fwords);
-  Py_XDECREF(((PyObject *)p->__pyx_v_hiero_phrase));
-  Py_XDECREF(p->__pyx_v_is_shadow_path);
-  Py_XDECREF(((PyObject *)p->__pyx_v_key));
-  Py_XDECREF(p->__pyx_v_loc);
-  Py_XDECREF(((PyObject *)p->__pyx_v_locs));
-  Py_XDECREF(p->__pyx_v_max_locs);
-  Py_XDECREF(((PyObject *)p->__pyx_v_new_frontier));
-  Py_XDECREF(p->__pyx_v_new_node);
-  Py_XDECREF(((PyObject *)p->__pyx_v_next_states));
-  Py_XDECREF(p->__pyx_v_node);
-  Py_XDECREF(((PyObject *)p->__pyx_v_nodes_isteps_away_buffer));
-  Py_XDECREF(p->__pyx_v_pathlen);
-  Py_XDECREF(p->__pyx_v_phrase);
-  Py_XDECREF(((PyObject *)p->__pyx_v_phrase_location));
-  Py_XDECREF(p->__pyx_v_prefix);
-  Py_XDECREF(((PyObject *)p->__pyx_v_reachable_buffer));
-  Py_XDECREF(p->__pyx_v_sa_range);
-  Py_XDECREF(((PyObject *)p->__pyx_v_sample));
-  Py_XDECREF(((PyObject *)p->__pyx_v_scores));
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  Py_XDECREF(p->__pyx_v_spanlen);
-  Py_XDECREF(p->__pyx_v_stop_time);
-  Py_XDECREF(p->__pyx_v_suffix_link);
-  Py_XDECREF(p->__pyx_v_suffix_link_xcat_index);
-  Py_XDECREF(p->__pyx_v_word_id);
-  Py_XDECREF(p->__pyx_v_xcat_index);
-  Py_XDECREF(p->__pyx_v_xnode);
-  Py_XDECREF(p->__pyx_v_xroot);
-  Py_XDECREF(p->__pyx_t_2);
-  Py_XDECREF(p->__pyx_t_3);
-  Py_XDECREF(p->__pyx_t_4);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
-}
-
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitproc v, void *a) {
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_15_input(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_15_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_15_input *)o;
+  Py_CLEAR(p->__pyx_v_alignment);
+  Py_CLEAR(p->__pyx_v_als);
+  Py_CLEAR(p->__pyx_v_alslist);
+  Py_CLEAR(p->__pyx_v_chunklen);
+  Py_CLEAR(p->__pyx_v_count);
+  Py_CLEAR(p->__pyx_v_e);
+  Py_CLEAR(p->__pyx_v_elist);
+  Py_CLEAR(p->__pyx_v_extract);
+  Py_CLEAR(p->__pyx_v_extract_start);
+  Py_CLEAR(p->__pyx_v_extract_stop);
+  Py_CLEAR(p->__pyx_v_extracts);
+  Py_CLEAR(p->__pyx_v_f);
+  Py_CLEAR(p->__pyx_v_fcount);
+  Py_CLEAR(p->__pyx_v_fphrases);
+  Py_CLEAR(p->__pyx_v_frontier);
+  Py_CLEAR(p->__pyx_v_frontier_nodes);
+  Py_CLEAR(p->__pyx_v_fwords);
+  Py_CLEAR(p->__pyx_v_hiero_phrase);
+  Py_CLEAR(p->__pyx_v_is_shadow_path);
+  Py_CLEAR(p->__pyx_v_key);
+  Py_CLEAR(p->__pyx_v_loc);
+  Py_CLEAR(p->__pyx_v_locs);
+  Py_CLEAR(p->__pyx_v_max_locs);
+  Py_CLEAR(p->__pyx_v_new_frontier);
+  Py_CLEAR(p->__pyx_v_new_node);
+  Py_CLEAR(p->__pyx_v_next_states);
+  Py_CLEAR(p->__pyx_v_node);
+  Py_CLEAR(p->__pyx_v_nodes_isteps_away_buffer);
+  Py_CLEAR(p->__pyx_v_pathlen);
+  Py_CLEAR(p->__pyx_v_phrase);
+  Py_CLEAR(p->__pyx_v_phrase_location);
+  Py_CLEAR(p->__pyx_v_prefix);
+  Py_CLEAR(p->__pyx_v_reachable_buffer);
+  Py_CLEAR(p->__pyx_v_sa_range);
+  Py_CLEAR(p->__pyx_v_sample);
+  Py_CLEAR(p->__pyx_v_scores);
+  Py_CLEAR(p->__pyx_v_self);
+  Py_CLEAR(p->__pyx_v_spanlen);
+  Py_CLEAR(p->__pyx_v_stop_time);
+  Py_CLEAR(p->__pyx_v_suffix_link);
+  Py_CLEAR(p->__pyx_v_suffix_link_xcat_index);
+  Py_CLEAR(p->__pyx_v_word_id);
+  Py_CLEAR(p->__pyx_v_xcat_index);
+  Py_CLEAR(p->__pyx_v_xnode);
+  Py_CLEAR(p->__pyx_v_xroot);
+  Py_CLEAR(p->__pyx_t_1);
+  Py_CLEAR(p->__pyx_t_4);
+  Py_CLEAR(p->__pyx_t_5);
+  (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_15_input(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_15_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_15_input *)o;
   if (p->__pyx_v_alignment) {
     e = (*v)(p->__pyx_v_alignment, a); if (e) return e;
   }
@@ -60217,22 +64930,21 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input(PyObject *o, visitp
   if (p->__pyx_v_xroot) {
     e = (*v)(p->__pyx_v_xroot, a); if (e) return e;
   }
-  if (p->__pyx_t_2) {
-    e = (*v)(p->__pyx_t_2, a); if (e) return e;
-  }
-  if (p->__pyx_t_3) {
-    e = (*v)(p->__pyx_t_3, a); if (e) return e;
+  if (p->__pyx_t_1) {
+    e = (*v)(p->__pyx_t_1, a); if (e) return e;
   }
   if (p->__pyx_t_4) {
     e = (*v)(p->__pyx_t_4, a); if (e) return e;
   }
+  if (p->__pyx_t_5) {
+    e = (*v)(p->__pyx_t_5, a); if (e) return e;
+  }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_8_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_8_input *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_15_input(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_15_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_15_input *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_alignment);
   p->__pyx_v_alignment = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -60342,7 +65054,7 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   p->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_spanlen);
   p->__pyx_v_spanlen = Py_None; Py_INCREF(Py_None);
@@ -60368,23 +65080,23 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_8_input(PyObject *o) {
   tmp = ((PyObject*)p->__pyx_v_xroot);
   p->__pyx_v_xroot = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_2);
-  p->__pyx_t_2 = Py_None; Py_INCREF(Py_None);
-  Py_XDECREF(tmp);
-  tmp = ((PyObject*)p->__pyx_t_3);
-  p->__pyx_t_3 = Py_None; Py_INCREF(Py_None);
+  tmp = ((PyObject*)p->__pyx_t_1);
+  p->__pyx_t_1 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_t_4);
   p->__pyx_t_4 = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_t_5);
+  p->__pyx_t_5 = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_8_input[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_15_input[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_8_input = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_15_input = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -60442,7 +65154,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_8_input = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_8_input = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_15_input = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -60455,13 +65167,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_8_input = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_8_input = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_15_input = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_8_input = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_15_input = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -60482,12 +65194,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_8_input = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_8_input = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_15_input = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_8_input"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_8_input), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_15_input"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_15_input), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_8_input, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_15_input, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -60497,24 +65209,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_8_input = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_8_input, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_8_input, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_8_input, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_15_input, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_15_input, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_15_input, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_8_input, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_15_input, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_8_input, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_8_input, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_15_input, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_15_input, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_8_input, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_15_input, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -60524,7 +65236,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_8_input = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_8_input, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_15_input, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -60538,46 +65250,44 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_8_input = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_16___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o);
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *)o);
   p->__pyx_v_self = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_9___iter__(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_16___iter__(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *)o;
+  Py_CLEAR(p->__pyx_v_self);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_9___iter__(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_16___iter__(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *)o;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_9___iter__(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__ *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_16___iter__(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_9___iter__[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_16___iter__[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_9___iter__ = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_16___iter__ = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -60635,7 +65345,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_9___iter__ = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_9___iter__ = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_16___iter__ = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -60648,13 +65358,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_9___iter__ = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_9___iter__ = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_16___iter__ = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_9___iter__ = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_16___iter__ = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -60675,12 +65385,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_9___iter__ = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_9___iter__ = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_16___iter__ = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_9___iter__"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_9___iter__), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_16___iter__"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_9___iter__, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_16___iter__, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -60690,24 +65400,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_9___iter__ = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_9___iter__, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_9___iter__, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_9___iter__, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_16___iter__, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_16___iter__, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_16___iter__, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_9___iter__, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_16___iter__, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_9___iter__, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_9___iter__, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_16___iter__, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_16___iter__, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_9___iter__, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_16___iter__, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -60717,7 +65427,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_9___iter__ = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_9___iter__, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_16___iter__, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -60731,44 +65441,44 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_9___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p;
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_17___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o);
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *)o);
   p->__pyx_v_self = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_10___str__(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_17___str__(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *)o;
+  Py_CLEAR(p->__pyx_v_self);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_10___str__(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_17___str__(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
+  struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *)o;
   if (p->__pyx_v_self) {
     e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
   }
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_10___str__(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_17___str__(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *)o;
   PyObject* tmp;
   tmp = ((PyObject*)p->__pyx_v_self);
-  p->__pyx_v_self = Py_None; Py_INCREF(Py_None);
+  p->__pyx_v_self = ((struct __pyx_obj_3_sa_FeatureVector *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_10___str__[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_17___str__[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_10___str__ = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_17___str__ = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -60826,7 +65536,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_10___str__ = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_10___str__ = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_17___str__ = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -60839,13 +65549,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_10___str__ = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_10___str__ = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_17___str__ = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_10___str__ = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_17___str__ = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -60866,12 +65576,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_10___str__ = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_10___str__ = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_17___str__ = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_10___str__"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_10___str__), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_17___str__"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_17___str__), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_10___str__, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_17___str__, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -60881,24 +65591,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_10___str__ = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_10___str__, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_10___str__, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_10___str__, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_17___str__, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_17___str__, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_17___str__, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_10___str__, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_17___str__, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_10___str__, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_10___str__, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_17___str__, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_17___str__, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_10___str__, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_17___str__, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -60908,7 +65618,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_10___str__ = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_10___str__, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_17___str__, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -60922,29 +65632,28 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_10___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p;
-  PyObject *o = __pyx_tp_new_3_sa___pyx_Generator(t, a, k);
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_18_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *p;
+  PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
-  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o);
+  p = ((struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *)o);
   p->__pyx_outer_scope = 0;
   p->__pyx_v_feat = 0;
   p->__pyx_t_0 = 0;
   return o;
 }
 
-static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
-  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
-  Py_XDECREF(p->__pyx_v_feat);
-  Py_XDECREF(p->__pyx_t_0);
-  __pyx_tp_dealloc_3_sa___pyx_Generator(o);
+static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_18_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *)o;
+  Py_CLEAR(p->__pyx_outer_scope);
+  Py_CLEAR(p->__pyx_v_feat);
+  Py_CLEAR(p->__pyx_t_0);
+  (*Py_TYPE(o)->tp_free)(o);
 }
 
-static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr(PyObject *o, visitproc v, void *a) {
+static int __pyx_tp_traverse_3_sa___pyx_scope_struct_18_genexpr(PyObject *o, visitproc v, void *a) {
   int e;
-  struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
-  e = __pyx_tp_traverse_3_sa___pyx_Generator(o, v, a); if (e) return e;
+  struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *)o;
   if (p->__pyx_outer_scope) {
     e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
   }
@@ -60957,12 +65666,11 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr(PyObject *o, vis
   return 0;
 }
 
-static int __pyx_tp_clear_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
-  struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr *)o;
+static int __pyx_tp_clear_3_sa___pyx_scope_struct_18_genexpr(PyObject *o) {
+  struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr *)o;
   PyObject* tmp;
-  __pyx_tp_clear_3_sa___pyx_Generator(o);
   tmp = ((PyObject*)p->__pyx_outer_scope);
-  p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_10___str__ *)Py_None); Py_INCREF(Py_None);
+  p->__pyx_outer_scope = ((struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_feat);
   p->__pyx_v_feat = Py_None; Py_INCREF(Py_None);
@@ -60973,11 +65681,11 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_11_genexpr(PyObject *o) {
   return 0;
 }
 
-static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_11_genexpr[] = {
+static PyMethodDef __pyx_methods_3_sa___pyx_scope_struct_18_genexpr[] = {
   {0, 0, 0, 0}
 };
 
-static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_11_genexpr = {
+static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_18_genexpr = {
   0, /*nb_add*/
   0, /*nb_subtract*/
   0, /*nb_multiply*/
@@ -61035,7 +65743,7 @@ static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct_11_genexpr = {
   #endif
 };
 
-static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_11_genexpr = {
+static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_18_genexpr = {
   0, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
@@ -61048,13 +65756,13 @@ static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct_11_genexpr = {
   0, /*sq_inplace_repeat*/
 };
 
-static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_11_genexpr = {
+static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct_18_genexpr = {
   0, /*mp_length*/
   0, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
-static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_11_genexpr = {
+static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_18_genexpr = {
   #if PY_MAJOR_VERSION < 3
   0, /*bf_getreadbuffer*/
   #endif
@@ -61075,12 +65783,12 @@ static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct_11_genexpr = {
   #endif
 };
 
-static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_11_genexpr = {
+static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_18_genexpr = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_sa.__pyx_scope_struct_11_genexpr"), /*tp_name*/
-  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_11_genexpr), /*tp_basicsize*/
+  __Pyx_NAMESTR("_sa.__pyx_scope_struct_18_genexpr"), /*tp_name*/
+  sizeof(struct __pyx_obj_3_sa___pyx_scope_struct_18_genexpr), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3_sa___pyx_scope_struct_11_genexpr, /*tp_dealloc*/
+  __pyx_tp_dealloc_3_sa___pyx_scope_struct_18_genexpr, /*tp_dealloc*/
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
@@ -61090,24 +65798,24 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_11_genexpr = {
   0, /*reserved*/
   #endif
   0, /*tp_repr*/
-  &__pyx_tp_as_number___pyx_scope_struct_11_genexpr, /*tp_as_number*/
-  &__pyx_tp_as_sequence___pyx_scope_struct_11_genexpr, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping___pyx_scope_struct_11_genexpr, /*tp_as_mapping*/
+  &__pyx_tp_as_number___pyx_scope_struct_18_genexpr, /*tp_as_number*/
+  &__pyx_tp_as_sequence___pyx_scope_struct_18_genexpr, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping___pyx_scope_struct_18_genexpr, /*tp_as_mapping*/
   0, /*tp_hash*/
   0, /*tp_call*/
   0, /*tp_str*/
   0, /*tp_getattro*/
   0, /*tp_setattro*/
-  &__pyx_tp_as_buffer___pyx_scope_struct_11_genexpr, /*tp_as_buffer*/
+  &__pyx_tp_as_buffer___pyx_scope_struct_18_genexpr, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
   0, /*tp_doc*/
-  __pyx_tp_traverse_3_sa___pyx_scope_struct_11_genexpr, /*tp_traverse*/
-  __pyx_tp_clear_3_sa___pyx_scope_struct_11_genexpr, /*tp_clear*/
+  __pyx_tp_traverse_3_sa___pyx_scope_struct_18_genexpr, /*tp_traverse*/
+  __pyx_tp_clear_3_sa___pyx_scope_struct_18_genexpr, /*tp_clear*/
   0, /*tp_richcompare*/
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3_sa___pyx_scope_struct_11_genexpr, /*tp_methods*/
+  __pyx_methods_3_sa___pyx_scope_struct_18_genexpr, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -61117,7 +65825,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_11_genexpr = {
   0, /*tp_dictoffset*/
   0, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3_sa___pyx_scope_struct_11_genexpr, /*tp_new*/
+  __pyx_tp_new_3_sa___pyx_scope_struct_18_genexpr, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -61183,9 +65891,10 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_133, __pyx_k_133, sizeof(__pyx_k_133), 0, 0, 1, 0},
   {&__pyx_kp_s_134, __pyx_k_134, sizeof(__pyx_k_134), 0, 0, 1, 0},
   {&__pyx_kp_s_135, __pyx_k_135, sizeof(__pyx_k_135), 0, 0, 1, 0},
-  {&__pyx_kp_s_136, __pyx_k_136, sizeof(__pyx_k_136), 0, 0, 1, 0},
   {&__pyx_kp_s_138, __pyx_k_138, sizeof(__pyx_k_138), 0, 0, 1, 0},
+  {&__pyx_kp_s_139, __pyx_k_139, sizeof(__pyx_k_139), 0, 0, 1, 0},
   {&__pyx_kp_s_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 0, 1, 0},
+  {&__pyx_kp_s_143, __pyx_k_143, sizeof(__pyx_k_143), 0, 0, 1, 0},
   {&__pyx_kp_s_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 1, 0},
   {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
   {&__pyx_kp_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 0},
@@ -61277,6 +65986,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__collections, __pyx_k__collections, sizeof(__pyx_k__collections), 0, 0, 1, 1},
   {&__pyx_n_s__curr_idx, __pyx_k__curr_idx, sizeof(__pyx_k__curr_idx), 0, 0, 1, 1},
   {&__pyx_n_s__debug, __pyx_k__debug, sizeof(__pyx_k__debug), 0, 0, 1, 1},
+  {&__pyx_n_s__decode_lattice, __pyx_k__decode_lattice, sizeof(__pyx_k__decode_lattice), 0, 0, 1, 1},
+  {&__pyx_n_s__decode_sentence, __pyx_k__decode_sentence, sizeof(__pyx_k__decode_sentence), 0, 0, 1, 1},
   {&__pyx_n_s__defaultdict, __pyx_k__defaultdict, sizeof(__pyx_k__defaultdict), 0, 0, 1, 1},
   {&__pyx_n_s__dist, __pyx_k__dist, sizeof(__pyx_k__dist), 0, 0, 1, 1},
   {&__pyx_n_s__e, __pyx_k__e, sizeof(__pyx_k__e), 0, 0, 1, 1},
@@ -61304,6 +66015,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__fword, __pyx_k__fword, sizeof(__pyx_k__fword), 0, 0, 1, 1},
   {&__pyx_n_s__fwords, __pyx_k__fwords, sizeof(__pyx_k__fwords), 0, 0, 1, 1},
   {&__pyx_n_s__gc, __pyx_k__gc, sizeof(__pyx_k__gc), 0, 0, 1, 1},
+  {&__pyx_n_s__genexpr, __pyx_k__genexpr, sizeof(__pyx_k__genexpr), 0, 0, 1, 1},
   {&__pyx_n_s__getLogger, __pyx_k__getLogger, sizeof(__pyx_k__getLogger), 0, 0, 1, 1},
   {&__pyx_n_s__get_e_id, __pyx_k__get_e_id, sizeof(__pyx_k__get_e_id), 0, 0, 1, 1},
   {&__pyx_n_s__get_f_id, __pyx_k__get_f_id, sizeof(__pyx_k__get_f_id), 0, 0, 1, 1},
@@ -61334,11 +66046,13 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__j, __pyx_k__j, sizeof(__pyx_k__j), 0, 0, 1, 1},
   {&__pyx_n_s__join, __pyx_k__join, sizeof(__pyx_k__join), 0, 0, 1, 1},
   {&__pyx_n_s__key, __pyx_k__key, sizeof(__pyx_k__key), 0, 0, 1, 1},
+  {&__pyx_n_s__lattice, __pyx_k__lattice, sizeof(__pyx_k__lattice), 0, 0, 1, 1},
   {&__pyx_n_s__lhs, __pyx_k__lhs, sizeof(__pyx_k__lhs), 0, 0, 1, 1},
   {&__pyx_n_s__logger, __pyx_k__logger, sizeof(__pyx_k__logger), 0, 0, 1, 1},
   {&__pyx_n_s__logging, __pyx_k__logging, sizeof(__pyx_k__logging), 0, 0, 1, 1},
   {&__pyx_n_s__lookup, __pyx_k__lookup, sizeof(__pyx_k__lookup), 0, 0, 1, 1},
   {&__pyx_n_s__low, __pyx_k__low, sizeof(__pyx_k__low), 0, 0, 1, 1},
+  {&__pyx_n_s__make_lattice, __pyx_k__make_lattice, sizeof(__pyx_k__make_lattice), 0, 0, 1, 1},
   {&__pyx_n_s__map, __pyx_k__map, sizeof(__pyx_k__map), 0, 0, 1, 1},
   {&__pyx_n_s__matches, __pyx_k__matches, sizeof(__pyx_k__matches), 0, 0, 1, 1},
   {&__pyx_n_s__max, __pyx_k__max, sizeof(__pyx_k__max), 0, 0, 1, 1},
@@ -61404,10 +66118,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__start, __pyx_k__start, sizeof(__pyx_k__start), 0, 0, 1, 1},
   {&__pyx_n_s__stats, __pyx_k__stats, sizeof(__pyx_k__stats), 0, 0, 1, 1},
   {&__pyx_n_s__stop, __pyx_k__stop, sizeof(__pyx_k__stop), 0, 0, 1, 1},
-  {&__pyx_n_s__string, __pyx_k__string, sizeof(__pyx_k__string), 0, 0, 1, 1},
   {&__pyx_n_s__suffix_link, __pyx_k__suffix_link, sizeof(__pyx_k__suffix_link), 0, 0, 1, 1},
-  {&__pyx_n_s__sym_fromstring, __pyx_k__sym_fromstring, sizeof(__pyx_k__sym_fromstring), 0, 0, 1, 1},
-  {&__pyx_n_s__terminal, __pyx_k__terminal, sizeof(__pyx_k__terminal), 0, 0, 1, 1},
   {&__pyx_n_s__test_sentence, __pyx_k__test_sentence, sizeof(__pyx_k__test_sentence), 0, 0, 1, 1},
   {&__pyx_n_s__tight_phrases, __pyx_k__tight_phrases, sizeof(__pyx_k__tight_phrases), 0, 0, 1, 1},
   {&__pyx_n_s__toMap, __pyx_k__toMap, sizeof(__pyx_k__toMap), 0, 0, 1, 1},
@@ -61422,6 +66133,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__warn, __pyx_k__warn, sizeof(__pyx_k__warn), 0, 0, 1, 1},
   {&__pyx_n_s__word, __pyx_k__word, sizeof(__pyx_k__word), 0, 0, 1, 1},
   {&__pyx_n_s__word_alignments, __pyx_k__word_alignments, sizeof(__pyx_k__word_alignments), 0, 0, 1, 1},
+  {&__pyx_n_s__word_ids, __pyx_k__word_ids, sizeof(__pyx_k__word_ids), 0, 0, 1, 1},
   {&__pyx_n_s__words, __pyx_k__words, sizeof(__pyx_k__words), 0, 0, 1, 1},
   {&__pyx_n_s__write, __pyx_k__write, sizeof(__pyx_k__write), 0, 0, 1, 1},
   {&__pyx_n_s__write_text, __pyx_k__write_text, sizeof(__pyx_k__write_text), 0, 0, 1, 1},
@@ -61448,9 +66160,9 @@ static int __Pyx_InitCachedBuiltins(void) {
 
 static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants");
+  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":20
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -61458,7 +66170,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.sent_index = IntList(1000,1000)
  */
   __pyx_k_tuple_10 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_10));
+  __Pyx_GOTREF(__pyx_k_tuple_10);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61467,7 +66179,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":21
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":21
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -61475,7 +66187,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.use_sent_id = use_sent_id
  */
   __pyx_k_tuple_11 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_11));
+  __Pyx_GOTREF(__pyx_k_tuple_11);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_11, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61484,7 +66196,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_11));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":22
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":22
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -61492,7 +66204,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if from_binary:
  */
   __pyx_k_tuple_12 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_12));
+  __Pyx_GOTREF(__pyx_k_tuple_12);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_12, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61501,7 +66213,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -61509,13 +66221,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def read_text(self, char* filename):
  */
   __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_15));
+  __Pyx_GOTREF(__pyx_k_tuple_15);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -61523,7 +66235,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 if w_id > 1:
  */
   __pyx_k_tuple_16 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_16));
+  __Pyx_GOTREF(__pyx_k_tuple_16);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61535,7 +66247,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -61543,7 +66255,7 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_17 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_17));
+  __Pyx_GOTREF(__pyx_k_tuple_17);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61555,7 +66267,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":76
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -61563,13 +66275,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_19 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_19));
+  __Pyx_GOTREF(__pyx_k_tuple_19);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_18));
   PyTuple_SET_ITEM(__pyx_k_tuple_19, 0, ((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_19));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":75
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":75
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -61577,7 +66289,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.read_text_data(data)
  */
   __pyx_k_tuple_20 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_20));
+  __Pyx_GOTREF(__pyx_k_tuple_20);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_20, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61589,7 +66301,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_20));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -61597,13 +66309,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%d " %i)
  */
   __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_22));
+  __Pyx_GOTREF(__pyx_k_tuple_22);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_22, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_22));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -61611,13 +66323,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%d " %i)
  */
   __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_23));
+  __Pyx_GOTREF(__pyx_k_tuple_23);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_23, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_23));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -61625,13 +66337,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             f.write("%s %d " % (word, self.word2id[word]))
  */
   __pyx_k_tuple_24 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_24));
+  __Pyx_GOTREF(__pyx_k_tuple_24);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_24, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_24));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -61639,20 +66351,20 @@ static int __Pyx_InitCachedConstants(void) {
  *     def write_enhanced(self, char* filename):
  */
   __pyx_k_tuple_26 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_26)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_26));
+  __Pyx_GOTREF(__pyx_k_tuple_26);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_26, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_26));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":158
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.write_enhanced_handle(self, f)
  */
   __pyx_k_tuple_28 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_28));
+  __Pyx_GOTREF(__pyx_k_tuple_28);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_28, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61664,7 +66376,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_28));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":46
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -61672,7 +66384,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if from_binary:
  */
   __pyx_k_tuple_29 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_29)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_29));
+  __Pyx_GOTREF(__pyx_k_tuple_29);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_29, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61681,7 +66393,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_29));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":47
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":47
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -61689,7 +66401,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.read_binary(from_binary)
  */
   __pyx_k_tuple_30 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_30)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_30));
+  __Pyx_GOTREF(__pyx_k_tuple_30);
   __Pyx_INCREF(__pyx_int_1000);
   PyTuple_SET_ITEM(__pyx_k_tuple_30, 0, __pyx_int_1000);
   __Pyx_GIVEREF(__pyx_int_1000);
@@ -61698,7 +66410,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_30));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":59
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))             # <<<<<<<<<<<<<<
@@ -61706,13 +66418,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             self.sent_index.append(len(self.links))
  */
   __pyx_k_tuple_32 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_32)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_32));
+  __Pyx_GOTREF(__pyx_k_tuple_32);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_31));
   PyTuple_SET_ITEM(__pyx_k_tuple_32, 0, ((PyObject *)__pyx_kp_s_31));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_31));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_32));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -61720,7 +66432,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 self.sent_index.append(len(self.links))
  */
   __pyx_k_tuple_33 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_33)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_33));
+  __Pyx_GOTREF(__pyx_k_tuple_33);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_33, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61732,7 +66444,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_33));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":75
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":75
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -61740,13 +66452,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d-%d " % self.unlink(link))
  */
   __pyx_k_tuple_34 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_34)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_34));
+  __Pyx_GOTREF(__pyx_k_tuple_34);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_34, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_34));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":78
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61754,13 +66466,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def write_binary(self, char* filename):
  */
   __pyx_k_tuple_36 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_36)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_36));
+  __Pyx_GOTREF(__pyx_k_tuple_36);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_36, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_36));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -61768,7 +66480,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for i, link in enumerate(self.links):
  */
   __pyx_k_tuple_37 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_37)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_37));
+  __Pyx_GOTREF(__pyx_k_tuple_37);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_37, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61780,7 +66492,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_37));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":92
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
  *                 f.write("%d " % link)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61788,13 +66500,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % i)
  */
   __pyx_k_tuple_38 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_38)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_38));
+  __Pyx_GOTREF(__pyx_k_tuple_38);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_38, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_38));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":95
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61802,13 +66514,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def alignment(self, i):
  */
   __pyx_k_tuple_39 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_39)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_39));
+  __Pyx_GOTREF(__pyx_k_tuple_39);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_39, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_39));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -61816,7 +66528,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for link in self.links:
  */
   __pyx_k_tuple_40 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_40)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_40));
+  __Pyx_GOTREF(__pyx_k_tuple_40);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_40, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61828,7 +66540,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_40));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":297
  * 
  *             # Re-read file, placing words into buckets
  *             f.seek(0)             # <<<<<<<<<<<<<<
@@ -61836,13 +66548,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 (fword, eword, score1, score2) = line.split()
  */
   __pyx_k_tuple_43 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_43)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_43));
+  __Pyx_GOTREF(__pyx_k_tuple_43);
   __Pyx_INCREF(__pyx_int_0);
   PyTuple_SET_ITEM(__pyx_k_tuple_43, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_43));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -61850,7 +66562,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for line in f:
  */
   __pyx_k_tuple_44 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_44)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_44));
+  __Pyx_GOTREF(__pyx_k_tuple_44);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_44, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61862,7 +66574,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_44));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":339
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":339
  * 
  *         if i > j:
  *             raise Exception("Sort error in CLex")             # <<<<<<<<<<<<<<
@@ -61870,13 +66582,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             return
  */
   __pyx_k_tuple_47 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_47)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_47));
+  __Pyx_GOTREF(__pyx_k_tuple_47);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_46));
   PyTuple_SET_ITEM(__pyx_k_tuple_47, 0, ((PyObject *)__pyx_kp_s_46));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_46));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_47));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":362
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61884,13 +66596,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %f %f " % (i, s1, s2))
  */
   __pyx_k_tuple_49 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_49)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_49));
+  __Pyx_GOTREF(__pyx_k_tuple_49);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_49, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_49));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":365
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":365
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61898,13 +66610,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %s " % (i, w))
  */
   __pyx_k_tuple_51 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_51)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_51));
+  __Pyx_GOTREF(__pyx_k_tuple_51);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_51, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_51));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":368
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61912,13 +66624,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d %s " % (i, w))
  */
   __pyx_k_tuple_53 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_53)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_53));
+  __Pyx_GOTREF(__pyx_k_tuple_53);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_53, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_53));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":371
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -61926,13 +66638,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_54 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_54)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_54));
+  __Pyx_GOTREF(__pyx_k_tuple_54);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_54, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_54));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -61940,7 +66652,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % i)
  */
   __pyx_k_tuple_55 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_55)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_55));
+  __Pyx_GOTREF(__pyx_k_tuple_55);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_55, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61952,7 +66664,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_55));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -61960,7 +66672,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             f_id = 0
  */
   __pyx_k_tuple_57 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_57)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_57));
+  __Pyx_GOTREF(__pyx_k_tuple_57);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_57, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -61972,7 +66684,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_57));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":13
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
  * 
  *         logger.info("Constructing LCP array")             # <<<<<<<<<<<<<<
@@ -61980,13 +66692,13 @@ static int __Pyx_InitCachedConstants(void) {
  *         n = self.sa.sa.len
  */
   __pyx_k_tuple_61 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_61)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_61));
+  __Pyx_GOTREF(__pyx_k_tuple_61);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_60));
   PyTuple_SET_ITEM(__pyx_k_tuple_61, 0, ((PyObject *)__pyx_kp_s_60));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_60));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_61));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":34
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":34
  *             if h > 0:
  *                 h = h-1
  *         logger.info("LCP array completed")             # <<<<<<<<<<<<<<
@@ -61994,13 +66706,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def compute_stats(self, int max_n):
  */
   __pyx_k_tuple_63 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_63)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_63));
+  __Pyx_GOTREF(__pyx_k_tuple_63);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_62));
   PyTuple_SET_ITEM(__pyx_k_tuple_63, 0, ((PyObject *)__pyx_kp_s_62));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_62));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_63));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":297
  *         pattern_rank = {}
  * 
  *         logger.info("Precomputing frequent intersections")             # <<<<<<<<<<<<<<
@@ -62008,13 +66720,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_73 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_73)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_73));
+  __Pyx_GOTREF(__pyx_k_tuple_73);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_72));
   PyTuple_SET_ITEM(__pyx_k_tuple_73, 0, ((PyObject *)__pyx_kp_s_72));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_72));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_73));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":314
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":314
  *         queue = IntList(increment=1000)
  * 
  *         logger.info("    Computing inverted indexes...")             # <<<<<<<<<<<<<<
@@ -62022,13 +66734,13 @@ static int __Pyx_InitCachedConstants(void) {
  *         for i from 0 <= i < N:
  */
   __pyx_k_tuple_75 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_75)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_75));
+  __Pyx_GOTREF(__pyx_k_tuple_75);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_74));
   PyTuple_SET_ITEM(__pyx_k_tuple_75, 0, ((PyObject *)__pyx_kp_s_74));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_74));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_75));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":329
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":329
  *                     trie_node_data_append(node, i)
  * 
  *         logger.info("    Computing collocations...")             # <<<<<<<<<<<<<<
@@ -62036,13 +66748,13 @@ static int __Pyx_InitCachedConstants(void) {
  *         ptr1 = 0
  */
   __pyx_k_tuple_77 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_77)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_77));
+  __Pyx_GOTREF(__pyx_k_tuple_77);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_76));
   PyTuple_SET_ITEM(__pyx_k_tuple_77, 0, ((PyObject *)__pyx_kp_s_76));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_76));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_77));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":393
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":393
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -62050,13 +66762,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_79 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_79)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_79));
+  __Pyx_GOTREF(__pyx_k_tuple_79);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_79, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_79));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":400
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":400
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -62064,13 +66776,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_80 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_80)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_80));
+  __Pyx_GOTREF(__pyx_k_tuple_80);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_80, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_80));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":407
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":407
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -62078,13 +66790,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  */
   __pyx_k_tuple_81 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_81)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_81));
+  __Pyx_GOTREF(__pyx_k_tuple_81);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_81, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_81));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":409
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":409
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1             # <<<<<<<<<<<<<<
@@ -62092,13 +66804,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_82 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_82)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_82));
+  __Pyx_GOTREF(__pyx_k_tuple_82);
   __Pyx_INCREF(__pyx_int_neg_1);
   PyTuple_SET_ITEM(__pyx_k_tuple_82, 0, __pyx_int_neg_1);
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_82));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":103
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
@@ -62106,13 +66818,13 @@ static int __Pyx_InitCachedConstants(void) {
  *             j = isa.arr[i]
  */
   __pyx_k_tuple_94 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_94)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_94));
+  __Pyx_GOTREF(__pyx_k_tuple_94);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_93));
   PyTuple_SET_ITEM(__pyx_k_tuple_94, 0, ((PyObject *)__pyx_kp_s_93));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_93));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_94));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":202
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":202
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -62120,13 +66832,13 @@ static int __Pyx_InitCachedConstants(void) {
  *                 f.write("%d " % w_i)
  */
   __pyx_k_tuple_97 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_97)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_97));
+  __Pyx_GOTREF(__pyx_k_tuple_97);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_97, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_97));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":205
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":205
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -62134,13 +66846,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
   __pyx_k_tuple_98 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_98)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_98));
+  __Pyx_GOTREF(__pyx_k_tuple_98);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_98, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_98));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -62148,7 +66860,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             for a_i in self.sa:
  */
   __pyx_k_tuple_99 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_99)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_99));
+  __Pyx_GOTREF(__pyx_k_tuple_99);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_99, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
@@ -62160,7 +66872,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_99));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":107
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
@@ -62168,13 +66880,13 @@ static int __Pyx_InitCachedConstants(void) {
  *     def sample(self, PhraseLocation phrase_location):
  */
   __pyx_k_tuple_103 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_103)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_103));
+  __Pyx_GOTREF(__pyx_k_tuple_103);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_102));
   PyTuple_SET_ITEM(__pyx_k_tuple_103, 0, ((PyObject *)__pyx_kp_s_102));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_102));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_103));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":316
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":316
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
@@ -62182,13 +66894,13 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  */
   __pyx_k_tuple_108 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_108)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_108));
+  __Pyx_GOTREF(__pyx_k_tuple_108);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_107));
   PyTuple_SET_ITEM(__pyx_k_tuple_108, 0, ((PyObject *)__pyx_kp_s_107));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_107));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_108));
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1022
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1022
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
@@ -62196,12 +66908,30 @@ static int __Pyx_InitCachedConstants(void) {
  *                 if lookup_required:
  */
   __pyx_k_tuple_123 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_123)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_123));
+  __Pyx_GOTREF(__pyx_k_tuple_123);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_122));
   PyTuple_SET_ITEM(__pyx_k_tuple_123, 0, ((PyObject *)__pyx_kp_s_122));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_122));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_123));
 
+  /* "_sa.pyx":9
+ *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
+ * 
+ * def gzip_or_text(char* filename):             # <<<<<<<<<<<<<<
+ *     if filename.endswith('.gz'):
+ *         return gzip.GzipFile(filename)
+ */
+  __pyx_k_tuple_136 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_136)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_136);
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
+  PyTuple_SET_ITEM(__pyx_k_tuple_136, 0, ((PyObject *)__pyx_n_s__filename));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
+  PyTuple_SET_ITEM(__pyx_k_tuple_136, 1, ((PyObject *)__pyx_n_s__filename));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_136));
+  __pyx_k_codeobj_137 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_136, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_138, __pyx_n_s__gzip_or_text, 9, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_137)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
   /* "_sa.pyx":15
  *         return open(filename)
  * 
@@ -62209,12 +66939,80 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  * include "float_list.pxi"
  */
-  __pyx_k_tuple_137 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_137)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_137));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_136));
-  PyTuple_SET_ITEM(__pyx_k_tuple_137, 0, ((PyObject *)__pyx_kp_s_136));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_136));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_137));
+  __pyx_k_tuple_140 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_140)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_140);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_139));
+  PyTuple_SET_ITEM(__pyx_k_tuple_140, 0, ((PyObject *)__pyx_kp_s_139));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_139));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_140));
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":107
+ *     return ALPHABET.fromstring(string, terminal)
+ * 
+ * def make_lattice(words):             # <<<<<<<<<<<<<<
+ *     word_ids = (sym_fromstring(word, True) for word in words)
+ *     return tuple(((word, None, 1), ) for word in word_ids)
+ */
+  __pyx_k_tuple_141 = PyTuple_New(5); if (unlikely(!__pyx_k_tuple_141)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_141);
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__words));
+  PyTuple_SET_ITEM(__pyx_k_tuple_141, 0, ((PyObject *)__pyx_n_s__words));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__words));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__word_ids));
+  PyTuple_SET_ITEM(__pyx_k_tuple_141, 1, ((PyObject *)__pyx_n_s__word_ids));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__word_ids));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_141, 2, ((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_141, 3, ((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_141, 4, ((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_141));
+  __pyx_k_codeobj_142 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_141, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_143, __pyx_n_s__make_lattice, 107, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_142)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":111
+ *     return tuple(((word, None, 1), ) for word in word_ids)
+ * 
+ * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc
+ *             for arc in node for node in lattice)
+ */
+  __pyx_k_tuple_144 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_144)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_144);
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__lattice));
+  PyTuple_SET_ITEM(__pyx_k_tuple_144, 0, ((PyObject *)__pyx_n_s__lattice));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__lattice));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_144, 1, ((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_144, 2, ((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_144));
+  __pyx_k_codeobj_145 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_144, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_143, __pyx_n_s__decode_lattice, 111, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_145)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":115
+ *             for arc in node for node in lattice)
+ * 
+ * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
+ *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
+ */
+  __pyx_k_tuple_146 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_146)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_146);
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__lattice));
+  PyTuple_SET_ITEM(__pyx_k_tuple_146, 0, ((PyObject *)__pyx_n_s__lattice));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__lattice));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_146, 1, ((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_146, 2, ((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_146));
+  __pyx_k_codeobj_147 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_146, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_143, __pyx_n_s__decode_sentence, 115, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_147)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -62223,9 +67021,6 @@ static int __Pyx_InitCachedConstants(void) {
 }
 
 static int __Pyx_InitGlobals(void) {
-  #if PY_VERSION_HEX < 0x02040000
-  if (unlikely(__Pyx_Py23SetsImport() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #endif
   if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
@@ -62253,7 +67048,6 @@ PyMODINIT_FUNC PyInit__sa(void)
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
   __Pyx_RefNannyDeclarations
   #if CYTHON_REFNANNY
   __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
@@ -62264,12 +67058,18 @@ PyMODINIT_FUNC PyInit__sa(void)
           Py_FatalError("failed to import 'refnanny' module");
   }
   #endif
-  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__sa(void)");
+  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__sa(void)", 0);
   if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #ifdef __pyx_binding_PyCFunctionType_USED
-  if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #ifdef __Pyx_CyFunction_USED
+  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
+  #ifdef __Pyx_FusedFunction_USED
+  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
+  #ifdef __Pyx_Generator_USED
+  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   /*--- Library function declarations ---*/
   /*--- Threads initialization code ---*/
@@ -62280,16 +67080,15 @@ PyMODINIT_FUNC PyInit__sa(void)
   #endif
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_sa"), __pyx_methods, 0, 0, PYTHON_API_VERSION);
+  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_sa"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
   #else
   __pyx_m = PyModule_Create(&__pyx_moduledef);
   #endif
-  if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
-  #if PY_MAJOR_VERSION < 3
-  Py_INCREF(__pyx_m);
+  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #if CYTHON_COMPILING_IN_PYPY
+  Py_INCREF(__pyx_b);
   #endif
-  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
-  if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   /*--- Initialize various global constants etc. ---*/
   if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -62426,10 +67225,10 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetAttrString(__pyx_m, "Precomputation", (PyObject *)&__pyx_type_3_sa_Precomputation) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Precomputation = &__pyx_type_3_sa_Precomputation;
   __pyx_vtabptr_3_sa_SuffixArray = &__pyx_vtable_3_sa_SuffixArray;
-  __pyx_vtable_3_sa_SuffixArray.__search_high = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_high;
-  __pyx_vtable_3_sa_SuffixArray.__search_low = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_low;
-  __pyx_vtable_3_sa_SuffixArray.__get_range = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int))__pyx_f_3_sa_11SuffixArray___get_range;
-  __pyx_vtable_3_sa_SuffixArray.__lookup_helper = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___lookup_helper;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___search_high = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_high;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___search_low = (int (*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___search_low;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___get_range = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int, int))__pyx_f_3_sa_11SuffixArray___get_range;
+  __pyx_vtable_3_sa_SuffixArray.__pyx___lookup_helper = (PyObject *(*)(struct __pyx_obj_3_sa_SuffixArray *, int, int, int, int))__pyx_f_3_sa_11SuffixArray___lookup_helper;
   if (PyType_Ready(&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetVtable(__pyx_type_3_sa_SuffixArray.tp_dict, __pyx_vtabptr_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "SuffixArray", (PyObject *)&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -62479,41 +67278,44 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetVtable(__pyx_type_3_sa_Scorer.tp_dict, __pyx_vtabptr_3_sa_Scorer) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "Scorer", (PyObject *)&__pyx_type_3_sa_Scorer) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Scorer = &__pyx_type_3_sa_Scorer;
-  if (PyType_Ready(&__pyx_Generator_type) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_3_sa___pyx_Generator = &__pyx_Generator_type;
-  __pyx_type_3_sa___pyx_scope_struct____iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct____iter__) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct____iter__ = &__pyx_type_3_sa___pyx_scope_struct____iter__;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_1_read_bitext) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = &__pyx_type_3_sa___pyx_scope_struct_1_read_bitext;
-  __pyx_type_3_sa___pyx_scope_struct_2_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = &__pyx_type_3_sa___pyx_scope_struct_2_genexpr;
-  __pyx_type_3_sa___pyx_scope_struct_3_compute_stats.tp_base = __pyx_ptype_3_sa___pyx_Generator;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_3_compute_stats) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats = &__pyx_type_3_sa___pyx_scope_struct_3_compute_stats;
-  __pyx_type_3_sa___pyx_scope_struct_4___iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_4___iter__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_3_sa___pyx_scope_struct_4___iter__ = &__pyx_type_3_sa___pyx_scope_struct_4___iter__;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_5___str__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_3_sa___pyx_scope_struct_5___str__ = &__pyx_type_3_sa___pyx_scope_struct_5___str__;
-  __pyx_type_3_sa___pyx_scope_struct_6_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_6_genexpr) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_4_make_lattice) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_4_make_lattice = &__pyx_type_3_sa___pyx_scope_struct_4_make_lattice;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_5_genexpr) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_5_genexpr = &__pyx_type_3_sa___pyx_scope_struct_5_genexpr;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_6_genexpr) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_6_genexpr = &__pyx_type_3_sa___pyx_scope_struct_6_genexpr;
-  __pyx_type_3_sa___pyx_scope_struct_7_alignments.tp_base = __pyx_ptype_3_sa___pyx_Generator;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_7_alignments) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_3_sa___pyx_scope_struct_7_alignments = &__pyx_type_3_sa___pyx_scope_struct_7_alignments;
-  __pyx_type_3_sa___pyx_scope_struct_8_input.tp_base = __pyx_ptype_3_sa___pyx_Generator;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_8_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_3_sa___pyx_scope_struct_8_input = &__pyx_type_3_sa___pyx_scope_struct_8_input;
-  __pyx_type_3_sa___pyx_scope_struct_9___iter__.tp_base = __pyx_ptype_3_sa___pyx_Generator;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_9___iter__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_3_sa___pyx_scope_struct_9___iter__ = &__pyx_type_3_sa___pyx_scope_struct_9___iter__;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_10___str__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_3_sa___pyx_scope_struct_10___str__ = &__pyx_type_3_sa___pyx_scope_struct_10___str__;
-  __pyx_type_3_sa___pyx_scope_struct_11_genexpr.tp_base = __pyx_ptype_3_sa___pyx_Generator;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_11_genexpr) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_3_sa___pyx_scope_struct_11_genexpr = &__pyx_type_3_sa___pyx_scope_struct_11_genexpr;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_7_decode_lattice) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_7_decode_lattice = &__pyx_type_3_sa___pyx_scope_struct_7_decode_lattice;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_8_genexpr) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_8_genexpr = &__pyx_type_3_sa___pyx_scope_struct_8_genexpr;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_9_decode_sentence) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_9_decode_sentence = &__pyx_type_3_sa___pyx_scope_struct_9_decode_sentence;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_10_genexpr) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_10_genexpr = &__pyx_type_3_sa___pyx_scope_struct_10_genexpr;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_11___iter__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_11___iter__ = &__pyx_type_3_sa___pyx_scope_struct_11___iter__;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_12___str__) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_12___str__ = &__pyx_type_3_sa___pyx_scope_struct_12___str__;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_13_genexpr) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_13_genexpr = &__pyx_type_3_sa___pyx_scope_struct_13_genexpr;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_14_alignments) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_14_alignments = &__pyx_type_3_sa___pyx_scope_struct_14_alignments;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_15_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_15_input = &__pyx_type_3_sa___pyx_scope_struct_15_input;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_16___iter__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_16___iter__ = &__pyx_type_3_sa___pyx_scope_struct_16___iter__;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_17___str__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_17___str__ = &__pyx_type_3_sa___pyx_scope_struct_17___str__;
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_18_genexpr) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_3_sa___pyx_scope_struct_18_genexpr = &__pyx_type_3_sa___pyx_scope_struct_18_genexpr;
   /*--- Type import code ---*/
   /*--- Variable import code ---*/
   /*--- Function import code ---*/
@@ -62559,7 +67361,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  *     if filename.endswith('.gz'):
  *         return gzip.GzipFile(filename)
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_gzip_or_text, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_1gzip_or_text, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gzip_or_text, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -62576,13 +67378,13 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__getLogger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_137), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_140), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__logger, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
  *     cdef id2eword, id2fword, eword2id, fword2id
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
@@ -62595,7 +67397,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":17
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":17
  * from libc.string cimport memset
  * 
  * cdef int MIN_BOTTOM_SIZE = 32             # <<<<<<<<<<<<<<
@@ -62604,7 +67406,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MIN_BOTTOM_SIZE = 32;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":18
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":18
  * 
  * cdef int MIN_BOTTOM_SIZE = 32
  * cdef int MIN_BOTTOM_BITS = 5             # <<<<<<<<<<<<<<
@@ -62613,7 +67415,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MIN_BOTTOM_BITS = 5;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":28
  *         LOWER_MASK[i] = mask
  * 
  * _init_lower_mask()             # <<<<<<<<<<<<<<
@@ -62622,7 +67424,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_f_3_sa__init_lower_mask();
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":4
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":4
  * from libc.stdlib cimport malloc, realloc, strtol
  * 
  * cdef int INDEX_SHIFT = 3             # <<<<<<<<<<<<<<
@@ -62631,7 +67433,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_INDEX_SHIFT = 3;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":5
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":5
  * 
  * cdef int INDEX_SHIFT = 3
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1             # <<<<<<<<<<<<<<
@@ -62640,7 +67442,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_INDEX_MASK = ((1 << __pyx_v_3_sa_INDEX_SHIFT) - 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":87
  *             return self.terminals.index(s)
  * 
  * cdef Alphabet ALPHABET = Alphabet()             # <<<<<<<<<<<<<<
@@ -62655,18 +67457,42 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_v_3_sa_ALPHABET = ((struct __pyx_obj_3_sa_Alphabet *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
- *     return ALPHABET.setindex(sym, id)
- * 
- * def sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":107
  *     return ALPHABET.fromstring(string, terminal)
+ * 
+ * def make_lattice(words):             # <<<<<<<<<<<<<<
+ *     word_ids = (sym_fromstring(word, True) for word in words)
+ *     return tuple(((word, None, 1), ) for word in word_ids)
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_1sym_fromstring, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_3make_lattice, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sym_fromstring, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__make_lattice, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":5
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":111
+ *     return tuple(((word, None, 1), ) for word in word_ids)
+ * 
+ * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
+ *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc
+ *             for arc in node for node in lattice)
+ */
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_5decode_lattice, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__decode_lattice, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":115
+ *             for arc in node for node in lattice)
+ * 
+ * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
+ *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
+ */
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3_sa_7decode_sentence, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__decode_sentence, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":5
  * # Much faster than the Python numbers reported there.
  * # Note to reader: this code is closer to C than Python
  * import gc             # <<<<<<<<<<<<<<
@@ -62678,7 +67504,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gc, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":6
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":6
  * # Note to reader: this code is closer to C than Python
  * import gc
  * import itertools             # <<<<<<<<<<<<<<
@@ -62690,7 +67516,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__itertools, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":12
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":12
  * from libc.math cimport fmod, ceil, floor, log
  * 
  * from collections import defaultdict, Counter, namedtuple             # <<<<<<<<<<<<<<
@@ -62698,7 +67524,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  * FeatureContext = namedtuple('FeatureContext',
  */
   __pyx_t_1 = PyList_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__defaultdict));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__defaultdict));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__defaultdict));
@@ -62711,21 +67537,33 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__collections), ((PyObject *)__pyx_t_1), -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__defaultdict);
+  if (__pyx_t_1 == NULL) {
+    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__defaultdict);
+    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__defaultdict, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Counter); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Counter);
+  if (__pyx_t_1 == NULL) {
+    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__Counter);
+    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__Counter, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__namedtuple);
+  if (__pyx_t_1 == NULL) {
+    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__namedtuple);
+    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__namedtuple, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":14
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":14
  * from collections import defaultdict, Counter, namedtuple
  * 
  * FeatureContext = namedtuple('FeatureContext',             # <<<<<<<<<<<<<<
@@ -62735,7 +67573,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":15
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":15
  * 
  * FeatureContext = namedtuple('FeatureContext',
  *     ['fphrase',             # <<<<<<<<<<<<<<
@@ -62743,7 +67581,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  *      'paircount',
  */
   __pyx_t_1 = PyList_New(10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__fphrase));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__fphrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fphrase));
@@ -62775,7 +67613,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   PyList_SET_ITEM(__pyx_t_1, 9, ((PyObject *)__pyx_n_s__e_text));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__e_text));
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__FeatureContext));
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_n_s__FeatureContext));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__FeatureContext));
@@ -62789,7 +67627,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FeatureContext, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":27
  *     ])
  * 
  * cdef int PRECOMPUTE = 0             # <<<<<<<<<<<<<<
@@ -62798,7 +67636,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_PRECOMPUTE = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":28
  * 
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1             # <<<<<<<<<<<<<<
@@ -62807,7 +67645,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MERGE = 1;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":29
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":29
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1
  * cdef int BAEZA_YATES = 2             # <<<<<<<<<<<<<<
@@ -62816,60 +67654,42 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_BAEZA_YATES = 2;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":32
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":32
  * 
  * # NOTE: was encoded as a non-terminal in the previous version
  * cdef int EPSILON = sym_fromstring('*EPS*', True)             # <<<<<<<<<<<<<<
  * 
  * cdef class TrieNode:
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__sym_fromstring); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_138));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_138));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_138));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
-  __Pyx_GIVEREF(__pyx_t_3);
-  __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_3_sa_EPSILON = __pyx_t_4;
+  __pyx_v_3_sa_EPSILON = __pyx_f_3_sa_sym_fromstring(__pyx_k_148, 1);
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":55
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":55
  *     cdef public int count
  *     cdef public root
  *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
  *         self.count = 0
  *         self.extended = extended
  */
-  __pyx_t_3 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_k_100 = __pyx_t_3;
-  __Pyx_GIVEREF(__pyx_t_3);
-  __pyx_t_3 = 0;
+  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_k_100 = __pyx_t_1;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":1
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":1
  * cdef StringMap FD = StringMap() # Feature name dictionary             # <<<<<<<<<<<<<<
  * 
  * INITIAL_CAPACITY = 7 # default number of features
  */
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_StringMap)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_XGOTREF(((PyObject *)__pyx_v_3_sa_FD));
   __Pyx_DECREF(((PyObject *)__pyx_v_3_sa_FD));
-  __Pyx_GIVEREF(__pyx_t_3);
-  __pyx_v_3_sa_FD = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_3);
-  __pyx_t_3 = 0;
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_v_3_sa_FD = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":3
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":3
  * cdef StringMap FD = StringMap() # Feature name dictionary
  * 
  * INITIAL_CAPACITY = 7 # default number of features             # <<<<<<<<<<<<<<
@@ -62878,27 +67698,27 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__INITIAL_CAPACITY, __pyx_int_7) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 3; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":4
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":4
  * 
  * INITIAL_CAPACITY = 7 # default number of features
  * INCREMENT = INITIAL_CAPACITY # double size             # <<<<<<<<<<<<<<
  * 
  * cdef class FeatureVector:
  */
-  __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__INITIAL_CAPACITY); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__INCREMENT, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__INITIAL_CAPACITY); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__INCREMENT, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   /* "_sa.pyx":1
  * import logging             # <<<<<<<<<<<<<<
  * import resource
  * import gzip
  */
-  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_3)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
@@ -62920,7 +67740,6 @@ PyMODINIT_FUNC PyInit__sa(void)
 }
 
 /* Runtime support code */
-
 #if CYTHON_REFNANNY
 static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
     PyObject *m = NULL, *p = NULL;
@@ -62952,92 +67771,6 @@ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
     return result;
 }
 
-static int __Pyx_PyBytes_SingleTailmatch(PyObject* self, PyObject* arg, Py_ssize_t start,
-                                         Py_ssize_t end, int direction)
-{
-    const char* self_ptr = PyBytes_AS_STRING(self);
-    Py_ssize_t self_len = PyBytes_GET_SIZE(self);
-    const char* sub_ptr;
-    Py_ssize_t sub_len;
-    int retval;
-
-#if PY_VERSION_HEX >= 0x02060000
-    Py_buffer view;
-    view.obj = NULL;
-#endif
-
-    if ( PyBytes_Check(arg) ) {
-        sub_ptr = PyBytes_AS_STRING(arg);
-        sub_len = PyBytes_GET_SIZE(arg);
-    }
-#if PY_MAJOR_VERSION < 3
-    // Python 2.x allows mixing unicode and str
-    else if ( PyUnicode_Check(arg) ) {
-        return PyUnicode_Tailmatch(self, arg, start, end, direction);
-    }
-#endif
-    else {
-#if PY_VERSION_HEX < 0x02060000
-        if (unlikely(PyObject_AsCharBuffer(arg, &sub_ptr, &sub_len)))
-            return -1;
-#else
-        if (unlikely(PyObject_GetBuffer(self, &view, PyBUF_SIMPLE) == -1))
-            return -1;
-        sub_ptr = (const char*) view.buf;
-        sub_len = view.len;
-#endif
-    }
-
-    if (end > self_len)
-        end = self_len;
-    else if (end < 0)
-        end += self_len;
-    if (end < 0)
-        end = 0;
-    if (start < 0)
-        start += self_len;
-    if (start < 0)
-        start = 0;
-
-    if (direction > 0) {
-        /* endswith */
-        if (end-sub_len > start)
-            start = end - sub_len;
-    }
-
-    if (start + sub_len <= end)
-        retval = !memcmp(self_ptr+start, sub_ptr, sub_len);
-    else
-        retval = 0;
-
-#if PY_VERSION_HEX >= 0x02060000
-    if (view.obj)
-        PyBuffer_Release(&view);
-#endif
-
-    return retval;
-}
-
-static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t start,
-                                   Py_ssize_t end, int direction)
-{
-    if (unlikely(PyTuple_Check(substr))) {
-        int result;
-        Py_ssize_t i;
-        for (i = 0; i < PyTuple_GET_SIZE(substr); i++) {
-            result = __Pyx_PyBytes_SingleTailmatch(self, PyTuple_GET_ITEM(substr, i),
-                                                   start, end, direction);
-            if (result) {
-                return result;
-            }
-        }
-        return 0;
-    }
-
-    return __Pyx_PyBytes_SingleTailmatch(self, substr, start, end, direction);
-}
-
-
 static void __Pyx_RaiseDoubleKeywordsError(
     const char* func_name,
     PyObject* kw_name)
@@ -63047,7 +67780,7 @@ static void __Pyx_RaiseDoubleKeywordsError(
         "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
         #else
         "%s() got multiple values for keyword argument '%s'", func_name,
-        PyString_AS_STRING(kw_name));
+        PyString_AsString(kw_name));
         #endif
 }
 
@@ -63063,55 +67796,77 @@ static int __Pyx_ParseOptionalKeywords(
     Py_ssize_t pos = 0;
     PyObject*** name;
     PyObject*** first_kw_arg = argnames + num_pos_args;
-
     while (PyDict_Next(kwds, &pos, &key, &value)) {
         name = first_kw_arg;
         while (*name && (**name != key)) name++;
         if (*name) {
             values[name-argnames] = value;
-        } else {
-            #if PY_MAJOR_VERSION < 3
-            if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) {
-            #else
-            if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) {
-            #endif
-                goto invalid_keyword_type;
-            } else {
-                for (name = first_kw_arg; *name; name++) {
-                    #if PY_MAJOR_VERSION >= 3
-                    if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
-                        PyUnicode_Compare(**name, key) == 0) break;
-                    #else
-                    if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
-                        _PyString_Eq(**name, key)) break;
-                    #endif
-                }
-                if (*name) {
+            continue;
+        }
+        name = first_kw_arg;
+        #if PY_MAJOR_VERSION < 3
+        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
+            while (*name) {
+                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
+                        && _PyString_Eq(**name, key)) {
                     values[name-argnames] = value;
-                } else {
-                    /* unexpected keyword found */
-                    for (name=argnames; name != first_kw_arg; name++) {
-                        if (**name == key) goto arg_passed_twice;
-                        #if PY_MAJOR_VERSION >= 3
-                        if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
-                            PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice;
-                        #else
-                        if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
-                            _PyString_Eq(**name, key)) goto arg_passed_twice;
-                        #endif
-                    }
-                    if (kwds2) {
-                        if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
-                    } else {
-                        goto invalid_keyword;
+                    break;
+                }
+                name++;
+            }
+            if (*name) continue;
+            else {
+                PyObject*** argname = argnames;
+                while (argname != first_kw_arg) {
+                    if ((**argname == key) || (
+                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
+                             && _PyString_Eq(**argname, key))) {
+                        goto arg_passed_twice;
                     }
+                    argname++;
+                }
+            }
+        } else
+        #endif
+        if (likely(PyUnicode_Check(key))) {
+            while (*name) {
+                int cmp = (**name == key) ? 0 :
+                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
+                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
+                #endif
+                    PyUnicode_Compare(**name, key);
+                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
+                if (cmp == 0) {
+                    values[name-argnames] = value;
+                    break;
                 }
+                name++;
             }
+            if (*name) continue;
+            else {
+                PyObject*** argname = argnames;
+                while (argname != first_kw_arg) {
+                    int cmp = (**argname == key) ? 0 :
+                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
+                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
+                    #endif
+                        PyUnicode_Compare(**argname, key);
+                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
+                    if (cmp == 0) goto arg_passed_twice;
+                    argname++;
+                }
+            }
+        } else
+            goto invalid_keyword_type;
+        if (kwds2) {
+            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
+        } else {
+            goto invalid_keyword;
         }
     }
     return 0;
 arg_passed_twice:
-    __Pyx_RaiseDoubleKeywordsError(function_name, **name);
+    __Pyx_RaiseDoubleKeywordsError(function_name, key);
     goto bad;
 invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
@@ -63139,7 +67894,6 @@ static void __Pyx_RaiseArgtupleInvalid(
 {
     Py_ssize_t num_expected;
     const char *more_or_less;
-
     if (num_found < num_min) {
         num_expected = num_min;
         more_or_less = "at least";
@@ -63151,15 +67905,15 @@ static void __Pyx_RaiseArgtupleInvalid(
         more_or_less = "exactly";
     }
     PyErr_Format(PyExc_TypeError,
-                 "%s() takes %s %"PY_FORMAT_SIZE_T"d positional argument%s (%"PY_FORMAT_SIZE_T"d given)",
+                 "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)",
                  func_name, more_or_less, num_expected,
                  (num_expected == 1) ? "" : "s", num_found);
 }
 
 static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
-
     tmp_type = tstate->curexc_type;
     tmp_value = tstate->curexc_value;
     tmp_tb = tstate->curexc_traceback;
@@ -63169,55 +67923,60 @@ static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyOb
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
+#else
+    PyErr_Restore(type, value, tb);
+#endif
 }
-
 static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->curexc_type;
     *value = tstate->curexc_value;
     *tb = tstate->curexc_traceback;
-
     tstate->curexc_type = 0;
     tstate->curexc_value = 0;
     tstate->curexc_traceback = 0;
+#else
+    PyErr_Fetch(type, value, tb);
+#endif
 }
 
-
 #if PY_MAJOR_VERSION < 3
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
-    /* cause is unused */
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
+                        CYTHON_UNUSED PyObject *cause) {
     Py_XINCREF(type);
-    Py_XINCREF(value);
-    Py_XINCREF(tb);
-    /* First, check the traceback argument, replacing None with NULL. */
-    if (tb == Py_None) {
-        Py_DECREF(tb);
-        tb = 0;
-    }
-    else if (tb != NULL && !PyTraceBack_Check(tb)) {
-        PyErr_SetString(PyExc_TypeError,
-            "raise: arg 3 must be a traceback or None");
-        goto raise_error;
-    }
-    /* Next, replace a missing value with None */
-    if (value == NULL) {
-        value = Py_None;
+    if (!value || value == Py_None)
+        value = NULL;
+    else
         Py_INCREF(value);
+    if (!tb || tb == Py_None)
+        tb = NULL;
+    else {
+        Py_INCREF(tb);
+        if (!PyTraceBack_Check(tb)) {
+            PyErr_SetString(PyExc_TypeError,
+                "raise: arg 3 must be a traceback or None");
+            goto raise_error;
+        }
     }
     #if PY_VERSION_HEX < 0x02050000
-    if (!PyClass_Check(type))
+    if (PyClass_Check(type)) {
     #else
-    if (!PyType_Check(type))
+    if (PyType_Check(type)) {
     #endif
-    {
-        /* Raising an instance.  The value should be a dummy. */
-        if (value != Py_None) {
+#if CYTHON_COMPILING_IN_PYPY
+        if (!value) {
+            Py_INCREF(Py_None);
+            value = Py_None;
+        }
+#endif
+        PyErr_NormalizeException(&type, &value, &tb);
+    } else {
+        if (value) {
             PyErr_SetString(PyExc_TypeError,
                 "instance exception may not have a separate value");
             goto raise_error;
         }
-        /* Normalize to raise <class>, <instance> */
-        Py_DECREF(value);
         value = type;
         #if PY_VERSION_HEX < 0x02050000
             if (PyInstance_Check(type)) {
@@ -63240,7 +67999,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             }
         #endif
     }
-
     __Pyx_ErrRestore(type, value, tb);
     return;
 raise_error:
@@ -63249,10 +68007,9 @@ raise_error:
     Py_XDECREF(tb);
     return;
 }
-
 #else /* Python 3+ */
-
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
+    PyObject* owned_instance = NULL;
     if (tb == Py_None) {
         tb = 0;
     } else if (tb && !PyTraceBack_Check(tb)) {
@@ -63262,7 +68019,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
     }
     if (value == Py_None)
         value = 0;
-
     if (PyExceptionInstance_Check(type)) {
         if (value) {
             PyErr_SetString(PyExc_TypeError,
@@ -63271,13 +68027,36 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
         }
         value = type;
         type = (PyObject*) Py_TYPE(value);
-    } else if (!PyExceptionClass_Check(type)) {
+    } else if (PyExceptionClass_Check(type)) {
+        PyObject *args;
+        if (!value)
+            args = PyTuple_New(0);
+        else if (PyTuple_Check(value)) {
+            Py_INCREF(value);
+            args = value;
+        }
+        else
+            args = PyTuple_Pack(1, value);
+        if (!args)
+            goto bad;
+        owned_instance = PyEval_CallObject(type, args);
+        Py_DECREF(args);
+        if (!owned_instance)
+            goto bad;
+        value = owned_instance;
+        if (!PyExceptionInstance_Check(value)) {
+            PyErr_Format(PyExc_TypeError,
+                         "calling %R should have returned an instance of "
+                         "BaseException, not %R",
+                         type, Py_TYPE(value));
+            goto bad;
+        }
+    } else {
         PyErr_SetString(PyExc_TypeError,
             "raise: exception class must be a subclass of BaseException");
         goto bad;
     }
-
-    if (cause) {
+    if (cause && cause != Py_None) {
         PyObject *fixed_cause;
         if (PyExceptionClass_Check(cause)) {
             fixed_cause = PyObject_CallObject(cause, NULL);
@@ -63294,14 +68073,9 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
                             "BaseException");
             goto bad;
         }
-        if (!value) {
-            value = PyObject_CallObject(type, NULL);
-        }
         PyException_SetCause(value, fixed_cause);
     }
-
     PyErr_SetObject(type, value);
-
     if (tb) {
         PyThreadState *tstate = PyThreadState_GET();
         PyObject* tmp_tb = tstate->curexc_traceback;
@@ -63311,8 +68085,8 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             Py_XDECREF(tmp_tb);
         }
     }
-
 bad:
+    Py_XDECREF(owned_instance);
     return;
 }
 #endif
@@ -63336,13 +68110,17 @@ static CYTHON_INLINE int __Pyx_CheckKeywordStrings(
 {
     PyObject* key = 0;
     Py_ssize_t pos = 0;
+#if CPYTHON_COMPILING_IN_PYPY
+    if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0))
+        goto invalid_keyword;
+    return 1;
+#else
     while (PyDict_Next(kwdict, &pos, &key, 0)) {
         #if PY_MAJOR_VERSION < 3
         if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key)))
-        #else
-        if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key)))
         #endif
-            goto invalid_keyword_type;
+            if (unlikely(!PyUnicode_Check(key)))
+                goto invalid_keyword_type;
     }
     if ((!kw_allowed) && unlikely(key))
         goto invalid_keyword;
@@ -63351,6 +68129,7 @@ invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
         "%s() keywords must be strings", function_name);
     return 0;
+#endif
 invalid_keyword:
     PyErr_Format(PyExc_TypeError,
     #if PY_MAJOR_VERSION < 3
@@ -63363,9 +68142,9 @@ invalid_keyword:
     return 0;
 }
 
-
 static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *local_type, *local_value, *local_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
     local_type = tstate->curexc_type;
@@ -63374,19 +68153,27 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->curexc_type = 0;
     tstate->curexc_value = 0;
     tstate->curexc_traceback = 0;
+#else
+    PyErr_Fetch(&local_type, &local_value, &local_tb);
+#endif
     PyErr_NormalizeException(&local_type, &local_value, &local_tb);
+#if CYTHON_COMPILING_IN_CPYTHON
     if (unlikely(tstate->curexc_type))
+#else
+    if (unlikely(PyErr_Occurred()))
+#endif
         goto bad;
     #if PY_MAJOR_VERSION >= 3
     if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
         goto bad;
     #endif
-    *type = local_type;
-    *value = local_value;
-    *tb = local_tb;
     Py_INCREF(local_type);
     Py_INCREF(local_value);
     Py_INCREF(local_tb);
+    *type = local_type;
+    *value = local_value;
+    *tb = local_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
     tmp_type = tstate->exc_type;
     tmp_value = tstate->exc_value;
     tmp_tb = tstate->exc_traceback;
@@ -63394,10 +68181,13 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->exc_value = local_value;
     tstate->exc_traceback = local_tb;
     /* Make sure tstate is in a consistent state when we XDECREF
-       these objects (XDECREF may run arbitrary code). */
+       these objects (DECREF may run arbitrary code). */
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
+#else
+    PyErr_SetExcInfo(local_type, local_value, local_tb);
+#endif
     return 0;
 bad:
     *type = 0;
@@ -63409,7 +68199,6 @@ bad:
     return -1;
 }
 
-
 static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
     PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
 }
@@ -63427,23 +68216,40 @@ static CYTHON_INLINE long __Pyx_mod_long(long a, long b) {
     return r;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
     PyErr_Format(PyExc_ValueError,
-                 "need more than %"PY_FORMAT_SIZE_T"d value%s to unpack",
-                 index, (index == 1) ? "" : "s");
+                 "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected);
 }
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
+static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
     PyErr_Format(PyExc_ValueError,
-                 "too many values to unpack (expected %"PY_FORMAT_SIZE_T"d)", expected);
+                 "need more than %" CYTHON_FORMAT_SSIZE_T "d value%s to unpack",
+                 index, (index == 1) ? "" : "s");
 }
 
-static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
-    if (unlikely(retval)) {
-        Py_DECREF(retval);
-        __Pyx_RaiseTooManyValuesError(expected);
-        return -1;
-    } else if (PyErr_Occurred()) {
+static CYTHON_INLINE int __Pyx_IterFinish(void) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyThreadState *tstate = PyThreadState_GET();
+    PyObject* exc_type = tstate->curexc_type;
+    if (unlikely(exc_type)) {
+        if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) {
+            PyObject *exc_value, *exc_tb;
+            exc_value = tstate->curexc_value;
+            exc_tb = tstate->curexc_traceback;
+            tstate->curexc_type = 0;
+            tstate->curexc_value = 0;
+            tstate->curexc_traceback = 0;
+            Py_DECREF(exc_type);
+            Py_XDECREF(exc_value);
+            Py_XDECREF(exc_tb);
+            return 0;
+        } else {
+            return -1;
+        }
+    }
+    return 0;
+#else
+    if (unlikely(PyErr_Occurred())) {
         if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) {
             PyErr_Clear();
             return 0;
@@ -63452,11 +68258,25 @@ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
         }
     }
     return 0;
+#endif
 }
 
+static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
+    if (unlikely(retval)) {
+        Py_DECREF(retval);
+        __Pyx_RaiseTooManyValuesError(expected);
+        return -1;
+    } else {
+        return __Pyx_IterFinish();
+    }
+    return 0;
+}
 
 static double __Pyx__PyObject_AsDouble(PyObject* obj) {
     PyObject* float_value;
+#if CYTHON_COMPILING_IN_PYPY
+    float_value = PyNumber_Float(obj);
+#else
     if (Py_TYPE(obj)->tp_as_number && Py_TYPE(obj)->tp_as_number->nb_float) {
         return PyFloat_AsDouble(obj);
     } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) {
@@ -63473,6 +68293,7 @@ static double __Pyx__PyObject_AsDouble(PyObject* obj) {
         PyTuple_SET_ITEM(args, 0, 0);
         Py_DECREF(args);
     }
+#endif
     if (likely(float_value)) {
         double value = PyFloat_AS_DOUBLE(float_value);
         Py_DECREF(float_value);
@@ -63506,8 +68327,158 @@ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed
     return 0;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is unsubscriptable");
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+}
+
+static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
+    if (t == Py_None) {
+      __Pyx_RaiseNoneNotIterableError();
+    } else if (PyTuple_GET_SIZE(t) < index) {
+      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
+    } else {
+      __Pyx_RaiseTooManyValuesError(index);
+    }
+}
+
+static CYTHON_INLINE int __Pyx_unpack_tuple2(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2,
+                                             int is_tuple, int has_known_size, int decref_tuple) {
+    Py_ssize_t index;
+    PyObject *value1 = NULL, *value2 = NULL, *iter = NULL;
+    if (!is_tuple && unlikely(!PyTuple_Check(tuple))) {
+        iternextfunc iternext;
+        iter = PyObject_GetIter(tuple);
+        if (unlikely(!iter)) goto bad;
+        if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; }
+        iternext = Py_TYPE(iter)->tp_iternext;
+        value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; }
+        value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; }
+        if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad;
+        Py_DECREF(iter);
+    } else {
+        if (!has_known_size && unlikely(PyTuple_GET_SIZE(tuple) != 2)) {
+            __Pyx_UnpackTupleError(tuple, 2);
+            goto bad;
+        }
+#if CYTHON_COMPILING_IN_PYPY
+        value1 = PySequence_ITEM(tuple, 0);
+        if (unlikely(!value1)) goto bad;
+        value2 = PySequence_ITEM(tuple, 1);
+        if (unlikely(!value2)) goto bad;
+#else
+        value1 = PyTuple_GET_ITEM(tuple, 0);
+        value2 = PyTuple_GET_ITEM(tuple, 1);
+        Py_INCREF(value1);
+        Py_INCREF(value2);
+#endif
+        if (decref_tuple) { Py_DECREF(tuple); }
+    }
+    *pvalue1 = value1;
+    *pvalue2 = value2;
+    return 0;
+unpacking_failed:
+    if (!has_known_size && __Pyx_IterFinish() == 0)
+        __Pyx_RaiseNeedMoreValuesError(index);
+bad:
+    Py_XDECREF(iter);
+    Py_XDECREF(value1);
+    Py_XDECREF(value2);
+    if (decref_tuple) { Py_XDECREF(tuple); }
+    return -1;
+}
+
+static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name,
+                                                   Py_ssize_t* p_orig_length, int* p_source_is_dict) {
+    is_dict = is_dict || likely(PyDict_CheckExact(iterable));
+    *p_source_is_dict = is_dict;
+#if !CYTHON_COMPILING_IN_PYPY
+    if (is_dict) {
+        *p_orig_length = PyDict_Size(iterable);
+        Py_INCREF(iterable);
+        return iterable;
+    }
+#endif
+    *p_orig_length = 0;
+    if (method_name) {
+        PyObject* iter;
+        iterable = PyObject_CallMethodObjArgs(iterable, method_name, NULL);
+        if (!iterable)
+            return NULL;
+#if !CYTHON_COMPILING_IN_PYPY
+        if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable))
+            return iterable;
+#endif
+        iter = PyObject_GetIter(iterable);
+        Py_DECREF(iterable);
+        return iter;
+    }
+    return PyObject_GetIter(iterable);
+}
+static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* iter_obj, Py_ssize_t orig_length, Py_ssize_t* ppos,
+                                              PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) {
+    PyObject* next_item;
+#if !CYTHON_COMPILING_IN_PYPY
+    if (source_is_dict) {
+        PyObject *key, *value;
+        if (unlikely(orig_length != PyDict_Size(iter_obj))) {
+            PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration");
+            return -1;
+        }
+        if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) {
+            return 0;
+        }
+        if (pitem) {
+            PyObject* tuple = PyTuple_New(2);
+            if (unlikely(!tuple)) {
+                return -1;
+            }
+            Py_INCREF(key);
+            Py_INCREF(value);
+            PyTuple_SET_ITEM(tuple, 0, key);
+            PyTuple_SET_ITEM(tuple, 1, value);
+            *pitem = tuple;
+        } else {
+            if (pkey) {
+                Py_INCREF(key);
+                *pkey = key;
+            }
+            if (pvalue) {
+                Py_INCREF(value);
+                *pvalue = value;
+            }
+        }
+        return 1;
+    } else if (PyTuple_CheckExact(iter_obj)) {
+        Py_ssize_t pos = *ppos;
+        if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0;
+        *ppos = pos + 1;
+        next_item = PyTuple_GET_ITEM(iter_obj, pos);
+        Py_INCREF(next_item);
+    } else if (PyList_CheckExact(iter_obj)) {
+        Py_ssize_t pos = *ppos;
+        if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0;
+        *ppos = pos + 1;
+        next_item = PyList_GET_ITEM(iter_obj, pos);
+        Py_INCREF(next_item);
+    } else
+#endif
+    {
+        next_item = PyIter_Next(iter_obj);
+        if (unlikely(!next_item)) {
+            return __Pyx_IterFinish();
+        }
+    }
+    if (pitem) {
+        *pitem = next_item;
+    } else if (pkey && pvalue) {
+        if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1))
+            return -1;
+    } else if (pkey) {
+        *pkey = next_item;
+    } else {
+        *pvalue = next_item;
+    }
+    return 1;
 }
 
 static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
@@ -63518,6 +68489,7 @@ static CYTHON_INLINE int __Pyx_div_int(int a, int b) {
 }
 
 static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->exc_type;
     *value = tstate->exc_value;
@@ -63525,9 +68497,12 @@ static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value,
     Py_XINCREF(*type);
     Py_XINCREF(*value);
     Py_XINCREF(*tb);
+#else
+    PyErr_GetExcInfo(type, value, tb);
+#endif
 }
-
 static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
     tmp_type = tstate->exc_type;
@@ -63539,6 +68514,9 @@ static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb)
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
+#else
+    PyErr_SetExcInfo(type, value, tb);
+#endif
 }
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {
@@ -63567,12 +68545,33 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {
         goto bad;
     #if PY_VERSION_HEX >= 0x02050000
     {
-        PyObject *py_level = PyInt_FromLong(level);
-        if (!py_level)
-            goto bad;
-        module = PyObject_CallFunctionObjArgs(py_import,
-            name, global_dict, empty_dict, list, py_level, NULL);
-        Py_DECREF(py_level);
+        #if PY_MAJOR_VERSION >= 3
+        if (level == -1) {
+            if (strchr(__Pyx_MODULE_NAME, '.')) {
+                /* try package relative import first */
+                PyObject *py_level = PyInt_FromLong(1);
+                if (!py_level)
+                    goto bad;
+                module = PyObject_CallFunctionObjArgs(py_import,
+                    name, global_dict, empty_dict, list, py_level, NULL);
+                Py_DECREF(py_level);
+                if (!module) {
+                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
+                        goto bad;
+                    PyErr_Clear();
+                }
+            }
+            level = 0; /* try absolute import on failure */
+        }
+        #endif
+        if (!module) {
+            PyObject *py_level = PyInt_FromLong(level);
+            if (!py_level)
+                goto bad;
+            module = PyObject_CallFunctionObjArgs(py_import,
+                name, global_dict, empty_dict, list, py_level, NULL);
+            Py_DECREF(py_level);
+        }
     }
     #else
     if (level>0) {
@@ -63589,106 +68588,422 @@ bad:
     return module;
 }
 
-static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
-    if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
-        return (equals == Py_EQ);
-    } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
-        if (PyBytes_GET_SIZE(s1) != PyBytes_GET_SIZE(s2)) {
-            return (equals == Py_NE);
-        } else if (PyBytes_GET_SIZE(s1) == 1) {
-            if (equals == Py_EQ)
-                return (PyBytes_AS_STRING(s1)[0] == PyBytes_AS_STRING(s2)[0]);
-            else
-                return (PyBytes_AS_STRING(s1)[0] != PyBytes_AS_STRING(s2)[0]);
-        } else {
-            int result = memcmp(PyBytes_AS_STRING(s1), PyBytes_AS_STRING(s2), (size_t)PyBytes_GET_SIZE(s1));
-            return (equals == Py_EQ) ? (result == 0) : (result != 0);
-        }
-    } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
-        return (equals == Py_NE);
-    } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
-        return (equals == Py_NE);
-    } else {
-        int result;
-        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
-        if (!py_result)
-            return -1;
-        result = __Pyx_PyObject_IsTrue(py_result);
-        Py_DECREF(py_result);
-        return result;
-    }
+static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) {
+#if PY_MAJOR_VERSION < 3
+    PyErr_Format(PyExc_ImportError, "cannot import name %.230s",
+                 PyString_AsString(name));
+#else
+    PyErr_Format(PyExc_ImportError, "cannot import name %S", name);
+#endif
 }
 
-static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
-    if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
-        return (equals == Py_EQ);
-    } else if (PyUnicode_CheckExact(s1) & PyUnicode_CheckExact(s2)) {
-        if (PyUnicode_GET_SIZE(s1) != PyUnicode_GET_SIZE(s2)) {
-            return (equals == Py_NE);
-        } else if (PyUnicode_GET_SIZE(s1) == 1) {
-            if (equals == Py_EQ)
-                return (PyUnicode_AS_UNICODE(s1)[0] == PyUnicode_AS_UNICODE(s2)[0]);
-            else
-                return (PyUnicode_AS_UNICODE(s1)[0] != PyUnicode_AS_UNICODE(s2)[0]);
-        } else {
-            int result = PyUnicode_Compare(s1, s2);
-            if ((result == -1) && unlikely(PyErr_Occurred()))
-                return -1;
-            return (equals == Py_EQ) ? (result == 0) : (result != 0);
+static PyObject *
+__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure)
+{
+    if (op->func_doc == NULL && op->func.m_ml->ml_doc) {
+#if PY_MAJOR_VERSION >= 3
+        op->func_doc = PyUnicode_FromString(op->func.m_ml->ml_doc);
+#else
+        op->func_doc = PyString_FromString(op->func.m_ml->ml_doc);
+#endif
+    }
+    if (op->func_doc == 0) {
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
+    Py_INCREF(op->func_doc);
+    return op->func_doc;
+}
+static int
+__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value)
+{
+    PyObject *tmp = op->func_doc;
+    if (value == NULL)
+        op->func_doc = Py_None; /* Mark as deleted */
+    else
+        op->func_doc = value;
+    Py_INCREF(op->func_doc);
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op)
+{
+    if (op->func_name == NULL) {
+#if PY_MAJOR_VERSION >= 3
+        op->func_name = PyUnicode_InternFromString(op->func.m_ml->ml_name);
+#else
+        op->func_name = PyString_InternFromString(op->func.m_ml->ml_name);
+#endif
+    }
+    Py_INCREF(op->func_name);
+    return op->func_name;
+}
+static int
+__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value)
+{
+    PyObject *tmp;
+#if PY_MAJOR_VERSION >= 3
+    if (value == NULL || !PyUnicode_Check(value)) {
+#else
+    if (value == NULL || !PyString_Check(value)) {
+#endif
+        PyErr_SetString(PyExc_TypeError,
+                        "__name__ must be set to a string object");
+        return -1;
+    }
+    tmp = op->func_name;
+    Py_INCREF(value);
+    op->func_name = value;
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure)
+{
+    PyObject *self;
+    self = m->func_closure;
+    if (self == NULL)
+        self = Py_None;
+    Py_INCREF(self);
+    return self;
+}
+static PyObject *
+__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op)
+{
+    if (op->func_dict == NULL) {
+        op->func_dict = PyDict_New();
+        if (op->func_dict == NULL)
+            return NULL;
+    }
+    Py_INCREF(op->func_dict);
+    return op->func_dict;
+}
+static int
+__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value)
+{
+    PyObject *tmp;
+    if (value == NULL) {
+        PyErr_SetString(PyExc_TypeError,
+               "function's dictionary may not be deleted");
+        return -1;
+    }
+    if (!PyDict_Check(value)) {
+        PyErr_SetString(PyExc_TypeError,
+               "setting function's dictionary to a non-dict");
+        return -1;
+    }
+    tmp = op->func_dict;
+    Py_INCREF(value);
+    op->func_dict = value;
+    Py_XDECREF(tmp);
+    return 0;
+}
+static PyObject *
+__Pyx_CyFunction_get_globals(CYTHON_UNUSED __pyx_CyFunctionObject *op)
+{
+    PyObject* dict = PyModule_GetDict(__pyx_m);
+    Py_XINCREF(dict);
+    return dict;
+}
+static PyObject *
+__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op)
+{
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+static PyObject *
+__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op)
+{
+    PyObject* result = (op->func_code) ? op->func_code : Py_None;
+    Py_INCREF(result);
+    return result;
+}
+static PyObject *
+__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op)
+{
+    if (op->defaults_tuple) {
+        Py_INCREF(op->defaults_tuple);
+        return op->defaults_tuple;
+    }
+    if (op->defaults_getter) {
+        PyObject *res = op->defaults_getter((PyObject *) op);
+        if (res) {
+            Py_INCREF(res);
+            op->defaults_tuple = res;
         }
-    } else if ((s1 == Py_None) & PyUnicode_CheckExact(s2)) {
-        return (equals == Py_NE);
-    } else if ((s2 == Py_None) & PyUnicode_CheckExact(s1)) {
-        return (equals == Py_NE);
-    } else {
-        int result;
-        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
-        if (!py_result)
-            return -1;
-        result = __Pyx_PyObject_IsTrue(py_result);
-        Py_DECREF(py_result);
-        return result;
+        return res;
     }
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+static PyGetSetDef __pyx_CyFunction_getsets[] = {
+    {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
+    {(char *) "__doc__",  (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
+    {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
+    {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
+    {(char *) "__self__", (getter)__Pyx_CyFunction_get_self, 0, 0, 0},
+    {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
+    {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
+    {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
+    {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
+    {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
+    {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
+    {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
+    {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
+    {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, 0, 0, 0},
+    {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, 0, 0, 0},
+    {0, 0, 0, 0, 0}
+};
+#ifndef PY_WRITE_RESTRICTED /* < Py2.5 */
+#define PY_WRITE_RESTRICTED WRITE_RESTRICTED
+#endif
+static PyMemberDef __pyx_CyFunction_members[] = {
+    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CyFunctionObject, func.m_module), PY_WRITE_RESTRICTED, 0},
+    {0, 0, 0,  0, 0}
+};
+static PyObject *
+__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args)
+{
+#if PY_MAJOR_VERSION >= 3
+    return PyUnicode_FromString(m->func.m_ml->ml_name);
+#else
+    return PyString_FromString(m->func.m_ml->ml_name);
+#endif
 }
-
-
-static PyObject *__pyx_binding_PyCFunctionType_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) {
-    __pyx_binding_PyCFunctionType_object *op = PyObject_GC_New(__pyx_binding_PyCFunctionType_object, __pyx_binding_PyCFunctionType);
+static PyMethodDef __pyx_CyFunction_methods[] = {
+    {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0},
+    {0, 0, 0, 0}
+};
+static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags,
+                                      PyObject *closure, PyObject *module, PyObject* code) {
+    __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type);
     if (op == NULL)
         return NULL;
+    op->flags = flags;
+    op->func_weakreflist = NULL;
     op->func.m_ml = ml;
-    Py_XINCREF(self);
-    op->func.m_self = self;
+    op->func.m_self = (PyObject *) op;
+    Py_XINCREF(closure);
+    op->func_closure = closure;
     Py_XINCREF(module);
     op->func.m_module = module;
+    op->func_dict = NULL;
+    op->func_name = NULL;
+    op->func_doc = NULL;
+    op->func_classobj = NULL;
+    Py_XINCREF(code);
+    op->func_code = code;
+    op->defaults_pyobjects = 0;
+    op->defaults = NULL;
+    op->defaults_tuple = NULL;
+    op->defaults_getter = NULL;
     PyObject_GC_Track(op);
-    return (PyObject *)op;
+    return (PyObject *) op;
 }
-
-static void __pyx_binding_PyCFunctionType_dealloc(__pyx_binding_PyCFunctionType_object *m) {
+static int
+__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
+{
+    Py_CLEAR(m->func_closure);
+    Py_CLEAR(m->func.m_module);
+    Py_CLEAR(m->func_dict);
+    Py_CLEAR(m->func_name);
+    Py_CLEAR(m->func_doc);
+    Py_CLEAR(m->func_code);
+    Py_CLEAR(m->func_classobj);
+    Py_CLEAR(m->defaults_tuple);
+    if (m->defaults) {
+        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
+        int i;
+        for (i = 0; i < m->defaults_pyobjects; i++)
+            Py_XDECREF(pydefaults[i]);
+        PyMem_Free(m->defaults);
+        m->defaults = NULL;
+    }
+    return 0;
+}
+static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
+{
     PyObject_GC_UnTrack(m);
-    Py_XDECREF(m->func.m_self);
-    Py_XDECREF(m->func.m_module);
+    if (m->func_weakreflist != NULL)
+        PyObject_ClearWeakRefs((PyObject *) m);
+    __Pyx_CyFunction_clear(m);
     PyObject_GC_Del(m);
 }
-
-static PyObject *__pyx_binding_PyCFunctionType_descr_get(PyObject *func, PyObject *obj, PyObject *type) {
+static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg)
+{
+    Py_VISIT(m->func_closure);
+    Py_VISIT(m->func.m_module);
+    Py_VISIT(m->func_dict);
+    Py_VISIT(m->func_name);
+    Py_VISIT(m->func_doc);
+    Py_VISIT(m->func_code);
+    Py_VISIT(m->func_classobj);
+    Py_VISIT(m->defaults_tuple);
+    if (m->defaults) {
+        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
+        int i;
+        for (i = 0; i < m->defaults_pyobjects; i++)
+            Py_VISIT(pydefaults[i]);
+    }
+    return 0;
+}
+static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
+{
+    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
+    if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
+        Py_INCREF(func);
+        return func;
+    }
+    if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
+        if (type == NULL)
+            type = (PyObject *)(Py_TYPE(obj));
+        return PyMethod_New(func,
+                            type, (PyObject *)(Py_TYPE(type)));
+    }
     if (obj == Py_None)
-            obj = NULL;
+        obj = NULL;
     return PyMethod_New(func, obj, type);
 }
-
-static int __pyx_binding_PyCFunctionType_init(void) {
-    __pyx_binding_PyCFunctionType_type = PyCFunction_Type;
-    __pyx_binding_PyCFunctionType_type.tp_name = __Pyx_NAMESTR("cython_binding_builtin_function_or_method");
-    __pyx_binding_PyCFunctionType_type.tp_dealloc = (destructor)__pyx_binding_PyCFunctionType_dealloc;
-    __pyx_binding_PyCFunctionType_type.tp_descr_get = __pyx_binding_PyCFunctionType_descr_get;
-    if (PyType_Ready(&__pyx_binding_PyCFunctionType_type) < 0) {
-        return -1;
+static PyObject*
+__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op)
+{
+    PyObject *func_name = __Pyx_CyFunction_get_name(op);
+#if PY_MAJOR_VERSION >= 3
+    return PyUnicode_FromFormat("<cyfunction %U at %p>",
+                                func_name, (void *)op);
+#else
+    return PyString_FromFormat("<cyfunction %s at %p>",
+                               PyString_AsString(func_name), (void *)op);
+#endif
+}
+#if CYTHON_COMPILING_IN_PYPY
+static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+    PyCFunctionObject* f = (PyCFunctionObject*)func;
+    PyCFunction meth = PyCFunction_GET_FUNCTION(func);
+    PyObject *self = PyCFunction_GET_SELF(func);
+    Py_ssize_t size;
+    switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
+    case METH_VARARGS:
+        if (likely(kw == NULL) || PyDict_Size(kw) == 0)
+            return (*meth)(self, arg);
+        break;
+    case METH_VARARGS | METH_KEYWORDS:
+        return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
+    case METH_NOARGS:
+        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
+            size = PyTuple_GET_SIZE(arg);
+            if (size == 0)
+                return (*meth)(self, NULL);
+            PyErr_Format(PyExc_TypeError,
+                "%.200s() takes no arguments (%zd given)",
+                f->m_ml->ml_name, size);
+            return NULL;
+        }
+        break;
+    case METH_O:
+        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
+            size = PyTuple_GET_SIZE(arg);
+            if (size == 1)
+                return (*meth)(self, PyTuple_GET_ITEM(arg, 0));
+            PyErr_Format(PyExc_TypeError,
+                "%.200s() takes exactly one argument (%zd given)",
+                f->m_ml->ml_name, size);
+            return NULL;
+        }
+        break;
+    default:
+        PyErr_SetString(PyExc_SystemError, "Bad call flags in "
+                        "__Pyx_CyFunction_Call. METH_OLDARGS is no "
+                        "longer supported!");
+        return NULL;
     }
-    __pyx_binding_PyCFunctionType = &__pyx_binding_PyCFunctionType_type;
+    PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
+                 f->m_ml->ml_name);
+    return NULL;
+}
+#else
+static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+	return PyCFunction_Call(func, arg, kw);
+}
+#endif
+static PyTypeObject __pyx_CyFunctionType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    __Pyx_NAMESTR("cython_function_or_method"), /*tp_name*/
+    sizeof(__pyx_CyFunctionObject),   /*tp_basicsize*/
+    0,                                  /*tp_itemsize*/
+    (destructor) __Pyx_CyFunction_dealloc, /*tp_dealloc*/
+    0,                                  /*tp_print*/
+    0,                                  /*tp_getattr*/
+    0,                                  /*tp_setattr*/
+#if PY_MAJOR_VERSION < 3
+    0,                                  /*tp_compare*/
+#else
+    0,                                  /*reserved*/
+#endif
+    (reprfunc) __Pyx_CyFunction_repr,   /*tp_repr*/
+    0,                                  /*tp_as_number*/
+    0,                                  /*tp_as_sequence*/
+    0,                                  /*tp_as_mapping*/
+    0,                                  /*tp_hash*/
+    __Pyx_CyFunction_Call,              /*tp_call*/
+    0,                                  /*tp_str*/
+    0,                                  /*tp_getattro*/
+    0,                                  /*tp_setattro*/
+    0,                                  /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
+    0,                                  /*tp_doc*/
+    (traverseproc) __Pyx_CyFunction_traverse,   /*tp_traverse*/
+    (inquiry) __Pyx_CyFunction_clear,   /*tp_clear*/
+    0,                                  /*tp_richcompare*/
+    offsetof(__pyx_CyFunctionObject, func_weakreflist), /* tp_weaklistoffse */
+    0,                                  /*tp_iter*/
+    0,                                  /*tp_iternext*/
+    __pyx_CyFunction_methods,           /*tp_methods*/
+    __pyx_CyFunction_members,           /*tp_members*/
+    __pyx_CyFunction_getsets,           /*tp_getset*/
+    0,                                  /*tp_base*/
+    0,                                  /*tp_dict*/
+    __Pyx_CyFunction_descr_get,         /*tp_descr_get*/
+    0,                                  /*tp_descr_set*/
+    offsetof(__pyx_CyFunctionObject, func_dict),/*tp_dictoffset*/
+    0,                                  /*tp_init*/
+    0,                                  /*tp_alloc*/
+    0,                                  /*tp_new*/
+    0,                                  /*tp_free*/
+    0,                                  /*tp_is_gc*/
+    0,                                  /*tp_bases*/
+    0,                                  /*tp_mro*/
+    0,                                  /*tp_cache*/
+    0,                                  /*tp_subclasses*/
+    0,                                  /*tp_weaklist*/
+    0,                                  /*tp_del*/
+#if PY_VERSION_HEX >= 0x02060000
+    0,                                  /*tp_version_tag*/
+#endif
+};
+static int __Pyx_CyFunction_init(void) {
+#if !CYTHON_COMPILING_IN_PYPY
+    __pyx_CyFunctionType_type.tp_call = PyCFunction_Call;
+#endif
+    if (PyType_Ready(&__pyx_CyFunctionType_type) < 0)
+        return -1;
+    __pyx_CyFunctionType = &__pyx_CyFunctionType_type;
     return 0;
-
+}
+static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) {
+    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
+    m->defaults = PyMem_Malloc(size);
+    if (!m->defaults)
+        return PyErr_NoMemory();
+    memset(m->defaults, 0, sizeof(size));
+    m->defaults_pyobjects = pyobjects;
+    return m->defaults;
+}
+static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) {
+    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
+    m->defaults_tuple = tuple;
+    Py_INCREF(tuple);
 }
 
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
@@ -64091,8 +69406,8 @@ static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject*
     }
 }
 
-static void __Pyx_WriteUnraisable(const char *name, int clineno,
-                                  int lineno, const char *filename) {
+static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
+                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename) {
     PyObject *old_exc, *old_val, *old_tb;
     PyObject *ctx;
     __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
@@ -64112,125 +69427,522 @@ static void __Pyx_WriteUnraisable(const char *name, int clineno,
 
 static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *tmp_type, *tmp_value, *tmp_tb;
+#if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
-
     tmp_type = tstate->exc_type;
     tmp_value = tstate->exc_value;
     tmp_tb = tstate->exc_traceback;
-
     tstate->exc_type = *type;
     tstate->exc_value = *value;
     tstate->exc_traceback = *tb;
-
+#else
+    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
+    PyErr_SetExcInfo(*type, *value, *tb);
+#endif
     *type = tmp_type;
     *value = tmp_value;
     *tb = tmp_tb;
 }
 
-static CYTHON_INLINE void __Pyx_Generator_ExceptionClear(struct __pyx_Generator_object *self)
-{
-    Py_XDECREF(self->exc_type);
-    Py_XDECREF(self->exc_value);
-    Py_XDECREF(self->exc_traceback);
-
+static PyObject *__Pyx_Generator_Next(PyObject *self);
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
+static PyObject *__Pyx_Generator_Close(PyObject *self);
+static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args);
+static PyTypeObject *__pyx_GeneratorType = 0;
+#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
+#define __Pyx_Generator_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
+#if 1 || PY_VERSION_HEX < 0x030300B0
+static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
+    PyObject *et, *ev, *tb;
+    PyObject *value = NULL;
+    __Pyx_ErrFetch(&et, &ev, &tb);
+    if (!et) {
+        Py_XDECREF(tb);
+        Py_XDECREF(ev);
+        Py_INCREF(Py_None);
+        *pvalue = Py_None;
+        return 0;
+    }
+    if (unlikely(et != PyExc_StopIteration) &&
+            unlikely(!PyErr_GivenExceptionMatches(et, PyExc_StopIteration))) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    if (likely(et == PyExc_StopIteration)) {
+        if (likely(!ev) || !PyObject_IsInstance(ev, PyExc_StopIteration)) {
+            if (!ev) {
+                Py_INCREF(Py_None);
+                ev = Py_None;
+            }
+            Py_XDECREF(tb);
+            Py_DECREF(et);
+            *pvalue = ev;
+            return 0;
+        }
+    }
+    PyErr_NormalizeException(&et, &ev, &tb);
+    if (unlikely(!PyObject_IsInstance(ev, PyExc_StopIteration))) {
+        __Pyx_ErrRestore(et, ev, tb);
+        return -1;
+    }
+    Py_XDECREF(tb);
+    Py_DECREF(et);
+#if PY_VERSION_HEX >= 0x030300A0
+    value = ((PyStopIterationObject *)ev)->value;
+    Py_INCREF(value);
+    Py_DECREF(ev);
+#else
+    {
+        PyObject* args = PyObject_GetAttrString(ev, "args");
+        Py_DECREF(ev);
+        if (likely(args)) {
+            value = PyObject_GetItem(args, 0);
+            Py_DECREF(args);
+        }
+        if (unlikely(!value)) {
+            __Pyx_ErrRestore(NULL, NULL, NULL);
+            Py_INCREF(Py_None);
+            value = Py_None;
+        }
+    }
+#endif
+    *pvalue = value;
+    return 0;
+}
+#endif
+static CYTHON_INLINE
+void __Pyx_Generator_ExceptionClear(__pyx_GeneratorObject *self) {
+    PyObject *exc_type = self->exc_type;
+    PyObject *exc_value = self->exc_value;
+    PyObject *exc_traceback = self->exc_traceback;
     self->exc_type = NULL;
     self->exc_value = NULL;
     self->exc_traceback = NULL;
+    Py_XDECREF(exc_type);
+    Py_XDECREF(exc_value);
+    Py_XDECREF(exc_traceback);
 }
-
-static CYTHON_INLINE PyObject *__Pyx_Generator_SendEx(struct __pyx_Generator_object *self, PyObject *value)
-{
-    PyObject *retval;
-
-    if (self->is_running) {
+static CYTHON_INLINE
+int __Pyx_Generator_CheckRunning(__pyx_GeneratorObject *gen) {
+    if (unlikely(gen->is_running)) {
         PyErr_SetString(PyExc_ValueError,
                         "generator already executing");
-        return NULL;
+        return 1;
     }
-
-    if (self->resume_label == 0) {
-        if (value && value != Py_None) {
+    return 0;
+}
+static CYTHON_INLINE
+PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value) {
+    PyObject *retval;
+    assert(!self->is_running);
+    if (unlikely(self->resume_label == 0)) {
+        if (unlikely(value && value != Py_None)) {
             PyErr_SetString(PyExc_TypeError,
                             "can't send non-None value to a "
                             "just-started generator");
             return NULL;
         }
     }
-
-    if (self->resume_label == -1) {
+    if (unlikely(self->resume_label == -1)) {
         PyErr_SetNone(PyExc_StopIteration);
         return NULL;
     }
-
-
-    if (value)
-        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback);
-    else
+    if (value) {
+#if CYTHON_COMPILING_IN_PYPY
+#else
+        /* Generators always return to their most recent caller, not
+         * necessarily their creator. */
+        if (self->exc_traceback) {
+            PyThreadState *tstate = PyThreadState_GET();
+            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
+            PyFrameObject *f = tb->tb_frame;
+            Py_XINCREF(tstate->frame);
+            assert(f->f_back == NULL);
+            f->f_back = tstate->frame;
+        }
+#endif
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
+                            &self->exc_traceback);
+    } else {
         __Pyx_Generator_ExceptionClear(self);
-
+    }
     self->is_running = 1;
     retval = self->body((PyObject *) self, value);
     self->is_running = 0;
-
-    if (retval)
-        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback);
-    else
+    if (retval) {
+        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
+                            &self->exc_traceback);
+#if CYTHON_COMPILING_IN_PYPY
+#else
+        /* Don't keep the reference to f_back any longer than necessary.  It
+         * may keep a chain of frames alive or it could create a reference
+         * cycle. */
+        if (self->exc_traceback) {
+            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
+            PyFrameObject *f = tb->tb_frame;
+            Py_CLEAR(f->f_back);
+        }
+#endif
+    } else {
         __Pyx_Generator_ExceptionClear(self);
-
+    }
     return retval;
 }
-
-static PyObject *__Pyx_Generator_Next(PyObject *self)
-{
-    return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, Py_None);
-}
-
-static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value)
-{
-    return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, value);
+static CYTHON_INLINE
+PyObject *__Pyx_Generator_FinishDelegation(__pyx_GeneratorObject *gen) {
+    PyObject *ret;
+    PyObject *val = NULL;
+    __Pyx_Generator_Undelegate(gen);
+    __Pyx_PyGen_FetchStopIterationValue(&val);
+    ret = __Pyx_Generator_SendEx(gen, val);
+    Py_XDECREF(val);
+    return ret;
+}
+static PyObject *__Pyx_Generator_Next(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        ret = Py_TYPE(yf)->tp_iternext(yf);
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Generator_FinishDelegation(gen);
+    }
+    return __Pyx_Generator_SendEx(gen, Py_None);
 }
-
-static PyObject *__Pyx_Generator_Close(PyObject *self)
-{
-    struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
-    PyObject *retval;
+static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
+    PyObject *yf = gen->yieldfrom;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        gen->is_running = 1;
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Send(yf, value);
+        } else {
+            if (value == Py_None)
+                ret = PyIter_Next(yf);
+            else
+                ret = PyObject_CallMethod(yf, (char*)"send", (char*)"O", value);
+        }
+        gen->is_running = 0;
+        if (likely(ret)) {
+            return ret;
+        }
+        return __Pyx_Generator_FinishDelegation(gen);
+    }
+    return __Pyx_Generator_SendEx(gen, value);
+}
+static int __Pyx_Generator_CloseIter(__pyx_GeneratorObject *gen, PyObject *yf) {
+    PyObject *retval = NULL;
+    int err = 0;
+    if (__Pyx_Generator_CheckExact(yf)) {
+        retval = __Pyx_Generator_Close(yf);
+        if (!retval)
+            return -1;
+    } else {
+        PyObject *meth;
+        gen->is_running = 1;
+        meth = PyObject_GetAttrString(yf, "close");
+        if (unlikely(!meth)) {
+            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                PyErr_WriteUnraisable(yf);
+            }
+            PyErr_Clear();
+        } else {
+            retval = PyObject_CallFunction(meth, NULL);
+            Py_DECREF(meth);
+            if (!retval)
+                err = -1;
+        }
+        gen->is_running = 0;
+    }
+    Py_XDECREF(retval);
+    return err;
+}
+static PyObject *__Pyx_Generator_Close(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject *retval, *raised_exception;
+    PyObject *yf = gen->yieldfrom;
+    int err = 0;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        Py_INCREF(yf);
+        err = __Pyx_Generator_CloseIter(gen, yf);
+        __Pyx_Generator_Undelegate(gen);
+        Py_DECREF(yf);
+    }
+    if (err == 0)
 #if PY_VERSION_HEX < 0x02050000
-    PyErr_SetNone(PyExc_StopIteration);
+        PyErr_SetNone(PyExc_StopIteration);
 #else
-    PyErr_SetNone(PyExc_GeneratorExit);
+        PyErr_SetNone(PyExc_GeneratorExit);
 #endif
-    retval = __Pyx_Generator_SendEx(generator, NULL);
+    retval = __Pyx_Generator_SendEx(gen, NULL);
     if (retval) {
         Py_DECREF(retval);
         PyErr_SetString(PyExc_RuntimeError,
                         "generator ignored GeneratorExit");
         return NULL;
     }
-#if PY_VERSION_HEX < 0x02050000
-    if (PyErr_ExceptionMatches(PyExc_StopIteration))
-#else
-    if (PyErr_ExceptionMatches(PyExc_StopIteration)
-        || PyErr_ExceptionMatches(PyExc_GeneratorExit))
+    raised_exception = PyErr_Occurred();
+    if (!raised_exception
+        || raised_exception == PyExc_StopIteration
+#if PY_VERSION_HEX >= 0x02050000
+        || raised_exception == PyExc_GeneratorExit
+        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
 #endif
+        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
     {
-        PyErr_Clear();          /* ignore these errors */
+        if (raised_exception) PyErr_Clear();      /* ignore these errors */
         Py_INCREF(Py_None);
         return Py_None;
     }
     return NULL;
 }
-
-static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args, CYTHON_UNUSED PyObject *kwds)
-{
-    struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
+static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
     PyObject *typ;
     PyObject *tb = NULL;
     PyObject *val = NULL;
-
+    PyObject *yf = gen->yieldfrom;
     if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
         return NULL;
+    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
+        return NULL;
+    if (yf) {
+        PyObject *ret;
+        Py_INCREF(yf);
+#if PY_VERSION_HEX >= 0x02050000
+        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
+            int err = __Pyx_Generator_CloseIter(gen, yf);
+            Py_DECREF(yf);
+            __Pyx_Generator_Undelegate(gen);
+            if (err < 0)
+                return __Pyx_Generator_SendEx(gen, NULL);
+            goto throw_here;
+        }
+#endif
+        gen->is_running = 1;
+        if (__Pyx_Generator_CheckExact(yf)) {
+            ret = __Pyx_Generator_Throw(yf, args);
+        } else {
+            PyObject *meth = PyObject_GetAttrString(yf, "throw");
+            if (unlikely(!meth)) {
+                Py_DECREF(yf);
+                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                    gen->is_running = 0;
+                    return NULL;
+                }
+                PyErr_Clear();
+                __Pyx_Generator_Undelegate(gen);
+                gen->is_running = 0;
+                goto throw_here;
+            }
+            ret = PyObject_CallObject(meth, args);
+            Py_DECREF(meth);
+        }
+        gen->is_running = 0;
+        Py_DECREF(yf);
+        if (!ret) {
+            ret = __Pyx_Generator_FinishDelegation(gen);
+        }
+        return ret;
+    }
+throw_here:
     __Pyx_Raise(typ, val, tb, NULL);
-    return __Pyx_Generator_SendEx(generator, NULL);
+    return __Pyx_Generator_SendEx(gen, NULL);
+}
+static int __Pyx_Generator_traverse(PyObject *self, visitproc visit, void *arg) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    Py_VISIT(gen->closure);
+    Py_VISIT(gen->classobj);
+    Py_VISIT(gen->yieldfrom);
+    Py_VISIT(gen->exc_type);
+    Py_VISIT(gen->exc_value);
+    Py_VISIT(gen->exc_traceback);
+    return 0;
+}
+static int __Pyx_Generator_clear(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    Py_CLEAR(gen->closure);
+    Py_CLEAR(gen->classobj);
+    Py_CLEAR(gen->yieldfrom);
+    Py_CLEAR(gen->exc_type);
+    Py_CLEAR(gen->exc_value);
+    Py_CLEAR(gen->exc_traceback);
+    return 0;
+}
+static void __Pyx_Generator_dealloc(PyObject *self) {
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    PyObject_GC_UnTrack(gen);
+    if (gen->gi_weakreflist != NULL)
+        PyObject_ClearWeakRefs(self);
+    PyObject_GC_Track(self);
+    if (gen->resume_label > 0) {
+        Py_TYPE(gen)->tp_del(self);
+        if (self->ob_refcnt > 0)
+            return;                     /* resurrected.  :( */
+    }
+    PyObject_GC_UnTrack(self);
+    __Pyx_Generator_clear(self);
+    PyObject_GC_Del(gen);
+}
+static void __Pyx_Generator_del(PyObject *self) {
+    PyObject *res;
+    PyObject *error_type, *error_value, *error_traceback;
+    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
+    if (gen->resume_label <= 0)
+        return ;
+    assert(self->ob_refcnt == 0);
+    self->ob_refcnt = 1;
+    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
+    res = __Pyx_Generator_Close(self);
+    if (res == NULL)
+        PyErr_WriteUnraisable(self);
+    else
+        Py_DECREF(res);
+    __Pyx_ErrRestore(error_type, error_value, error_traceback);
+    /* Undo the temporary resurrection; can't use DECREF here, it would
+     * cause a recursive call.
+     */
+    assert(self->ob_refcnt > 0);
+    if (--self->ob_refcnt == 0)
+        return; /* this is the normal path out */
+    /* close() resurrected it!  Make it look like the original Py_DECREF
+     * never happened.
+     */
+    {
+        Py_ssize_t refcnt = self->ob_refcnt;
+        _Py_NewReference(self);
+        self->ob_refcnt = refcnt;
+    }
+#if CYTHON_COMPILING_FOR_CPYTHON
+    assert(PyType_IS_GC(self->ob_type) &&
+           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
+    /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
+     * we need to undo that. */
+    _Py_DEC_REFTOTAL;
+#endif
+    /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
+     * chain, so no more to do there.
+     * If COUNT_ALLOCS, the original decref bumped tp_frees, and
+     * _Py_NewReference bumped tp_allocs:  both of those need to be
+     * undone.
+     */
+#ifdef COUNT_ALLOCS
+    --Py_TYPE(self)->tp_frees;
+    --Py_TYPE(self)->tp_allocs;
+#endif
+}
+static PyMemberDef __pyx_Generator_memberlist[] = {
+    {(char *) "gi_running",
+#if PY_VERSION_HEX >= 0x02060000
+     T_BOOL,
+#else
+     T_BYTE,
+#endif
+     offsetof(__pyx_GeneratorObject, is_running),
+     READONLY,
+     NULL},
+    {0, 0, 0, 0, 0}
+};
+static PyMethodDef __pyx_Generator_methods[] = {
+    {__Pyx_NAMESTR("send"), (PyCFunction) __Pyx_Generator_Send, METH_O, 0},
+    {__Pyx_NAMESTR("throw"), (PyCFunction) __Pyx_Generator_Throw, METH_VARARGS, 0},
+    {__Pyx_NAMESTR("close"), (PyCFunction) __Pyx_Generator_Close, METH_NOARGS, 0},
+    {0, 0, 0, 0}
+};
+static PyTypeObject __pyx_GeneratorType_type = {
+    PyVarObject_HEAD_INIT(0, 0)
+    __Pyx_NAMESTR("generator"),         /*tp_name*/
+    sizeof(__pyx_GeneratorObject),      /*tp_basicsize*/
+    0,                                  /*tp_itemsize*/
+    (destructor) __Pyx_Generator_dealloc,/*tp_dealloc*/
+    0,                                  /*tp_print*/
+    0,                                  /*tp_getattr*/
+    0,                                  /*tp_setattr*/
+#if PY_MAJOR_VERSION < 3
+    0,                                  /*tp_compare*/
+#else
+    0,                                  /*reserved*/
+#endif
+    0,                                   /*tp_repr*/
+    0,                                  /*tp_as_number*/
+    0,                                  /*tp_as_sequence*/
+    0,                                  /*tp_as_mapping*/
+    0,                                  /*tp_hash*/
+    0,                                  /*tp_call*/
+    0,                                  /*tp_str*/
+    0,                                  /*tp_getattro*/
+    0,                                  /*tp_setattro*/
+    0,                                  /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
+    0,                                  /*tp_doc*/
+    (traverseproc) __Pyx_Generator_traverse,   /*tp_traverse*/
+    0,                                  /*tp_clear*/
+    0,                                  /*tp_richcompare*/
+    offsetof(__pyx_GeneratorObject, gi_weakreflist), /* tp_weaklistoffse */
+    0,                                  /*tp_iter*/
+    (iternextfunc) __Pyx_Generator_Next, /*tp_iternext*/
+    __pyx_Generator_methods,            /*tp_methods*/
+    __pyx_Generator_memberlist,         /*tp_members*/
+    0,                                  /*tp_getset*/
+    0,                                  /*tp_base*/
+    0,                                  /*tp_dict*/
+    0,                                  /*tp_descr_get*/
+    0,                                  /*tp_descr_set*/
+    0,                                  /*tp_dictoffset*/
+    0,                                  /*tp_init*/
+    0,                                  /*tp_alloc*/
+    0,                                  /*tp_new*/
+    0,                                  /*tp_free*/
+    0,                                  /*tp_is_gc*/
+    0,                                  /*tp_bases*/
+    0,                                  /*tp_mro*/
+    0,                                  /*tp_cache*/
+    0,                                  /*tp_subclasses*/
+    0,                                  /*tp_weaklist*/
+    __Pyx_Generator_del,                /*tp_del*/
+#if PY_VERSION_HEX >= 0x02060000
+    0,                                  /*tp_version_tag*/
+#endif
+};
+static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                                  PyObject *closure) {
+    __pyx_GeneratorObject *gen =
+        PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType_type);
+    if (gen == NULL)
+        return NULL;
+    gen->body = body;
+    gen->closure = closure;
+    Py_XINCREF(closure);
+    gen->is_running = 0;
+    gen->resume_label = 0;
+    gen->classobj = NULL;
+    gen->yieldfrom = NULL;
+    gen->exc_type = NULL;
+    gen->exc_value = NULL;
+    gen->exc_traceback = NULL;
+    gen->gi_weakreflist = NULL;
+    PyObject_GC_Track(gen);
+    return gen;
+}
+static int __pyx_Generator_init(void) {
+    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
+    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
+    if (PyType_Ready(&__pyx_GeneratorType_type)) {
+        return -1;
+    }
+    __pyx_GeneratorType = &__pyx_GeneratorType_type;
+    return 0;
 }
 
 static int __Pyx_check_binary_version(void) {
@@ -64259,7 +69971,6 @@ static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *s
         void (*fp)(void);
         void *p;
     } tmp;
-
     d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__");
     if (!d) {
         PyErr_Clear();
@@ -64306,29 +70017,105 @@ bad:
     return -1;
 }
 
+static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
+    int start = 0, mid = 0, end = count - 1;
+    if (end >= 0 && code_line > entries[end].code_line) {
+        return count;
+    }
+    while (start < end) {
+        mid = (start + end) / 2;
+        if (code_line < entries[mid].code_line) {
+            end = mid;
+        } else if (code_line > entries[mid].code_line) {
+             start = mid + 1;
+        } else {
+            return mid;
+        }
+    }
+    if (code_line <= entries[mid].code_line) {
+        return mid;
+    } else {
+        return mid + 1;
+    }
+}
+static PyCodeObject *__pyx_find_code_object(int code_line) {
+    PyCodeObject* code_object;
+    int pos;
+    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
+        return NULL;
+    }
+    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
+        return NULL;
+    }
+    code_object = __pyx_code_cache.entries[pos].code_object;
+    Py_INCREF(code_object);
+    return code_object;
+}
+static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
+    int pos, i;
+    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
+    if (unlikely(!code_line)) {
+        return;
+    }
+    if (unlikely(!entries)) {
+        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
+        if (likely(entries)) {
+            __pyx_code_cache.entries = entries;
+            __pyx_code_cache.max_count = 64;
+            __pyx_code_cache.count = 1;
+            entries[0].code_line = code_line;
+            entries[0].code_object = code_object;
+            Py_INCREF(code_object);
+        }
+        return;
+    }
+    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
+        PyCodeObject* tmp = entries[pos].code_object;
+        entries[pos].code_object = code_object;
+        Py_DECREF(tmp);
+        return;
+    }
+    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
+        int new_max = __pyx_code_cache.max_count + 64;
+        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
+            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));
+        if (unlikely(!entries)) {
+            return;
+        }
+        __pyx_code_cache.entries = entries;
+        __pyx_code_cache.max_count = new_max;
+    }
+    for (i=__pyx_code_cache.count; i>pos; i--) {
+        entries[i] = entries[i-1];
+    }
+    entries[pos].code_line = code_line;
+    entries[pos].code_object = code_object;
+    __pyx_code_cache.count++;
+    Py_INCREF(code_object);
+}
+
 #include "compile.h"
 #include "frameobject.h"
 #include "traceback.h"
-
-static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
-                               int __pyx_lineno, const char *__pyx_filename) {
+static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
+            const char *funcname, int c_line,
+            int py_line, const char *filename) {
+    PyCodeObject *py_code = 0;
     PyObject *py_srcfile = 0;
     PyObject *py_funcname = 0;
-    PyObject *py_globals = 0;
-    PyCodeObject *py_code = 0;
-    PyFrameObject *py_frame = 0;
-
     #if PY_MAJOR_VERSION < 3
-    py_srcfile = PyString_FromString(__pyx_filename);
+    py_srcfile = PyString_FromString(filename);
     #else
-    py_srcfile = PyUnicode_FromString(__pyx_filename);
+    py_srcfile = PyUnicode_FromString(filename);
     #endif
     if (!py_srcfile) goto bad;
-    if (__pyx_clineno) {
+    if (c_line) {
         #if PY_MAJOR_VERSION < 3
-        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
+        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
         #else
-        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
+        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
         #endif
     }
     else {
@@ -64339,28 +70126,45 @@ static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
         #endif
     }
     if (!py_funcname) goto bad;
-    py_globals = PyModule_GetDict(__pyx_m);
-    if (!py_globals) goto bad;
-    py_code = PyCode_New(
+    py_code = __Pyx_PyCode_New(
         0,            /*int argcount,*/
-        #if PY_MAJOR_VERSION >= 3
         0,            /*int kwonlyargcount,*/
-        #endif
         0,            /*int nlocals,*/
         0,            /*int stacksize,*/
         0,            /*int flags,*/
         __pyx_empty_bytes, /*PyObject *code,*/
-        __pyx_empty_tuple,  /*PyObject *consts,*/
-        __pyx_empty_tuple,  /*PyObject *names,*/
-        __pyx_empty_tuple,  /*PyObject *varnames,*/
-        __pyx_empty_tuple,  /*PyObject *freevars,*/
-        __pyx_empty_tuple,  /*PyObject *cellvars,*/
+        __pyx_empty_tuple, /*PyObject *consts,*/
+        __pyx_empty_tuple, /*PyObject *names,*/
+        __pyx_empty_tuple, /*PyObject *varnames,*/
+        __pyx_empty_tuple, /*PyObject *freevars,*/
+        __pyx_empty_tuple, /*PyObject *cellvars,*/
         py_srcfile,   /*PyObject *filename,*/
         py_funcname,  /*PyObject *name,*/
-        __pyx_lineno,   /*int firstlineno,*/
+        py_line,      /*int firstlineno,*/
         __pyx_empty_bytes  /*PyObject *lnotab*/
     );
-    if (!py_code) goto bad;
+    Py_DECREF(py_srcfile);
+    Py_DECREF(py_funcname);
+    return py_code;
+bad:
+    Py_XDECREF(py_srcfile);
+    Py_XDECREF(py_funcname);
+    return NULL;
+}
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+                               int py_line, const char *filename) {
+    PyCodeObject *py_code = 0;
+    PyObject *py_globals = 0;
+    PyFrameObject *py_frame = 0;
+    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
+    if (!py_code) {
+        py_code = __Pyx_CreateCodeObjectForTraceback(
+            funcname, c_line, py_line, filename);
+        if (!py_code) goto bad;
+        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
+    }
+    py_globals = PyModule_GetDict(__pyx_m);
+    if (!py_globals) goto bad;
     py_frame = PyFrame_New(
         PyThreadState_GET(), /*PyThreadState *tstate,*/
         py_code,             /*PyCodeObject *code,*/
@@ -64368,11 +70172,9 @@ static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
         0                    /*PyObject *locals*/
     );
     if (!py_frame) goto bad;
-    py_frame->f_lineno = __pyx_lineno;
+    py_frame->f_lineno = py_line;
     PyTraceBack_Here(py_frame);
 bad:
-    Py_XDECREF(py_srcfile);
-    Py_XDECREF(py_funcname);
     Py_XDECREF(py_code);
     Py_XDECREF(py_frame);
 }
@@ -64407,6 +70209,7 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     return 0;
 }
 
+
 /* Type Conversion Functions */
 
 static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
diff --git a/python/src/sa/sym.pxi b/python/src/sa/sym.pxi
index 132925f6..f47599cf 100644
--- a/python/src/sa/sym.pxi
+++ b/python/src/sa/sym.pxi
@@ -101,5 +101,16 @@ cdef int sym_getindex(int sym):
 cdef int sym_setindex(int sym, int id):
     return ALPHABET.setindex(sym, id)
 
-def sym_fromstring(char* string, bint terminal):
+cdef int sym_fromstring(char* string, bint terminal):
     return ALPHABET.fromstring(string, terminal)
+
+def make_lattice(words):
+    word_ids = (sym_fromstring(word, True) for word in words)
+    return tuple(((word, None, 1), ) for word in word_ids)
+
+def decode_lattice(lattice):
+    return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc
+            for arc in node for node in lattice)
+
+def decode_sentence(lattice):
+    return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
-- 
cgit v1.2.3


From fe9577d0ec51b7a5136d23885742780ca7f9ba8c Mon Sep 17 00:00:00 2001
From: Victor Chahuneau <vchahune@cs.cmu.edu>
Date: Thu, 6 Sep 2012 15:08:55 +0100
Subject: [cdec.sa] Fix the list of matching training source sentence

---
 python/src/sa/_sa.c           | 2832 +++++++++++++++++++++--------------------
 python/src/sa/data_array.pxi  |    7 +-
 python/src/sa/rulefactory.pxi |    5 +-
 3 files changed, 1455 insertions(+), 1389 deletions(-)

(limited to 'python/src/sa')

diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index 68205b2e..d1cc55c0 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.17 on Thu Sep  6 11:14:53 2012 */
+/* Generated by Cython 0.17 on Thu Sep  6 14:37:00 2012 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -837,7 +837,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -889,7 +889,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -2304,21 +2304,23 @@ static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *_
 static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMap *__pyx_v_self); /* proto */
 static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side, int __pyx_v_use_sent_id); /* proto */
 static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_4get_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_10get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_12get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_14get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
 static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_24read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_26write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_4data___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9DataArray_4data_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_9DataArray_4data_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link); /* proto */
 static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id); /* proto */
 static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text); /* proto */
@@ -2725,6 +2727,7 @@ static char __pyx_k__make_lattice[] = "make_lattice";
 static char __pyx_k__min_gap_size[] = "min_gap_size";
 static char __pyx_k__StopIteration[] = "StopIteration";
 static char __pyx_k__alphabet_size[] = "alphabet_size";
+static char __pyx_k__from_iterable[] = "from_iterable";
 static char __pyx_k__fsample_count[] = "fsample_count";
 static char __pyx_k__test_sentence[] = "test_sentence";
 static char __pyx_k__tight_phrases[] = "tight_phrases";
@@ -2900,6 +2903,7 @@ static PyObject *__pyx_n_s__filename;
 static PyObject *__pyx_n_s__fphrase;
 static PyObject *__pyx_n_s__from_binary;
 static PyObject *__pyx_n_s__from_data;
+static PyObject *__pyx_n_s__from_iterable;
 static PyObject *__pyx_n_s__from_stats;
 static PyObject *__pyx_n_s__from_text;
 static PyObject *__pyx_n_s__frontier;
@@ -7185,7 +7189,7 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataAr
  *     def __len__(self):
  *         return len(self.data)             # <<<<<<<<<<<<<<
  * 
- *     def get_data(self):
+ *     def get_sentence_id(self, i):
  */
   __pyx_t_1 = ((PyObject *)__pyx_v_self->data);
   __Pyx_INCREF(__pyx_t_1);
@@ -7206,12 +7210,12 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataAr
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_5get_data(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_5get_data(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pw_3_sa_9DataArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_data (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_4get_data(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannySetupContext("get_sentence_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_4get_sentence_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
@@ -7219,55 +7223,12 @@ static PyObject *__pyx_pw_3_sa_9DataArray_5get_data(PyObject *__pyx_v_self, CYTH
 /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":35
  *         return len(self.data)
  * 
- *     def get_data(self):             # <<<<<<<<<<<<<<
- *         return self.data
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_9DataArray_4get_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_data", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":36
- * 
- *     def get_data(self):
- *         return self.data             # <<<<<<<<<<<<<<
- * 
- *     def get_sentence_id(self, i):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_self->data));
-  __pyx_r = ((PyObject *)__pyx_v_self->data);
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_6get_sentence_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":38
- *         return self.data
- * 
  *     def get_sentence_id(self, i):             # <<<<<<<<<<<<<<
  *         return self.sent_id.arr[i]
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -7277,7 +7238,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence_id(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_sentence_id", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":36
  * 
  *     def get_sentence_id(self, i):
  *         return self.sent_id.arr[i]             # <<<<<<<<<<<<<<
@@ -7285,8 +7246,8 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence_id(struct __pyx_obj_3_sa
  *     def get_sentence(self, i):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_id->arr[__pyx_t_1])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -7305,17 +7266,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence_id(struct __pyx_obj_3_sa
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("get_sentence (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_8get_sentence(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_6get_sentence(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":41
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":38
  *         return self.sent_id.arr[i]
  * 
  *     def get_sentence(self, i):             # <<<<<<<<<<<<<<
@@ -7323,7 +7284,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence(PyObject *__pyx_v_self,
  *         sent = []
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
+static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i) {
   int __pyx_v_start;
   int __pyx_v_stop;
   PyObject *__pyx_v_sent = NULL;
@@ -7340,42 +7301,42 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence(struct __pyx_obj_3_sa_Da
   __Pyx_RefNannySetupContext("get_sentence", 0);
   __Pyx_INCREF(__pyx_v_i);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":40
  *     def get_sentence(self, i):
  *         cdef int j, start, stop
  *         sent = []             # <<<<<<<<<<<<<<
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_sent = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":44
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":41
  *         cdef int j, start, stop
  *         sent = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:
  */
-  __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":42
  *         sent = []
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])
  */
-  __pyx_t_1 = PyNumber_Add(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_Add(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_stop = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":43
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -7384,41 +7345,41 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence(struct __pyx_obj_3_sa_Da
  */
   __pyx_t_3 = __pyx_v_stop;
   for (__pyx_t_4 = __pyx_v_start; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) {
-    __pyx_t_1 = PyInt_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":47
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":44
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])             # <<<<<<<<<<<<<<
  *         return sent
  * 
  */
-    __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_self->id2word, (__pyx_v_self->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_self->id2word, (__pyx_v_self->data->arr[__pyx_t_2]), sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyList_Append(__pyx_v_sent, __pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyList_Append(__pyx_v_sent, __pyx_t_1); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":43
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
  *             sent.append(self.id2word[self.data.arr[i]])
  *         return sent
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_v_i);
   __pyx_v_i = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":48
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":45
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])
  *         return sent             # <<<<<<<<<<<<<<
@@ -7445,17 +7406,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence(struct __pyx_obj_3_sa_Da
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_11get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_11get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("get_sentence_position (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_10get_sentence_position(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_8get_sentence_position(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":50
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":47
  *         return sent
  * 
  *     def get_sentence_position(self, loc):             # <<<<<<<<<<<<<<
@@ -7463,7 +7424,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_11get_sentence_position(PyObject *__py
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_10get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   Py_ssize_t __pyx_t_1;
@@ -7474,7 +7435,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_sentence_position(struct __pyx_o
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_sentence_position", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":48
  * 
  *     def get_sentence_position(self, loc):
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]             # <<<<<<<<<<<<<<
@@ -7482,10 +7443,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_sentence_position(struct __pyx_o
  *     def get_id(self, word):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_index->arr[(__pyx_v_self->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_index->arr[(__pyx_v_self->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyNumber_Subtract(__pyx_v_loc, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyNumber_Subtract(__pyx_v_loc, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_r = __pyx_t_3;
@@ -7506,17 +7467,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_sentence_position(struct __pyx_o
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_13get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_13get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
+static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("get_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_12get_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_word));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_10get_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_word));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":53
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":50
  *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]
  * 
  *     def get_id(self, word):             # <<<<<<<<<<<<<<
@@ -7524,7 +7485,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_13get_id(PyObject *__pyx_v_self, PyObj
  *             self.word2id[word] = len(self.id2word)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_12get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word) {
+static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -7536,18 +7497,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_id(struct __pyx_obj_3_sa_DataArr
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_id", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":51
  * 
  *     def get_id(self, word):
  *         if not word in self.word2id:             # <<<<<<<<<<<<<<
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (!__pyx_t_1);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":55
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":52
  *     def get_id(self, word):
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
@@ -7556,28 +7517,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_id(struct __pyx_obj_3_sa_DataArr
  */
     __pyx_t_3 = __pyx_v_self->id2word;
     __Pyx_INCREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (PyObject_SetItem(__pyx_v_self->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_self->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":56
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":53
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
  *         return self.word2id[word]
  * 
  */
-    __pyx_t_3 = __Pyx_PyObject_Append(__pyx_v_self->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Append(__pyx_v_self->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":54
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *         return self.word2id[word]             # <<<<<<<<<<<<<<
@@ -7585,7 +7546,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_id(struct __pyx_obj_3_sa_DataArr
  *     def get_word(self, id):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_3 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -7604,17 +7565,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_id(struct __pyx_obj_3_sa_DataArr
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_15get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_15get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
+static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("get_word (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_14get_word(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_id));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_12get_word(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_id));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":59
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":56
  *         return self.word2id[word]
  * 
  *     def get_word(self, id):             # <<<<<<<<<<<<<<
@@ -7622,7 +7583,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_15get_word(PyObject *__pyx_v_self, PyO
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_14get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id) {
+static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -7631,7 +7592,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14get_word(struct __pyx_obj_3_sa_DataA
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_word", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":57
  * 
  *     def get_word(self, id):
  *         return self.id2word[id]             # <<<<<<<<<<<<<<
@@ -7639,7 +7600,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14get_word(struct __pyx_obj_3_sa_DataA
  *     def write_text(self, char* filename):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetItem(__pyx_v_self->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetItem(__pyx_v_self->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -7658,14 +7619,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14get_word(struct __pyx_obj_3_sa_DataA
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_17write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -7673,12 +7634,12 @@ static PyObject *__pyx_pw_3_sa_9DataArray_17write_text(PyObject *__pyx_v_self, P
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_16write_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_14write_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":62
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":59
  *         return self.id2word[id]
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -7686,7 +7647,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_17write_text(PyObject *__pyx_v_self, P
  *             for w_id in self.data:
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_w_id = NULL;
   PyObject *__pyx_r = NULL;
@@ -7710,7 +7671,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7718,9 +7679,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
  *                 if w_id > 1:
  */
   /*with:*/ {
-    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
@@ -7728,14 +7689,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
     PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_n_s__w));
     __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -7750,7 +7711,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":64
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":61
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             for w_id in self.data:             # <<<<<<<<<<<<<<
@@ -7761,7 +7722,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
             __pyx_t_4 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_4);
             __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
@@ -7769,23 +7730,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
             if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
               if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #endif
             } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
               if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #endif
             } else {
               __pyx_t_1 = __pyx_t_9(__pyx_t_4);
               if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -7795,47 +7756,47 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
             __pyx_v_w_id = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":62
  *         with open(filename, "w") as f:
  *             for w_id in self.data:
  *                 if w_id > 1:             # <<<<<<<<<<<<<<
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  */
-            __pyx_t_1 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             if (__pyx_t_10) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":66
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
  *             for w_id in self.data:
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))             # <<<<<<<<<<<<<<
  *                 if w_id == 1:
  *                     f.write("\n")
  */
-              __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_word); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_word); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_v_w_id);
               PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_w_id);
               __Pyx_GIVEREF(__pyx_v_w_id);
-              __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(((PyObject *)__pyx_t_11));
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
               __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
               __pyx_t_11 = 0;
-              __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
@@ -7844,28 +7805,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
             }
             __pyx_L18:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":67
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":64
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:             # <<<<<<<<<<<<<<
  *                     f.write("\n")
  * 
  */
-            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             if (__pyx_t_10) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
@@ -7886,7 +7847,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7895,11 +7856,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_4);
           PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
@@ -7912,11 +7873,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
           __Pyx_GIVEREF(__pyx_t_11);
           __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
           __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_14 = (!__pyx_t_10);
           if (__pyx_t_14) {
             __Pyx_GIVEREF(__pyx_t_4);
@@ -7924,7 +7885,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
             __Pyx_GIVEREF(__pyx_t_11);
             __Pyx_ErrRestore(__pyx_t_4, __pyx_t_12, __pyx_t_11);
             __pyx_t_4 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
             goto __pyx_L22;
           }
           __pyx_L22:;
@@ -7952,11 +7913,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
       if (__pyx_t_3) {
         __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
     goto __pyx_L23;
@@ -7985,14 +7946,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16write_text(struct __pyx_obj_3_sa_Dat
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_19read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_19read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -8000,12 +7961,12 @@ static PyObject *__pyx_pw_3_sa_9DataArray_19read_text(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_18read_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_16read_text(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":70
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":67
  *                     f.write("\n")
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -8013,7 +7974,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_19read_text(PyObject *__pyx_v_self, Py
  *             self.read_text_data(fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_fp = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -8033,7 +7994,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_Data
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8041,24 +8002,24 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_Data
  * 
  */
   /*with:*/ {
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -8073,21 +8034,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_Data
           __pyx_v_fp = __pyx_t_1;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":69
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:
  *             self.read_text_data(fp)             # <<<<<<<<<<<<<<
  * 
  *     def read_bitext(self, char* filename, int side):
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_v_fp);
           PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fp);
           __Pyx_GIVEREF(__pyx_v_fp);
-          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -8102,7 +8063,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_Data
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8111,11 +8072,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_Data
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
@@ -8128,11 +8089,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_Data
           __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
             __Pyx_GIVEREF(__pyx_t_3);
@@ -8140,7 +8101,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_Data
             __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
             __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
             goto __pyx_L18;
           }
           __pyx_L18:;
@@ -8168,11 +8129,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_Data
       if (__pyx_t_4) {
         __pyx_t_7 = PyObject_Call(__pyx_t_4, __pyx_k_tuple_17, NULL);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
     goto __pyx_L19;
@@ -8199,8 +8160,8 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_text(struct __pyx_obj_3_sa_Data
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_21read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_21read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   char *__pyx_v_filename;
   int __pyx_v_side;
   PyObject *__pyx_r = 0;
@@ -8226,11 +8187,11 @@ static PyObject *__pyx_pw_3_sa_9DataArray_21read_bitext(PyObject *__pyx_v_self,
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -8238,24 +8199,24 @@ static PyObject *__pyx_pw_3_sa_9DataArray_21read_bitext(PyObject *__pyx_v_self,
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_20read_bitext(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_18read_bitext(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -8281,7 +8242,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
   {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_9DataArray_11read_bitext_2generator6, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_9DataArray_11read_bitext_2generator6, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_cur_scope);
     __Pyx_RefNannyFinishContext();
     return (PyObject *) gen;
@@ -8318,13 +8279,13 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     return NULL;
   }
   __pyx_L3_first_run:;
-  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
   if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
     __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -8332,23 +8293,23 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -8359,12 +8320,12 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_cur_scope->__pyx_v_line = __pyx_t_4;
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_19), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_19), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_side, sizeof(int), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_side, sizeof(int), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_r = __pyx_t_4;
@@ -8384,7 +8345,7 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     __Pyx_XGOTREF(__pyx_t_1);
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
-    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   PyErr_SetNone(PyExc_StopIteration);
@@ -8402,7 +8363,7 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -8410,7 +8371,7 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
  *             data = (line.split(' ||| ')[side] for line in fp)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side) {
+static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename, int __pyx_v_side) {
   struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext *__pyx_cur_scope;
   PyObject *__pyx_v_data = NULL;
   PyObject *__pyx_r = NULL;
@@ -8438,7 +8399,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_Da
   __Pyx_GOTREF(__pyx_cur_scope);
   __pyx_cur_scope->__pyx_v_side = __pyx_v_side;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":75
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8446,24 +8407,24 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_Da
  *             self.read_text_data(data)
  */
   /*with:*/ {
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -8479,33 +8440,33 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_Da
           __pyx_cur_scope->__pyx_v_fp = __pyx_t_1;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
  *             self.read_text_data(data)
  * 
  */
-          __pyx_t_1 = __pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = __pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __pyx_v_data = __pyx_t_1;
           __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":77
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)
  *             self.read_text_data(data)             # <<<<<<<<<<<<<<
  * 
  *     def read_text_data(self, data):
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_v_data);
           PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_data);
           __Pyx_GIVEREF(__pyx_v_data);
-          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -8520,7 +8481,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_Da
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":75
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8529,11 +8490,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_Da
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
@@ -8546,11 +8507,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_Da
           __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
             __Pyx_GIVEREF(__pyx_t_3);
@@ -8558,7 +8519,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_Da
             __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
             __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
             goto __pyx_L18;
           }
           __pyx_L18:;
@@ -8586,11 +8547,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_Da
       if (__pyx_t_4) {
         __pyx_t_7 = PyObject_Call(__pyx_t_4, __pyx_k_tuple_20, NULL);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
     goto __pyx_L19;
@@ -8618,17 +8579,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_bitext(struct __pyx_obj_3_sa_Da
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_23read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_23read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
+static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_text_data (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_22read_text_data(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_data));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_20read_text_data(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_data));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":79
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
  *             self.read_text_data(data)
  * 
  *     def read_text_data(self, data):             # <<<<<<<<<<<<<<
@@ -8636,7 +8597,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_23read_text_data(PyObject *__pyx_v_sel
  *         for line_num, line in enumerate(data):
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data) {
+static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_data) {
   int __pyx_v_word_count;
   PyObject *__pyx_v_line_num = NULL;
   PyObject *__pyx_v_line = NULL;
@@ -8658,7 +8619,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_text_data", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":80
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":77
  * 
  *     def read_text_data(self, data):
  *         cdef int word_count = 0             # <<<<<<<<<<<<<<
@@ -8667,7 +8628,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
  */
   __pyx_v_word_count = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":81
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":78
  *     def read_text_data(self, data):
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):             # <<<<<<<<<<<<<<
@@ -8680,7 +8641,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
     __pyx_t_2 = __pyx_v_data; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
@@ -8688,23 +8649,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
     if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -8716,43 +8677,43 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
     __Pyx_INCREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_line_num);
     __pyx_v_line_num = __pyx_t_1;
-    __pyx_t_5 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_1);
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":82
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":79
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))
  */
-    __pyx_t_5 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":83
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":80
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)
  *             for word in line.split():             # <<<<<<<<<<<<<<
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:
  */
-    __pyx_t_6 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_5 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (PyList_CheckExact(__pyx_t_5) || PyTuple_CheckExact(__pyx_t_5)) {
       __pyx_t_6 = __pyx_t_5; __Pyx_INCREF(__pyx_t_6); __pyx_t_7 = 0;
       __pyx_t_8 = NULL;
     } else {
-      __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __pyx_t_8 = Py_TYPE(__pyx_t_6)->tp_iternext;
     }
@@ -8761,23 +8722,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
       if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else {
         __pyx_t_5 = __pyx_t_8(__pyx_t_6);
         if (unlikely(!__pyx_t_5)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -8787,30 +8748,30 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
       __pyx_v_word = __pyx_t_5;
       __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":84
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":81
  *             self.sent_index.append(word_count)
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))             # <<<<<<<<<<<<<<
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  */
-      __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_word);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_word);
       __Pyx_GIVEREF(__pyx_v_word);
-      __pyx_t_10 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":85
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":82
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:             # <<<<<<<<<<<<<<
@@ -8819,21 +8780,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
  */
       if (__pyx_v_self->use_sent_id) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":86
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":83
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *                 word_count = word_count + 1
  *             self.data.append(1)
  */
-        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
         goto __pyx_L7;
       }
       __pyx_L7:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":87
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":84
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -8844,18 +8805,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
     }
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":88
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":85
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  *             self.data.append(1)             # <<<<<<<<<<<<<<
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  */
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":89
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":86
  *                 word_count = word_count + 1
  *             self.data.append(1)
  *             if self.use_sent_id:             # <<<<<<<<<<<<<<
@@ -8864,21 +8825,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
  */
     if (__pyx_v_self->use_sent_id) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":90
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":87
  *             self.data.append(1)
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *             word_count = word_count + 1
  *         self.data.append(0)
  */
-      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       goto __pyx_L8;
     }
     __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":91
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":88
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -8890,27 +8851,27 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":92
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":89
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  *         self.data.append(0)             # <<<<<<<<<<<<<<
  *         self.sent_index.append(word_count)
  * 
  */
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":93
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":90
  *             word_count = word_count + 1
  *         self.data.append(0)
  *         self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -8936,14 +8897,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_text_data(struct __pyx_obj_3_sa
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_25read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_25read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -8951,12 +8912,12 @@ static PyObject *__pyx_pw_3_sa_9DataArray_25read_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_24read_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_22read_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":96
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":93
  * 
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -8964,13 +8925,13 @@ static PyObject *__pyx_pw_3_sa_9DataArray_25read_binary(PyObject *__pyx_v_self,
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_24read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":98
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":95
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -8979,7 +8940,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24read_binary(struct __pyx_obj_3_sa_Da
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":99
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":96
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8988,7 +8949,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24read_binary(struct __pyx_obj_3_sa_Da
  */
   ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":100
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":97
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -9003,7 +8964,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24read_binary(struct __pyx_obj_3_sa_Da
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":102
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":99
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -9028,7 +8989,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":104
  *         cdef char* word
  * 
  *         self.data.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9037,7 +8998,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->read_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":108
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":105
  * 
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9046,7 +9007,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":109
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":106
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9055,7 +9016,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->read_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":110
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":107
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9064,7 +9025,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":111
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":108
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):             # <<<<<<<<<<<<<<
@@ -9075,7 +9036,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":112
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":109
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9084,7 +9045,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":113
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":110
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -9093,7 +9054,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":114
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":111
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -9102,7 +9063,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":115
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":112
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
@@ -9111,31 +9072,31 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     __pyx_t_3 = __pyx_v_self->id2word;
     __Pyx_INCREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-    if (PyObject_SetItem(__pyx_v_self->word2id, ((PyObject *)__pyx_t_5), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_self->word2id, ((PyObject *)__pyx_t_5), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":116
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":113
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
  *             free(word)
  *         if len(self.sent_id) == 0:
  */
-    __pyx_t_3 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __pyx_t_5 = __Pyx_PyObject_Append(__pyx_v_self->id2word, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_Append(__pyx_v_self->id2word, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":117
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":114
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -9145,7 +9106,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     free(__pyx_v_word);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":118
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":115
  *             self.id2word.append(word)
  *             free(word)
  *         if len(self.sent_id) == 0:             # <<<<<<<<<<<<<<
@@ -9154,12 +9115,12 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   __pyx_t_5 = ((PyObject *)__pyx_v_self->sent_id);
   __Pyx_INCREF(__pyx_t_5);
-  __pyx_t_4 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_t_6 = (__pyx_t_4 == 0);
   if (__pyx_t_6) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":119
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":116
  *             free(word)
  *         if len(self.sent_id) == 0:
  *             self.use_sent_id = False             # <<<<<<<<<<<<<<
@@ -9171,7 +9132,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":121
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":118
  *             self.use_sent_id = False
  *         else:
  *             self.use_sent_id = True             # <<<<<<<<<<<<<<
@@ -9191,7 +9152,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":123
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":120
  *             self.use_sent_id = True
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -9215,7 +9176,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":127
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":124
  *         cdef int num_words
  * 
  *         self.data.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9224,7 +9185,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->write_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":128
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":125
  * 
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9233,7 +9194,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":129
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":126
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9242,7 +9203,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->write_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":130
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":127
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2             # <<<<<<<<<<<<<<
@@ -9251,11 +9212,11 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   __pyx_t_1 = __pyx_v_self->id2word;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_num_words = (__pyx_t_2 - 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":131
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":128
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9264,20 +9225,20 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":129
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:             # <<<<<<<<<<<<<<
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  */
-  __pyx_t_1 = __Pyx_PySequence_GetSlice(__pyx_v_self->id2word, 2, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PySequence_GetSlice(__pyx_v_self->id2word, 2, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
     __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
@@ -9286,23 +9247,23 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_1 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_1)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9312,17 +9273,17 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_v_word = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":133
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":130
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)
  */
-    __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":134
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":131
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9331,14 +9292,14 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":135
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":132
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
  * 
  *     def write_binary(self, char* filename):
  */
-    __pyx_t_6 = PyBytes_AsString(__pyx_v_word); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyBytes_AsString(__pyx_v_word); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     fwrite(((char *)__pyx_t_6), (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -9354,14 +9315,14 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_27write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_27write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -9369,12 +9330,12 @@ static PyObject *__pyx_pw_3_sa_9DataArray_27write_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_26write_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_24write_binary(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":137
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":134
  *             fwrite(<char *>word, sizeof(char), word_len, f)
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9382,13 +9343,13 @@ static PyObject *__pyx_pw_3_sa_9DataArray_27write_binary(PyObject *__pyx_v_self,
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_26write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":139
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":136
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -9397,7 +9358,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_binary(struct __pyx_obj_3_sa_D
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":140
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":137
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9406,7 +9367,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_binary(struct __pyx_obj_3_sa_D
  */
   ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":141
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":138
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -9422,17 +9383,17 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_binary(struct __pyx_obj_3_sa_D
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
+static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__pyx_v_self, PyObject *__pyx_v_f) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_enhanced_handle (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_28write_enhanced_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_f));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_26write_enhanced_handle(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_f));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":140
  *         fclose(f)
  * 
  *     def write_enhanced_handle(self, f):             # <<<<<<<<<<<<<<
@@ -9440,7 +9401,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced_handle(PyObject *__py
  *             f.write("%d " %i)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f) {
+static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f) {
   PyObject *__pyx_v_i = NULL;
   PyObject *__pyx_v_word = NULL;
   PyObject *__pyx_r = NULL;
@@ -9456,7 +9417,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":144
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":141
  * 
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:             # <<<<<<<<<<<<<<
@@ -9467,7 +9428,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     __pyx_t_1 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -9475,23 +9436,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9501,23 +9462,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":145
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":142
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
  *         f.write("\n")
  *         for i in self.sent_index:
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
@@ -9525,21 +9486,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_22), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_22), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":147
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":144
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_index:             # <<<<<<<<<<<<<<
@@ -9550,7 +9511,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     __pyx_t_5 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_3 = Py_TYPE(__pyx_t_5)->tp_iternext;
   }
@@ -9558,23 +9519,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_5)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_1 = __pyx_t_3(__pyx_t_5);
       if (unlikely(!__pyx_t_1)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9584,23 +9545,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":148
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":145
  *         f.write("\n")
  *         for i in self.sent_index:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
  *         f.write("\n")
  *         for i in self.sent_id:
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_6));
-    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_6));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
     __pyx_t_6 = 0;
-    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -9608,21 +9569,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  */
-  __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_6 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_k_tuple_23), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_k_tuple_23), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":150
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":147
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_id:             # <<<<<<<<<<<<<<
@@ -9633,7 +9594,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     __pyx_t_6 = ((PyObject *)__pyx_v_self->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_3 = Py_TYPE(__pyx_t_6)->tp_iternext;
   }
@@ -9641,23 +9602,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_6)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_6);
       if (unlikely(!__pyx_t_5)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9667,23 +9628,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":151
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":148
  *         f.write("\n")
  *         for i in self.sent_id:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
  *         f.write("\n")
  *         for word in self.id2word:
  */
-    __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -9691,21 +9652,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  */
-  __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_4 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_k_tuple_24), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_k_tuple_24), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":153
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":150
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for word in self.id2word:             # <<<<<<<<<<<<<<
@@ -9716,7 +9677,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     __pyx_t_4 = __pyx_v_self->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_self->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_self->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
@@ -9724,23 +9685,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_6 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_6)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9750,18 +9711,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     __pyx_v_word = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":154
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":151
  *         f.write("\n")
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))             # <<<<<<<<<<<<<<
  *         f.write("\n")
  * 
  */
-    __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_1 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_word);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_word);
@@ -9769,15 +9730,15 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
     PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_25), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_25), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -9785,16 +9746,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def write_enhanced(self, char* filename):
  */
-  __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_26), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_26), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -9817,14 +9778,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced_handle(struct __pyx_o
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_31write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_31write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -9832,12 +9793,12 @@ static PyObject *__pyx_pw_3_sa_9DataArray_31write_enhanced(PyObject *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_9DataArray_30write_enhanced(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __pyx_r = __pyx_pf_3_sa_9DataArray_28write_enhanced(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((char *)__pyx_v_filename));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":157
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":154
  *         f.write("\n")
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9845,7 +9806,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_31write_enhanced(PyObject *__pyx_v_sel
  *             self.write_enhanced_handle(self, f)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -9865,16 +9826,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.write_enhanced_handle(self, f)
  */
   /*with:*/ {
-    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
@@ -9882,14 +9843,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa
     PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_n_s__w));
     __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -9904,14 +9865,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":159
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":156
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.write_enhanced_handle(self, f)             # <<<<<<<<<<<<<<
  */
-          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_INCREF(((PyObject *)__pyx_v_self));
           PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
@@ -9919,7 +9880,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa
           __Pyx_INCREF(__pyx_v_f);
           PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -9934,7 +9895,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":158
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -9942,11 +9903,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_2);
           PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
@@ -9959,11 +9920,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa
           __Pyx_GIVEREF(__pyx_t_4);
           __pyx_t_10 = PyObject_Call(__pyx_t_3, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
             __Pyx_GIVEREF(__pyx_t_2);
@@ -9971,7 +9932,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa
             __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_4);
             __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_4 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
             goto __pyx_L18;
           }
           __pyx_L18:;
@@ -9999,11 +9960,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa
       if (__pyx_t_3) {
         __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
     goto __pyx_L19;
@@ -10029,14 +9990,102 @@ static PyObject *__pyx_pf_3_sa_9DataArray_30write_enhanced(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":12
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_4data_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_4data_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_4data___get__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":12
+ *     cdef word2id
+ *     cdef id2word
+ *     cdef public IntList data             # <<<<<<<<<<<<<<
+ *     cdef IntList sent_id
  *     cdef IntList sent_index
- * 
- *     cdef int link(self, int i, int j):             # <<<<<<<<<<<<<<
- *         """Integerizes an alignment link pair"""
- *         return i*65536 + j
  */
 
+static PyObject *__pyx_pf_3_sa_9DataArray_4data___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->data));
+  __pyx_r = ((PyObject *)__pyx_v_self->data);
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_4data_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_4data_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_4data_2__set__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray_4data_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__set__", 0);
+  if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->data);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->data));
+  __pyx_v_self->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_value);
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.DataArray.data.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_4data_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_4data_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_4data_4__del__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray_4data_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->data);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->data));
+  __pyx_v_self->data = ((struct __pyx_obj_3_sa_IntList *)Py_None);
+
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -45617,8 +45666,8 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObjec
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
- *                                     locs = tuple(itertools.chain(alslist.itervalues()))
- *                                     # count = len(locs) # Should be?
+ *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
+ *                                     count = len(locs)
  */
 
 static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x) {
@@ -47931,7 +47980,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():             # <<<<<<<<<<<<<<
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
- *                                     locs = tuple(itertools.chain(alslist.itervalues()))
+ *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
  */
               __pyx_t_23 = 0;
               if (unlikely(__pyx_cur_scope->__pyx_v_elist == Py_None)) {
@@ -47964,8 +48013,8 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
- *                                     locs = tuple(itertools.chain(alslist.itervalues()))
- *                                     # count = len(locs) # Should be?
+ *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
+ *                                     count = len(locs)
  */
                 __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
@@ -48050,52 +48099,55 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1104
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
- *                                     locs = tuple(itertools.chain(alslist.itervalues()))             # <<<<<<<<<<<<<<
- *                                     # count = len(locs) # Should be?
- *                                     count = len(max_locs) # Was
+ *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))             # <<<<<<<<<<<<<<
+ *                                     count = len(locs)
+ *                                     scores = self.scorer.score(FeatureContext(
  */
                 __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
                 __pyx_t_14 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__chain); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__from_iterable); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_9 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+                __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
+                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
+                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
+                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
                 __Pyx_GIVEREF(__pyx_t_9);
                 __pyx_t_9 = 0;
-                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-                __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
+                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
+                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
                 __Pyx_GIVEREF(__pyx_t_9);
                 __pyx_t_9 = 0;
-                __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_GIVEREF(__pyx_t_9);
                 __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_9);
                 __pyx_t_9 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1106
- *                                     locs = tuple(itertools.chain(alslist.itervalues()))
- *                                     # count = len(locs) # Should be?
- *                                     count = len(max_locs) # Was             # <<<<<<<<<<<<<<
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1105
+ *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
+ *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
+ *                                     count = len(locs)             # <<<<<<<<<<<<<<
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  */
-                __pyx_t_25 = PyObject_Length(__pyx_cur_scope->__pyx_v_max_locs); if (unlikely(__pyx_t_25 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_25 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); if (unlikely(__pyx_t_25 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
@@ -48103,43 +48155,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_count = __pyx_t_9;
                 __pyx_t_9 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1107
- *                                     # count = len(locs) # Should be?
- *                                     count = len(max_locs) # Was
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1106
+ *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
+ *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(             # <<<<<<<<<<<<<<
  *                                                f, e, count, fcount[f], num_samples,
  *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  */
-                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1108
- *                                     count = len(max_locs) # Was
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1107
+ *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,             # <<<<<<<<<<<<<<
  *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  *                                                ))
  */
-                __pyx_t_13 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
+                __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_13);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1109
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1108
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda             # <<<<<<<<<<<<<<
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)
  */
-                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_7);
-                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyNumber_Add(__pyx_t_2, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyNumber_Add(__pyx_t_2, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-                __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7);
                 __Pyx_GIVEREF(__pyx_t_7);
@@ -48147,7 +48199,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_GIVEREF(__pyx_t_15);
                 __pyx_t_7 = 0;
                 __pyx_t_15 = 0;
-                __pyx_t_15 = PyTuple_New(10); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyTuple_New(10); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                 PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_f);
@@ -48158,10 +48210,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_count);
                 PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_cur_scope->__pyx_v_count);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_count);
-                PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_13);
-                __Pyx_GIVEREF(__pyx_t_13);
-                PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_14);
+                PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_14);
                 __Pyx_GIVEREF(__pyx_t_14);
+                PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_13);
+                __Pyx_GIVEREF(__pyx_t_13);
                 PyTuple_SET_ITEM(__pyx_t_15, 5, ((PyObject *)__pyx_t_2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
@@ -48176,14 +48228,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
                 PyTuple_SET_ITEM(__pyx_t_15, 9, ((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
                 __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
-                __pyx_t_13 = 0;
                 __pyx_t_14 = 0;
+                __pyx_t_13 = 0;
                 __pyx_t_2 = 0;
-                __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
@@ -48192,16 +48244,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_15);
                 __pyx_t_15 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1111
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1110
  *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
  *                                                ))
  *                                     yield Rule(self.category, f, e, scores, alignment)             # <<<<<<<<<<<<<<
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  */
-                __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_15);
                 __Pyx_GIVEREF(__pyx_t_15);
@@ -48218,7 +48270,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_alignment);
                 __pyx_t_15 = 0;
-                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
                 __pyx_r = __pyx_t_15;
@@ -48258,7 +48310,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_t_22 = __pyx_cur_scope->__pyx_t_7;
                 __pyx_t_23 = __pyx_cur_scope->__pyx_t_8;
                 __pyx_t_24 = __pyx_cur_scope->__pyx_t_9;
-                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             }
@@ -48273,38 +48325,38 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L32:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1113
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1112
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  */
-      __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_19 = (__pyx_t_22 < __pyx_cur_scope->__pyx_v_self->max_length);
       if (__pyx_t_19) {
-        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_3 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_22); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_22); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_15 = PyObject_RichCompare(__pyx_t_3, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyObject_RichCompare(__pyx_t_3, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
-          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_3 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __pyx_t_27 = __pyx_t_26;
         } else {
@@ -48316,45 +48368,45 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1114
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1113
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  */
-        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_10 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_22 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_22 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_22; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_alt_id = __pyx_t_18;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1115
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1114
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  */
-          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_15 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyTuple_New(7); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyTuple_New(7); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
@@ -48377,11 +48429,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_15 = 0;
           __pyx_t_10 = 0;
           __pyx_t_2 = 0;
-          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_9)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_9)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1116
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1115
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity             # <<<<<<<<<<<<<<
@@ -48390,18 +48442,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
         __pyx_cur_scope->__pyx_v_num_subpatterns = __pyx_cur_scope->__pyx_v_arity;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1117
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1116
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1118
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1117
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1             # <<<<<<<<<<<<<<
@@ -48413,14 +48465,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         __pyx_L64:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1119
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1118
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:             # <<<<<<<<<<<<<<
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]
  */
-        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_19 = ((__pyx_t_22 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
         if (__pyx_t_19) {
           __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
@@ -48436,7 +48488,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1120
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1119
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)             # <<<<<<<<<<<<<<
@@ -48445,16 +48497,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
           __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, (__pyx_cur_scope->__pyx_v_arity + 1));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1121
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1120
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]             # <<<<<<<<<<<<<<
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xnode);
@@ -48463,18 +48515,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_xnode = __pyx_t_2;
           __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1123
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1122
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])             # <<<<<<<<<<<<<<
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
@@ -48488,7 +48540,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
           __pyx_t_2 = 0;
           __pyx_t_9 = 0;
-          __pyx_t_9 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_9));
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
@@ -48497,14 +48549,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_key = __pyx_t_9;
           __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1124
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1123
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []             # <<<<<<<<<<<<<<
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  */
-          __pyx_t_9 = PyList_New(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyList_New(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
@@ -48512,24 +48564,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_9);
           __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1125
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1124
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):             # <<<<<<<<<<<<<<
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  */
-          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1126
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1125
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]             # <<<<<<<<<<<<<<
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  */
-            __pyx_t_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
@@ -48540,20 +48592,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1128
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1127
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)             # <<<<<<<<<<<<<<
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  */
-            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_124); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_124); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_15 = PyTuple_New(7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
@@ -48576,7 +48628,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
             __pyx_t_10 = 0;
             __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
@@ -48586,18 +48638,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1129
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1128
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  *                             nodes_isteps_away_buffer[key] = frontier_nodes             # <<<<<<<<<<<<<<
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  */
-            if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_L66:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1131
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1130
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:             # <<<<<<<<<<<<<<
@@ -48608,7 +48660,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_22 = 0;
             __pyx_t_20 = NULL;
           } else {
-            __pyx_t_22 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_22 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_20 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
@@ -48616,23 +48668,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_2)) {
               if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_2)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_2)) {
               if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else {
               __pyx_t_15 = __pyx_t_20(__pyx_t_2);
               if (unlikely(!__pyx_t_15)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -48648,7 +48700,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               if (unlikely(size != 3)) {
                 if (size > 3) __Pyx_RaiseTooManyValuesError(3);
                 else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
@@ -48664,38 +48716,38 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_3);
               #else
-              __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             } else
             {
               Py_ssize_t index = -1;
-              __pyx_t_14 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_13);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-              __pyx_t_17 = Py_TYPE(__pyx_t_14)->tp_iternext;
-              index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_9)) goto __pyx_L69_unpacking_failed;
+              __pyx_t_17 = Py_TYPE(__pyx_t_13)->tp_iternext;
+              index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_9)) goto __pyx_L69_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_9);
-              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_10)) goto __pyx_L69_unpacking_failed;
+              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L69_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_3 = __pyx_t_17(__pyx_t_14); if (unlikely(!__pyx_t_3)) goto __pyx_L69_unpacking_failed;
+              index = 2; __pyx_t_3 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L69_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_3);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_14), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_17 = NULL;
-              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
               goto __pyx_L70_unpacking_done;
               __pyx_L69_unpacking_failed:;
-              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
               __pyx_t_17 = NULL;
               if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L70_unpacking_done:;
             }
-            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __pyx_cur_scope->__pyx_v_i = __pyx_t_18;
             __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
@@ -48705,54 +48757,54 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1132
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1131
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))             # <<<<<<<<<<<<<<
  *             frontier = new_frontier
  * 
  */
-            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_14);
-            PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
+            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
+            PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_9);
             __pyx_t_9 = 0;
-            __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-            __pyx_t_14 = PyTuple_New(7); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_14);
-            PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_15);
+            __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+            __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_13);
+            PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_15);
             __Pyx_GIVEREF(__pyx_t_15);
-            PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_3);
+            PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_3);
-            PyTuple_SET_ITEM(__pyx_t_14, 2, __pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
-            PyTuple_SET_ITEM(__pyx_t_14, 3, __pyx_cur_scope->__pyx_v_pathlen);
+            PyTuple_SET_ITEM(__pyx_t_13, 3, __pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_14, 4, __pyx_cur_scope->__pyx_v_xnode);
+            PyTuple_SET_ITEM(__pyx_t_13, 4, __pyx_cur_scope->__pyx_v_xnode);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_14, 5, __pyx_t_9);
+            PyTuple_SET_ITEM(__pyx_t_13, 5, __pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-            PyTuple_SET_ITEM(__pyx_t_14, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
+            PyTuple_SET_ITEM(__pyx_t_13, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
             __pyx_t_15 = 0;
             __pyx_t_3 = 0;
             __pyx_t_10 = 0;
             __pyx_t_9 = 0;
-            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_14)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
+            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           goto __pyx_L65;
@@ -48765,7 +48817,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     }
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1133
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1132
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
  *             frontier = new_frontier             # <<<<<<<<<<<<<<
@@ -48779,94 +48831,94 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_cur_scope->__pyx_v_frontier = __pyx_cur_scope->__pyx_v_new_frontier;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1135
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1134
  *             frontier = new_frontier
  * 
  *         stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  */
-  __pyx_t_12 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_GIVEREF(__pyx_t_12);
   __pyx_cur_scope->__pyx_v_stop_time = __pyx_t_12;
   __pyx_t_12 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1135
  * 
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  */
-  __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_14 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_14);
+  __pyx_t_13 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
   PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_125));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_14);
-  __Pyx_GIVEREF(__pyx_t_14);
-  __pyx_t_14 = 0;
-  __pyx_t_14 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_14);
+  PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_13);
+  __Pyx_GIVEREF(__pyx_t_13);
+  __pyx_t_13 = 0;
+  __pyx_t_13 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1137
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1136
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()             # <<<<<<<<<<<<<<
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  * 
  */
-  __pyx_t_14 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_14);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-  __pyx_t_14 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_14);
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1138
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1137
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_14 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_14);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-  __pyx_t_14 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_14);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __pyx_t_13 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_126));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_126));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_126));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_14);
-  __Pyx_GIVEREF(__pyx_t_14);
-  __pyx_t_14 = 0;
-  __pyx_t_14 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_14);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_13);
+  __Pyx_GIVEREF(__pyx_t_13);
+  __pyx_t_13 = 0;
+  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
   PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -48889,7 +48941,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1141
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1140
  * 
  * 
  *     cdef int find_fixpoint(self,             # <<<<<<<<<<<<<<
@@ -48919,7 +48971,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("find_fixpoint", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1156
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1155
  *         cdef int e_low_prev, e_high_prev, f_low_prev, f_high_prev, new_x, new_low_x, new_high_x
  * 
  *         e_low[0] = e_in_low             # <<<<<<<<<<<<<<
@@ -48928,7 +48980,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_low[0]) = __pyx_v_e_in_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1157
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1156
  * 
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high             # <<<<<<<<<<<<<<
@@ -48937,19 +48989,19 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_high[0]) = __pyx_v_e_in_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1157
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *         if e_low[0] == -1:
  *             # low-priority corner case: if phrase w is unaligned,
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1159
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1158
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)
  *         if e_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -48959,7 +49011,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_3 = ((__pyx_v_e_low[0]) == -1);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1165
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1164
  *             # rule X -> X_1 w X_2 / X_1 X_2.    This is probably
  *             # not worth the bother, though.
  *             return 0             # <<<<<<<<<<<<<<
@@ -48971,7 +49023,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1166
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1165
  *             # not worth the bother, though.
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:             # <<<<<<<<<<<<<<
@@ -48987,7 +49039,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1167
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1166
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:             # <<<<<<<<<<<<<<
@@ -48997,7 +49049,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = ((__pyx_v_e_in_low - (__pyx_v_e_low[0])) < __pyx_v_min_ex_size);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1168
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1167
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size             # <<<<<<<<<<<<<<
@@ -49006,7 +49058,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_low[0]) = (__pyx_v_e_in_low - __pyx_v_min_ex_size);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1169
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1168
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -49016,7 +49068,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_5 = ((__pyx_v_e_low[0]) < 0);
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1170
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1169
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -49035,7 +49087,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1172
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1171
  *                     return 0
  * 
  *         if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -49045,7 +49097,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_5 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1173
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1172
  * 
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0             # <<<<<<<<<<<<<<
@@ -49057,7 +49109,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L6;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1174
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1173
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:             # <<<<<<<<<<<<<<
@@ -49073,7 +49125,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1175
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1174
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:             # <<<<<<<<<<<<<<
@@ -49083,7 +49135,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (((__pyx_v_e_high[0]) - __pyx_v_e_in_high) < __pyx_v_min_ex_size);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1176
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1175
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size             # <<<<<<<<<<<<<<
@@ -49092,7 +49144,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_high[0]) = (__pyx_v_e_in_high + __pyx_v_min_ex_size);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1177
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1176
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:             # <<<<<<<<<<<<<<
@@ -49102,7 +49154,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_e_high[0]) > __pyx_v_e_sent_len);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1178
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1177
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -49121,7 +49173,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1180
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1179
  *                     return 0
  * 
  *         f_back_low[0] = -1             # <<<<<<<<<<<<<<
@@ -49130,7 +49182,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_low[0]) = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1180
  * 
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1             # <<<<<<<<<<<<<<
@@ -49139,7 +49191,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_high[0]) = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1182
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1181
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1
  *         f_low_prev = f_low             # <<<<<<<<<<<<<<
@@ -49148,17 +49200,17 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_f_low_prev = __pyx_v_f_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1182
  *         f_back_high[0] = -1
  *         f_low_prev = f_low
  *         f_high_prev = f_high             # <<<<<<<<<<<<<<
  *         new_x = 0
  *         new_low_x = 0
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_f_high_prev = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1184
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1183
  *         f_low_prev = f_low
  *         f_high_prev = f_high
  *         new_x = 0             # <<<<<<<<<<<<<<
@@ -49167,7 +49219,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1184
  *         f_high_prev = f_high
  *         new_x = 0
  *         new_low_x = 0             # <<<<<<<<<<<<<<
@@ -49176,7 +49228,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_low_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1186
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1185
  *         new_x = 0
  *         new_low_x = 0
  *         new_high_x = 0             # <<<<<<<<<<<<<<
@@ -49185,7 +49237,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_high_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1188
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1187
  *         new_high_x = 0
  * 
  *         while True:             # <<<<<<<<<<<<<<
@@ -49195,7 +49247,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   while (1) {
     if (!1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1190
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1189
  *         while True:
  * 
  *             if f_back_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -49205,45 +49257,45 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) == -1);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1191
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1190
  * 
  *             if f_back_low[0] == -1:
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       goto __pyx_L11;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1193
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1192
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), __pyx_v_e_low_prev, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), __pyx_v_e_low_prev, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1194
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1193
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  * 
  *             if f_back_low[0] > f_low:
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_e_high_prev, (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_e_high_prev, (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     }
     __pyx_L11:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1196
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1195
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  *             if f_back_low[0] > f_low:             # <<<<<<<<<<<<<<
@@ -49253,7 +49305,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) > __pyx_v_f_low);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1197
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1196
  * 
  *             if f_back_low[0] > f_low:
  *                 f_back_low[0] = f_low             # <<<<<<<<<<<<<<
@@ -49265,35 +49317,35 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L12:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1199
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1198
  *                 f_back_low[0] = f_low
  * 
  *             if f_back_high[0] < f_high:             # <<<<<<<<<<<<<<
  *                 f_back_high[0] = f_high
  * 
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1200
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1199
  * 
  *             if f_back_high[0] < f_high:
  *                 f_back_high[0] = f_high             # <<<<<<<<<<<<<<
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  */
-      __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       (__pyx_v_f_back_high[0]) = __pyx_t_1;
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1202
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1201
  *                 f_back_high[0] = f_high
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:             # <<<<<<<<<<<<<<
@@ -49309,7 +49361,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1203
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1202
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -49322,7 +49374,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1205
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1204
  *                 return 1
  * 
  *             if allow_low_x == 0 and f_back_low[0] < f_low:             # <<<<<<<<<<<<<<
@@ -49338,7 +49390,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1207
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1206
  *             if allow_low_x == 0 and f_back_low[0] < f_low:
  *                 # FAIL: f phrase is not tight
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49351,7 +49403,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1209
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1208
  *                 return 0
  * 
  *             if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -49361,7 +49413,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1211
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1210
  *             if f_back_high[0] - f_back_low[0] > max_f_len:
  *                 # FAIL: f back projection is too wide
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49374,7 +49426,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1213
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1212
  *                 return 0
  * 
  *             if allow_high_x == 0 and f_back_high[0] > f_high:             # <<<<<<<<<<<<<<
@@ -49383,11 +49435,11 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_5 = (__pyx_v_allow_high_x == 0);
     if (__pyx_t_5) {
-      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_4 = __pyx_t_3;
     } else {
@@ -49395,7 +49447,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1215
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1214
  *             if allow_high_x == 0 and f_back_high[0] > f_high:
  *                 # FAIL: extension on high side not allowed
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49408,7 +49460,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1217
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1216
  *                 return 0
  * 
  *             if f_low != f_back_low[0]:             # <<<<<<<<<<<<<<
@@ -49418,7 +49470,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (__pyx_v_f_low != (__pyx_v_f_back_low[0]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1218
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1217
  * 
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:             # <<<<<<<<<<<<<<
@@ -49428,7 +49480,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_low_x == 0);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1219
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1218
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -49438,7 +49490,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1221
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1220
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on low side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49451,7 +49503,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1223
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1222
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -49460,7 +49512,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1224
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1223
  *                     else:
  *                         new_x = new_x + 1
  *                         new_low_x = 1             # <<<<<<<<<<<<<<
@@ -49474,7 +49526,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L19:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1225
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1224
  *                         new_x = new_x + 1
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:             # <<<<<<<<<<<<<<
@@ -49484,7 +49536,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_f_low - (__pyx_v_f_back_low[0])) < __pyx_v_min_fx_size);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1226
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1225
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size             # <<<<<<<<<<<<<<
@@ -49493,7 +49545,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
         (__pyx_v_f_back_low[0]) = (__pyx_v_f_low - __pyx_v_min_fx_size);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1227
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1226
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -49503,7 +49555,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1229
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1228
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49516,7 +49568,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L22:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1230
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1229
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0
  *                     if f_back_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -49526,7 +49578,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_low[0]) < 0);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1232
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1231
  *                     if f_back_low[0] < 0:
  *                         # FAIL: extension required on low side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49545,22 +49597,22 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L18:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1234
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1233
  *                         return 0
  * 
  *             if f_high != f_back_high[0]:             # <<<<<<<<<<<<<<
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1235
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1234
  * 
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:             # <<<<<<<<<<<<<<
@@ -49570,7 +49622,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_high_x == 0);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1236
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1235
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -49580,7 +49632,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1238
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1237
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on high side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49593,7 +49645,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1240
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1239
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -49602,7 +49654,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1241
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1240
  *                     else:
  *                         new_x = new_x + 1
  *                         new_high_x = 1             # <<<<<<<<<<<<<<
@@ -49616,44 +49668,44 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L25:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1242
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1241
  *                         new_x = new_x + 1
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:             # <<<<<<<<<<<<<<
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  */
-      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_f_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_f_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1243
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1242
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size             # <<<<<<<<<<<<<<
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  */
-        __pyx_t_7 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_6 = PyNumber_Add(__pyx_v_f_high, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyNumber_Add(__pyx_v_f_high, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         (__pyx_v_f_back_high[0]) = __pyx_t_1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1244
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1243
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -49663,7 +49715,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1246
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1245
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49676,7 +49728,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L28:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1247
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1246
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0
  *                     if f_back_high[0] > f_sent_len:             # <<<<<<<<<<<<<<
@@ -49686,7 +49738,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_high[0]) > __pyx_v_f_sent_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1249
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1248
  *                     if f_back_high[0] > f_sent_len:
  *                         # FAIL: extension required on high side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49705,7 +49757,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L24:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1251
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1250
  *                         return 0
  * 
  *             e_low_prev = e_low[0]             # <<<<<<<<<<<<<<
@@ -49714,7 +49766,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_low_prev = (__pyx_v_e_low[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1252
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1251
  * 
  *             e_low_prev = e_low[0]
  *             e_high_prev = e_high[0]             # <<<<<<<<<<<<<<
@@ -49723,29 +49775,29 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_high_prev = (__pyx_v_e_high[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1254
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1253
  *             e_high_prev = e_high[0]
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  */
-    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_f_back_low[0]), __pyx_v_f_low_prev, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_f_back_low[0]), __pyx_v_f_low_prev, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1255
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1254
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  */
-    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_high_prev, (__pyx_v_f_back_high[0]), __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_high_prev, (__pyx_v_f_back_high[0]), __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1256
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1255
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:             # <<<<<<<<<<<<<<
@@ -49761,7 +49813,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1257
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1256
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -49774,7 +49826,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L30:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1258
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1257
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  *             if allow_arbitrary_x == 0:             # <<<<<<<<<<<<<<
@@ -49784,7 +49836,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (__pyx_v_allow_arbitrary_x == 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1260
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1259
  *             if allow_arbitrary_x == 0:
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49797,7 +49849,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L31:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1261
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1260
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0
  *             if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -49807,7 +49859,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1263
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1262
  *             if e_high[0] - e_low[0] > max_e_len:
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49820,7 +49872,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L32:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1264
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1263
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0
  *             f_low_prev = f_back_low[0]             # <<<<<<<<<<<<<<
@@ -49829,7 +49881,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_f_low_prev = (__pyx_v_f_back_low[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1265
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1264
  *                 return 0
  *             f_low_prev = f_back_low[0]
  *             f_high_prev = f_back_high[0]             # <<<<<<<<<<<<<<
@@ -49852,7 +49904,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1268
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1267
  * 
  * 
  *     cdef find_projection(self, int in_low, int in_high, int* in_links_low, int* in_links_high,             # <<<<<<<<<<<<<<
@@ -49870,7 +49922,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   int __pyx_t_4;
   __Pyx_RefNannySetupContext("find_projection", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1271
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1270
  *                         int* out_low, int* out_high):
  *         cdef int i
  *         for i from in_low <= i < in_high:             # <<<<<<<<<<<<<<
@@ -49880,7 +49932,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   __pyx_t_1 = __pyx_v_in_high;
   for (__pyx_v_i = __pyx_v_in_low; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1272
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1271
  *         cdef int i
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:             # <<<<<<<<<<<<<<
@@ -49890,7 +49942,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
     __pyx_t_2 = ((__pyx_v_in_links_low[__pyx_v_i]) != -1);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1273
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1272
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:             # <<<<<<<<<<<<<<
@@ -49906,7 +49958,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1274
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1273
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]             # <<<<<<<<<<<<<<
@@ -49918,7 +49970,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       __pyx_L6:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1275
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1274
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:             # <<<<<<<<<<<<<<
@@ -49934,7 +49986,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1276
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1275
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:
  *                     out_high[0] = in_links_high[i]             # <<<<<<<<<<<<<<
@@ -49956,7 +50008,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1279
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1278
  * 
  * 
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):             # <<<<<<<<<<<<<<
@@ -49970,7 +50022,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("int_arr_extend", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1281
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1280
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len             # <<<<<<<<<<<<<<
@@ -49979,7 +50031,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_data_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1282
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1281
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -49988,7 +50040,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1283
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1282
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -49997,7 +50049,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_data, (__pyx_v_data_len * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1284
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1283
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -50006,7 +50058,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1285
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1284
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len
  *         return arr             # <<<<<<<<<<<<<<
@@ -50022,7 +50074,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1288
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1287
  * 
  * 
  *     cdef extract_phrases(self, int e_low, int e_high, int* e_gap_low, int* e_gap_high, int* e_links_low, int num_gaps,             # <<<<<<<<<<<<<<
@@ -50068,19 +50120,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("extract_phrases", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1296
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1295
  *         cdef result
  * 
  *         result = []             # <<<<<<<<<<<<<<
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1296
  * 
  *         result = []
  *         len1 = 0             # <<<<<<<<<<<<<<
@@ -50089,7 +50141,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1298
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1297
  *         result = []
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -50098,19 +50150,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = ((int *)malloc(0));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1299
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1298
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  *         ephr_arr = IntList()             # <<<<<<<<<<<<<<
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ephr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1301
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1300
  *         ephr_arr = IntList()
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50119,7 +50171,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gap_order = ((int *)malloc((__pyx_v_num_gaps * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1302
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1301
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:             # <<<<<<<<<<<<<<
@@ -50129,7 +50181,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_num_gaps > 0);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1303
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1302
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0             # <<<<<<<<<<<<<<
@@ -50138,7 +50190,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     (__pyx_v_e_gap_order[0]) = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1304
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1303
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -50148,7 +50200,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_3 = __pyx_v_num_gaps;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1305
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1304
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:             # <<<<<<<<<<<<<<
@@ -50158,7 +50210,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = __pyx_v_i;
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1306
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1305
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -50168,7 +50220,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_2 = ((__pyx_v_e_gap_low[__pyx_v_i]) < (__pyx_v_e_gap_low[__pyx_v_j]));
         if (__pyx_t_2) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1307
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1306
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:             # <<<<<<<<<<<<<<
@@ -50178,7 +50230,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_i;
           for (__pyx_v_k = __pyx_v_j; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1308
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1307
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]             # <<<<<<<<<<<<<<
@@ -50188,7 +50240,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             (__pyx_v_e_gap_order[(__pyx_v_k + 1)]) = (__pyx_v_e_gap_order[__pyx_v_k]);
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1309
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1308
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i             # <<<<<<<<<<<<<<
@@ -50197,7 +50249,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
           (__pyx_v_e_gap_order[__pyx_v_j]) = __pyx_v_i;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1310
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1309
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i
  *                         break             # <<<<<<<<<<<<<<
@@ -50211,7 +50263,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1312
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1311
  *                         break
  *                 else:
  *                     e_gap_order[i] = i             # <<<<<<<<<<<<<<
@@ -50226,7 +50278,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1314
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1313
  *                     e_gap_order[i] = i
  * 
  *         e_x_low = e_low             # <<<<<<<<<<<<<<
@@ -50235,7 +50287,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_low = __pyx_v_e_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1315
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1314
  * 
  *         e_x_low = e_low
  *         e_x_high = e_high             # <<<<<<<<<<<<<<
@@ -50244,7 +50296,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_high = __pyx_v_e_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1316
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1315
  *         e_x_low = e_low
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -50254,7 +50306,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1317
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1316
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -50277,7 +50329,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1318
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1317
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1             # <<<<<<<<<<<<<<
@@ -50287,7 +50339,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_e_x_low = (__pyx_v_e_x_low - 1);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1319
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1318
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:             # <<<<<<<<<<<<<<
@@ -50310,7 +50362,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_2) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1320
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1319
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:
  *                 e_x_high = e_x_high + 1             # <<<<<<<<<<<<<<
@@ -50323,7 +50375,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L11:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1322
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1321
  *                 e_x_high = e_x_high + 1
  * 
  *         for i from e_x_low <= i <= e_low:             # <<<<<<<<<<<<<<
@@ -50333,7 +50385,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_low;
   for (__pyx_v_i = __pyx_v_e_x_low; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1323
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1322
  * 
  *         for i from e_x_low <= i <= e_low:
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)             # <<<<<<<<<<<<<<
@@ -50343,7 +50395,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_e_gaps1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps1, (&__pyx_v_len1), (&__pyx_v_i), 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1325
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1324
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)
  * 
  *         for i from 0 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -50353,7 +50405,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_num_gaps;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1326
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1325
  * 
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -50362,7 +50414,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1327
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1326
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)
  *             len2 = 0             # <<<<<<<<<<<<<<
@@ -50371,7 +50423,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_len2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1329
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1328
  *             len2 = 0
  * 
  *             j = e_gap_order[i]             # <<<<<<<<<<<<<<
@@ -50380,7 +50432,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = (__pyx_v_e_gap_order[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1330
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1329
  * 
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]             # <<<<<<<<<<<<<<
@@ -50389,7 +50441,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_low = (__pyx_v_e_gap_low[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1331
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1330
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]             # <<<<<<<<<<<<<<
@@ -50398,7 +50450,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_high = (__pyx_v_e_gap_high[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1332
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1331
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -50408,7 +50460,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1333
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1332
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -50425,7 +50477,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_7) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1334
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1333
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1             # <<<<<<<<<<<<<<
@@ -50435,7 +50487,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_v_e_x_gap_low = (__pyx_v_e_x_gap_low - 1);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1335
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1334
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:             # <<<<<<<<<<<<<<
@@ -50452,7 +50504,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_6) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1336
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1335
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:
  *                     e_x_gap_high = e_x_gap_high + 1             # <<<<<<<<<<<<<<
@@ -50465,7 +50517,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     __pyx_L20:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1338
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1337
  *                     e_x_gap_high = e_x_gap_high + 1
  * 
  *             k = 0             # <<<<<<<<<<<<<<
@@ -50474,7 +50526,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_k = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1339
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1338
  * 
  *             k = 0
  *             step = 1+(i*2)             # <<<<<<<<<<<<<<
@@ -50483,7 +50535,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_step = (1 + (__pyx_v_i * 2));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1340
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1339
  *             k = 0
  *             step = 1+(i*2)
  *             while k < len1:             # <<<<<<<<<<<<<<
@@ -50494,7 +50546,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_k < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1341
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1340
  *             step = 1+(i*2)
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -50504,7 +50556,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = (__pyx_v_e_gap_low[__pyx_v_j]);
       for (__pyx_v_m = __pyx_v_e_x_gap_low; __pyx_v_m <= __pyx_t_4; __pyx_v_m++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1342
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1341
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:             # <<<<<<<<<<<<<<
@@ -50514,7 +50566,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_6 = (__pyx_v_m >= (__pyx_v_e_gaps1[((__pyx_v_k + __pyx_v_step) - 1)]));
         if (__pyx_t_6) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1343
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1342
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:             # <<<<<<<<<<<<<<
@@ -50524,7 +50576,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_e_x_gap_high;
           for (__pyx_v_n = (__pyx_v_e_gap_high[__pyx_v_j]); __pyx_v_n <= __pyx_t_5; __pyx_v_n++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1344
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1343
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length             # <<<<<<<<<<<<<<
@@ -50534,7 +50586,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             __pyx_t_6 = ((__pyx_v_n - __pyx_v_m) >= 1);
             if (__pyx_t_6) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1345
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1344
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)             # <<<<<<<<<<<<<<
@@ -50543,7 +50595,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_k), __pyx_v_step);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1346
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1345
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)             # <<<<<<<<<<<<<<
@@ -50552,7 +50604,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (&__pyx_v_m), 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1347
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1346
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)             # <<<<<<<<<<<<<<
@@ -50569,7 +50621,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_L29:;
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1348
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1347
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step             # <<<<<<<<<<<<<<
@@ -50579,7 +50631,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_k = (__pyx_v_k + __pyx_v_step);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1349
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1348
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step
  *             free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -50588,7 +50640,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     free(__pyx_v_e_gaps1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1350
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1349
  *                 k = k + step
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -50597,7 +50649,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1351
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1350
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2
  *             len1 = len2             # <<<<<<<<<<<<<<
@@ -50607,7 +50659,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_len1 = __pyx_v_len2;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1353
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1352
  *             len1 = len2
  * 
  *         step = 1+(num_gaps*2)             # <<<<<<<<<<<<<<
@@ -50616,7 +50668,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = (1 + (__pyx_v_num_gaps * 2));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1354
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1353
  * 
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -50625,7 +50677,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1355
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1354
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0             # <<<<<<<<<<<<<<
@@ -50634,7 +50686,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1356
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1355
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:             # <<<<<<<<<<<<<<
@@ -50644,7 +50696,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_x_high;
   for (__pyx_v_i = __pyx_v_e_high; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1357
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1356
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:
  *             j = 0             # <<<<<<<<<<<<<<
@@ -50653,7 +50705,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1358
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1357
  *         for i from e_high <= i <= e_x_high:
  *             j = 0
  *             while j < len1:             # <<<<<<<<<<<<<<
@@ -50664,7 +50716,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_j < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1359
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1358
  *             j = 0
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:             # <<<<<<<<<<<<<<
@@ -50680,7 +50732,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1360
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1359
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)             # <<<<<<<<<<<<<<
@@ -50689,7 +50741,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
         __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_j), __pyx_v_step);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1361
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1360
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)             # <<<<<<<<<<<<<<
@@ -50701,7 +50753,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L37:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1362
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1361
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step             # <<<<<<<<<<<<<<
@@ -50712,7 +50764,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1363
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1362
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -50721,7 +50773,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1364
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1363
  *                 j = j + step
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -50730,7 +50782,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1365
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1364
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2
  *         len1 = len2             # <<<<<<<<<<<<<<
@@ -50739,7 +50791,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = __pyx_v_len2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1367
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1366
  *         len1 = len2
  * 
  *         step = (num_gaps+1)*2             # <<<<<<<<<<<<<<
@@ -50748,7 +50800,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = ((__pyx_v_num_gaps + 1) * 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1368
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1367
  * 
  *         step = (num_gaps+1)*2
  *         i = 0             # <<<<<<<<<<<<<<
@@ -50757,7 +50809,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1370
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1369
  *         i = 0
  * 
  *         while i < len1:             # <<<<<<<<<<<<<<
@@ -50768,7 +50820,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_i < __pyx_v_len1);
     if (!__pyx_t_2) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1371
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1370
  * 
  *         while i < len1:
  *             ephr_arr._clear()             # <<<<<<<<<<<<<<
@@ -50777,7 +50829,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_clear(__pyx_v_ephr_arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1372
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1371
  *         while i < len1:
  *             ephr_arr._clear()
  *             num_chunks = 0             # <<<<<<<<<<<<<<
@@ -50786,20 +50838,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_num_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1373
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1372
  *             ephr_arr._clear()
  *             num_chunks = 0
  *             indexes = []             # <<<<<<<<<<<<<<
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  */
-    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1372; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(((PyObject *)__pyx_v_indexes));
     __pyx_v_indexes = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1374
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1373
  *             num_chunks = 0
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:             # <<<<<<<<<<<<<<
@@ -50809,7 +50861,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_9 = (__pyx_v_num_gaps + 1);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_9; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1375
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1374
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -50819,7 +50871,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = ((__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]) < (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]));
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1376
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1375
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1             # <<<<<<<<<<<<<<
@@ -50831,7 +50883,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L42:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1377
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1376
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -50841,19 +50893,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_3 = (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]);
       for (__pyx_v_k = (__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1378
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1377
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  */
-        __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1379
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1378
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])             # <<<<<<<<<<<<<<
@@ -50861,14 +50913,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  */
         __pyx_t_4 = (__pyx_v_self->eda->data->arr[(__pyx_v_e_sent_start + __pyx_v_k)]);
-        __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->eid2symid), __pyx_t_4, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->eid2symid), __pyx_t_4, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_append(__pyx_v_ephr_arr, __pyx_t_4);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1380
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1379
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:             # <<<<<<<<<<<<<<
@@ -50878,19 +50930,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = (__pyx_v_j < __pyx_v_num_gaps);
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1381
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1380
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  */
-        __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1382
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1381
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
@@ -50903,7 +50955,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_L45:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1383
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1382
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step             # <<<<<<<<<<<<<<
@@ -50912,7 +50964,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_i = (__pyx_v_i + __pyx_v_step);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1384
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1383
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:             # <<<<<<<<<<<<<<
@@ -50928,22 +50980,22 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1385
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1384
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:
  *                 result.append((Phrase(ephr_arr),indexes))             # <<<<<<<<<<<<<<
  * 
  *         free(e_gaps1)
  */
-      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(((PyObject *)__pyx_v_ephr_arr));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_ephr_arr));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_ephr_arr));
-      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
       __Pyx_GIVEREF(__pyx_t_11);
@@ -50951,7 +51003,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_indexes));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_indexes));
       __pyx_t_11 = 0;
-      __pyx_t_11 = __Pyx_PyObject_Append(__pyx_v_result, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = __Pyx_PyObject_Append(__pyx_v_result, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
@@ -50960,7 +51012,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_L46:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1387
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1386
  *                 result.append((Phrase(ephr_arr),indexes))
  * 
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -50969,7 +51021,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1388
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1387
  * 
  *         free(e_gaps1)
  *         free(e_gap_order)             # <<<<<<<<<<<<<<
@@ -50978,7 +51030,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gap_order);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1389
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1388
  *         free(e_gaps1)
  *         free(e_gap_order)
  *         return result             # <<<<<<<<<<<<<<
@@ -51006,7 +51058,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1391
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1390
  *         return result
  * 
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):             # <<<<<<<<<<<<<<
@@ -51034,55 +51086,55 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("create_alignments", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1393
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1392
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):
  *         cdef unsigned i
  *         cdef IntList ret = IntList()             # <<<<<<<<<<<<<<
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1394
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1393
  *         cdef unsigned i
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):             # <<<<<<<<<<<<<<
  *             s = findexes[i]
  *             if (s<0):
  */
-  __pyx_t_2 = PyObject_Length(__pyx_v_findexes); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_v_findexes); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
     __pyx_v_i = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1395
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1394
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):
  *             s = findexes[i]             # <<<<<<<<<<<<<<
  *             if (s<0):
  *                 continue
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_findexes, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_findexes, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_s);
     __pyx_v_s = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1396
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1395
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  *             if (s<0):             # <<<<<<<<<<<<<<
  *                 continue
  *             idx = 0
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1397
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1396
  *             s = findexes[i]
  *             if (s<0):
  *                 continue             # <<<<<<<<<<<<<<
@@ -51094,7 +51146,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1398
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1397
  *             if (s<0):
  *                 continue
  *             idx = 0             # <<<<<<<<<<<<<<
@@ -51105,7 +51157,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __Pyx_XDECREF(__pyx_v_idx);
     __pyx_v_idx = __pyx_int_0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1399
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1398
  *                 continue
  *             idx = 0
  *             while (idx < num_links*2):             # <<<<<<<<<<<<<<
@@ -51113,51 +51165,51 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
  *                     j = eindexes.index(sent_links[idx+1])
  */
     while (1) {
-      __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (!__pyx_t_4) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1400
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1399
  *             idx = 0
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):             # <<<<<<<<<<<<<<
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  */
-      __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1401
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1400
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])             # <<<<<<<<<<<<<<
  *                     ret.append(i*65536+j)
  *                 idx += 2
  */
-        __pyx_t_1 = PyObject_GetAttr(__pyx_v_eindexes, __pyx_n_s__index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(__pyx_v_eindexes, __pyx_n_s__index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_5 = PyNumber_Add(__pyx_v_idx, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyNumber_Add(__pyx_v_idx, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         __pyx_t_5 = 0;
-        __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
@@ -51165,19 +51217,19 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
         __pyx_v_j = __pyx_t_5;
         __pyx_t_5 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1402
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1401
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)             # <<<<<<<<<<<<<<
  *                 idx += 2
  *         return ret
  */
-        __pyx_t_5 = PyInt_FromLong((__pyx_v_i * 65536)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyInt_FromLong((__pyx_v_i * 65536)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_v_j); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_v_j); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_t_5 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_ret), __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_ret), __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -51185,14 +51237,14 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       }
       __pyx_L8:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1403
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1402
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  *                 idx += 2             # <<<<<<<<<<<<<<
  *         return ret
  * 
  */
-      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_idx, __pyx_int_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_idx, __pyx_int_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_v_idx);
       __pyx_v_idx = __pyx_t_5;
@@ -51201,7 +51253,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __pyx_L3_continue:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1404
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1403
  *                     ret.append(i*65536+j)
  *                 idx += 2
  *         return ret             # <<<<<<<<<<<<<<
@@ -51231,7 +51283,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1406
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1405
  *         return ret
  * 
  *     cdef extract(self, Phrase phrase, Matching* matching, int* chunklen, int num_chunks):             # <<<<<<<<<<<<<<
@@ -51325,19 +51377,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("extract", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1419
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1418
  *         cdef reason_for_failure
  * 
  *         fphr_arr = IntList()             # <<<<<<<<<<<<<<
  *         phrase_len = phrase.n
  *         extracts = []
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_fphr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1420
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1419
  * 
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n             # <<<<<<<<<<<<<<
@@ -51346,19 +51398,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_phrase_len = __pyx_v_phrase->n;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1421
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1420
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n
  *         extracts = []             # <<<<<<<<<<<<<<
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_extracts = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1422
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1421
  *         phrase_len = phrase.n
  *         extracts = []
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -51367,7 +51419,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_sent_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->alignment->__pyx_vtab)->_get_sent_links(__pyx_v_self->alignment, __pyx_v_matching->sent_id, (&__pyx_v_num_links));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1424
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1423
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -51376,7 +51428,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_start = (__pyx_v_self->eda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1425
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1424
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -51385,7 +51437,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_end = (__pyx_v_self->eda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1426
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1425
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1             # <<<<<<<<<<<<<<
@@ -51394,7 +51446,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_len = ((__pyx_v_e_sent_end - __pyx_v_e_sent_start) - 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1427
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1426
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -51403,7 +51455,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_start = (__pyx_v_self->fda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1428
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1427
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -51412,7 +51464,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_end = (__pyx_v_self->fda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1429
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1428
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]
  *         f_sent_len = f_sent_end - f_sent_start - 1             # <<<<<<<<<<<<<<
@@ -51421,21 +51473,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_len = ((__pyx_v_f_sent_end - __pyx_v_f_sent_start) - 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1431
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1430
  *         f_sent_len = f_sent_end - f_sent_start - 1
  * 
  *         self.findexes1.reset()             # <<<<<<<<<<<<<<
  *         sofar = 0
  *         for i in range(num_chunks):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes1), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes1), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1432
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1431
  * 
  *         self.findexes1.reset()
  *         sofar = 0             # <<<<<<<<<<<<<<
@@ -51445,7 +51497,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_sofar = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1433
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1432
  *         self.findexes1.reset()
  *         sofar = 0
  *         for i in range(num_chunks):             # <<<<<<<<<<<<<<
@@ -51456,7 +51508,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1434
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1433
  *         sofar = 0
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):             # <<<<<<<<<<<<<<
@@ -51467,35 +51519,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_v_j = __pyx_t_6;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1435
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1434
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);             # <<<<<<<<<<<<<<
  *                 sofar += 1
  *             if (i+1<num_chunks):
  */
-      __pyx_t_2 = PyInt_FromLong((((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong((((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1436
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1435
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1             # <<<<<<<<<<<<<<
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  */
-      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_1;
       __pyx_t_1 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1437
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1436
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1
  *             if (i+1<num_chunks):             # <<<<<<<<<<<<<<
@@ -51505,28 +51557,28 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = ((__pyx_v_i + 1) < __pyx_v_num_chunks);
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1438
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1437
  *                 sofar += 1
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])             # <<<<<<<<<<<<<<
  *                 sofar += 1
  * 
  */
-      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_phrase), __pyx_v_sofar); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_phrase), __pyx_v_sofar); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1439
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1438
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  *                 sofar += 1             # <<<<<<<<<<<<<<
  * 
  * 
  */
-      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_2;
@@ -51536,7 +51588,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1442
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1441
  * 
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51545,7 +51597,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_low = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1443
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1442
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51554,7 +51606,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_high = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1444
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1443
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51563,7 +51615,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_low = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1445
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1444
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51572,7 +51624,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_high = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1446
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1445
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51581,7 +51633,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1447
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1446
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51590,7 +51642,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1448
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1447
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51599,7 +51651,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1449
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1448
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51608,7 +51660,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1450
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1449
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51617,7 +51669,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1451
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1450
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51626,7 +51678,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1452
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1451
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51635,7 +51687,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1453
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1452
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51644,7 +51696,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1455
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1454
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))
  * 
  *         reason_for_failure = ""             # <<<<<<<<<<<<<<
@@ -51654,7 +51706,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_45);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1457
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1456
  *         reason_for_failure = ""
  * 
  *         for i from 0 <= i < e_sent_len:             # <<<<<<<<<<<<<<
@@ -51664,7 +51716,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_e_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1458
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1457
  * 
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -51673,7 +51725,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_e_links_low[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1459
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1458
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -51683,7 +51735,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_e_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1460
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1459
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:             # <<<<<<<<<<<<<<
@@ -51693,7 +51745,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_f_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1461
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1460
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -51702,7 +51754,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_f_links_low[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1462
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1461
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1
  *             f_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -51712,7 +51764,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_f_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1468
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1467
  *         # links that we care about (but then how to look up
  *         # when we want to check something on the e side?)
  *         i = 0             # <<<<<<<<<<<<<<
@@ -51721,7 +51773,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1469
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1468
  *         # when we want to check something on the e side?)
  *         i = 0
  *         while i < num_links*2:             # <<<<<<<<<<<<<<
@@ -51732,7 +51784,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = (__pyx_v_i < (__pyx_v_num_links * 2));
     if (!__pyx_t_7) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1470
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1469
  *         i = 0
  *         while i < num_links*2:
  *             f_i = sent_links[i]             # <<<<<<<<<<<<<<
@@ -51741,7 +51793,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_f_i = (__pyx_v_sent_links[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1471
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1470
  *         while i < num_links*2:
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]             # <<<<<<<<<<<<<<
@@ -51750,7 +51802,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_e_i = (__pyx_v_sent_links[(__pyx_v_i + 1)]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1472
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1471
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:             # <<<<<<<<<<<<<<
@@ -51766,7 +51818,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1473
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1472
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i             # <<<<<<<<<<<<<<
@@ -51778,7 +51830,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1474
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1473
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:             # <<<<<<<<<<<<<<
@@ -51794,7 +51846,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_8) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1475
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1474
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1             # <<<<<<<<<<<<<<
@@ -51806,7 +51858,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1476
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1475
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:             # <<<<<<<<<<<<<<
@@ -51822,7 +51874,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1477
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1476
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i             # <<<<<<<<<<<<<<
@@ -51834,7 +51886,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1478
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1477
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:             # <<<<<<<<<<<<<<
@@ -51850,7 +51902,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1479
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1478
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1             # <<<<<<<<<<<<<<
@@ -51862,7 +51914,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1480
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1479
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1
  *             i = i + 2             # <<<<<<<<<<<<<<
@@ -51872,19 +51924,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + 2);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1482
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1481
  *             i = i + 2
  * 
  *         als = []             # <<<<<<<<<<<<<<
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  */
-  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_als = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1483
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1482
  * 
  *         als = []
  *         for x in range(matching.start,matching.end):             # <<<<<<<<<<<<<<
@@ -51895,18 +51947,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = __pyx_v_matching->start; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_x = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1484
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1483
  *         als = []
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])             # <<<<<<<<<<<<<<
  *             als.append(al)
  *         # check all source-side alignment constraints
  */
-    __pyx_t_2 = PyInt_FromLong(((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
@@ -51918,17 +51970,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_al = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1485
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1484
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  *             als.append(al)             # <<<<<<<<<<<<<<
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  */
-    __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1487
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1486
  *             als.append(al)
  *         # check all source-side alignment constraints
  *         met_constraints = 1             # <<<<<<<<<<<<<<
@@ -51937,7 +51989,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_met_constraints = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1488
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1487
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  *         if self.require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -51946,7 +51998,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_self->require_aligned_terminal) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1489
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1488
  *         met_constraints = 1
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -51955,7 +52007,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_num_aligned_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1490
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1489
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:             # <<<<<<<<<<<<<<
@@ -51965,7 +52017,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_3 = __pyx_v_num_chunks;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1491
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1490
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:             # <<<<<<<<<<<<<<
@@ -51975,7 +52027,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_chunklen[__pyx_v_i]);
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1492
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1491
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:             # <<<<<<<<<<<<<<
@@ -51985,7 +52037,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_9 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)]) > -1);
         if (__pyx_t_9) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1493
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1492
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1             # <<<<<<<<<<<<<<
@@ -51994,7 +52046,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_num_aligned_chunks = (__pyx_v_num_aligned_chunks + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1494
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1493
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break             # <<<<<<<<<<<<<<
@@ -52009,7 +52061,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_L24_break:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1495
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1494
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break
  *             if num_aligned_chunks == 0:             # <<<<<<<<<<<<<<
@@ -52019,7 +52071,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_9 = (__pyx_v_num_aligned_chunks == 0);
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1496
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1495
  *                         break
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"             # <<<<<<<<<<<<<<
@@ -52030,7 +52082,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_127);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1497
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1496
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52042,7 +52094,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L26:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1498
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1497
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:             # <<<<<<<<<<<<<<
@@ -52057,7 +52109,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1499
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1498
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"             # <<<<<<<<<<<<<<
@@ -52068,7 +52120,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1500
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1499
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52083,7 +52135,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L20:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1502
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1501
  *                 met_constraints = 0
  * 
  *         if met_constraints and self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52097,7 +52149,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1504
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1503
  *         if met_constraints and self.tight_phrases:
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:             # <<<<<<<<<<<<<<
@@ -52107,7 +52159,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_12 = (__pyx_v_num_chunks - 1);
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1505
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1504
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -52117,7 +52169,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1506
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1505
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -52128,7 +52180,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_129);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1507
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1506
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52137,7 +52189,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1508
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1507
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -52149,7 +52201,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L31:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1509
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1508
  *                     met_constraints = 0
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -52159,7 +52211,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - 1) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1510
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1509
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -52170,7 +52222,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_129);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1511
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1510
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52179,7 +52231,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1512
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1511
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -52196,7 +52248,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L28:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1514
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1513
  *                     break
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52205,7 +52257,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_low = ((__pyx_v_matching->arr[__pyx_v_matching->start]) - __pyx_v_f_sent_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1515
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1514
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52214,7 +52266,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_high = (((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_matching->size) - 1)]) + (__pyx_v_chunklen[(__pyx_v_num_chunks - 1)])) - __pyx_v_f_sent_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1516
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1515
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start
  *         if met_constraints:             # <<<<<<<<<<<<<<
@@ -52223,17 +52275,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_met_constraints) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1518
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1517
  *         if met_constraints:
  * 
  *             if self.find_fixpoint(f_low, f_high, f_links_low, f_links_high, e_links_low, e_links_high,             # <<<<<<<<<<<<<<
  *                                 -1, -1, &e_low, &e_high, &f_back_low, &f_back_high, f_sent_len, e_sent_len,
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  */
-    __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1522
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1521
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):             # <<<<<<<<<<<<<<
@@ -52244,7 +52296,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1523
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1522
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0             # <<<<<<<<<<<<<<
@@ -52253,7 +52305,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_gap_error = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1524
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1523
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0
  *                 num_gaps = 0             # <<<<<<<<<<<<<<
@@ -52262,7 +52314,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_num_gaps = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1526
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1525
  *                 num_gaps = 0
  * 
  *                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -52272,7 +52324,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1527
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1526
  * 
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low             # <<<<<<<<<<<<<<
@@ -52281,7 +52333,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[0]) = __pyx_v_f_back_low;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1528
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1527
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low             # <<<<<<<<<<<<<<
@@ -52290,7 +52342,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[0]) = __pyx_v_f_low;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1529
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1528
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1             # <<<<<<<<<<<<<<
@@ -52299,7 +52351,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1530
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1529
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1
  *                     gap_start = 0             # <<<<<<<<<<<<<<
@@ -52308,7 +52360,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1531
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1530
  *                     num_gaps = 1
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -52317,7 +52369,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1532
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1531
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -52327,7 +52379,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1533
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1532
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -52339,7 +52391,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L36:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1534
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1533
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52348,7 +52400,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1535
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1534
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -52364,7 +52416,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1536
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1535
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -52373,7 +52425,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1537
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1536
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -52393,7 +52445,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1539
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1538
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"
  *                 else:
  *                     gap_start = 1             # <<<<<<<<<<<<<<
@@ -52402,7 +52454,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1540
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1539
  *                 else:
  *                     gap_start = 1
  *                     if self.tight_phrases and f_links_low[f_low] == -1:             # <<<<<<<<<<<<<<
@@ -52417,7 +52469,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1543
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1542
  *                         # this is not a hard error.    we can't extract this phrase
  *                         # but we still might be able to extract a superphrase
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52431,7 +52483,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L35:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1545
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1544
  *                         met_constraints = 0
  * 
  *                 for i from 0 <= i < matching.size - 1:             # <<<<<<<<<<<<<<
@@ -52441,7 +52493,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_12 = (__pyx_v_matching->size - 1);
       for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1546
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1545
  * 
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52450,7 +52502,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(1 + __pyx_v_i)]) = (((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1547
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1546
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52459,7 +52511,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(1 + __pyx_v_i)]) = ((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - __pyx_v_f_sent_start);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1548
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1547
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -52469,7 +52521,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1550
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1549
  *                     num_gaps = num_gaps + 1
  * 
  *                 if f_high < f_back_high:             # <<<<<<<<<<<<<<
@@ -52479,7 +52531,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_high < __pyx_v_f_back_high);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1551
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1550
  * 
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high             # <<<<<<<<<<<<<<
@@ -52488,7 +52540,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_high;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1552
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1551
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high             # <<<<<<<<<<<<<<
@@ -52497,7 +52549,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_back_high;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1553
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1552
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -52506,7 +52558,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1554
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1553
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -52515,7 +52567,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1555
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1554
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -52525,7 +52577,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1556
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1555
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -52537,7 +52589,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L43:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1557
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1556
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52546,7 +52598,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1558
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1557
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:             # <<<<<<<<<<<<<<
@@ -52562,7 +52614,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1559
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1558
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -52571,7 +52623,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1560
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1559
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -52591,7 +52643,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1562
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1561
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -52606,7 +52658,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1563
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1562
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52620,7 +52672,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L42:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1565
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1564
  *                         met_constraints = 0
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -52630,7 +52682,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1566
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1565
  * 
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low             # <<<<<<<<<<<<<<
@@ -52639,7 +52691,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_e_word_count = (__pyx_v_e_high - __pyx_v_e_low);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1567
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1566
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases             # <<<<<<<<<<<<<<
@@ -52649,17 +52701,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_num_gaps;
         for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1568
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1567
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases
  *                         if self.find_fixpoint(f_gap_low[gap_start+i], f_gap_high[gap_start+i],             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low+gap_start+i, e_gap_high+gap_start+i,
  */
-          __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1573
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1572
  *                                             f_gap_low+gap_start+i, f_gap_high+gap_start+i,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -52670,7 +52722,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1575
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1574
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -52679,18 +52731,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1576
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1575
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])             # <<<<<<<<<<<<<<
  *                             break
  * 
  */
-            __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
@@ -52698,14 +52750,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_10 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
             __pyx_v_reason_for_failure = ((PyObject *)__pyx_t_1);
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1577
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1576
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])
  *                             break             # <<<<<<<<<<<<<<
@@ -52722,7 +52774,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L47:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1579
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1578
  *                             break
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -52732,7 +52784,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1580
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1579
  * 
  *                 if gap_error == 0:
  *                     i = 1             # <<<<<<<<<<<<<<
@@ -52741,21 +52793,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_i = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1581
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1580
  *                 if gap_error == 0:
  *                     i = 1
  *                     self.findexes.reset()             # <<<<<<<<<<<<<<
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  */
-        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1582
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1581
  *                     i = 1
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -52765,7 +52817,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1583
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1582
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52774,7 +52826,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1584
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1583
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1             # <<<<<<<<<<<<<<
@@ -52783,16 +52835,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_i = (__pyx_v_i + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1585
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1584
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -52800,27 +52852,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L52:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1586
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1585
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  */
-        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->findexes1));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-        __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1587
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1586
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -52830,7 +52882,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_phrase->n;
         for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1588
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1587
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -52840,7 +52892,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
           if (__pyx_t_4) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1589
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1588
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52849,7 +52901,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1590
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1589
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))
  *                             i = i + 1             # <<<<<<<<<<<<<<
@@ -52861,7 +52913,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1592
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1591
  *                             i = i + 1
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -52873,7 +52925,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_L55:;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1593
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1592
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -52883,7 +52935,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_high > __pyx_v_f_high);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1594
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1593
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -52892,16 +52944,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1595
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1594
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  * 
  *                     fphr = Phrase(fphr_arr)
  */
-          __pyx_t_10 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -52909,25 +52961,25 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L56:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1597
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1596
  *                         self.findexes.append(sym_setindex(self.category, i))
  * 
  *                     fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                     if met_constraints:
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  */
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1596; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_fphr_arr));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-        __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1596; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_10);
         __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1598
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1597
  * 
  *                     fphr = Phrase(fphr_arr)
  *                     if met_constraints:             # <<<<<<<<<<<<<<
@@ -52936,47 +52988,47 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_met_constraints) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1601
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1600
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)
  */
-          __pyx_t_10 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_low, __pyx_v_e_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, __pyx_v_num_gaps, __pyx_v_f_back_low, __pyx_v_f_back_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_low, __pyx_v_e_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, __pyx_v_num_gaps, __pyx_v_f_back_low, __pyx_v_f_back_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_v_phrase_list = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1602
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1601
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  */
-          __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_7 = (__pyx_t_13 > 0);
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1603
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1602
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                         else:
  *                             pair_count = 0
  */
-            __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (unlikely(__pyx_t_13 == 0)) {
               PyErr_Format(PyExc_ZeroDivisionError, "float division");
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             __pyx_v_pair_count = (1.0 / __pyx_t_13);
             goto __pyx_L58;
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1605
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1604
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  *                             pair_count = 0             # <<<<<<<<<<<<<<
@@ -52985,22 +53037,22 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_pair_count = 0.0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1606
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1605
  *                         else:
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  */
-            __pyx_t_10 = PyInt_FromLong(__pyx_v_f_back_low); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_v_f_back_low); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyInt_FromLong(__pyx_v_e_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromLong(__pyx_v_e_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
@@ -53014,7 +53066,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
             __pyx_t_14 = 0;
-            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_133), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_133), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_14));
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
@@ -53023,7 +53075,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L58:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1607
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1606
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:             # <<<<<<<<<<<<<<
@@ -53034,7 +53086,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_14 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_14); __pyx_t_13 = 0;
             __pyx_t_16 = NULL;
           } else {
-            __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
             __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
           }
@@ -53042,23 +53094,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else {
               __pyx_t_15 = __pyx_t_16(__pyx_t_14);
               if (unlikely(!__pyx_t_15)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -53074,7 +53126,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (unlikely(size != 2)) {
                 if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                 else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
@@ -53087,14 +53139,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_2);
               #else
-              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             } else
             {
               Py_ssize_t index = -1;
-              __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -53102,7 +53154,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_GOTREF(__pyx_t_1);
               index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L61_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_2);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               goto __pyx_L62_unpacking_done;
@@ -53110,7 +53162,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               __pyx_t_17 = NULL;
               if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L62_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_phrase2);
@@ -53120,7 +53172,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_eindexes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1608
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1607
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -53129,31 +53181,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_t_15 = ((PyObject *)__pyx_v_self->findexes);
             __Pyx_INCREF(__pyx_t_15);
-            __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             __Pyx_XDECREF(((PyObject *)__pyx_v_als1));
             __pyx_v_als1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1609
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1608
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))             # <<<<<<<<<<<<<<
  * 
  *                     if (num_gaps < self.max_nonterminals and
  */
-            __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_als1));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als1));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_als1));
-            __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
@@ -53167,7 +53219,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -53177,7 +53229,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L57:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1611
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1610
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))
  * 
  *                     if (num_gaps < self.max_nonterminals and             # <<<<<<<<<<<<<<
@@ -53187,7 +53239,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_num_gaps < __pyx_v_self->max_nonterminals);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1612
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1611
  * 
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and             # <<<<<<<<<<<<<<
@@ -53197,7 +53249,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_phrase_len < __pyx_v_self->max_length);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1613
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1612
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):             # <<<<<<<<<<<<<<
@@ -53215,7 +53267,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_9) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1614
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1613
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -53225,7 +53277,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_low == __pyx_v_f_low);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1615
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1614
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -53235,7 +53287,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1616
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1615
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):             # <<<<<<<<<<<<<<
@@ -53265,7 +53317,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1617
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1616
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -53274,7 +53326,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1618
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1617
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -53283,7 +53335,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1619
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1618
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -53292,7 +53344,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1620
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1619
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -53309,7 +53361,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1621
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1620
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -53322,7 +53374,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L65:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1622
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1621
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -53338,7 +53390,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1623
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1622
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -53350,7 +53402,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L68:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1625
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1624
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -53359,17 +53411,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1626
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1625
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_back_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1625; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1630
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1629
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -53379,7 +53431,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_14, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 1, 0, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1632
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1631
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and             # <<<<<<<<<<<<<<
@@ -53395,17 +53447,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1633
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1632
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and
  *                                 self.find_fixpoint(f_x_low, f_low,    # check integrity of new subphrase             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  */
-                  __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1632; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_1);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1637
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1636
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -53428,7 +53480,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1639
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1638
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -53437,7 +53489,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1640
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1639
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -53446,35 +53498,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1641
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1640
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_1 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1642
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1641
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1643
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1642
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53483,7 +53535,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1644
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1643
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -53492,27 +53544,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1645
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1644
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1646
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1645
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -53522,7 +53574,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1647
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1646
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -53532,7 +53584,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1648
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1647
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53541,7 +53593,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1649
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1648
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -53553,7 +53605,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1651
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1650
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -53565,7 +53617,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L72:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1652
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1651
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -53575,7 +53627,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_high > __pyx_v_f_high);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1653
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1652
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53584,16 +53636,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1654
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1653
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  */
-                __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -53601,67 +53653,67 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L73:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1655
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1654
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  */
-              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_15);
               __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1658
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1657
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_15 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_15;
               __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1659
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1658
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1658; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1660
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1659
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L74;
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1662
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1661
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -53672,7 +53724,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L74:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1663
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1662
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -53683,7 +53735,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_15 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_15); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __pyx_t_16 = Py_TYPE(__pyx_t_15)->tp_iternext;
               }
@@ -53691,23 +53743,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_15)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else {
                   __pyx_t_1 = __pyx_t_16(__pyx_t_15);
                   if (unlikely(!__pyx_t_1)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -53723,7 +53775,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
@@ -53736,14 +53788,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_INCREF(__pyx_t_14);
                   __Pyx_INCREF(__pyx_t_2);
                   #else
-                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -53751,7 +53803,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_14);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L77_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L78_unpacking_done;
@@ -53759,7 +53811,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   __pyx_t_17 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L78_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -53769,7 +53821,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1664
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1663
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -53778,31 +53830,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_1 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_1);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_1, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_1, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als2));
                 __pyx_v_als2 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1665
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1664
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))             # <<<<<<<<<<<<<<
  * 
  *                         if (f_back_high == f_high and
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als2));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_als2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als2));
-                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-                __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr));
@@ -53816,7 +53868,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_t_2 = 0;
                 __pyx_t_14 = 0;
-                __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
@@ -53829,7 +53881,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L64:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1667
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1666
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))
  * 
  *                         if (f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -53839,7 +53891,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_high == __pyx_v_f_high);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1668
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1667
  * 
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -53849,7 +53901,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_f_sent_len - __pyx_v_f_high) >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1669
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1668
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):             # <<<<<<<<<<<<<<
@@ -53879,7 +53931,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1670
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1669
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -53888,7 +53940,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1671
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1670
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -53897,7 +53949,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1672
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1671
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -53906,7 +53958,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1673
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1672
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -53923,7 +53975,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1674
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1673
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -53936,7 +53988,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L80:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1675
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1674
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -53952,7 +54004,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1676
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1675
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -53964,7 +54016,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L83:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1678
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1677
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -53973,17 +54025,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1679
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1678
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_back_low, f_x_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1679; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1678; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1683
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1682
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -53993,7 +54045,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_back_low, __pyx_t_15, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 0, 1, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1685
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1684
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and             # <<<<<<<<<<<<<<
@@ -54009,17 +54061,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1686
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1685
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low+gap_start+num_gaps, e_gap_high+gap_start+num_gaps,
  */
-                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1685; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_14);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1691
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1690
  *                                             f_gap_low+gap_start+num_gaps, f_gap_high+gap_start+num_gaps,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -54042,7 +54094,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1693
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1692
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -54051,7 +54103,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1694
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1693
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -54060,21 +54112,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1695
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1694
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1695; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1694; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1695; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1694; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1696
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1695
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -54084,7 +54136,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_low < __pyx_v_f_low);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1697
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1696
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54093,7 +54145,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1698
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1697
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1             # <<<<<<<<<<<<<<
@@ -54102,16 +54154,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_v_i = (__pyx_v_i + 1);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1699
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1698
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  */
-                __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1698; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1698; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -54119,27 +54171,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L85:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1700
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1699
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1701
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1700
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -54149,7 +54201,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1702
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1701
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -54159,7 +54211,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1703
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1702
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54168,7 +54220,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1704
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1703
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -54180,7 +54232,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1706
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1705
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -54192,7 +54244,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L88:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1707
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1706
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54201,81 +54253,81 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1708
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1707
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1709
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1708
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  */
-              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
               __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1712
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1711
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_1;
               __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1713
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1712
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1714
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1713
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L89;
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1716
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1715
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -54286,7 +54338,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L89:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1717
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1716
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -54297,7 +54349,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_1 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_1); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __pyx_t_16 = Py_TYPE(__pyx_t_1)->tp_iternext;
               }
@@ -54305,23 +54357,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_1)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else {
                   __pyx_t_14 = __pyx_t_16(__pyx_t_1);
                   if (unlikely(!__pyx_t_14)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -54337,7 +54389,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
@@ -54350,14 +54402,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_INCREF(__pyx_t_15);
                   __Pyx_INCREF(__pyx_t_2);
                   #else
-                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -54365,7 +54417,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_15);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L92_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L93_unpacking_done;
@@ -54373,7 +54425,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   __pyx_t_17 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L93_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -54383,7 +54435,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1718
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1717
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -54392,31 +54444,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_14 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_14);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_14, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_14, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als3));
                 __pyx_v_als3 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1719
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1718
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))             # <<<<<<<<<<<<<<
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als3));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_als3));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als3));
-                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr));
@@ -54430,7 +54482,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_15);
                 __pyx_t_2 = 0;
                 __pyx_t_15 = 0;
-                __pyx_t_15 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -54443,7 +54495,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L79:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1720
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1719
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and             # <<<<<<<<<<<<<<
@@ -54453,7 +54505,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_num_gaps < (__pyx_v_self->max_nonterminals - 1));
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1721
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1720
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and             # <<<<<<<<<<<<<<
@@ -54463,7 +54515,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_phrase_len + 1) < __pyx_v_self->max_length);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1722
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1721
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -54473,7 +54525,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_18 = (__pyx_v_f_back_high == __pyx_v_f_high);
               if (__pyx_t_18) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1723
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1722
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -54483,7 +54535,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_8 = (__pyx_v_f_back_low == __pyx_v_f_low);
                 if (__pyx_t_8) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1724
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1723
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
@@ -54493,7 +54545,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_19 = (((__pyx_v_f_back_high - __pyx_v_f_back_low) + (2 * __pyx_v_self->train_min_gap_size)) <= __pyx_v_self->train_max_initial_size);
                   if (__pyx_t_19) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1725
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1724
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -54503,7 +54555,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                     __pyx_t_20 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
                     if (__pyx_t_20) {
 
-                      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1726
+                      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1725
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -54513,7 +54565,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                       __pyx_t_21 = (__pyx_v_f_high <= (__pyx_v_f_sent_len - __pyx_v_self->train_min_gap_size));
                       if (__pyx_t_21) {
 
-                        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1727
+                        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1726
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):             # <<<<<<<<<<<<<<
@@ -54563,7 +54615,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1729
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1728
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):
  * 
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -54572,7 +54624,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1730
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1729
  * 
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -54581,7 +54633,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1731
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1730
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -54590,7 +54642,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1732
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1731
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -54607,7 +54659,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1733
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1732
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -54620,7 +54672,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L95:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1734
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1733
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:             # <<<<<<<<<<<<<<
@@ -54630,7 +54682,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_18 = (__pyx_v_f_x_low < 0);
             if (__pyx_t_18) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1735
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1734
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -54642,7 +54694,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L98:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1737
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1736
  *                                 met_constraints = 0
  * 
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -54651,7 +54703,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1738
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1737
  * 
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -54660,7 +54712,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1739
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1738
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -54677,7 +54729,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_9) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1740
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1739
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -54690,7 +54742,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L99:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1741
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1740
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -54706,7 +54758,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1742
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1741
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -54718,7 +54770,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L102:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1744
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1743
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -54727,17 +54779,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1745
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1744
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_x_high,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1749
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1748
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -54747,7 +54799,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 2, 1, 1, 1, 1)) {
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1751
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1750
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and             # <<<<<<<<<<<<<<
@@ -54769,17 +54821,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_9) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1752
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1751
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and
  *                                 self.find_fixpoint(f_x_low, f_low,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  */
-                  __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_15);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1756
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1755
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -54790,17 +54842,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   if (__pyx_t_3) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1758
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1757
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 -1, -1, e_gap_low+1+num_gaps, e_gap_high+1+num_gaps,
  */
-                    __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1758; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1757; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     __Pyx_GOTREF(__pyx_t_15);
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1763
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1762
  *                                                 f_gap_low+1+num_gaps, f_gap_high+1+num_gaps,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -54828,7 +54880,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_8) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1765
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1764
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -54837,7 +54889,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1766
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1765
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -54846,35 +54898,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1767
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1766
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1768
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1767
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  */
-              __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1769
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1768
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54883,7 +54935,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1770
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1769
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -54892,27 +54944,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1771
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1770
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_14 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1772
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1771
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -54922,7 +54974,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1773
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1772
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -54932,7 +54984,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1774
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1773
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54941,7 +54993,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1775
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1774
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -54953,7 +55005,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1777
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1776
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -54965,7 +55017,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L106:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1778
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1777
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54974,81 +55026,81 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1779
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1778
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  */
-              __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1780
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1779
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  */
-              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_14);
               __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1783
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1782
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_14 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 2), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 2), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1784
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1783
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_8 = (__pyx_t_13 > 0);
               if (__pyx_t_8) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1785
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1784
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L107;
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1787
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1786
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -55059,7 +55111,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L107:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1788
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1787
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -55070,7 +55122,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_14 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_14); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
               }
@@ -55078,23 +55130,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else {
                   __pyx_t_15 = __pyx_t_16(__pyx_t_14);
                   if (unlikely(!__pyx_t_15)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -55110,7 +55162,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
@@ -55123,14 +55175,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_INCREF(__pyx_t_1);
                   __Pyx_INCREF(__pyx_t_2);
                   #else
-                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -55138,7 +55190,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_1);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L110_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L111_unpacking_done;
@@ -55146,7 +55198,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   __pyx_t_17 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L111_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -55156,7 +55208,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1789
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1788
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -55165,31 +55217,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_15 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_15);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als4));
                 __pyx_v_als4 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1790
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1789
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))             # <<<<<<<<<<<<<<
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als4));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als4));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als4));
-                __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
@@ -55203,7 +55255,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_1);
                 __pyx_t_2 = 0;
                 __pyx_t_1 = 0;
-                __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -55225,7 +55277,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1792
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1791
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"             # <<<<<<<<<<<<<<
@@ -55241,7 +55293,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L33:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1794
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1793
  *                 reason_for_failure = "Unable to extract basic phrase"
  * 
  *         free(sent_links)             # <<<<<<<<<<<<<<
@@ -55250,7 +55302,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_sent_links);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1795
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1794
  * 
  *         free(sent_links)
  *         free(f_links_low)             # <<<<<<<<<<<<<<
@@ -55259,7 +55311,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1796
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1795
  *         free(sent_links)
  *         free(f_links_low)
  *         free(f_links_high)             # <<<<<<<<<<<<<<
@@ -55268,7 +55320,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1797
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1796
  *         free(f_links_low)
  *         free(f_links_high)
  *         free(e_links_low)             # <<<<<<<<<<<<<<
@@ -55277,7 +55329,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1798
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1797
  *         free(f_links_high)
  *         free(e_links_low)
  *         free(e_links_high)             # <<<<<<<<<<<<<<
@@ -55286,7 +55338,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1799
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1798
  *         free(e_links_low)
  *         free(e_links_high)
  *         free(f_gap_low)             # <<<<<<<<<<<<<<
@@ -55295,7 +55347,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1800
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1799
  *         free(e_links_high)
  *         free(f_gap_low)
  *         free(f_gap_high)             # <<<<<<<<<<<<<<
@@ -55304,7 +55356,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1801
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1800
  *         free(f_gap_low)
  *         free(f_gap_high)
  *         free(e_gap_low)             # <<<<<<<<<<<<<<
@@ -55313,7 +55365,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1802
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1801
  *         free(f_gap_high)
  *         free(e_gap_low)
  *         free(e_gap_high)             # <<<<<<<<<<<<<<
@@ -55322,7 +55374,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1804
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1803
  *         free(e_gap_high)
  * 
  *         return extracts             # <<<<<<<<<<<<<<
@@ -57566,24 +57618,41 @@ static int __pyx_tp_clear_3_sa_DataArray(PyObject *o) {
   return 0;
 }
 
+static PyObject *__pyx_getprop_3_sa_9DataArray_data(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9DataArray_4data_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_9DataArray_data(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_9DataArray_4data_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_3_sa_9DataArray_4data_5__del__(o);
+  }
+}
+
 static PyMethodDef __pyx_methods_3_sa_DataArray[] = {
-  {__Pyx_NAMESTR("get_data"), (PyCFunction)__pyx_pw_3_sa_9DataArray_5get_data, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_7get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pw_3_sa_9DataArray_9get_sentence, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pw_3_sa_9DataArray_11get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_13get_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pw_3_sa_9DataArray_15get_word, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_17write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_19read_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pw_3_sa_9DataArray_21read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pw_3_sa_9DataArray_23read_text_data, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_25read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_27write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pw_3_sa_9DataArray_29write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9DataArray_31write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_5get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pw_3_sa_9DataArray_7get_sentence, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pw_3_sa_9DataArray_9get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_11get_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pw_3_sa_9DataArray_13get_word, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_17read_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pw_3_sa_9DataArray_19read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text_data"), (PyCFunction)__pyx_pw_3_sa_9DataArray_21read_text_data, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_23read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_9DataArray_25write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced_handle"), (PyCFunction)__pyx_pw_3_sa_9DataArray_27write_enhanced_handle, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_9DataArray_29write_enhanced, METH_O, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
+static struct PyGetSetDef __pyx_getsets_3_sa_DataArray[] = {
+  {(char *)"data", __pyx_getprop_3_sa_9DataArray_data, __pyx_setprop_3_sa_9DataArray_data, 0, 0},
+  {0, 0, 0, 0, 0}
+};
+
 static PyNumberMethods __pyx_tp_as_number_DataArray = {
   0, /*nb_add*/
   0, /*nb_subtract*/
@@ -57716,7 +57785,7 @@ static PyTypeObject __pyx_type_3_sa_DataArray = {
   0, /*tp_iternext*/
   __pyx_methods_3_sa_DataArray, /*tp_methods*/
   0, /*tp_members*/
-  0, /*tp_getset*/
+  __pyx_getsets_3_sa_DataArray, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
@@ -66007,6 +66076,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__fphrase, __pyx_k__fphrase, sizeof(__pyx_k__fphrase), 0, 0, 1, 1},
   {&__pyx_n_s__from_binary, __pyx_k__from_binary, sizeof(__pyx_k__from_binary), 0, 0, 1, 1},
   {&__pyx_n_s__from_data, __pyx_k__from_data, sizeof(__pyx_k__from_data), 0, 0, 1, 1},
+  {&__pyx_n_s__from_iterable, __pyx_k__from_iterable, sizeof(__pyx_k__from_iterable), 0, 0, 1, 1},
   {&__pyx_n_s__from_stats, __pyx_k__from_stats, sizeof(__pyx_k__from_stats), 0, 0, 1, 1},
   {&__pyx_n_s__from_text, __pyx_k__from_text, sizeof(__pyx_k__from_text), 0, 0, 1, 1},
   {&__pyx_n_s__frontier, __pyx_k__frontier, sizeof(__pyx_k__frontier), 0, 0, 1, 1},
@@ -66145,7 +66215,7 @@ static int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_IndexError = __Pyx_GetName(__pyx_b, __pyx_n_s__IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_TypeError = __Pyx_GetName(__pyx_b, __pyx_n_s__TypeError); if (!__pyx_builtin_TypeError) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_enumerate = __Pyx_GetName(__pyx_b, __pyx_n_s__enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_enumerate = __Pyx_GetName(__pyx_b, __pyx_n_s__enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_map = __Pyx_GetName(__pyx_b, __pyx_n_s__map); if (!__pyx_builtin_map) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_Exception = __Pyx_GetName(__pyx_b, __pyx_n_s__Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_zip = __Pyx_GetName(__pyx_b, __pyx_n_s__zip); if (!__pyx_builtin_zip) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -66213,28 +66283,28 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-  __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_15);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             for w_id in self.data:
  *                 if w_id > 1:
  */
-  __pyx_k_tuple_16 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_16 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_16);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, Py_None);
@@ -66247,14 +66317,14 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
  *             self.read_text_data(fp)
  * 
  */
-  __pyx_k_tuple_17 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_17 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_17);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, Py_None);
@@ -66267,28 +66337,28 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
  *             self.read_text_data(data)
  * 
  */
-  __pyx_k_tuple_19 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_19 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_19);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_18));
   PyTuple_SET_ITEM(__pyx_k_tuple_19, 0, ((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_19));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":75
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
  *             data = (line.split(' ||| ')[side] for line in fp)
  *             self.read_text_data(data)
  */
-  __pyx_k_tuple_20 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_20 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_20);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_20, 0, Py_None);
@@ -66301,69 +66371,69 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_20));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  */
-  __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_22);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_22, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_22));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  */
-  __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_23);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_23, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_23));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  */
-  __pyx_k_tuple_24 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_24 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_24);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_24, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_24));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def write_enhanced(self, char* filename):
  */
-  __pyx_k_tuple_26 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_26)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_26 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_26)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_26);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_26, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_26));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.write_enhanced_handle(self, f)
  */
-  __pyx_k_tuple_28 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_28 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_28);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_28, 0, Py_None);
@@ -67280,9 +67350,9 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_ptype_3_sa_Scorer = &__pyx_type_3_sa_Scorer;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct____iter__) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct____iter__ = &__pyx_type_3_sa___pyx_scope_struct____iter__;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_1_read_bitext) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_1_read_bitext) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = &__pyx_type_3_sa___pyx_scope_struct_1_read_bitext;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = &__pyx_type_3_sa___pyx_scope_struct_2_genexpr;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_3_compute_stats) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats = &__pyx_type_3_sa___pyx_scope_struct_3_compute_stats;
diff --git a/python/src/sa/data_array.pxi b/python/src/sa/data_array.pxi
index ce2d3a79..371708c5 100644
--- a/python/src/sa/data_array.pxi
+++ b/python/src/sa/data_array.pxi
@@ -9,8 +9,8 @@ from libc.string cimport memset, strcpy
 cdef class DataArray:
     cdef word2id
     cdef id2word
-    cdef IntList data
-    cdef IntList sent_id
+    cdef public IntList data
+    cdef public IntList sent_id
     cdef IntList sent_index
     cdef bint use_sent_id
 
@@ -32,9 +32,6 @@ cdef class DataArray:
     def __len__(self):
         return len(self.data)
 
-    def get_data(self):
-        return self.data
-
     def get_sentence_id(self, i):
         return self.sent_id.arr[i]
 
diff --git a/python/src/sa/rulefactory.pxi b/python/src/sa/rulefactory.pxi
index 233654e9..3973554c 100644
--- a/python/src/sa/rulefactory.pxi
+++ b/python/src/sa/rulefactory.pxi
@@ -1101,9 +1101,8 @@ cdef class HieroCachingRuleFactory:
                             for f, elist in fphrases.iteritems():
                                 for e, alslist in elist.iteritems():
                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
-                                    locs = tuple(itertools.chain(alslist.itervalues()))
-                                    # count = len(locs) # Should be?
-                                    count = len(max_locs) # Was
+                                    locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
+                                    count = len(locs)
                                     scores = self.scorer.score(FeatureContext(
                                                f, e, count, fcount[f], num_samples,
                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
-- 
cgit v1.2.3


From c1b77250f656c4cff9f0e532d6b6644cb0dc993c Mon Sep 17 00:00:00 2001
From: Victor Chahuneau <vchahune@cs.cmu.edu>
Date: Thu, 6 Sep 2012 16:44:53 +0100
Subject: [cdec.sa] Fix API to make everyone happy

---
 python/src/sa/_sa.c            | 2719 ++++++++++++++++++++++------------------
 python/src/sa/data_array.pxi   |   17 +-
 python/src/sa/suffix_array.pxi |    9 -
 3 files changed, 1495 insertions(+), 1250 deletions(-)

(limited to 'python/src/sa')

diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index d1cc55c0..5507cd15 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.17 on Thu Sep  6 14:37:00 2012 */
+/* Generated by Cython 0.17 on Thu Sep  6 16:40:54 2012 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -701,8 +701,8 @@ struct __pyx_obj_3_sa_LCP {
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
- *     cdef word2id
- *     cdef id2word
+ *     cdef public word2id
+ *     cdef public id2word
  */
 struct __pyx_obj_3_sa_DataArray {
   PyObject_HEAD
@@ -837,7 +837,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -889,7 +889,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -1344,8 +1344,8 @@ static struct __pyx_vtabstruct_3_sa_StringMap *__pyx_vtabptr_3_sa_StringMap;
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
- *     cdef word2id
- *     cdef id2word
+ *     cdef public word2id
+ *     cdef public id2word
  */
 
 struct __pyx_vtabstruct_3_sa_DataArray {
@@ -2306,9 +2306,9 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
 static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
 static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word); /* proto */
-static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_8get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_10__getitem__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_12get_sentence_bounds(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
 static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
 static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
 static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_self); /* proto */
@@ -2318,9 +2318,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
 static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
 static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_f); /* proto */
 static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_7word2id___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9DataArray_7word2id_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_9DataArray_7word2id_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_7id2word___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9DataArray_7id2word_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_9DataArray_7id2word_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_3_sa_9DataArray_4data___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
 static int __pyx_pf_3_sa_9DataArray_4data_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
 static int __pyx_pf_3_sa_9DataArray_4data_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_7sent_id___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9DataArray_7sent_id_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_9DataArray_7sent_id_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_3_sa_9DataArray_10sent_index___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
+static int __pyx_pf_3_sa_9DataArray_10sent_index_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
+static int __pyx_pf_3_sa_9DataArray_10sent_index_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_link); /* proto */
 static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_sent_id); /* proto */
 static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text); /* proto */
@@ -2413,16 +2425,13 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
 static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_sa_Precomputation *__pyx_v_self, PyObject *__pyx_v_stats, struct __pyx_obj_3_sa_SuffixArray *__pyx_v_sarray); /* proto */
 static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_from_binary, PyObject *__pyx_v_from_text, PyObject *__pyx_v_side); /* proto */
 static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
-static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_12write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename); /* proto */
+static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high); /* proto */
 static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_3_sa_8TrieNode_8children___get__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self); /* proto */
 static int __pyx_pf_3_sa_8TrieNode_8children_2__set__(struct __pyx_obj_3_sa_TrieNode *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
@@ -2515,13 +2524,12 @@ static char __pyx_k_85[] = "RANK %d\tCOUNT, COST: %d    %d\tCUMUL: %d, %d";
 static char __pyx_k_86[] = "Precomputed collocations for %d patterns out of %d possible (upper bound %d)";
 static char __pyx_k_87[] = "Precomputed inverted index for %d patterns ";
 static char __pyx_k_88[] = "Precomputation took %f seconds";
-static char __pyx_k_89[] = "get_sentence_position";
-static char __pyx_k_90[] = "    Bucket sort took %f seconds";
-static char __pyx_k_91[] = "    Refining, sort depth = %d";
-static char __pyx_k_92[] = "    Refinement took %f seconds";
-static char __pyx_k_93[] = "    Finalizing sort...";
-static char __pyx_k_95[] = "Suffix array construction took %f seconds";
-static char __pyx_k_96[] = "Unexpected condition found in q3sort: sort from %d to %d";
+static char __pyx_k_89[] = "    Bucket sort took %f seconds";
+static char __pyx_k_90[] = "    Refining, sort depth = %d";
+static char __pyx_k_91[] = "    Refinement took %f seconds";
+static char __pyx_k_92[] = "    Finalizing sort...";
+static char __pyx_k_94[] = "Suffix array construction took %f seconds";
+static char __pyx_k_95[] = "Unexpected condition found in q3sort: sort from %d to %d";
 static char __pyx_k__0[] = "0";
 static char __pyx_k__1[] = "1";
 static char __pyx_k__e[] = "e";
@@ -2531,42 +2539,42 @@ static char __pyx_k__i[] = "i";
 static char __pyx_k__j[] = "j";
 static char __pyx_k__r[] = "r";
 static char __pyx_k__w[] = "w";
-static char __pyx_k_101[] = "Sampling strategy: uniform, max sample size = %d";
-static char __pyx_k_102[] = "Sampling strategy: no sampling";
-static char __pyx_k_104[] = "require_aligned_terminal";
-static char __pyx_k_105[] = "require_aligned_chunks";
-static char __pyx_k_106[] = "[X]";
-static char __pyx_k_107[] = "Must specify an alignment object";
-static char __pyx_k_109[] = "Reading precomputed data from file %s... ";
-static char __pyx_k_110[] = "Precomputation done with max nonterminals %d, decoder uses %d";
-static char __pyx_k_111[] = "Precomputation done with max terminals %d, decoder uses %d";
-static char __pyx_k_112[] = "Precomputation done with max initial size %d, decoder uses %d";
-static char __pyx_k_113[] = "Precomputation done with min gap size %d, decoder uses %d";
-static char __pyx_k_114[] = "Converting %d hash keys on precomputed inverted index... ";
-static char __pyx_k_115[] = "Converting %d hash keys on precomputed collocations... ";
-static char __pyx_k_116[] = "Processing precomputations took %f seconds";
-static char __pyx_k_117[] = "{";
-  static char __pyx_k_118[] = "(";
-static char __pyx_k_119[] = "}";
-static char __pyx_k_120[] = "get_precomputed_collocation";
-static char __pyx_k_121[] = "double binary";
-static char __pyx_k_122[] = "Keyword trie error";
-static char __pyx_k_124[] = "get_all_nodes_isteps_away";
-static char __pyx_k_125[] = "Total time for rule lookup, extraction, and scoring = %f seconds";
-static char __pyx_k_126[] = "    Extract time = %f seconds";
-static char __pyx_k_127[] = "No aligned terminals";
-static char __pyx_k_128[] = "Unaligned chunk";
-static char __pyx_k_129[] = "Gaps are not tight phrases";
-static char __pyx_k_130[] = "Inside edges of preceding subphrase are not tight";
-static char __pyx_k_131[] = "Inside edges of following subphrase are not tight";
-static char __pyx_k_132[] = "Subphrase [%d, %d] failed integrity check";
-static char __pyx_k_133[] = "Didn't extract anything from [%d, %d] -> [%d, %d]";
-static char __pyx_k_134[] = "Unable to extract basic phrase";
-static char __pyx_k_135[] = "%s=%s";
-static char __pyx_k_138[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/_sa.pyx";
-static char __pyx_k_139[] = "cdec.sa";
-static char __pyx_k_143[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi";
-static char __pyx_k_148[] = "*EPS*";
+static char __pyx_k_100[] = "Sampling strategy: uniform, max sample size = %d";
+static char __pyx_k_101[] = "Sampling strategy: no sampling";
+static char __pyx_k_103[] = "require_aligned_terminal";
+static char __pyx_k_104[] = "require_aligned_chunks";
+static char __pyx_k_105[] = "[X]";
+static char __pyx_k_106[] = "Must specify an alignment object";
+static char __pyx_k_108[] = "Reading precomputed data from file %s... ";
+static char __pyx_k_109[] = "Precomputation done with max nonterminals %d, decoder uses %d";
+static char __pyx_k_110[] = "Precomputation done with max terminals %d, decoder uses %d";
+static char __pyx_k_111[] = "Precomputation done with max initial size %d, decoder uses %d";
+static char __pyx_k_112[] = "Precomputation done with min gap size %d, decoder uses %d";
+static char __pyx_k_113[] = "Converting %d hash keys on precomputed inverted index... ";
+static char __pyx_k_114[] = "Converting %d hash keys on precomputed collocations... ";
+static char __pyx_k_115[] = "Processing precomputations took %f seconds";
+static char __pyx_k_116[] = "{";
+  static char __pyx_k_117[] = "(";
+static char __pyx_k_118[] = "}";
+static char __pyx_k_119[] = "get_precomputed_collocation";
+static char __pyx_k_120[] = "double binary";
+static char __pyx_k_121[] = "Keyword trie error";
+static char __pyx_k_123[] = "get_all_nodes_isteps_away";
+static char __pyx_k_124[] = "Total time for rule lookup, extraction, and scoring = %f seconds";
+static char __pyx_k_125[] = "    Extract time = %f seconds";
+static char __pyx_k_126[] = "No aligned terminals";
+static char __pyx_k_127[] = "Unaligned chunk";
+static char __pyx_k_128[] = "Gaps are not tight phrases";
+static char __pyx_k_129[] = "Inside edges of preceding subphrase are not tight";
+static char __pyx_k_130[] = "Inside edges of following subphrase are not tight";
+static char __pyx_k_131[] = "Subphrase [%d, %d] failed integrity check";
+static char __pyx_k_132[] = "Didn't extract anything from [%d, %d] -> [%d, %d]";
+static char __pyx_k_133[] = "Unable to extract basic phrase";
+static char __pyx_k_134[] = "%s=%s";
+static char __pyx_k_137[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/_sa.pyx";
+static char __pyx_k_138[] = "cdec.sa";
+static char __pyx_k_142[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi";
+static char __pyx_k_147[] = "*EPS*";
 static char __pyx_k__gc[] = "gc";
 static char __pyx_k__sa[] = "sa";
 static char __pyx_k___sa[] = "_sa";
@@ -2721,7 +2729,6 @@ static char __pyx_k__sample_size[] = "sample_size";
 static char __pyx_k__suffix_link[] = "suffix_link";
 static char __pyx_k__use_sent_id[] = "use_sent_id";
 static char __pyx_k___doquicksort[] = "_doquicksort";
-static char __pyx_k__get_sentence[] = "get_sentence";
 static char __pyx_k__gzip_or_text[] = "gzip_or_text";
 static char __pyx_k__make_lattice[] = "make_lattice";
 static char __pyx_k__min_gap_size[] = "min_gap_size";
@@ -2738,7 +2745,6 @@ static char __pyx_k__read_text_data[] = "read_text_data";
 static char __pyx_k__by_slack_factor[] = "by_slack_factor";
 static char __pyx_k__decode_sentence[] = "decode_sentence";
 static char __pyx_k__get_next_states[] = "get_next_states";
-static char __pyx_k__get_sentence_id[] = "get_sentence_id";
 static char __pyx_k__num_subpatterns[] = "num_subpatterns";
 static char __pyx_k__phrase_location[] = "phrase_location";
 static char __pyx_k__precompute_file[] = "precompute_file";
@@ -2755,11 +2761,12 @@ static char __pyx_k__max_target_length[] = "max_target_length";
 static char __pyx_k__train_min_gap_size[] = "train_min_gap_size";
 static char __pyx_k__pattern2phrase_plus[] = "pattern2phrase_plus";
 static PyObject *__pyx_kp_s_1;
+static PyObject *__pyx_kp_s_100;
 static PyObject *__pyx_kp_s_101;
-static PyObject *__pyx_kp_s_102;
+static PyObject *__pyx_n_s_103;
 static PyObject *__pyx_n_s_104;
-static PyObject *__pyx_n_s_105;
-static PyObject *__pyx_kp_s_107;
+static PyObject *__pyx_kp_s_106;
+static PyObject *__pyx_kp_s_108;
 static PyObject *__pyx_kp_s_109;
 static PyObject *__pyx_kp_s_110;
 static PyObject *__pyx_kp_s_111;
@@ -2770,11 +2777,11 @@ static PyObject *__pyx_kp_s_115;
 static PyObject *__pyx_kp_s_116;
 static PyObject *__pyx_kp_s_117;
 static PyObject *__pyx_kp_s_118;
-static PyObject *__pyx_kp_s_119;
-static PyObject *__pyx_n_s_120;
+static PyObject *__pyx_n_s_119;
+static PyObject *__pyx_kp_s_120;
 static PyObject *__pyx_kp_s_121;
-static PyObject *__pyx_kp_s_122;
-static PyObject *__pyx_n_s_124;
+static PyObject *__pyx_n_s_123;
+static PyObject *__pyx_kp_s_124;
 static PyObject *__pyx_kp_s_125;
 static PyObject *__pyx_kp_s_126;
 static PyObject *__pyx_kp_s_127;
@@ -2786,11 +2793,10 @@ static PyObject *__pyx_kp_s_131;
 static PyObject *__pyx_kp_s_132;
 static PyObject *__pyx_kp_s_133;
 static PyObject *__pyx_kp_s_134;
-static PyObject *__pyx_kp_s_135;
+static PyObject *__pyx_kp_s_137;
 static PyObject *__pyx_kp_s_138;
-static PyObject *__pyx_kp_s_139;
 static PyObject *__pyx_kp_s_14;
-static PyObject *__pyx_kp_s_143;
+static PyObject *__pyx_kp_s_142;
 static PyObject *__pyx_kp_s_18;
 static PyObject *__pyx_kp_s_2;
 static PyObject *__pyx_kp_s_21;
@@ -2833,14 +2839,13 @@ static PyObject *__pyx_kp_s_85;
 static PyObject *__pyx_kp_s_86;
 static PyObject *__pyx_kp_s_87;
 static PyObject *__pyx_kp_s_88;
-static PyObject *__pyx_n_s_89;
+static PyObject *__pyx_kp_s_89;
 static PyObject *__pyx_kp_s_9;
 static PyObject *__pyx_kp_s_90;
 static PyObject *__pyx_kp_s_91;
 static PyObject *__pyx_kp_s_92;
-static PyObject *__pyx_kp_s_93;
+static PyObject *__pyx_kp_s_94;
 static PyObject *__pyx_kp_s_95;
-static PyObject *__pyx_kp_s_96;
 static PyObject *__pyx_kp_s__0;
 static PyObject *__pyx_kp_s__1;
 static PyObject *__pyx_n_s__Counter;
@@ -2918,8 +2923,6 @@ static PyObject *__pyx_n_s__get_e_id;
 static PyObject *__pyx_n_s__get_f_id;
 static PyObject *__pyx_n_s__get_id;
 static PyObject *__pyx_n_s__get_next_states;
-static PyObject *__pyx_n_s__get_sentence;
-static PyObject *__pyx_n_s__get_sentence_id;
 static PyObject *__pyx_n_s__get_word;
 static PyObject *__pyx_n_s__getchunk;
 static PyObject *__pyx_n_s__getrusage;
@@ -3046,7 +3049,7 @@ static PyObject *__pyx_int_20;
 static PyObject *__pyx_int_1000;
 static PyObject *__pyx_int_65536;
 static PyObject *__pyx_k_41;
-static PyObject *__pyx_k_100;
+static PyObject *__pyx_k_99;
 static PyObject *__pyx_k_tuple_10;
 static PyObject *__pyx_k_tuple_11;
 static PyObject *__pyx_k_tuple_12;
@@ -3088,22 +3091,22 @@ static PyObject *__pyx_k_tuple_79;
 static PyObject *__pyx_k_tuple_80;
 static PyObject *__pyx_k_tuple_81;
 static PyObject *__pyx_k_tuple_82;
-static PyObject *__pyx_k_tuple_94;
+static PyObject *__pyx_k_tuple_93;
+static PyObject *__pyx_k_tuple_96;
 static PyObject *__pyx_k_tuple_97;
 static PyObject *__pyx_k_tuple_98;
-static PyObject *__pyx_k_tuple_99;
-static PyObject *__pyx_k_tuple_103;
-static PyObject *__pyx_k_tuple_108;
-static PyObject *__pyx_k_tuple_123;
-static PyObject *__pyx_k_tuple_136;
+static PyObject *__pyx_k_tuple_102;
+static PyObject *__pyx_k_tuple_107;
+static PyObject *__pyx_k_tuple_122;
+static PyObject *__pyx_k_tuple_135;
+static PyObject *__pyx_k_tuple_139;
 static PyObject *__pyx_k_tuple_140;
-static PyObject *__pyx_k_tuple_141;
-static PyObject *__pyx_k_tuple_144;
-static PyObject *__pyx_k_tuple_146;
-static PyObject *__pyx_k_codeobj_137;
-static PyObject *__pyx_k_codeobj_142;
-static PyObject *__pyx_k_codeobj_145;
-static PyObject *__pyx_k_codeobj_147;
+static PyObject *__pyx_k_tuple_143;
+static PyObject *__pyx_k_tuple_145;
+static PyObject *__pyx_k_codeobj_136;
+static PyObject *__pyx_k_codeobj_141;
+static PyObject *__pyx_k_codeobj_144;
+static PyObject *__pyx_k_codeobj_146;
 
 /* "_sa.pyx":5
  * import gzip
@@ -7384,7 +7387,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
  *             sent.append(self.id2word[self.data.arr[i]])
  *         return sent             # <<<<<<<<<<<<<<
  * 
- *     def get_sentence_position(self, loc):
+ *     def get_id(self, word):
  */
   __Pyx_XDECREF(__pyx_r);
   __Pyx_INCREF(((PyObject *)__pyx_v_sent));
@@ -7406,12 +7409,12 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+static PyObject *__pyx_pw_3_sa_9DataArray_9get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_9get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence_position (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_8get_sentence_position(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
+  __Pyx_RefNannySetupContext("get_id (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_8get_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_word));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
@@ -7419,73 +7422,12 @@ static PyObject *__pyx_pw_3_sa_9DataArray_9get_sentence_position(PyObject *__pyx
 /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":47
  *         return sent
  * 
- *     def get_sentence_position(self, loc):             # <<<<<<<<<<<<<<
- *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_9DataArray_8get_sentence_position(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  Py_ssize_t __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_position", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":48
- * 
- *     def get_sentence_position(self, loc):
- *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]             # <<<<<<<<<<<<<<
- * 
- *     def get_id(self, word):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_index->arr[(__pyx_v_self->sent_id->arr[__pyx_t_1])])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyNumber_Subtract(__pyx_v_loc, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_3;
-  __pyx_t_3 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.DataArray.get_sentence_position", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_11get_id(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_10get_id(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_word));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":50
- *         return loc - self.sent_index.arr[self.sent_id.arr[loc]]
- * 
  *     def get_id(self, word):             # <<<<<<<<<<<<<<
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word) {
+static PyObject *__pyx_pf_3_sa_9DataArray_8get_id(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_word) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
@@ -7497,18 +7439,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArr
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_id", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":48
  * 
  *     def get_id(self, word):
  *         if not word in self.word2id:             # <<<<<<<<<<<<<<
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_2 = (!__pyx_t_1);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":52
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":49
  *     def get_id(self, word):
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
@@ -7517,36 +7459,36 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArr
  */
     __pyx_t_3 = __pyx_v_self->id2word;
     __Pyx_INCREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (PyObject_SetItem(__pyx_v_self->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_self->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":50
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
  *         return self.word2id[word]
  * 
  */
-    __pyx_t_3 = __Pyx_PyObject_Append(__pyx_v_self->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Append(__pyx_v_self->id2word, __pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":54
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":51
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *         return self.word2id[word]             # <<<<<<<<<<<<<<
  * 
- *     def get_word(self, id):
+ *     def __getitem__(self, loc):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_3 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_3) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
@@ -7565,52 +7507,134 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10get_id(struct __pyx_obj_3_sa_DataArr
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id); /*proto*/
-static PyObject *__pyx_pw_3_sa_9DataArray_13get_word(PyObject *__pyx_v_self, PyObject *__pyx_v_id) {
+static PyObject *__pyx_pw_3_sa_9DataArray_11__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_11__getitem__(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_word (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_9DataArray_12get_word(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_id));
+  __Pyx_RefNannySetupContext("__getitem__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_10__getitem__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":56
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":53
  *         return self.word2id[word]
  * 
- *     def get_word(self, id):             # <<<<<<<<<<<<<<
- *         return self.id2word[id]
+ *     def __getitem__(self, loc):             # <<<<<<<<<<<<<<
+ *         return self.id2word[self.data.arr[loc]]
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_9DataArray_12get_word(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_id) {
+static PyObject *__pyx_pf_3_sa_9DataArray_10__getitem__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
+  Py_ssize_t __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__getitem__", 0);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":54
+ * 
+ *     def __getitem__(self, loc):
+ *         return self.id2word[self.data.arr[loc]]             # <<<<<<<<<<<<<<
+ * 
+ *     def get_sentence_bounds(self, loc):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_self->id2word, (__pyx_v_self->data->arr[__pyx_t_1]), sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("_sa.DataArray.__getitem__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_13get_sentence_bounds(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_13get_sentence_bounds(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("get_sentence_bounds (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_12get_sentence_bounds(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":56
+ *         return self.id2word[self.data.arr[loc]]
+ * 
+ *     def get_sentence_bounds(self, loc):             # <<<<<<<<<<<<<<
+ *         cdef int sid = self.sent_id.arr[loc]
+ *         return (self.sent_index.arr[sid], self.sent_index.arr[sid+1])
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_12get_sentence_bounds(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_loc) {
+  int __pyx_v_sid;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  Py_ssize_t __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_word", 0);
+  __Pyx_RefNannySetupContext("get_sentence_bounds", 0);
 
   /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":57
  * 
- *     def get_word(self, id):
- *         return self.id2word[id]             # <<<<<<<<<<<<<<
+ *     def get_sentence_bounds(self, loc):
+ *         cdef int sid = self.sent_id.arr[loc]             # <<<<<<<<<<<<<<
+ *         return (self.sent_index.arr[sid], self.sent_index.arr[sid+1])
+ * 
+ */
+  __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_v_sid = (__pyx_v_self->sent_id->arr[__pyx_t_1]);
+
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":58
+ *     def get_sentence_bounds(self, loc):
+ *         cdef int sid = self.sent_id.arr[loc]
+ *         return (self.sent_index.arr[sid], self.sent_index.arr[sid+1])             # <<<<<<<<<<<<<<
  * 
  *     def write_text(self, char* filename):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetItem(__pyx_v_self->id2word, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_self->sent_index->arr[__pyx_v_sid])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyInt_FromLong((__pyx_v_self->sent_index->arr[(__pyx_v_sid + 1)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_3);
+  __pyx_t_2 = 0;
+  __pyx_t_3 = 0;
+  __pyx_r = ((PyObject *)__pyx_t_4);
+  __pyx_t_4 = 0;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("_sa.DataArray.get_word", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_AddTraceback("_sa.DataArray.get_sentence_bounds", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -7626,7 +7650,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, P
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -7639,8 +7663,8 @@ static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":59
- *         return self.id2word[id]
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
+ *         return (self.sent_index.arr[sid], self.sent_index.arr[sid+1])
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
  *         with open(filename, "w") as f:
@@ -7671,7 +7695,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":61
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7679,9 +7703,9 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
  *                 if w_id > 1:
  */
   /*with:*/ {
-    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
@@ -7689,14 +7713,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
     PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_n_s__w));
     __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -7711,7 +7735,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":61
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":62
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             for w_id in self.data:             # <<<<<<<<<<<<<<
@@ -7722,7 +7746,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
             __pyx_t_4 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_4);
             __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
@@ -7730,23 +7754,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
             if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
               if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #endif
             } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
               if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #endif
             } else {
               __pyx_t_1 = __pyx_t_9(__pyx_t_4);
               if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -7756,47 +7780,47 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
             __pyx_v_w_id = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":62
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
  *         with open(filename, "w") as f:
  *             for w_id in self.data:
  *                 if w_id > 1:             # <<<<<<<<<<<<<<
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  */
-            __pyx_t_1 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             if (__pyx_t_10) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":64
  *             for w_id in self.data:
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))             # <<<<<<<<<<<<<<
  *                 if w_id == 1:
  *                     f.write("\n")
  */
-              __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_word); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_word); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_2);
-              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_v_w_id);
               PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_w_id);
               __Pyx_GIVEREF(__pyx_v_w_id);
-              __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_13), __pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(((PyObject *)__pyx_t_11));
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_t_11));
               __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
               __pyx_t_11 = 0;
-              __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
@@ -7805,28 +7829,28 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
             }
             __pyx_L18:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":64
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:             # <<<<<<<<<<<<<<
  *                     f.write("\n")
  * 
  */
-            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_11 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             if (__pyx_t_10) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":66
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_11 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_11);
-              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_12 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __Pyx_GOTREF(__pyx_t_12);
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
@@ -7847,7 +7871,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":61
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7856,11 +7880,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_12, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_GOTREF(__pyx_t_11);
-          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_t_4);
           PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
@@ -7873,11 +7897,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
           __Pyx_GIVEREF(__pyx_t_11);
           __pyx_t_13 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_13);
           __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_13);
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_14 = (!__pyx_t_10);
           if (__pyx_t_14) {
             __Pyx_GIVEREF(__pyx_t_4);
@@ -7885,7 +7909,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
             __Pyx_GIVEREF(__pyx_t_11);
             __Pyx_ErrRestore(__pyx_t_4, __pyx_t_12, __pyx_t_11);
             __pyx_t_4 = 0; __pyx_t_12 = 0; __pyx_t_11 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
             goto __pyx_L22;
           }
           __pyx_L22:;
@@ -7913,11 +7937,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
       if (__pyx_t_3) {
         __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_16, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
     goto __pyx_L23;
@@ -7953,7 +7977,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, Py
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_text (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -7966,7 +7990,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":67
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
  *                     f.write("\n")
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -7994,7 +8018,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":69
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8002,24 +8026,24 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
  * 
  */
   /*with:*/ {
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -8034,21 +8058,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
           __pyx_v_fp = __pyx_t_1;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":69
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":70
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:
  *             self.read_text_data(fp)             # <<<<<<<<<<<<<<
  * 
  *     def read_bitext(self, char* filename, int side):
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_v_fp);
           PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fp);
           __Pyx_GIVEREF(__pyx_v_fp);
-          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -8063,7 +8087,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":69
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8072,11 +8096,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
@@ -8089,11 +8113,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
           __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
             __Pyx_GIVEREF(__pyx_t_3);
@@ -8101,7 +8125,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
             __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
             __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
             goto __pyx_L18;
           }
           __pyx_L18:;
@@ -8129,11 +8153,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
       if (__pyx_t_4) {
         __pyx_t_7 = PyObject_Call(__pyx_t_4, __pyx_k_tuple_17, NULL);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
     goto __pyx_L19;
@@ -8187,11 +8211,11 @@ static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self,
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_bitext") < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -8199,12 +8223,12 @@ static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self,
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(values[0]); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_side = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_side == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read_bitext", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -8216,7 +8240,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self,
 }
 static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -8242,7 +8266,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(PyObject *__pyx_
   __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
   {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_9DataArray_11read_bitext_2generator6, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_9DataArray_11read_bitext_2generator6, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_cur_scope);
     __Pyx_RefNannyFinishContext();
     return (PyObject *) gen;
@@ -8279,13 +8303,13 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     return NULL;
   }
   __pyx_L3_first_run:;
-  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) { __Pyx_RaiseClosureNameError("fp"); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
   if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp)) {
     __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -8293,23 +8317,23 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -8320,12 +8344,12 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_cur_scope->__pyx_v_line = __pyx_t_4;
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_19), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_19), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_side, sizeof(int), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_5, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_side, sizeof(int), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_r = __pyx_t_4;
@@ -8345,7 +8369,7 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
     __Pyx_XGOTREF(__pyx_t_1);
     __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
     __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
-    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   PyErr_SetNone(PyExc_StopIteration);
@@ -8363,7 +8387,7 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":71
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -8399,7 +8423,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
   __Pyx_GOTREF(__pyx_cur_scope);
   __pyx_cur_scope->__pyx_v_side = __pyx_v_side;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8407,24 +8431,24 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
  *             self.read_text_data(data)
  */
   /*with:*/ {
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__gzip_or_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____exit__); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s____enter__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -8440,33 +8464,33 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
           __pyx_cur_scope->__pyx_v_fp = __pyx_t_1;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
  *             self.read_text_data(data)
  * 
  */
-          __pyx_t_1 = __pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = __pyx_pf_3_sa_9DataArray_11read_bitext_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __pyx_v_data = __pyx_t_1;
           __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":75
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)
  *             self.read_text_data(data)             # <<<<<<<<<<<<<<
  * 
  *     def read_text_data(self, data):
  */
-          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__read_text_data); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_v_data);
           PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_data);
           __Pyx_GIVEREF(__pyx_v_data);
-          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -8481,7 +8505,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8490,11 +8514,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.read_bitext", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_2, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3);
@@ -8507,11 +8531,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
           __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_10 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
             __Pyx_GIVEREF(__pyx_t_3);
@@ -8519,7 +8543,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
             __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_ErrRestore(__pyx_t_3, __pyx_t_2, __pyx_t_1);
             __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
             goto __pyx_L18;
           }
           __pyx_L18:;
@@ -8547,11 +8571,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
       if (__pyx_t_4) {
         __pyx_t_7 = PyObject_Call(__pyx_t_4, __pyx_k_tuple_20, NULL);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
     goto __pyx_L19;
@@ -8589,7 +8613,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":76
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":77
  *             self.read_text_data(data)
  * 
  *     def read_text_data(self, data):             # <<<<<<<<<<<<<<
@@ -8619,7 +8643,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_text_data", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":77
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":78
  * 
  *     def read_text_data(self, data):
  *         cdef int word_count = 0             # <<<<<<<<<<<<<<
@@ -8628,7 +8652,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
   __pyx_v_word_count = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":78
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":79
  *     def read_text_data(self, data):
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):             # <<<<<<<<<<<<<<
@@ -8641,7 +8665,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     __pyx_t_2 = __pyx_v_data; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_data); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
@@ -8649,23 +8673,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_5 = __pyx_t_4(__pyx_t_2);
       if (unlikely(!__pyx_t_5)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -8677,43 +8701,43 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     __Pyx_INCREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_line_num);
     __pyx_v_line_num = __pyx_t_1;
-    __pyx_t_5 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_1);
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":79
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":80
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))
  */
-    __pyx_t_5 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":80
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":81
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)
  *             for word in line.split():             # <<<<<<<<<<<<<<
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:
  */
-    __pyx_t_6 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetAttr(__pyx_v_line, __pyx_n_s__split); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_5 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (PyList_CheckExact(__pyx_t_5) || PyTuple_CheckExact(__pyx_t_5)) {
       __pyx_t_6 = __pyx_t_5; __Pyx_INCREF(__pyx_t_6); __pyx_t_7 = 0;
       __pyx_t_8 = NULL;
     } else {
-      __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __pyx_t_8 = Py_TYPE(__pyx_t_6)->tp_iternext;
     }
@@ -8722,23 +8746,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
       if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_6)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else {
         __pyx_t_5 = __pyx_t_8(__pyx_t_6);
         if (unlikely(!__pyx_t_5)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -8748,30 +8772,30 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
       __pyx_v_word = __pyx_t_5;
       __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":81
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":82
  *             self.sent_index.append(word_count)
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))             # <<<<<<<<<<<<<<
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  */
-      __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_id); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_word);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_word);
       __Pyx_GIVEREF(__pyx_v_word);
-      __pyx_t_10 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":82
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":83
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:             # <<<<<<<<<<<<<<
@@ -8780,21 +8804,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
       if (__pyx_v_self->use_sent_id) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":83
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":84
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *                 word_count = word_count + 1
  *             self.data.append(1)
  */
-        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
         goto __pyx_L7;
       }
       __pyx_L7:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":84
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":85
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -8805,18 +8829,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     }
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":86
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  *             self.data.append(1)             # <<<<<<<<<<<<<<
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  */
-    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":86
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":87
  *                 word_count = word_count + 1
  *             self.data.append(1)
  *             if self.use_sent_id:             # <<<<<<<<<<<<<<
@@ -8825,21 +8849,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
     if (__pyx_v_self->use_sent_id) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":87
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":88
  *             self.data.append(1)
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
  *             word_count = word_count + 1
  *         self.data.append(0)
  */
-      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_id), __pyx_v_line_num); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       goto __pyx_L8;
     }
     __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":88
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":89
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -8851,27 +8875,27 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":89
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":90
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  *         self.data.append(0)             # <<<<<<<<<<<<<<
  *         self.sent_index.append(word_count)
  * 
  */
-  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->data), __pyx_int_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":90
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":91
  *             word_count = word_count + 1
  *         self.data.append(0)
  *         self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_word_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->sent_index), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -8904,7 +8928,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -8917,7 +8941,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":93
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":94
  * 
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -8931,7 +8955,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":95
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":96
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -8940,7 +8964,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":96
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":97
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8949,7 +8973,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
  */
   ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":97
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":98
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -8964,7 +8988,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":99
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":100
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -8989,7 +9013,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":105
  *         cdef char* word
  * 
  *         self.data.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8998,7 +9022,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->read_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":105
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":106
  * 
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9007,7 +9031,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":106
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":107
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9016,7 +9040,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->read_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":108
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9025,7 +9049,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":108
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":109
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):             # <<<<<<<<<<<<<<
@@ -9036,7 +9060,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":109
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":110
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9045,7 +9069,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":110
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":111
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -9054,7 +9078,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":111
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":112
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -9063,7 +9087,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":112
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":113
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
@@ -9072,31 +9096,31 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     __pyx_t_3 = __pyx_v_self->id2word;
     __Pyx_INCREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-    if (PyObject_SetItem(__pyx_v_self->word2id, ((PyObject *)__pyx_t_5), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_self->word2id, ((PyObject *)__pyx_t_5), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":113
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":114
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
  *             free(word)
  *         if len(self.sent_id) == 0:
  */
-    __pyx_t_3 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyBytes_FromString(__pyx_v_word); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __pyx_t_5 = __Pyx_PyObject_Append(__pyx_v_self->id2word, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_Append(__pyx_v_self->id2word, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":114
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":115
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -9106,7 +9130,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     free(__pyx_v_word);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":115
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":116
  *             self.id2word.append(word)
  *             free(word)
  *         if len(self.sent_id) == 0:             # <<<<<<<<<<<<<<
@@ -9115,12 +9139,12 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   __pyx_t_5 = ((PyObject *)__pyx_v_self->sent_id);
   __Pyx_INCREF(__pyx_t_5);
-  __pyx_t_4 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_t_6 = (__pyx_t_4 == 0);
   if (__pyx_t_6) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":116
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":117
  *             free(word)
  *         if len(self.sent_id) == 0:
  *             self.use_sent_id = False             # <<<<<<<<<<<<<<
@@ -9132,7 +9156,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":118
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":119
  *             self.use_sent_id = False
  *         else:
  *             self.use_sent_id = True             # <<<<<<<<<<<<<<
@@ -9152,7 +9176,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":120
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":121
  *             self.use_sent_id = True
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -9176,7 +9200,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":124
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":125
  *         cdef int num_words
  * 
  *         self.data.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9185,7 +9209,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->write_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":125
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":126
  * 
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9194,7 +9218,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":126
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":127
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9203,7 +9227,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->write_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":127
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":128
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2             # <<<<<<<<<<<<<<
@@ -9212,11 +9236,11 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   __pyx_t_1 = __pyx_v_self->id2word;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_num_words = (__pyx_t_2 - 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":128
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":129
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9225,20 +9249,20 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":129
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":130
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:             # <<<<<<<<<<<<<<
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  */
-  __pyx_t_1 = __Pyx_PySequence_GetSlice(__pyx_v_self->id2word, 2, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PySequence_GetSlice(__pyx_v_self->id2word, 2, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
     __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
@@ -9247,23 +9271,23 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_1 = __pyx_t_4(__pyx_t_3);
       if (unlikely(!__pyx_t_1)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9273,17 +9297,17 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_v_word = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":130
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":131
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)
  */
-    __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":131
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":132
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9292,14 +9316,14 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":132
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":133
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
  * 
  *     def write_binary(self, char* filename):
  */
-    __pyx_t_6 = PyBytes_AsString(__pyx_v_word); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyBytes_AsString(__pyx_v_word); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     fwrite(((char *)__pyx_t_6), (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -9322,7 +9346,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self,
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -9335,7 +9359,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":134
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":135
  *             fwrite(<char *>word, sizeof(char), word_len, f)
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9349,7 +9373,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":137
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -9358,7 +9382,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":137
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":138
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9367,7 +9391,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
  */
   ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":138
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":139
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -9393,7 +9417,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":140
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":141
  *         fclose(f)
  * 
  *     def write_enhanced_handle(self, f):             # <<<<<<<<<<<<<<
@@ -9417,7 +9441,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":141
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":142
  * 
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:             # <<<<<<<<<<<<<<
@@ -9428,7 +9452,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_t_1 = ((PyObject *)__pyx_v_self->data); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_self->data)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -9436,23 +9460,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9462,23 +9486,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":142
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
  *         f.write("\n")
  *         for i in self.sent_index:
  */
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
@@ -9486,21 +9510,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":144
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_22), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_k_tuple_22), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":144
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":145
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_index:             # <<<<<<<<<<<<<<
@@ -9511,7 +9535,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_t_5 = ((PyObject *)__pyx_v_self->sent_index); __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_index)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_3 = Py_TYPE(__pyx_t_5)->tp_iternext;
   }
@@ -9519,23 +9543,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_5)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_5)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_1 = __pyx_t_3(__pyx_t_5);
       if (unlikely(!__pyx_t_1)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9545,23 +9569,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":145
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
  *         f.write("\n")
  *         for i in self.sent_index:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
  *         f.write("\n")
  *         for i in self.sent_id:
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_6));
-    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_6));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
     __pyx_t_6 = 0;
-    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -9569,21 +9593,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":147
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  */
-  __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_6 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_k_tuple_23), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_k_tuple_23), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":147
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":148
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_id:             # <<<<<<<<<<<<<<
@@ -9594,7 +9618,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_t_6 = ((PyObject *)__pyx_v_self->sent_id); __Pyx_INCREF(__pyx_t_6); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_6 = PyObject_GetIter(((PyObject *)__pyx_v_self->sent_id)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __pyx_t_3 = Py_TYPE(__pyx_t_6)->tp_iternext;
   }
@@ -9602,23 +9626,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_6)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_6)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_5 = __pyx_t_3(__pyx_t_6);
       if (unlikely(!__pyx_t_5)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9628,23 +9652,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":148
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
  *         f.write("\n")
  *         for i in self.sent_id:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
  *         f.write("\n")
  *         for word in self.id2word:
  */
-    __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -9652,21 +9676,21 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":150
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  */
-  __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_4 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_k_tuple_24), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_k_tuple_24), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":150
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":151
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for word in self.id2word:             # <<<<<<<<<<<<<<
@@ -9677,7 +9701,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_t_4 = __pyx_v_self->id2word; __Pyx_INCREF(__pyx_t_4); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_self->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_self->id2word); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_t_3 = Py_TYPE(__pyx_t_4)->tp_iternext;
   }
@@ -9685,23 +9709,23 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_4)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_6 = __pyx_t_3(__pyx_t_4);
       if (unlikely(!__pyx_t_6)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -9711,18 +9735,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_word = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":151
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
  *         f.write("\n")
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))             # <<<<<<<<<<<<<<
  *         f.write("\n")
  * 
  */
-    __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_1 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(__pyx_v_self->word2id, __pyx_v_word); if (!__pyx_t_1) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_word);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_word);
@@ -9730,15 +9754,15 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_25), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_25), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -9746,16 +9770,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":153
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def write_enhanced(self, char* filename):
  */
-  __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_26), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_26), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -9785,7 +9809,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_sel
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -9798,7 +9822,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":154
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
  *         f.write("\n")
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9826,16 +9850,16 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":156
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.write_enhanced_handle(self, f)
  */
   /*with:*/ {
-    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
@@ -9843,14 +9867,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
     PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_n_s__w));
     __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -9865,14 +9889,14 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":156
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":157
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.write_enhanced_handle(self, f)             # <<<<<<<<<<<<<<
  */
-          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_INCREF(((PyObject *)__pyx_v_self));
           PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
@@ -9880,7 +9904,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
           __Pyx_INCREF(__pyx_v_f);
           PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -9895,7 +9919,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":156
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -9903,11 +9927,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.DataArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_t_2);
           PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
@@ -9920,11 +9944,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
           __Pyx_GIVEREF(__pyx_t_4);
           __pyx_t_10 = PyObject_Call(__pyx_t_3, __pyx_t_8, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_11 = (!__pyx_t_9);
           if (__pyx_t_11) {
             __Pyx_GIVEREF(__pyx_t_2);
@@ -9932,7 +9956,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
             __Pyx_GIVEREF(__pyx_t_4);
             __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_4);
             __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_4 = 0; 
-            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
             goto __pyx_L18;
           }
           __pyx_L18:;
@@ -9960,11 +9984,11 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
       if (__pyx_t_3) {
         __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_28, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
     goto __pyx_L19;
@@ -9990,6 +10014,180 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_7word2id_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_7word2id_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_7word2id___get__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":10
+ * 
+ * cdef class DataArray:
+ *     cdef public word2id             # <<<<<<<<<<<<<<
+ *     cdef public id2word
+ *     cdef public IntList data
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_7word2id___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->word2id);
+  __pyx_r = __pyx_v_self->word2id;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_7word2id_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_7word2id_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_7word2id_2__set__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray_7word2id_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->word2id);
+  __Pyx_DECREF(__pyx_v_self->word2id);
+  __pyx_v_self->word2id = __pyx_v_value;
+
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_7word2id_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_7word2id_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_7word2id_4__del__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray_7word2id_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->word2id);
+  __Pyx_DECREF(__pyx_v_self->word2id);
+  __pyx_v_self->word2id = Py_None;
+
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_7id2word_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_7id2word_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_7id2word___get__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":11
+ * cdef class DataArray:
+ *     cdef public word2id
+ *     cdef public id2word             # <<<<<<<<<<<<<<
+ *     cdef public IntList data
+ *     cdef public IntList sent_id
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_7id2word___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_self->id2word);
+  __pyx_r = __pyx_v_self->id2word;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_7id2word_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_7id2word_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_7id2word_2__set__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray_7id2word_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__", 0);
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->id2word);
+  __Pyx_DECREF(__pyx_v_self->id2word);
+  __pyx_v_self->id2word = __pyx_v_value;
+
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_7id2word_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_7id2word_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_7id2word_4__del__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray_7id2word_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->id2word);
+  __Pyx_DECREF(__pyx_v_self->id2word);
+  __pyx_v_self->id2word = Py_None;
+
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 /* Python wrapper */
 static PyObject *__pyx_pw_3_sa_9DataArray_4data_1__get__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_pw_3_sa_9DataArray_4data_1__get__(PyObject *__pyx_v_self) {
@@ -10002,11 +10200,11 @@ static PyObject *__pyx_pw_3_sa_9DataArray_4data_1__get__(PyObject *__pyx_v_self)
 }
 
 /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":12
- *     cdef word2id
- *     cdef id2word
+ *     cdef public word2id
+ *     cdef public id2word
  *     cdef public IntList data             # <<<<<<<<<<<<<<
- *     cdef IntList sent_id
- *     cdef IntList sent_index
+ *     cdef public IntList sent_id
+ *     cdef public IntList sent_index
  */
 
 static PyObject *__pyx_pf_3_sa_9DataArray_4data___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
@@ -10086,6 +10284,206 @@ static int __pyx_pf_3_sa_9DataArray_4data_4__del__(struct __pyx_obj_3_sa_DataArr
   return __pyx_r;
 }
 
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_7sent_id_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_7sent_id_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_7sent_id___get__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":13
+ *     cdef public id2word
+ *     cdef public IntList data
+ *     cdef public IntList sent_id             # <<<<<<<<<<<<<<
+ *     cdef public IntList sent_index
+ *     cdef bint use_sent_id
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_7sent_id___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->sent_id));
+  __pyx_r = ((PyObject *)__pyx_v_self->sent_id);
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_7sent_id_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_7sent_id_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_7sent_id_2__set__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray_7sent_id_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__set__", 0);
+  if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->sent_id);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_id));
+  __pyx_v_self->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_value);
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.DataArray.sent_id.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_7sent_id_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_7sent_id_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_7sent_id_4__del__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray_7sent_id_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->sent_id);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_id));
+  __pyx_v_self->sent_id = ((struct __pyx_obj_3_sa_IntList *)Py_None);
+
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_3_sa_9DataArray_10sent_index_1__get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_pw_3_sa_9DataArray_10sent_index_1__get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_10sent_index___get__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":14
+ *     cdef public IntList data
+ *     cdef public IntList sent_id
+ *     cdef public IntList sent_index             # <<<<<<<<<<<<<<
+ *     cdef bint use_sent_id
+ * 
+ */
+
+static PyObject *__pyx_pf_3_sa_9DataArray_10sent_index___get__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__get__", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(((PyObject *)__pyx_v_self->sent_index));
+  __pyx_r = ((PyObject *)__pyx_v_self->sent_index);
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_10sent_index_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_10sent_index_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_10sent_index_2__set__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray_10sent_index_2__set__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self, PyObject *__pyx_v_value) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+  __Pyx_RefNannySetupContext("__set__", 0);
+  if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_INCREF(__pyx_v_value);
+  __Pyx_GIVEREF(__pyx_v_value);
+  __Pyx_GOTREF(__pyx_v_self->sent_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
+  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_value);
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("_sa.DataArray.sent_index.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static int __pyx_pw_3_sa_9DataArray_10sent_index_5__del__(PyObject *__pyx_v_self); /*proto*/
+static int __pyx_pw_3_sa_9DataArray_10sent_index_5__del__(PyObject *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
+  __pyx_r = __pyx_pf_3_sa_9DataArray_10sent_index_4__del__(((struct __pyx_obj_3_sa_DataArray *)__pyx_v_self));
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static int __pyx_pf_3_sa_9DataArray_10sent_index_4__del__(struct __pyx_obj_3_sa_DataArray *__pyx_v_self) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("__del__", 0);
+  __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(Py_None);
+  __Pyx_GOTREF(__pyx_v_self->sent_index);
+  __Pyx_DECREF(((PyObject *)__pyx_v_self->sent_index));
+  __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)Py_None);
+
+  __pyx_r = 0;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":12
+ *     cdef IntList sent_index
+ * 
+ *     cdef int link(self, int i, int j):             # <<<<<<<<<<<<<<
+ *         """Integerizes an alignment link pair"""
+ *         return i*65536 + j
+ */
+
 static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alignment *__pyx_v_self, int __pyx_v_i, int __pyx_v_j) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -32650,7 +33048,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_
  *     def __getitem__(self, i):
  *         return self.sa.arr[i]             # <<<<<<<<<<<<<<
  * 
- *     def get_sentence_id(self, i):
+ *     def read_text(self, filename, side):
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -32673,210 +33071,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_5get_sentence_id(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence_id (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_4get_sentence_id(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":23
- *         return self.sa.arr[i]
- * 
- *     def get_sentence_id(self, i):             # <<<<<<<<<<<<<<
- *         return self.darray.get_sentence_id(i)
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_4get_sentence_id(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_id", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":24
- * 
- *     def get_sentence_id(self, i):
- *         return self.darray.get_sentence_id(i)             # <<<<<<<<<<<<<<
- * 
- *     def get_sentence(self, i):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__get_sentence_id); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(__pyx_v_i);
-  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
-  __Pyx_GIVEREF(__pyx_v_i);
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_3;
-  __pyx_t_3 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.SuffixArray.get_sentence_id", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_7get_sentence(PyObject *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_6get_sentence(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_i));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":26
- *         return self.darray.get_sentence_id(i)
- * 
- *     def get_sentence(self, i):             # <<<<<<<<<<<<<<
- *         return self.darray.get_sentence(i)
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_6get_sentence(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_i) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":27
- * 
- *     def get_sentence(self, i):
- *         return self.darray.get_sentence(i)             # <<<<<<<<<<<<<<
- * 
- *     def get_sentence_position(self, loc):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__get_sentence); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(__pyx_v_i);
-  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
-  __Pyx_GIVEREF(__pyx_v_i);
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_3;
-  __pyx_t_3 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.SuffixArray.get_sentence", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_9get_sentence_position(PyObject *__pyx_v_self, PyObject *__pyx_v_loc) {
-  PyObject *__pyx_r = 0;
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("get_sentence_position (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_8get_sentence_position(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((PyObject *)__pyx_v_loc));
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":29
- *         return self.darray.get_sentence(i)
- * 
- *     def get_sentence_position(self, loc):             # <<<<<<<<<<<<<<
- *         return self.darray.get_sentence_position(loc)
- * 
- */
-
-static PyObject *__pyx_pf_3_sa_11SuffixArray_8get_sentence_position(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_loc) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("get_sentence_position", 0);
-
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":30
- * 
- *     def get_sentence_position(self, loc):
- *         return self.darray.get_sentence_position(loc)             # <<<<<<<<<<<<<<
- * 
- *     def read_text(self, filename, side):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_89); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(__pyx_v_loc);
-  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_loc);
-  __Pyx_GIVEREF(__pyx_v_loc);
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_3;
-  __pyx_t_3 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_sa.SuffixArray.get_sentence_position", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_10read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
-static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_4read_text[] = "Constructs suffix array using the algorithm\n        of Larsson & Sadahkane (1999)";
+static PyObject *__pyx_pw_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_filename = 0;
   PyObject *__pyx_v_side = 0;
   PyObject *__pyx_r = 0;
@@ -32902,11 +33099,11 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self,
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__side)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("read_text", 1, 2, 2, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("read_text", 1, 2, 2, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "read_text") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -32919,26 +33116,26 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_text(PyObject *__pyx_v_self,
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("read_text", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("read_text", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.SuffixArray.read_text", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_10read_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_4read_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_filename, __pyx_v_side);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":32
- *         return self.darray.get_sentence_position(loc)
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":23
+ *         return self.sa.arr[i]
  * 
  *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
  *         '''Constructs suffix array using the algorithm
  *         of Larsson & Sadahkane (1999)'''
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_side) {
   int __pyx_v_V;
   int __pyx_v_N;
   int __pyx_v_i;
@@ -32970,22 +33167,22 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":38
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":29
  *         cdef IntList isa, word_count
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)             # <<<<<<<<<<<<<<
  *         N = len(self.darray)
  *         V = len(self.darray.id2word)
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__from_text), __pyx_v_filename) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__side), __pyx_v_side) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__from_text), __pyx_v_filename) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__side), __pyx_v_side) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__use_sent_id), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__use_sent_id), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_DataArray)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
@@ -32994,7 +33191,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":39
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":30
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)             # <<<<<<<<<<<<<<
@@ -33003,11 +33200,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_t_2 = ((PyObject *)__pyx_v_self->darray);
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_v_N = __pyx_t_3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":40
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":31
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)
  *         V = len(self.darray.id2word)             # <<<<<<<<<<<<<<
@@ -33016,24 +33213,24 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_t_2 = __pyx_v_self->darray->id2word;
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_v_V = __pyx_t_3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":42
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":33
  *         V = len(self.darray.id2word)
  * 
  *         self.sa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
  *         self.ha = IntList(initial_len=V+1)
  * 
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
@@ -33042,20 +33239,20 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":43
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":34
  * 
  *         self.sa = IntList(initial_len=N)
  *         self.ha = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
  * 
  *         isa = IntList(initial_len=N)
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_V + 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_V + 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
@@ -33064,45 +33261,45 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":45
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":36
  *         self.ha = IntList(initial_len=V+1)
  * 
  *         isa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
  *         word_count = IntList(initial_len=V+1)
  * 
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_isa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":37
  * 
  *         isa = IntList(initial_len=N)
  *         word_count = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
  * 
  *         '''Step 1: bucket sort data'''
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_V + 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_V + 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_word_count = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":49
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":40
  * 
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -33111,7 +33308,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_v_sort_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":50
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":41
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()
  *         cdef float start_time = sort_start_time             # <<<<<<<<<<<<<<
@@ -33120,7 +33317,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_v_start_time = __pyx_v_sort_start_time;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":51
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":42
  *         cdef float sort_start_time = monitor_cpu()
  *         cdef float start_time = sort_start_time
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -33130,7 +33327,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":52
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":43
  *         cdef float start_time = sort_start_time
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
@@ -33139,7 +33336,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":53
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":44
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1             # <<<<<<<<<<<<<<
@@ -33149,7 +33346,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     (__pyx_v_word_count->arr[__pyx_v_a_i]) = ((__pyx_v_word_count->arr[__pyx_v_a_i]) + 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":55
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":46
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  *         n = 0             # <<<<<<<<<<<<<<
@@ -33158,7 +33355,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_v_n = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":56
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":47
  * 
  *         n = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -33168,7 +33365,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_5 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":57
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":48
  *         n = 0
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n             # <<<<<<<<<<<<<<
@@ -33177,7 +33374,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     (__pyx_v_self->ha->arr[__pyx_v_i]) = __pyx_v_n;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":58
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":49
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]             # <<<<<<<<<<<<<<
@@ -33186,7 +33383,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_n = (__pyx_v_n + (__pyx_v_word_count->arr[__pyx_v_i]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":59
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":50
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0             # <<<<<<<<<<<<<<
@@ -33196,7 +33393,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     (__pyx_v_word_count->arr[__pyx_v_i]) = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":61
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":52
  *             word_count.arr[i] = 0
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -33206,7 +33403,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":62
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":53
  * 
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
@@ -33215,7 +33412,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":63
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":54
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i             # <<<<<<<<<<<<<<
@@ -33224,7 +33421,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":64
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":55
  *             a_i = self.darray.data.arr[i]
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket             # <<<<<<<<<<<<<<
@@ -33233,7 +33430,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     (__pyx_v_isa->arr[__pyx_v_i]) = ((__pyx_v_self->ha->arr[(__pyx_v_a_i + 1)]) - 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":65
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":56
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1             # <<<<<<<<<<<<<<
@@ -33243,7 +33440,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     (__pyx_v_word_count->arr[__pyx_v_a_i]) = ((__pyx_v_word_count->arr[__pyx_v_a_i]) + 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":59
  * 
  *         '''Determine size of initial runs'''
  *         current_run = 0             # <<<<<<<<<<<<<<
@@ -33252,7 +33449,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_v_current_run = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":69
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":60
  *         '''Determine size of initial runs'''
  *         current_run = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -33262,7 +33459,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_5 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":70
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":61
  *         current_run = 0
  *         for i from 0 <= i < V+1:
  *             if i < V and self.ha.arr[i+1] - self.ha.arr[i] == 1:             # <<<<<<<<<<<<<<
@@ -33278,7 +33475,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     }
     if (__pyx_t_8) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":71
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":62
  *         for i from 0 <= i < V+1:
  *             if i < V and self.ha.arr[i+1] - self.ha.arr[i] == 1:
  *                 current_run = current_run + 1             # <<<<<<<<<<<<<<
@@ -33290,7 +33487,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":73
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":64
  *                 current_run = current_run + 1
  *             else:
  *                 if current_run > 0:             # <<<<<<<<<<<<<<
@@ -33300,7 +33497,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
       __pyx_t_8 = (__pyx_v_current_run > 0);
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":74
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":65
  *             else:
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run             # <<<<<<<<<<<<<<
@@ -33309,7 +33506,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
         (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":75
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":66
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run
  *                     current_run = 0             # <<<<<<<<<<<<<<
@@ -33324,35 +33521,35 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     __pyx_L11:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":77
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":68
  *                     current_run = 0
  * 
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
  * 
  *         '''Step 2: prefix-doubling sort'''
  */
-  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_90));
-  PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_90));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_90));
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_89));
+  PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_89));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_89));
   PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":80
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":71
  * 
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1             # <<<<<<<<<<<<<<
@@ -33361,7 +33558,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
   __pyx_v_h = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":81
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":72
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1
  *         while self.sa.arr[0] != -N:             # <<<<<<<<<<<<<<
@@ -33372,7 +33569,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     __pyx_t_8 = ((__pyx_v_self->sa->arr[0]) != (-__pyx_v_N));
     if (!__pyx_t_8) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":82
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":73
  *         h = 1
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -33381,35 +33578,35 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_sort_start_time = __pyx_f_3_sa_monitor_cpu();
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":83
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":74
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)             # <<<<<<<<<<<<<<
  *             i = 0
  *             skip = 0
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_9 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__debug); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__debug); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_s_91));
-    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_91));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_91));
+    __Pyx_INCREF(((PyObject *)__pyx_kp_s_90));
+    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_90));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_90));
     PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":84
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":75
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0             # <<<<<<<<<<<<<<
@@ -33418,7 +33615,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_i = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":76
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0
  *             skip = 0             # <<<<<<<<<<<<<<
@@ -33427,7 +33624,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_skip = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":86
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":77
  *             i = 0
  *             skip = 0
  *             while i < N:             # <<<<<<<<<<<<<<
@@ -33438,7 +33635,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
       __pyx_t_8 = (__pyx_v_i < __pyx_v_N);
       if (!__pyx_t_8) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":87
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":78
  *             skip = 0
  *             while i < N:
  *                 if self.sa.arr[i] < 0:             # <<<<<<<<<<<<<<
@@ -33448,7 +33645,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
       __pyx_t_8 = ((__pyx_v_self->sa->arr[__pyx_v_i]) < 0);
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":88
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":79
  *             while i < N:
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -33457,7 +33654,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
         __pyx_v_skip = (__pyx_v_skip + (__pyx_v_self->sa->arr[__pyx_v_i]));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":89
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":80
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]
  *                     i = i - self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -33469,7 +33666,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":91
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":82
  *                     i = i - self.sa.arr[i]
  *                 else:
  *                     if skip < 0:             # <<<<<<<<<<<<<<
@@ -33479,7 +33676,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
         __pyx_t_8 = (__pyx_v_skip < 0);
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":92
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":83
  *                 else:
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
@@ -33488,7 +33685,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
           (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":93
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":84
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0             # <<<<<<<<<<<<<<
@@ -33500,7 +33697,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
         }
         __pyx_L18:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":94
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":85
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]             # <<<<<<<<<<<<<<
@@ -33509,22 +33706,22 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
         __pyx_v_j = (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":95
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":86
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)             # <<<<<<<<<<<<<<
  *                     i = j+1
  *             if skip < 0:
  */
-        __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_9 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_10 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_11 = PyTuple_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = PyTuple_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_11);
         PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
@@ -33538,13 +33735,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
         __pyx_t_1 = 0;
         __pyx_t_9 = 0;
         __pyx_t_10 = 0;
-        __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":96
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":87
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1             # <<<<<<<<<<<<<<
@@ -33556,7 +33753,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
       __pyx_L17:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":97
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":88
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  *             if skip < 0:             # <<<<<<<<<<<<<<
@@ -33566,7 +33763,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     __pyx_t_8 = (__pyx_v_skip < 0);
     if (__pyx_t_8) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":98
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":89
  *                     i = j+1
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
@@ -33578,7 +33775,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     }
     __pyx_L19:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":99
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":90
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2             # <<<<<<<<<<<<<<
@@ -33587,53 +33784,53 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_h = (__pyx_v_h * 2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":100
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":91
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2
  *             logger.debug("    Refinement took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  */
-    __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
-    __pyx_t_11 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__debug); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__debug); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-    __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_sort_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_s_92));
-    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_92));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_92));
+    __Pyx_INCREF(((PyObject *)__pyx_kp_s_91));
+    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_91));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_91));
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_10);
     __Pyx_GIVEREF(__pyx_t_10);
     __pyx_t_10 = 0;
-    __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":94
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]
  */
-  __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-  __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_94), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_93), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":95
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -33643,7 +33840,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":96
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]             # <<<<<<<<<<<<<<
@@ -33652,7 +33849,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
  */
     __pyx_v_j = (__pyx_v_isa->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":106
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":97
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i             # <<<<<<<<<<<<<<
@@ -33662,29 +33859,29 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
     (__pyx_v_self->sa->arr[__pyx_v_j]) = __pyx_v_i;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":98
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))             # <<<<<<<<<<<<<<
  * 
  *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):
  */
-  __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-  __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyFloat_FromDouble((__pyx_f_3_sa_monitor_cpu() - __pyx_v_start_time)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_11);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_95));
-  PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_kp_s_95));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_95));
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_94));
+  PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_kp_s_94));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_94));
   PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_10);
   __Pyx_GIVEREF(__pyx_t_10);
   __pyx_t_10 = 0;
-  __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
@@ -33709,9 +33906,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_text(struct __pyx_obj_3_sa_S
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3_sa_11SuffixArray_12q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
-static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_3_sa_11SuffixArray_7q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_3_sa_11SuffixArray_6q3sort[] = "This is a ternary quicksort. It divides the array into\n        three partitions: items less than the pivot, items equal\n        to pivot, and items greater than pivot.    The first and last\n        of these partitions are then recursively sorted";
+static PyObject *__pyx_pw_3_sa_11SuffixArray_7q3sort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   int __pyx_v_i;
   int __pyx_v_j;
   int __pyx_v_h;
@@ -33744,17 +33941,17 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__h)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
         if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__isa)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
         if (kw_args > 0) {
@@ -33763,7 +33960,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "q3sort") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -33776,22 +33973,22 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    __pyx_v_i = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_i == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_j = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_j == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_h = __Pyx_PyInt_AsInt(values[2]); if (unlikely((__pyx_v_h == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_i = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_i == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_j = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_j == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_h = __Pyx_PyInt_AsInt(values[2]); if (unlikely((__pyx_v_h == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_isa = ((struct __pyx_obj_3_sa_IntList *)values[3]);
     __pyx_v_pad = values[4];
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("q3sort", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.SuffixArray.q3sort", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_isa), __pyx_ptype_3_sa_IntList, 1, "isa", 0))) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_12q3sort(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_i, __pyx_v_j, __pyx_v_h, __pyx_v_isa, __pyx_v_pad);
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_isa), __pyx_ptype_3_sa_IntList, 1, "isa", 0))) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_6q3sort(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_i, __pyx_v_j, __pyx_v_h, __pyx_v_isa, __pyx_v_pad);
   goto __pyx_L0;
   __pyx_L1_error:;
   __pyx_r = NULL;
@@ -33800,7 +33997,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":109
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":100
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
  * 
  *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
@@ -33808,7 +34005,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13q3sort(PyObject *__pyx_v_self, Py
  *         three partitions: items less than the pivot, items equal
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, int __pyx_v_i, int __pyx_v_j, int __pyx_v_h, struct __pyx_obj_3_sa_IntList *__pyx_v_isa, PyObject *__pyx_v_pad) {
   int __pyx_v_k;
   int __pyx_v_midpoint;
   int __pyx_v_pval;
@@ -33830,7 +34027,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("q3sort", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":116
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":107
  *         cdef int k, midpoint, pval, phead, ptail, tmp
  * 
  *         if j-i < -1:             # <<<<<<<<<<<<<<
@@ -33840,18 +34037,18 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) < -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":117
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":108
  * 
  *         if j-i < -1:
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))             # <<<<<<<<<<<<<<
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return
  */
-    __pyx_t_2 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
@@ -33859,25 +34056,25 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_2 = 0;
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_96), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_95), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    {__pyx_filename = __pyx_f[12]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[12]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":118
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":109
  *         if j-i < -1:
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))
  *         if j-i == -1:    # recursive base case -- empty interval             # <<<<<<<<<<<<<<
@@ -33887,7 +34084,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":119
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":110
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return             # <<<<<<<<<<<<<<
@@ -33901,7 +34098,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":120
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":111
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return
  *         if (j-i == 0):    # recursive base case -- singleton interval             # <<<<<<<<<<<<<<
@@ -33911,7 +34108,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":121
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":112
  *             return
  *         if (j-i == 0):    # recursive base case -- singleton interval
  *             isa.arr[self.sa.arr[i]] = i             # <<<<<<<<<<<<<<
@@ -33920,7 +34117,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
     (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]) = __pyx_v_i;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":122
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":113
  *         if (j-i == 0):    # recursive base case -- singleton interval
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1             # <<<<<<<<<<<<<<
@@ -33929,7 +34126,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
     (__pyx_v_self->sa->arr[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":123
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":114
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1
  *             return             # <<<<<<<<<<<<<<
@@ -33943,7 +34140,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":132
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":123
  *         # If the method of assigning word_id's is changed, this method
  *         # may need to be reconsidered as well.
  *         midpoint = (i+j)/2             # <<<<<<<<<<<<<<
@@ -33952,7 +34149,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_i + __pyx_v_j), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":133
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":124
  *         # may need to be reconsidered as well.
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]             # <<<<<<<<<<<<<<
@@ -33961,7 +34158,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
   __pyx_v_pval = (__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":134
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":125
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:             # <<<<<<<<<<<<<<
@@ -33971,7 +34168,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__pyx_v_i != __pyx_v_midpoint);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":135
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":126
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -33980,7 +34177,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
     __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_midpoint]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":136
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":127
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -33989,7 +34186,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
     (__pyx_v_self->sa->arr[__pyx_v_midpoint]) = (__pyx_v_self->sa->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":137
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":128
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp             # <<<<<<<<<<<<<<
@@ -34001,7 +34198,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":138
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":129
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  *         phead = i             # <<<<<<<<<<<<<<
@@ -34010,7 +34207,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
   __pyx_v_phead = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":139
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":130
  *             self.sa.arr[i] = tmp
  *         phead = i
  *         ptail = i             # <<<<<<<<<<<<<<
@@ -34019,7 +34216,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
   __pyx_v_ptail = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":143
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":134
  *         # find the three partitions.    phead marks the first element
  *         # of the middle partition, and ptail marks the last element
  *         for k from i+1 <= k < j+1:             # <<<<<<<<<<<<<<
@@ -34029,7 +34226,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_5 = (__pyx_v_j + 1);
   for (__pyx_v_k = (__pyx_v_i + 1); __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":144
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":135
  *         # of the middle partition, and ptail marks the last element
  *         for k from i+1 <= k < j+1:
  *             if isa.arr[self.sa.arr[k] + h] < pval:             # <<<<<<<<<<<<<<
@@ -34039,7 +34236,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":145
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":136
  *         for k from i+1 <= k < j+1:
  *             if isa.arr[self.sa.arr[k] + h] < pval:
  *                 if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -34049,7 +34246,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
       __pyx_t_1 = (__pyx_v_k > (__pyx_v_ptail + 1));
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":146
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":137
  *             if isa.arr[self.sa.arr[k] + h] < pval:
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
@@ -34058,7 +34255,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
         __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":147
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":138
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]             # <<<<<<<<<<<<<<
@@ -34067,7 +34264,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
         (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":148
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":139
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]             # <<<<<<<<<<<<<<
@@ -34076,7 +34273,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
         (__pyx_v_self->sa->arr[__pyx_v_k]) = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":149
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":140
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  *                     self.sa.arr[ptail+1] = tmp             # <<<<<<<<<<<<<<
@@ -34088,7 +34285,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":151
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":142
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
@@ -34097,7 +34294,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
         __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":152
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":143
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]             # <<<<<<<<<<<<<<
@@ -34106,7 +34303,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
         (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":153
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":144
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp             # <<<<<<<<<<<<<<
@@ -34117,7 +34314,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
       }
       __pyx_L10:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":154
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":145
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1             # <<<<<<<<<<<<<<
@@ -34126,7 +34323,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
       __pyx_v_phead = (__pyx_v_phead + 1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":155
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":146
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  *                 ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -34138,7 +34335,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":157
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":148
  *                 ptail = ptail + 1
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:             # <<<<<<<<<<<<<<
@@ -34148,7 +34345,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
       __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":158
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":149
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -34158,7 +34355,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
         __pyx_t_1 = (__pyx_v_k > (__pyx_v_ptail + 1));
         if (__pyx_t_1) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":159
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":150
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]             # <<<<<<<<<<<<<<
@@ -34167,7 +34364,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
           __pyx_v_tmp = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":160
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":151
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]             # <<<<<<<<<<<<<<
@@ -34176,7 +34373,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
  */
           (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":161
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":152
  *                         tmp = self.sa.arr[ptail+1]
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp             # <<<<<<<<<<<<<<
@@ -34188,7 +34385,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
         }
         __pyx_L12:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":162
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":153
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp
  *                     ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -34203,24 +34400,24 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     __pyx_L9:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":165
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":156
  * 
  *         # recursively sort smaller suffixes
  *         self.q3sort(i, phead-1, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
  * 
  *         # update suffixes with pivot value
  */
-  __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyInt_FromLong(__pyx_v_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_2 = PyInt_FromLong((__pyx_v_phead - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong((__pyx_v_phead - 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_6 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_7 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
-  __pyx_t_8 = PyTuple_New(5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = PyTuple_New(5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
@@ -34237,13 +34434,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_2 = 0;
   __pyx_t_6 = 0;
   __pyx_t_7 = 0;
-  __pyx_t_7 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":160
  *         # update suffixes with pivot value
  *         # corresponds to update_group function in Larsson & Sadakane
  *         for k from phead <= k < ptail+1:             # <<<<<<<<<<<<<<
@@ -34253,7 +34450,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_5 = (__pyx_v_ptail + 1);
   for (__pyx_v_k = __pyx_v_phead; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":170
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":161
  *         # corresponds to update_group function in Larsson & Sadakane
  *         for k from phead <= k < ptail+1:
  *             isa.arr[self.sa.arr[k]] = ptail             # <<<<<<<<<<<<<<
@@ -34263,7 +34460,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
     (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":162
  *         for k from phead <= k < ptail+1:
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:             # <<<<<<<<<<<<<<
@@ -34273,7 +34470,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__pyx_v_phead == __pyx_v_ptail);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":172
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":163
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1             # <<<<<<<<<<<<<<
@@ -34285,24 +34482,24 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   }
   __pyx_L15:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":175
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":166
  * 
  *         # recursively sort larger suffixes
  *         self.q3sort(ptail+1, j, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__q3sort); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
-  __pyx_t_8 = PyInt_FromLong((__pyx_v_ptail + 1)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = PyInt_FromLong((__pyx_v_ptail + 1)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_3 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromLong(__pyx_v_j); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_6 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyInt_FromLong(__pyx_v_h); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_2 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Add(__pyx_v_pad, ((PyObject *)__pyx_kp_s_48)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyTuple_New(5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_8);
   __Pyx_GIVEREF(__pyx_t_8);
@@ -34319,7 +34516,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
   __pyx_t_3 = 0;
   __pyx_t_6 = 0;
   __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -34343,14 +34540,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12q3sort(struct __pyx_obj_3_sa_Suff
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+static PyObject *__pyx_pw_3_sa_11SuffixArray_9write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_9write_text(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_text (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -34358,12 +34555,12 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_14write_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_8write_text(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":178
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":169
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -34371,7 +34568,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_text(PyObject *__pyx_v_self
  * 
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_8write_text(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -34382,23 +34579,23 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":179
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":170
  * 
  *     def write_text(self, char* filename):
  *         self.darray.write_text(filename)             # <<<<<<<<<<<<<<
  * 
  *     def read_binary(self, char* filename):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s__write_text); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -34419,14 +34616,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_text(struct __pyx_obj_3_sa_
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -34434,12 +34631,12 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_sel
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_16read_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_10read_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":181
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":172
  *         self.darray.write_text(filename)
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -34447,13 +34644,13 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_17read_binary(PyObject *__pyx_v_sel
  *         f = fopen(filename, "r")
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":174
  *     def read_binary(self, char* filename):
  *         cdef FILE *f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -34462,7 +34659,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":184
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":175
  *         cdef FILE *f
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)             # <<<<<<<<<<<<<<
@@ -34471,7 +34668,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
  */
   ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->read_handle(__pyx_v_self->darray, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":176
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)             # <<<<<<<<<<<<<<
@@ -34480,7 +34677,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->read_handle(__pyx_v_self->sa, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":186
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":177
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)             # <<<<<<<<<<<<<<
@@ -34489,7 +34686,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->read_handle(__pyx_v_self->ha, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":187
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":178
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -34505,14 +34702,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16read_binary(struct __pyx_obj_3_sa
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+static PyObject *__pyx_pw_3_sa_11SuffixArray_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_13write_binary(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -34520,12 +34717,12 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_se
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_18write_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_12write_binary(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":189
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":180
  *         fclose(f)
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -34533,13 +34730,13 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_19write_binary(PyObject *__pyx_v_se
  *         f = fopen(filename, "w")
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_12write_binary(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
   FILE *__pyx_v_f;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":191
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":182
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -34548,7 +34745,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":192
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":183
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)             # <<<<<<<<<<<<<<
@@ -34557,7 +34754,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
  */
   ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->write_handle(__pyx_v_self->darray, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":193
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":184
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)             # <<<<<<<<<<<<<<
@@ -34566,7 +34763,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->write_handle(__pyx_v_self->sa, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":194
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":185
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)             # <<<<<<<<<<<<<<
@@ -34575,7 +34772,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->write_handle(__pyx_v_self->ha, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":195
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":186
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -34591,14 +34788,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_18write_binary(struct __pyx_obj_3_s
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
+static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_enhanced(PyObject *__pyx_v_self, PyObject *__pyx_arg_filename) {
   char *__pyx_v_filename;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_enhanced (wrapper)", 0);
   assert(__pyx_arg_filename); {
-    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_filename = PyBytes_AsString(__pyx_arg_filename); if (unlikely((!__pyx_v_filename) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L3_error:;
@@ -34606,12 +34803,12 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_20write_enhanced(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_14write_enhanced(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), ((char *)__pyx_v_filename));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":197
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":188
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -34619,7 +34816,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_21write_enhanced(PyObject *__pyx_v_
  *             self.darray.write_enhanced_handle(f)
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, char *__pyx_v_filename) {
   PyObject *__pyx_v_f = NULL;
   PyObject *__pyx_v_a_i = NULL;
   PyObject *__pyx_v_w_i = NULL;
@@ -34643,7 +34840,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":189
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -34651,9 +34848,9 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  *             for a_i in self.sa:
  */
   /*with:*/ {
-    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyBytes_FromString(__pyx_v_filename); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
@@ -34661,14 +34858,14 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
     PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_n_s__w));
     __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_open, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____exit__); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s____enter__); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -34683,27 +34880,27 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":199
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":190
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.darray.write_enhanced_handle(f)             # <<<<<<<<<<<<<<
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  */
-          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self->darray), __pyx_n_s_27); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_INCREF(__pyx_v_f);
           PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_f);
           __Pyx_GIVEREF(__pyx_v_f);
-          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":200
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":191
  *         with open(filename, "w") as f:
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:             # <<<<<<<<<<<<<<
@@ -34714,7 +34911,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
             __pyx_t_2 = ((PyObject *)__pyx_v_self->sa); __Pyx_INCREF(__pyx_t_2); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sa)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_self->sa)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_9 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
@@ -34722,23 +34919,23 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
             if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_2)) {
               if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_2)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #endif
             } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_2)) {
               if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #else
-              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #endif
             } else {
               __pyx_t_1 = __pyx_t_9(__pyx_t_2);
               if (unlikely(!__pyx_t_1)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -34748,23 +34945,23 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
             __pyx_v_a_i = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":201
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":192
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  *             for w_i in self.ha:
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_a_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_4));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
             __pyx_t_4 = 0;
-            __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_4);
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
@@ -34772,21 +34969,21 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":202
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":193
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_96), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_4);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":203
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":194
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  *             for w_i in self.ha:             # <<<<<<<<<<<<<<
@@ -34797,7 +34994,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
             __pyx_t_4 = ((PyObject *)__pyx_v_self->ha); __Pyx_INCREF(__pyx_t_4); __pyx_t_8 = 0;
             __pyx_t_9 = NULL;
           } else {
-            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->ha)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(((PyObject *)__pyx_v_self->ha)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_4);
             __pyx_t_9 = Py_TYPE(__pyx_t_4)->tp_iternext;
           }
@@ -34805,23 +35002,23 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
             if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_4)) {
               if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_4)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #endif
             } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_4)) {
               if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #else
-              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               #endif
             } else {
               __pyx_t_2 = __pyx_t_9(__pyx_t_4);
               if (unlikely(!__pyx_t_2)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+                  else {__pyx_filename = __pyx_f[12]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 }
                 break;
               }
@@ -34831,23 +35028,23 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
             __pyx_v_w_i = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":204
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":195
  *             f.write("\n")
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)             # <<<<<<<<<<<<<<
  *             f.write("\n")
  * 
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_v_w_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_1);
             PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -34855,16 +35052,16 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
           }
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":205
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":196
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
-          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_4 = PyObject_GetAttr(__pyx_v_f, __pyx_n_s__write); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_98), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+          __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_97), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
@@ -34879,7 +35076,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
         __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":189
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -34888,11 +35085,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
  */
         /*except:*/ {
           __Pyx_AddTraceback("_sa.SuffixArray.write_enhanced", __pyx_clineno, __pyx_lineno, __pyx_filename);
-          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_4, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_4, &__pyx_t_1) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_GOTREF(__pyx_t_4);
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_t_10);
           PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
@@ -34905,11 +35102,11 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
           __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_12 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+          if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
           __pyx_t_13 = (!__pyx_t_11);
           if (__pyx_t_13) {
             __Pyx_GIVEREF(__pyx_t_10);
@@ -34917,7 +35114,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
             __Pyx_GIVEREF(__pyx_t_1);
             __Pyx_ErrRestore(__pyx_t_10, __pyx_t_4, __pyx_t_1);
             __pyx_t_10 = 0; __pyx_t_4 = 0; __pyx_t_1 = 0; 
-            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
+            {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L9_except_error;}
             goto __pyx_L22;
           }
           __pyx_L22:;
@@ -34943,13 +35140,13 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
     }
     /*finally:*/ {
       if (__pyx_t_3) {
-        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_99, NULL);
+        __pyx_t_7 = PyObject_Call(__pyx_t_3, __pyx_k_tuple_98, NULL);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
     }
     goto __pyx_L23;
@@ -34977,7 +35174,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_20write_enhanced(struct __pyx_obj_3
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":207
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
  *             f.write("\n")
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -34992,7 +35189,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("__search_high", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":210
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":201
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -35002,7 +35199,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":211
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":202
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -35015,7 +35212,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":212
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":203
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -35024,7 +35221,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":213
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":204
  *             return high
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -35034,7 +35231,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":214
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":205
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__search_high(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
@@ -35047,7 +35244,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":216
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":207
  *             return self.__search_high(word_id, offset, midpoint+1, high)
  *         else:
  *             return self.__search_high(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
@@ -35065,7 +35262,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":218
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":209
  *             return self.__search_high(word_id, offset, low, midpoint)
  * 
  *     cdef int __search_low(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -35080,7 +35277,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("__search_low", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":221
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":212
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -35090,7 +35287,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":222
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":213
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -35103,7 +35300,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":223
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":214
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -35112,7 +35309,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":224
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":215
  *             return high
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -35122,7 +35319,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":225
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":216
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__search_low(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
@@ -35135,7 +35332,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":227
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":218
  *             return self.__search_low(word_id, offset, low, midpoint)
  *         else:
  *             return self.__search_low(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
@@ -35153,7 +35350,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":229
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":220
  *             return self.__search_low(word_id, offset, midpoint+1, high)
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):             # <<<<<<<<<<<<<<
@@ -35172,7 +35369,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get_range", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":230
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":221
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  *         return (self.__search_low(word_id, offset, low, midpoint),             # <<<<<<<<<<<<<<
@@ -35180,19 +35377,19 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":231
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":222
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  *         return (self.__search_low(word_id, offset, low, midpoint),
  *                 self.__search_high(word_id, offset, midpoint, high))             # <<<<<<<<<<<<<<
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):
  */
-  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_high(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_midpoint, __pyx_v_high)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
@@ -35218,7 +35415,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":233
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":224
  *                 self.__search_high(word_id, offset, midpoint, high))
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -35239,7 +35436,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__lookup_helper", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":236
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":227
  *         cdef int midpoint
  * 
  *         if offset == 0:             # <<<<<<<<<<<<<<
@@ -35249,7 +35446,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = (__pyx_v_offset == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":237
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":228
  * 
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])             # <<<<<<<<<<<<<<
@@ -35257,11 +35454,11 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return None
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->ha->arr[__pyx_v_word_id])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_self->ha->arr[__pyx_v_word_id])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->ha->arr[(__pyx_v_word_id + 1)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_self->ha->arr[(__pyx_v_word_id + 1)])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
@@ -35276,7 +35473,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":238
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":229
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -35286,7 +35483,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":239
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":230
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])
  *         if low >= high:
  *             return None             # <<<<<<<<<<<<<<
@@ -35301,7 +35498,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":241
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":232
  *             return None
  * 
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -35310,7 +35507,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":242
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":233
  * 
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -35320,7 +35517,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":243
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":234
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__get_range(word_id, offset, low, high, midpoint)             # <<<<<<<<<<<<<<
@@ -35328,7 +35525,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___get_range(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_high, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -35337,7 +35534,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":244
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":235
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__get_range(word_id, offset, low, high, midpoint)
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] > word_id:             # <<<<<<<<<<<<<<
@@ -35347,7 +35544,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) > __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":245
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":236
  *             return self.__get_range(word_id, offset, low, high, midpoint)
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] > word_id:
  *             return self.__lookup_helper(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
@@ -35355,7 +35552,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -35364,7 +35561,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":247
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":238
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  *         else:
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
@@ -35372,7 +35569,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  *     def lookup(self, word, int offset, int low, int high):
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, (__pyx_v_midpoint + 1), __pyx_v_high); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -35395,8 +35592,8 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
 }
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_3_sa_11SuffixArray_17lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_3_sa_11SuffixArray_17lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_word = 0;
   int __pyx_v_offset;
   int __pyx_v_low;
@@ -35426,21 +35623,21 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, Py
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__offset)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 1); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__low)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 2); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
         if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__high)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, 3); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lookup") < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -35451,24 +35648,24 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, Py
       values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
     }
     __pyx_v_word = values[0];
-    __pyx_v_offset = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_offset == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_low = __Pyx_PyInt_AsInt(values[2]); if (unlikely((__pyx_v_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_high = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_offset = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_offset == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_low = __Pyx_PyInt_AsInt(values[2]); if (unlikely((__pyx_v_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_high = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("lookup", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[12]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.SuffixArray.lookup", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  __pyx_r = __pyx_pf_3_sa_11SuffixArray_22lookup(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_word, __pyx_v_offset, __pyx_v_low, __pyx_v_high);
+  __pyx_r = __pyx_pf_3_sa_11SuffixArray_16lookup(((struct __pyx_obj_3_sa_SuffixArray *)__pyx_v_self), __pyx_v_word, __pyx_v_offset, __pyx_v_low, __pyx_v_high);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":249
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":240
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
  * 
  *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -35476,7 +35673,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_23lookup(PyObject *__pyx_v_self, Py
  *         if low == -1:
  */
 
-static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high) {
+static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_SuffixArray *__pyx_v_self, PyObject *__pyx_v_word, int __pyx_v_offset, int __pyx_v_low, int __pyx_v_high) {
   PyObject *__pyx_v_word_id = NULL;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -35489,7 +35686,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lookup", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":251
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":242
  *     def lookup(self, word, int offset, int low, int high):
  *         cdef int wordid
  *         if low == -1:             # <<<<<<<<<<<<<<
@@ -35499,7 +35696,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__pyx_v_low == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":252
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":243
  *         cdef int wordid
  *         if low == -1:
  *             low = 0             # <<<<<<<<<<<<<<
@@ -35511,7 +35708,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":253
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":244
  *         if low == -1:
  *             low = 0
  *         if high == -1:             # <<<<<<<<<<<<<<
@@ -35521,7 +35718,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__pyx_v_high == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":254
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":245
  *             low = 0
  *         if high == -1:
  *             high = len(self.sa)             # <<<<<<<<<<<<<<
@@ -35530,36 +35727,36 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
  */
     __pyx_t_2 = ((PyObject *)__pyx_v_self->sa);
     __Pyx_INCREF(__pyx_t_2);
-    __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_v_high = __pyx_t_3;
     goto __pyx_L4;
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":255
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":246
  *         if high == -1:
  *             high = len(self.sa)
  *         if word in self.darray.word2id:             # <<<<<<<<<<<<<<
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->darray->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->darray->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":256
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":247
  *             high = len(self.sa)
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]             # <<<<<<<<<<<<<<
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->darray->word2id, __pyx_v_word); if (!__pyx_t_2) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_word_id = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":257
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":248
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)             # <<<<<<<<<<<<<<
@@ -35567,8 +35764,8 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
  *             return None
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___lookup_helper(__pyx_v_self, __pyx_t_4, __pyx_v_offset, __pyx_v_low, __pyx_v_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_r = __pyx_t_2;
     __pyx_t_2 = 0;
@@ -35577,7 +35774,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_22lookup(struct __pyx_obj_3_sa_Suff
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":259
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":250
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  *             return None             # <<<<<<<<<<<<<<
@@ -36146,7 +36343,7 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
   {
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
     PyObject* values[1] = {0};
-    values[0] = __pyx_k_100;
+    values[0] = __pyx_k_99;
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -36893,9 +37090,9 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_s_101));
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_101));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_101));
+    __Pyx_INCREF(((PyObject *)__pyx_kp_s_100));
+    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_100));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_100));
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
@@ -36920,7 +37117,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
     __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_103), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_102), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -37708,7 +37905,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_104,&__pyx_n_s_105,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_103,&__pyx_n_s_104,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
     PyObject* values[21] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
     /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":273
@@ -37841,12 +38038,12 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
         }
         case 13:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_104);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_103);
           if (value) { values[13] = value; kw_args--; }
         }
         case 14:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_105);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_104);
           if (value) { values[14] = value; kw_args--; }
         }
         case 15:
@@ -37927,7 +38124,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
     if (values[2]) {
       __pyx_v_category = PyBytes_AsString(values[2]); if (unlikely((!__pyx_v_category) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
-      __pyx_v_category = ((char *)__pyx_k_106);
+      __pyx_v_category = ((char *)__pyx_k_105);
     }
     __pyx_v_max_chunks = values[3];
     if (values[4]) {
@@ -38152,7 +38349,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  *         self.alignment = alignment
  * 
  */
-    __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_108), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_107), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -39568,9 +39765,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_s_109));
-    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_109));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_109));
+    __Pyx_INCREF(((PyObject *)__pyx_kp_s_108));
+    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_108));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_108));
     __Pyx_INCREF(__pyx_v_self->precompute_file);
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->precompute_file);
     __Pyx_GIVEREF(__pyx_v_self->precompute_file);
@@ -39624,9 +39821,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
-      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_s_110));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_110));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_109));
+      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_s_109));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_109));
       PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3);
@@ -39670,9 +39867,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_111));
-      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_111));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_111));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
+      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_110));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_110));
       PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
       __Pyx_GIVEREF(__pyx_t_3);
       PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_4);
@@ -39717,7 +39914,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_4 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_112), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_111), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -39764,7 +39961,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_2 = 0;
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_113), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_112), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -39811,9 +40008,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_114));
-      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_114));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_114));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_113));
+      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_113));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_113));
       PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
@@ -39965,9 +40162,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
-      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_115));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_115));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_114));
+      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_114));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_114));
       PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
@@ -40071,9 +40268,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_s_116));
-    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_116));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_116));
+    __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
+    PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_115));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_115));
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
@@ -42793,8 +42990,8 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
  *         i = 0
  *         while i < loc.arr_high:
  */
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_117));
-  __pyx_v_result = ((PyObject *)__pyx_kp_s_117);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_116));
+  __pyx_v_result = ((PyObject *)__pyx_kp_s_116);
 
   /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":811
  *         cdef int i, j
@@ -42823,7 +43020,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  */
-    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_118)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_117)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_v_result);
     __pyx_v_result = __pyx_t_2;
@@ -42889,7 +43086,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
  *         return result
  * 
  */
-  __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_119)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_118)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_v_result);
   __pyx_v_result = __pyx_t_2;
@@ -43006,7 +43203,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
  *         if result is not None:
  *             intersect_method = "precomputed"
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_120); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_119); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
@@ -43084,9 +43281,9 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  */
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_121));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_120));
       __Pyx_XDECREF(__pyx_v_intersect_method);
-      __pyx_v_intersect_method = ((PyObject *)__pyx_kp_s_121);
+      __pyx_v_intersect_method = ((PyObject *)__pyx_kp_s_120);
       goto __pyx_L5;
     }
     /*else*/ {
@@ -46783,7 +46980,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-            __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_123), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_122), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_Raise(__pyx_t_3, 0, 0, 0);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -48599,7 +48796,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  */
-            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_124); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_123); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
@@ -48863,9 +49060,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_125));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_124));
+  PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_124));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_124));
   PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_13);
   __Pyx_GIVEREF(__pyx_t_13);
   __pyx_t_13 = 0;
@@ -48908,9 +49105,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_GOTREF(__pyx_t_13);
   __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_126));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_126));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_126));
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_125));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_13);
   __Pyx_GIVEREF(__pyx_t_13);
   __pyx_t_13 = 0;
@@ -52078,9 +52275,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  */
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_127));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_126));
       __Pyx_DECREF(__pyx_v_reason_for_failure);
-      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_127);
+      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_126);
 
       /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1496
  *             if num_aligned_chunks == 0:
@@ -52116,9 +52313,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                 met_constraints = 0
  * 
  */
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_128));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_127));
       __Pyx_DECREF(__pyx_v_reason_for_failure);
-      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
+      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_127);
 
       /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1499
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
@@ -52176,9 +52373,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                     met_constraints = 0
  *                     break
  */
-        __Pyx_INCREF(((PyObject *)__pyx_kp_s_129));
+        __Pyx_INCREF(((PyObject *)__pyx_kp_s_128));
         __Pyx_DECREF(__pyx_v_reason_for_failure);
-        __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_129);
+        __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
         /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1506
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
@@ -52218,9 +52415,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                     met_constraints = 0
  *                     break
  */
-        __Pyx_INCREF(((PyObject *)__pyx_kp_s_129));
+        __Pyx_INCREF(((PyObject *)__pyx_kp_s_128));
         __Pyx_DECREF(__pyx_v_reason_for_failure);
-        __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_129);
+        __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
         /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1510
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
@@ -52432,9 +52629,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                 else:
  *                     gap_start = 1
  */
-            __Pyx_INCREF(((PyObject *)__pyx_kp_s_130));
+            __Pyx_INCREF(((PyObject *)__pyx_kp_s_129));
             __Pyx_DECREF(__pyx_v_reason_for_failure);
-            __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_130);
+            __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_129);
             goto __pyx_L38;
           }
           __pyx_L38:;
@@ -52630,9 +52827,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:
  */
-            __Pyx_INCREF(((PyObject *)__pyx_kp_s_131));
+            __Pyx_INCREF(((PyObject *)__pyx_kp_s_130));
             __Pyx_DECREF(__pyx_v_reason_for_failure);
-            __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_131);
+            __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_130);
             goto __pyx_L45;
           }
           __pyx_L45:;
@@ -52750,7 +52947,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_10 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_131), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
@@ -53066,7 +53263,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
             __pyx_t_14 = 0;
-            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_133), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_14));
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
@@ -55284,9 +55481,9 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  * 
  *         free(sent_links)
  */
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_134));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_133));
       __Pyx_DECREF(__pyx_v_reason_for_failure);
-      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_134);
+      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_133);
     }
     __pyx_L34:;
     goto __pyx_L33;
@@ -55887,7 +56084,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator12(__pyx_Gener
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_cur_scope->__pyx_v_feat = __pyx_t_4;
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_135), __pyx_cur_scope->__pyx_v_feat); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_134), __pyx_cur_scope->__pyx_v_feat); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __pyx_r = ((PyObject *)__pyx_t_4);
     __pyx_t_4 = 0;
@@ -57617,6 +57814,39 @@ static int __pyx_tp_clear_3_sa_DataArray(PyObject *o) {
   Py_XDECREF(tmp);
   return 0;
 }
+static PyObject *__pyx_sq_item_3_sa_DataArray(PyObject *o, Py_ssize_t i) {
+  PyObject *r;
+  PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;
+  r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);
+  Py_DECREF(x);
+  return r;
+}
+
+static PyObject *__pyx_getprop_3_sa_9DataArray_word2id(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9DataArray_7word2id_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_9DataArray_word2id(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_9DataArray_7word2id_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_3_sa_9DataArray_7word2id_5__del__(o);
+  }
+}
+
+static PyObject *__pyx_getprop_3_sa_9DataArray_id2word(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9DataArray_7id2word_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_9DataArray_id2word(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_9DataArray_7id2word_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_3_sa_9DataArray_7id2word_5__del__(o);
+  }
+}
 
 static PyObject *__pyx_getprop_3_sa_9DataArray_data(PyObject *o, CYTHON_UNUSED void *x) {
   return __pyx_pw_3_sa_9DataArray_4data_1__get__(o);
@@ -57631,12 +57861,37 @@ static int __pyx_setprop_3_sa_9DataArray_data(PyObject *o, PyObject *v, CYTHON_U
   }
 }
 
+static PyObject *__pyx_getprop_3_sa_9DataArray_sent_id(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9DataArray_7sent_id_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_9DataArray_sent_id(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_9DataArray_7sent_id_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_3_sa_9DataArray_7sent_id_5__del__(o);
+  }
+}
+
+static PyObject *__pyx_getprop_3_sa_9DataArray_sent_index(PyObject *o, CYTHON_UNUSED void *x) {
+  return __pyx_pw_3_sa_9DataArray_10sent_index_1__get__(o);
+}
+
+static int __pyx_setprop_3_sa_9DataArray_sent_index(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
+  if (v) {
+    return __pyx_pw_3_sa_9DataArray_10sent_index_3__set__(o, v);
+  }
+  else {
+    return __pyx_pw_3_sa_9DataArray_10sent_index_5__del__(o);
+  }
+}
+
 static PyMethodDef __pyx_methods_3_sa_DataArray[] = {
   {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_5get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pw_3_sa_9DataArray_7get_sentence, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pw_3_sa_9DataArray_9get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_11get_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_word"), (PyCFunction)__pyx_pw_3_sa_9DataArray_13get_word, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_id"), (PyCFunction)__pyx_pw_3_sa_9DataArray_9get_id, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("get_sentence_bounds"), (PyCFunction)__pyx_pw_3_sa_9DataArray_13get_sentence_bounds, METH_O, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_9DataArray_17read_text, METH_O, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("read_bitext"), (PyCFunction)__pyx_pw_3_sa_9DataArray_19read_bitext, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
@@ -57649,7 +57904,11 @@ static PyMethodDef __pyx_methods_3_sa_DataArray[] = {
 };
 
 static struct PyGetSetDef __pyx_getsets_3_sa_DataArray[] = {
+  {(char *)"word2id", __pyx_getprop_3_sa_9DataArray_word2id, __pyx_setprop_3_sa_9DataArray_word2id, 0, 0},
+  {(char *)"id2word", __pyx_getprop_3_sa_9DataArray_id2word, __pyx_setprop_3_sa_9DataArray_id2word, 0, 0},
   {(char *)"data", __pyx_getprop_3_sa_9DataArray_data, __pyx_setprop_3_sa_9DataArray_data, 0, 0},
+  {(char *)"sent_id", __pyx_getprop_3_sa_9DataArray_sent_id, __pyx_setprop_3_sa_9DataArray_sent_id, 0, 0},
+  {(char *)"sent_index", __pyx_getprop_3_sa_9DataArray_sent_index, __pyx_setprop_3_sa_9DataArray_sent_index, 0, 0},
   {0, 0, 0, 0, 0}
 };
 
@@ -57715,7 +57974,7 @@ static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
   __pyx_pw_3_sa_9DataArray_3__len__, /*sq_length*/
   0, /*sq_concat*/
   0, /*sq_repeat*/
-  0, /*sq_item*/
+  __pyx_sq_item_3_sa_DataArray, /*sq_item*/
   0, /*sq_slice*/
   0, /*sq_ass_item*/
   0, /*sq_ass_slice*/
@@ -57726,7 +57985,7 @@ static PySequenceMethods __pyx_tp_as_sequence_DataArray = {
 
 static PyMappingMethods __pyx_tp_as_mapping_DataArray = {
   __pyx_pw_3_sa_9DataArray_3__len__, /*mp_length*/
-  0, /*mp_subscript*/
+  __pyx_pw_3_sa_9DataArray_11__getitem__, /*mp_subscript*/
   0, /*mp_ass_subscript*/
 };
 
@@ -59881,16 +60140,13 @@ static PyObject *__pyx_sq_item_3_sa_SuffixArray(PyObject *o, Py_ssize_t i) {
 }
 
 static PyMethodDef __pyx_methods_3_sa_SuffixArray[] = {
-  {__Pyx_NAMESTR("get_sentence_id"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_5get_sentence_id, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_7get_sentence, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("get_sentence_position"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_9get_sentence_position, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_11read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_10read_text)},
-  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_13q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_12q3sort)},
-  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_15write_text, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_17read_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_19write_binary, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_21write_enhanced, METH_O, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_23lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_5read_text, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_4read_text)},
+  {__Pyx_NAMESTR("q3sort"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_7q3sort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_11SuffixArray_6q3sort)},
+  {__Pyx_NAMESTR("write_text"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_9write_text, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("read_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_11read_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_binary"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_13write_binary, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("write_enhanced"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_15write_enhanced, METH_O, __Pyx_DOCSTR(0)},
+  {__Pyx_NAMESTR("lookup"), (PyCFunction)__pyx_pw_3_sa_11SuffixArray_17lookup, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
 };
 
@@ -65928,11 +66184,12 @@ static struct PyModuleDef __pyx_moduledef = {
 
 static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},
+  {&__pyx_kp_s_100, __pyx_k_100, sizeof(__pyx_k_100), 0, 0, 1, 0},
   {&__pyx_kp_s_101, __pyx_k_101, sizeof(__pyx_k_101), 0, 0, 1, 0},
-  {&__pyx_kp_s_102, __pyx_k_102, sizeof(__pyx_k_102), 0, 0, 1, 0},
+  {&__pyx_n_s_103, __pyx_k_103, sizeof(__pyx_k_103), 0, 0, 1, 1},
   {&__pyx_n_s_104, __pyx_k_104, sizeof(__pyx_k_104), 0, 0, 1, 1},
-  {&__pyx_n_s_105, __pyx_k_105, sizeof(__pyx_k_105), 0, 0, 1, 1},
-  {&__pyx_kp_s_107, __pyx_k_107, sizeof(__pyx_k_107), 0, 0, 1, 0},
+  {&__pyx_kp_s_106, __pyx_k_106, sizeof(__pyx_k_106), 0, 0, 1, 0},
+  {&__pyx_kp_s_108, __pyx_k_108, sizeof(__pyx_k_108), 0, 0, 1, 0},
   {&__pyx_kp_s_109, __pyx_k_109, sizeof(__pyx_k_109), 0, 0, 1, 0},
   {&__pyx_kp_s_110, __pyx_k_110, sizeof(__pyx_k_110), 0, 0, 1, 0},
   {&__pyx_kp_s_111, __pyx_k_111, sizeof(__pyx_k_111), 0, 0, 1, 0},
@@ -65943,11 +66200,11 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_116, __pyx_k_116, sizeof(__pyx_k_116), 0, 0, 1, 0},
   {&__pyx_kp_s_117, __pyx_k_117, sizeof(__pyx_k_117), 0, 0, 1, 0},
   {&__pyx_kp_s_118, __pyx_k_118, sizeof(__pyx_k_118), 0, 0, 1, 0},
-  {&__pyx_kp_s_119, __pyx_k_119, sizeof(__pyx_k_119), 0, 0, 1, 0},
-  {&__pyx_n_s_120, __pyx_k_120, sizeof(__pyx_k_120), 0, 0, 1, 1},
+  {&__pyx_n_s_119, __pyx_k_119, sizeof(__pyx_k_119), 0, 0, 1, 1},
+  {&__pyx_kp_s_120, __pyx_k_120, sizeof(__pyx_k_120), 0, 0, 1, 0},
   {&__pyx_kp_s_121, __pyx_k_121, sizeof(__pyx_k_121), 0, 0, 1, 0},
-  {&__pyx_kp_s_122, __pyx_k_122, sizeof(__pyx_k_122), 0, 0, 1, 0},
-  {&__pyx_n_s_124, __pyx_k_124, sizeof(__pyx_k_124), 0, 0, 1, 1},
+  {&__pyx_n_s_123, __pyx_k_123, sizeof(__pyx_k_123), 0, 0, 1, 1},
+  {&__pyx_kp_s_124, __pyx_k_124, sizeof(__pyx_k_124), 0, 0, 1, 0},
   {&__pyx_kp_s_125, __pyx_k_125, sizeof(__pyx_k_125), 0, 0, 1, 0},
   {&__pyx_kp_s_126, __pyx_k_126, sizeof(__pyx_k_126), 0, 0, 1, 0},
   {&__pyx_kp_s_127, __pyx_k_127, sizeof(__pyx_k_127), 0, 0, 1, 0},
@@ -65959,11 +66216,10 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_132, __pyx_k_132, sizeof(__pyx_k_132), 0, 0, 1, 0},
   {&__pyx_kp_s_133, __pyx_k_133, sizeof(__pyx_k_133), 0, 0, 1, 0},
   {&__pyx_kp_s_134, __pyx_k_134, sizeof(__pyx_k_134), 0, 0, 1, 0},
-  {&__pyx_kp_s_135, __pyx_k_135, sizeof(__pyx_k_135), 0, 0, 1, 0},
+  {&__pyx_kp_s_137, __pyx_k_137, sizeof(__pyx_k_137), 0, 0, 1, 0},
   {&__pyx_kp_s_138, __pyx_k_138, sizeof(__pyx_k_138), 0, 0, 1, 0},
-  {&__pyx_kp_s_139, __pyx_k_139, sizeof(__pyx_k_139), 0, 0, 1, 0},
   {&__pyx_kp_s_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 0, 1, 0},
-  {&__pyx_kp_s_143, __pyx_k_143, sizeof(__pyx_k_143), 0, 0, 1, 0},
+  {&__pyx_kp_s_142, __pyx_k_142, sizeof(__pyx_k_142), 0, 0, 1, 0},
   {&__pyx_kp_s_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 1, 0},
   {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
   {&__pyx_kp_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 0},
@@ -66006,14 +66262,13 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_86, __pyx_k_86, sizeof(__pyx_k_86), 0, 0, 1, 0},
   {&__pyx_kp_s_87, __pyx_k_87, sizeof(__pyx_k_87), 0, 0, 1, 0},
   {&__pyx_kp_s_88, __pyx_k_88, sizeof(__pyx_k_88), 0, 0, 1, 0},
-  {&__pyx_n_s_89, __pyx_k_89, sizeof(__pyx_k_89), 0, 0, 1, 1},
+  {&__pyx_kp_s_89, __pyx_k_89, sizeof(__pyx_k_89), 0, 0, 1, 0},
   {&__pyx_kp_s_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 0, 1, 0},
   {&__pyx_kp_s_90, __pyx_k_90, sizeof(__pyx_k_90), 0, 0, 1, 0},
   {&__pyx_kp_s_91, __pyx_k_91, sizeof(__pyx_k_91), 0, 0, 1, 0},
   {&__pyx_kp_s_92, __pyx_k_92, sizeof(__pyx_k_92), 0, 0, 1, 0},
-  {&__pyx_kp_s_93, __pyx_k_93, sizeof(__pyx_k_93), 0, 0, 1, 0},
+  {&__pyx_kp_s_94, __pyx_k_94, sizeof(__pyx_k_94), 0, 0, 1, 0},
   {&__pyx_kp_s_95, __pyx_k_95, sizeof(__pyx_k_95), 0, 0, 1, 0},
-  {&__pyx_kp_s_96, __pyx_k_96, sizeof(__pyx_k_96), 0, 0, 1, 0},
   {&__pyx_kp_s__0, __pyx_k__0, sizeof(__pyx_k__0), 0, 0, 1, 0},
   {&__pyx_kp_s__1, __pyx_k__1, sizeof(__pyx_k__1), 0, 0, 1, 0},
   {&__pyx_n_s__Counter, __pyx_k__Counter, sizeof(__pyx_k__Counter), 0, 0, 1, 1},
@@ -66091,8 +66346,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__get_f_id, __pyx_k__get_f_id, sizeof(__pyx_k__get_f_id), 0, 0, 1, 1},
   {&__pyx_n_s__get_id, __pyx_k__get_id, sizeof(__pyx_k__get_id), 0, 0, 1, 1},
   {&__pyx_n_s__get_next_states, __pyx_k__get_next_states, sizeof(__pyx_k__get_next_states), 0, 0, 1, 1},
-  {&__pyx_n_s__get_sentence, __pyx_k__get_sentence, sizeof(__pyx_k__get_sentence), 0, 0, 1, 1},
-  {&__pyx_n_s__get_sentence_id, __pyx_k__get_sentence_id, sizeof(__pyx_k__get_sentence_id), 0, 0, 1, 1},
   {&__pyx_n_s__get_word, __pyx_k__get_word, sizeof(__pyx_k__get_word), 0, 0, 1, 1},
   {&__pyx_n_s__getchunk, __pyx_k__getchunk, sizeof(__pyx_k__getchunk), 0, 0, 1, 1},
   {&__pyx_n_s__getrusage, __pyx_k__getrusage, sizeof(__pyx_k__getrusage), 0, 0, 1, 1},
@@ -66215,7 +66468,7 @@ static int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_IndexError = __Pyx_GetName(__pyx_b, __pyx_n_s__IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_TypeError = __Pyx_GetName(__pyx_b, __pyx_n_s__TypeError); if (!__pyx_builtin_TypeError) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_enumerate = __Pyx_GetName(__pyx_b, __pyx_n_s__enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_enumerate = __Pyx_GetName(__pyx_b, __pyx_n_s__enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_map = __Pyx_GetName(__pyx_b, __pyx_n_s__map); if (!__pyx_builtin_map) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_Exception = __Pyx_GetName(__pyx_b, __pyx_n_s__Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_zip = __Pyx_GetName(__pyx_b, __pyx_n_s__zip); if (!__pyx_builtin_zip) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -66283,28 +66536,28 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":66
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def read_text(self, char* filename):
  */
-  __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_15);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":61
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             for w_id in self.data:
  *                 if w_id > 1:
  */
-  __pyx_k_tuple_16 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_16 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_16);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, Py_None);
@@ -66317,14 +66570,14 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":69
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
  *             self.read_text_data(fp)
  * 
  */
-  __pyx_k_tuple_17 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_17 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_17);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, Py_None);
@@ -66337,28 +66590,28 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
  *             self.read_text_data(data)
  * 
  */
-  __pyx_k_tuple_19 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_19 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_19);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_18));
   PyTuple_SET_ITEM(__pyx_k_tuple_19, 0, ((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_19));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
  *             data = (line.split(' ||| ')[side] for line in fp)
  *             self.read_text_data(data)
  */
-  __pyx_k_tuple_20 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_20 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_20)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_20);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_20, 0, Py_None);
@@ -66371,69 +66624,69 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_20));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":144
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  */
-  __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_22 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_22)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_22);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_22, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_22));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":147
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  */
-  __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_23 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_23);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_23, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_23));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":150
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  */
-  __pyx_k_tuple_24 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_24 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_24);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_24, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_24));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":153
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     def write_enhanced(self, char* filename):
  */
-  __pyx_k_tuple_26 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_26)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_26 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_26)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_26);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
   PyTuple_SET_ITEM(__pyx_k_tuple_26, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_26));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":156
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.write_enhanced_handle(self, f)
  */
-  __pyx_k_tuple_28 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_28 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_28)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_28);
   __Pyx_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_k_tuple_28, 0, Py_None);
@@ -66880,67 +67133,67 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_82));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":94
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]
  */
-  __pyx_k_tuple_94 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_94)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_94);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_93));
-  PyTuple_SET_ITEM(__pyx_k_tuple_94, 0, ((PyObject *)__pyx_kp_s_93));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_93));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_94));
+  __pyx_k_tuple_93 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_93)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_93);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_92));
+  PyTuple_SET_ITEM(__pyx_k_tuple_93, 0, ((PyObject *)__pyx_kp_s_92));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_92));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_93));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":202
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":193
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  */
-  __pyx_k_tuple_97 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_97)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_97);
+  __pyx_k_tuple_96 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_96)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_96);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
-  PyTuple_SET_ITEM(__pyx_k_tuple_97, 0, ((PyObject *)__pyx_kp_s_14));
+  PyTuple_SET_ITEM(__pyx_k_tuple_96, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_97));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_96));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":205
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":196
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):
  */
-  __pyx_k_tuple_98 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_98)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_98);
+  __pyx_k_tuple_97 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_97)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_97);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_14));
-  PyTuple_SET_ITEM(__pyx_k_tuple_98, 0, ((PyObject *)__pyx_kp_s_14));
+  PyTuple_SET_ITEM(__pyx_k_tuple_97, 0, ((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_98));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_97));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":189
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:
  */
-  __pyx_k_tuple_99 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_99)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_99);
+  __pyx_k_tuple_98 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_98)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_98);
   __Pyx_INCREF(Py_None);
-  PyTuple_SET_ITEM(__pyx_k_tuple_99, 0, Py_None);
+  PyTuple_SET_ITEM(__pyx_k_tuple_98, 0, Py_None);
   __Pyx_GIVEREF(Py_None);
   __Pyx_INCREF(Py_None);
-  PyTuple_SET_ITEM(__pyx_k_tuple_99, 1, Py_None);
+  PyTuple_SET_ITEM(__pyx_k_tuple_98, 1, Py_None);
   __Pyx_GIVEREF(Py_None);
   __Pyx_INCREF(Py_None);
-  PyTuple_SET_ITEM(__pyx_k_tuple_99, 2, Py_None);
+  PyTuple_SET_ITEM(__pyx_k_tuple_98, 2, Py_None);
   __Pyx_GIVEREF(Py_None);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_99));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_98));
 
   /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":107
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
@@ -66949,12 +67202,12 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  *     def sample(self, PhraseLocation phrase_location):
  */
-  __pyx_k_tuple_103 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_103)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_103);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_102));
-  PyTuple_SET_ITEM(__pyx_k_tuple_103, 0, ((PyObject *)__pyx_kp_s_102));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_102));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_103));
+  __pyx_k_tuple_102 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_102)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_102);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_101));
+  PyTuple_SET_ITEM(__pyx_k_tuple_102, 0, ((PyObject *)__pyx_kp_s_101));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_101));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_102));
 
   /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":316
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
@@ -66963,12 +67216,12 @@ static int __Pyx_InitCachedConstants(void) {
  *         self.alignment = alignment
  * 
  */
-  __pyx_k_tuple_108 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_108)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_108);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_107));
-  PyTuple_SET_ITEM(__pyx_k_tuple_108, 0, ((PyObject *)__pyx_kp_s_107));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_107));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_108));
+  __pyx_k_tuple_107 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_107)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_107);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_106));
+  PyTuple_SET_ITEM(__pyx_k_tuple_107, 0, ((PyObject *)__pyx_kp_s_106));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_106));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_107));
 
   /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1022
  *                         else:
@@ -66977,12 +67230,12 @@ static int __Pyx_InitCachedConstants(void) {
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-  __pyx_k_tuple_123 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_123)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_123);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_122));
-  PyTuple_SET_ITEM(__pyx_k_tuple_123, 0, ((PyObject *)__pyx_kp_s_122));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_122));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_123));
+  __pyx_k_tuple_122 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_122)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_122);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_121));
+  PyTuple_SET_ITEM(__pyx_k_tuple_122, 0, ((PyObject *)__pyx_kp_s_121));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_121));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_122));
 
   /* "_sa.pyx":9
  *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
@@ -66991,16 +67244,16 @@ static int __Pyx_InitCachedConstants(void) {
  *     if filename.endswith('.gz'):
  *         return gzip.GzipFile(filename)
  */
-  __pyx_k_tuple_136 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_136)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_136);
+  __pyx_k_tuple_135 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_135)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_135);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 0, ((PyObject *)__pyx_n_s__filename));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 0, ((PyObject *)__pyx_n_s__filename));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 1, ((PyObject *)__pyx_n_s__filename));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 1, ((PyObject *)__pyx_n_s__filename));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_136));
-  __pyx_k_codeobj_137 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_136, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_138, __pyx_n_s__gzip_or_text, 9, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_137)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_135));
+  __pyx_k_codeobj_136 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_135, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_137, __pyx_n_s__gzip_or_text, 9, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_136)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "_sa.pyx":15
  *         return open(filename)
@@ -67009,12 +67262,12 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  * include "float_list.pxi"
  */
-  __pyx_k_tuple_140 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_140)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_140);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_139));
-  PyTuple_SET_ITEM(__pyx_k_tuple_140, 0, ((PyObject *)__pyx_kp_s_139));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_139));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_140));
+  __pyx_k_tuple_139 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_139)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_139);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_138));
+  PyTuple_SET_ITEM(__pyx_k_tuple_139, 0, ((PyObject *)__pyx_kp_s_138));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_138));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_139));
 
   /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":107
  *     return ALPHABET.fromstring(string, terminal)
@@ -67023,25 +67276,25 @@ static int __Pyx_InitCachedConstants(void) {
  *     word_ids = (sym_fromstring(word, True) for word in words)
  *     return tuple(((word, None, 1), ) for word in word_ids)
  */
-  __pyx_k_tuple_141 = PyTuple_New(5); if (unlikely(!__pyx_k_tuple_141)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_141);
+  __pyx_k_tuple_140 = PyTuple_New(5); if (unlikely(!__pyx_k_tuple_140)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_140);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__words));
-  PyTuple_SET_ITEM(__pyx_k_tuple_141, 0, ((PyObject *)__pyx_n_s__words));
+  PyTuple_SET_ITEM(__pyx_k_tuple_140, 0, ((PyObject *)__pyx_n_s__words));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__words));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__word_ids));
-  PyTuple_SET_ITEM(__pyx_k_tuple_141, 1, ((PyObject *)__pyx_n_s__word_ids));
+  PyTuple_SET_ITEM(__pyx_k_tuple_140, 1, ((PyObject *)__pyx_n_s__word_ids));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__word_ids));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_141, 2, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_140, 2, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_141, 3, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_140, 3, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_141, 4, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_140, 4, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_141));
-  __pyx_k_codeobj_142 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_141, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_143, __pyx_n_s__make_lattice, 107, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_142)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_140));
+  __pyx_k_codeobj_141 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_140, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_142, __pyx_n_s__make_lattice, 107, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_141)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":111
  *     return tuple(((word, None, 1), ) for word in word_ids)
@@ -67050,19 +67303,19 @@ static int __Pyx_InitCachedConstants(void) {
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc
  *             for arc in node for node in lattice)
  */
-  __pyx_k_tuple_144 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_144)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_144);
+  __pyx_k_tuple_143 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_143)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_143);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__lattice));
-  PyTuple_SET_ITEM(__pyx_k_tuple_144, 0, ((PyObject *)__pyx_n_s__lattice));
+  PyTuple_SET_ITEM(__pyx_k_tuple_143, 0, ((PyObject *)__pyx_n_s__lattice));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__lattice));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_144, 1, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_143, 1, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_144, 2, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_143, 2, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_144));
-  __pyx_k_codeobj_145 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_144, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_143, __pyx_n_s__decode_lattice, 111, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_145)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_143));
+  __pyx_k_codeobj_144 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_143, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_142, __pyx_n_s__decode_lattice, 111, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_144)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":115
  *             for arc in node for node in lattice)
@@ -67070,19 +67323,19 @@ static int __Pyx_InitCachedConstants(void) {
  * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
  */
-  __pyx_k_tuple_146 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_146)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_146);
+  __pyx_k_tuple_145 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_145)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_145);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__lattice));
-  PyTuple_SET_ITEM(__pyx_k_tuple_146, 0, ((PyObject *)__pyx_n_s__lattice));
+  PyTuple_SET_ITEM(__pyx_k_tuple_145, 0, ((PyObject *)__pyx_n_s__lattice));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__lattice));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_146, 1, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_145, 1, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_146, 2, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_145, 2, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_146));
-  __pyx_k_codeobj_147 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_146, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_143, __pyx_n_s__decode_sentence, 115, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_147)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_145));
+  __pyx_k_codeobj_146 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_145, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_142, __pyx_n_s__decode_sentence, 115, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_146)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -67350,9 +67603,9 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_ptype_3_sa_Scorer = &__pyx_type_3_sa_Scorer;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct____iter__) < 0) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct____iter__ = &__pyx_type_3_sa___pyx_scope_struct____iter__;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_1_read_bitext) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_1_read_bitext) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_1_read_bitext = &__pyx_type_3_sa___pyx_scope_struct_1_read_bitext;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_2_genexpr) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_2_genexpr = &__pyx_type_3_sa___pyx_scope_struct_2_genexpr;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_3_compute_stats) < 0) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_3_compute_stats = &__pyx_type_3_sa___pyx_scope_struct_3_compute_stats;
@@ -67448,7 +67701,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__getLogger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_140), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_139), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__logger, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -67731,7 +67984,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  * 
  * cdef class TrieNode:
  */
-  __pyx_v_3_sa_EPSILON = __pyx_f_3_sa_sym_fromstring(__pyx_k_148, 1);
+  __pyx_v_3_sa_EPSILON = __pyx_f_3_sa_sym_fromstring(__pyx_k_147, 1);
 
   /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":55
  *     cdef public int count
@@ -67742,7 +67995,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_100 = __pyx_t_1;
+  __pyx_k_99 = __pyx_t_1;
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
diff --git a/python/src/sa/data_array.pxi b/python/src/sa/data_array.pxi
index 371708c5..2a8ea921 100644
--- a/python/src/sa/data_array.pxi
+++ b/python/src/sa/data_array.pxi
@@ -7,11 +7,11 @@ from libc.stdlib cimport malloc, realloc, free
 from libc.string cimport memset, strcpy
 
 cdef class DataArray:
-    cdef word2id
-    cdef id2word
+    cdef public word2id
+    cdef public id2word
     cdef public IntList data
     cdef public IntList sent_id
-    cdef IntList sent_index
+    cdef public IntList sent_index
     cdef bint use_sent_id
 
     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):
@@ -44,17 +44,18 @@ cdef class DataArray:
             sent.append(self.id2word[self.data.arr[i]])
         return sent
 
-    def get_sentence_position(self, loc):
-        return loc - self.sent_index.arr[self.sent_id.arr[loc]]
-
     def get_id(self, word):
         if not word in self.word2id:
             self.word2id[word] = len(self.id2word)
             self.id2word.append(word)
         return self.word2id[word]
 
-    def get_word(self, id):
-        return self.id2word[id]
+    def __getitem__(self, loc):
+        return self.id2word[self.data.arr[loc]]
+
+    def get_sentence_bounds(self, loc):
+        cdef int sid = self.sent_id.arr[loc]
+        return (self.sent_index.arr[sid], self.sent_index.arr[sid+1])
 
     def write_text(self, char* filename):
         with open(filename, "w") as f:
diff --git a/python/src/sa/suffix_array.pxi b/python/src/sa/suffix_array.pxi
index baa3d546..de4adcd9 100644
--- a/python/src/sa/suffix_array.pxi
+++ b/python/src/sa/suffix_array.pxi
@@ -20,15 +20,6 @@ cdef class SuffixArray:
     def __getitem__(self, i):
         return self.sa.arr[i]
 
-    def get_sentence_id(self, i):
-        return self.darray.get_sentence_id(i)
-
-    def get_sentence(self, i):
-        return self.darray.get_sentence(i)
-
-    def get_sentence_position(self, loc):
-        return self.darray.get_sentence_position(loc)
-
     def read_text(self, filename, side):
         '''Constructs suffix array using the algorithm
         of Larsson & Sadahkane (1999)'''
-- 
cgit v1.2.3


From 1cef9b6842fec7598a0a0571f69bf4caab8e4c91 Mon Sep 17 00:00:00 2001
From: Victor Chahuneau <vchahune@cs.cmu.edu>
Date: Thu, 6 Sep 2012 17:46:41 +0100
Subject: [cdec.sa] Allow sentence annotation and initial configuration

---
 python/pkg/cdec/sa/__init__.py  |   14 +
 python/pkg/cdec/sa/extractor.py |    8 +-
 python/src/sa/_sa.c             | 4866 ++++++++++++++++++++-------------------
 python/src/sa/rulefactory.pxi   |    9 +-
 4 files changed, 2495 insertions(+), 2402 deletions(-)

(limited to 'python/src/sa')

diff --git a/python/pkg/cdec/sa/__init__.py b/python/pkg/cdec/sa/__init__.py
index d4b94484..e0a344b7 100644
--- a/python/pkg/cdec/sa/__init__.py
+++ b/python/pkg/cdec/sa/__init__.py
@@ -4,7 +4,21 @@ from cdec.sa._sa import make_lattice, decode_lattice, decode_sentence,\
 from cdec.sa.extractor import GrammarExtractor
 
 _SA_FEATURES = []
+_SA_ANNOTATORS = {}
+_SA_CONFIGURE = []
 
 def feature(fn):
     _SA_FEATURES.append(fn)
     return fn
+
+def annotator(fn):
+    _SA_ANNOTATORS[fn.__name__] = fn
+
+def annotate(sentence):
+    meta = {}
+    for name, fn in _SA_ANNOTATORS.iteritems():
+        meta[name] = fn(sentence)
+    return meta
+
+def configure(fn):
+    _SA_CONFIGURE.append(fn)
diff --git a/python/pkg/cdec/sa/extractor.py b/python/pkg/cdec/sa/extractor.py
index 94392c30..a5ce8a68 100644
--- a/python/pkg/cdec/sa/extractor.py
+++ b/python/pkg/cdec/sa/extractor.py
@@ -71,10 +71,14 @@ class GrammarExtractor:
         sampler = cdec.sa.Sampler(300, fsarray)
 
         self.factory.configure(fsarray, edarray, sampler, scorer)
+        # Initialize feature definitions with configuration
+        for fn in cdec.sa._SA_CONFIGURE:
+            fn(config)
 
     def grammar(self, sentence):
         if isinstance(sentence, unicode):
             sentence = sentence.encode('utf8')
-        words = chain(('<s>',), sentence.split(), ('</s>',))
+        words = tuple(chain(('<s>',), sentence.split(), ('</s>',)))
+        meta = cdec.sa.annotate(words)
         cnet = cdec.sa.make_lattice(words)
-        return self.factory.input(cnet)
+        return self.factory.input(cnet, meta)
diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index 5507cd15..6b6f0ef9 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.17 on Thu Sep  6 16:40:54 2012 */
+/* Generated by Cython 0.17 on Thu Sep  6 17:27:34 2012 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -481,7 +481,7 @@ struct __pyx_t_3_sa__Trie_Node {
   int arr_len;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":64
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":65
  * 
  * # linked list structure for storing matches in BaselineRuleFactory
  * cdef struct match_node:             # <<<<<<<<<<<<<<
@@ -493,7 +493,7 @@ struct __pyx_t_3_sa_match_node {
   struct __pyx_t_3_sa_match_node *next;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":160
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":161
  * 
  * # struct used to encapsulate a single matching
  * cdef struct Matching:             # <<<<<<<<<<<<<<
@@ -508,7 +508,7 @@ struct __pyx_t_3_sa_Matching {
   int size;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":216
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":217
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -854,7 +854,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":72
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":73
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -972,7 +972,7 @@ struct __pyx_obj_3_sa_BitSet {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":94
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":95
  * 
  * 
  * cdef class Sampler:             # <<<<<<<<<<<<<<
@@ -1013,7 +1013,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":34
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":35
  * cdef int EPSILON = sym_fromstring('*EPS*', True)
  * 
  * cdef class TrieNode:             # <<<<<<<<<<<<<<
@@ -1026,7 +1026,7 @@ struct __pyx_obj_3_sa_TrieNode {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":40
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":41
  *         self.children = {}
  * 
  * cdef class ExtendedTrieNode(TrieNode):             # <<<<<<<<<<<<<<
@@ -1110,10 +1110,10 @@ struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":937
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":938
  *         return sorted(result);
  * 
- *     def input(self, fwords):             # <<<<<<<<<<<<<<
+ *     def input(self, fwords, meta):             # <<<<<<<<<<<<<<
  *         '''When this function is called on the RuleFactory,
  *         it looks up all of the rules that can be used to translate
  */
@@ -1152,6 +1152,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_15_input {
   int __pyx_v_lookup_required;
   struct __pyx_t_3_sa_Matching __pyx_v_matching;
   PyObject *__pyx_v_max_locs;
+  PyObject *__pyx_v_meta;
   PyObject *__pyx_v_new_frontier;
   PyObject *__pyx_v_new_node;
   PyObject *__pyx_v_next_states;
@@ -1244,7 +1245,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct____iter__ {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":51
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":52
  * 
  * 
  * cdef class TrieTable:             # <<<<<<<<<<<<<<
@@ -1440,7 +1441,7 @@ struct __pyx_vtabstruct_3_sa_Phrase {
 static struct __pyx_vtabstruct_3_sa_Phrase *__pyx_vtabptr_3_sa_Phrase;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":72
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":73
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -1538,7 +1539,7 @@ struct __pyx_vtabstruct_3_sa_Alphabet {
 static struct __pyx_vtabstruct_3_sa_Alphabet *__pyx_vtabptr_3_sa_Alphabet;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":216
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":217
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -2471,7 +2472,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
 static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
 static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
 static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x); /* proto */
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords); /* proto */
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_meta); /* proto */
 static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
 static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self, unsigned int __pyx_v_name, float __pyx_v_value); /* proto */
 static PyObject *__pyx_pf_3_sa_13FeatureVector_4__iter__(struct __pyx_obj_3_sa_FeatureVector *__pyx_v_self); /* proto */
@@ -2599,6 +2600,7 @@ static char __pyx_k__gzip[] = "gzip";
 static char __pyx_k__high[] = "high";
 static char __pyx_k__info[] = "info";
 static char __pyx_k__join[] = "join";
+static char __pyx_k__meta[] = "meta";
 static char __pyx_k__name[] = "name";
 static char __pyx_k__open[] = "open";
 static char __pyx_k__seek[] = "seek";
@@ -2963,6 +2965,7 @@ static PyObject *__pyx_n_s__max_nonterminals;
 static PyObject *__pyx_n_s__max_target_chunks;
 static PyObject *__pyx_n_s__max_target_length;
 static PyObject *__pyx_n_s__merge;
+static PyObject *__pyx_n_s__meta;
 static PyObject *__pyx_n_s__min_dist;
 static PyObject *__pyx_n_s__min_gap_size;
 static PyObject *__pyx_n_s__name;
@@ -35813,7 +35816,7 @@ static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":37
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":38
  *     cdef public children
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -35830,14 +35833,14 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":38
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":39
  * 
  *     def __cinit__(self):
  *         self.children = {}             # <<<<<<<<<<<<<<
  * 
  * cdef class ExtendedTrieNode(TrieNode):
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __Pyx_GOTREF(__pyx_v_self->children);
@@ -35867,7 +35870,7 @@ static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":35
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":36
  * 
  * cdef class TrieNode:
  *     cdef public children             # <<<<<<<<<<<<<<
@@ -35956,7 +35959,7 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
     PyObject* values[3] = {0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":45
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":46
  *     cdef public suffix_link
  * 
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
@@ -35995,7 +35998,7 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -36012,7 +36015,7 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.ExtendedTrieNode.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -36028,7 +36031,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":46
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":47
  * 
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase             # <<<<<<<<<<<<<<
@@ -36041,7 +36044,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
   __Pyx_DECREF(__pyx_v_self->phrase);
   __pyx_v_self->phrase = __pyx_v_phrase;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":47
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":48
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location             # <<<<<<<<<<<<<<
@@ -36054,7 +36057,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
   __Pyx_DECREF(__pyx_v_self->phrase_location);
   __pyx_v_self->phrase_location = __pyx_v_phrase_location;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":48
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":49
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location
  *         self.suffix_link = suffix_link             # <<<<<<<<<<<<<<
@@ -36083,7 +36086,7 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":41
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":42
  * 
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase             # <<<<<<<<<<<<<<
@@ -36170,7 +36173,7 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyO
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":42
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":43
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase
  *     cdef public phrase_location             # <<<<<<<<<<<<<<
@@ -36257,7 +36260,7 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":43
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":44
  *     cdef public phrase
  *     cdef public phrase_location
  *     cdef public suffix_link             # <<<<<<<<<<<<<<
@@ -36361,7 +36364,7 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -36374,7 +36377,7 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.TrieTable.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -36385,7 +36388,7 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":55
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":56
  *     cdef public int count
  *     cdef public root
  *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
@@ -36404,7 +36407,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":56
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":57
  *     cdef public root
  *     def __cinit__(self, extended=False):
  *         self.count = 0             # <<<<<<<<<<<<<<
@@ -36413,34 +36416,34 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
  */
   __pyx_v_self->count = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":57
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":58
  *     def __cinit__(self, extended=False):
  *         self.count = 0
  *         self.extended = extended             # <<<<<<<<<<<<<<
  *         if extended:
  *             self.root = ExtendedTrieNode()
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_extended); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_extended); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->extended = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":58
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":59
  *         self.count = 0
  *         self.extended = extended
  *         if extended:             # <<<<<<<<<<<<<<
  *             self.root = ExtendedTrieNode()
  *         else:
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_extended); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_extended); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":59
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":60
  *         self.extended = extended
  *         if extended:
  *             self.root = ExtendedTrieNode()             # <<<<<<<<<<<<<<
  *         else:
  *             self.root = TrieNode()
  */
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __Pyx_GOTREF(__pyx_v_self->root);
@@ -36451,14 +36454,14 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":61
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":62
  *             self.root = ExtendedTrieNode()
  *         else:
  *             self.root = TrieNode()             # <<<<<<<<<<<<<<
  * 
  * # linked list structure for storing matches in BaselineRuleFactory
  */
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __Pyx_GOTREF(__pyx_v_self->root);
@@ -36490,7 +36493,7 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":52
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":53
  * 
  * cdef class TrieTable:
  *     cdef public int extended             # <<<<<<<<<<<<<<
@@ -36507,7 +36510,7 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -36544,7 +36547,7 @@ static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_Tri
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->extended = __pyx_t_1;
 
   __pyx_r = 0;
@@ -36568,7 +36571,7 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":53
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":54
  * cdef class TrieTable:
  *     cdef public int extended
  *     cdef public int count             # <<<<<<<<<<<<<<
@@ -36585,7 +36588,7 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_T
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -36622,7 +36625,7 @@ static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTa
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->count = __pyx_t_1;
 
   __pyx_r = 0;
@@ -36646,7 +36649,7 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":54
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":55
  *     cdef public int extended
  *     cdef public int count
  *     cdef public root             # <<<<<<<<<<<<<<
@@ -36722,7 +36725,7 @@ static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTab
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":81
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":82
  * 
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -36735,7 +36738,7 @@ static int __pyx_f_3_sa_14PhraseLocation_contains(CYTHON_UNUSED struct __pyx_obj
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("contains", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":82
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":83
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):
  *         return 1             # <<<<<<<<<<<<<<
@@ -36767,7 +36770,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
     PyObject* values[6] = {0,0,0,0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":85
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":86
  * 
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):             # <<<<<<<<<<<<<<
@@ -36822,7 +36825,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -36837,35 +36840,35 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
       }
     }
     if (values[0]) {
-      __pyx_v_sa_low = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sa_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_sa_low = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sa_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_sa_low = ((int)-1);
     }
     if (values[1]) {
-      __pyx_v_sa_high = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_sa_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_sa_high = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_sa_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_sa_high = ((int)-1);
     }
     if (values[2]) {
-      __pyx_v_arr_low = __Pyx_PyInt_AsInt(values[2]); if (unlikely((__pyx_v_arr_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_arr_low = __Pyx_PyInt_AsInt(values[2]); if (unlikely((__pyx_v_arr_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_arr_low = ((int)-1);
     }
     if (values[3]) {
-      __pyx_v_arr_high = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_arr_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_arr_high = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_arr_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_arr_high = ((int)-1);
     }
     __pyx_v_arr = values[4];
     if (values[5]) {
-      __pyx_v_num_subpatterns = __Pyx_PyInt_AsInt(values[5]); if (unlikely((__pyx_v_num_subpatterns == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_num_subpatterns = __Pyx_PyInt_AsInt(values[5]); if (unlikely((__pyx_v_num_subpatterns == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_num_subpatterns = ((int)1);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.PhraseLocation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -36876,7 +36879,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":84
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":85
  *         return 1
  * 
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
@@ -36892,7 +36895,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":86
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":87
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low             # <<<<<<<<<<<<<<
@@ -36901,7 +36904,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->sa_low = __pyx_v_sa_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":87
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":88
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high             # <<<<<<<<<<<<<<
@@ -36910,7 +36913,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->sa_high = __pyx_v_sa_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":88
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":89
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low             # <<<<<<<<<<<<<<
@@ -36919,7 +36922,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->arr_low = __pyx_v_arr_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":89
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":90
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high             # <<<<<<<<<<<<<<
@@ -36928,21 +36931,21 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->arr_high = __pyx_v_arr_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":90
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":91
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  *         self.arr = arr             # <<<<<<<<<<<<<<
  *         self.num_subpatterns = num_subpatterns
  * 
  */
-  if (!(likely(((__pyx_v_arr) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_arr, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_v_arr) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_arr, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_arr);
   __Pyx_GIVEREF(__pyx_v_arr);
   __Pyx_GOTREF(__pyx_v_self->arr);
   __Pyx_DECREF(((PyObject *)__pyx_v_self->arr));
   __pyx_v_self->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":91
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":92
  *         self.arr_high = arr_high
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns             # <<<<<<<<<<<<<<
@@ -36989,11 +36992,11 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -37001,18 +37004,18 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_sample_size = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sample_size == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_sample_size = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sample_size == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_fsarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.Sampler.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_3_sa_7Sampler___cinit__(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), __pyx_v_sample_size, __pyx_v_fsarray);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -37022,7 +37025,7 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":101
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":102
  *     cdef IntList sa
  * 
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
@@ -37042,7 +37045,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":102
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":103
  * 
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size             # <<<<<<<<<<<<<<
@@ -37051,7 +37054,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
  */
   __pyx_v_self->sample_size = __pyx_v_sample_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":103
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":104
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa             # <<<<<<<<<<<<<<
@@ -37064,7 +37067,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
   __pyx_v_self->sa = __pyx_v_fsarray->sa;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":104
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":105
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa
  *         if sample_size > 0:             # <<<<<<<<<<<<<<
@@ -37074,21 +37077,21 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   __pyx_t_1 = (__pyx_v_sample_size > 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":105
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":106
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)             # <<<<<<<<<<<<<<
  *         else:
  *             logger.info("Sampling strategy: no sampling")
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyInt_FromLong(__pyx_v_sample_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_sample_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_100));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_100));
@@ -37096,7 +37099,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -37105,19 +37108,19 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":107
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":108
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
  * 
  *     def sample(self, PhraseLocation phrase_location):
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_102), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_102), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -37144,7 +37147,7 @@ static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sample (wrapper)", 0);
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_3_sa_7Sampler_2sample(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location));
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -37154,7 +37157,7 @@ static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":109
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":110
  *             logger.info("Sampling strategy: no sampling")
  * 
  *     def sample(self, PhraseLocation phrase_location):             # <<<<<<<<<<<<<<
@@ -37181,19 +37184,19 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("sample", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":122
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":123
  *         cdef int num_locations, val, j
  * 
  *         sample = IntList()             # <<<<<<<<<<<<<<
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":123
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":124
  * 
  *         sample = IntList()
  *         if phrase_location.arr is None:             # <<<<<<<<<<<<<<
@@ -37203,7 +37206,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   __pyx_t_2 = (((PyObject *)__pyx_v_phrase_location->arr) == Py_None);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":124
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":125
  *         sample = IntList()
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low             # <<<<<<<<<<<<<<
@@ -37212,7 +37215,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
     __pyx_v_num_locations = (__pyx_v_phrase_location->sa_high - __pyx_v_phrase_location->sa_low);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":125
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":126
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
@@ -37228,7 +37231,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":126
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":127
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)             # <<<<<<<<<<<<<<
@@ -37240,7 +37243,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":128
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":129
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
@@ -37249,11 +37252,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
       if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":129
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":130
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low             # <<<<<<<<<<<<<<
@@ -37262,7 +37265,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
       __pyx_v_i = __pyx_v_phrase_location->sa_low;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":130
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":131
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:             # <<<<<<<<<<<<<<
@@ -37279,7 +37282,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         if (!__pyx_t_3) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":133
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":134
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -37289,7 +37292,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         __pyx_t_3 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":134
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":135
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -37301,7 +37304,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":136
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":137
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -37312,7 +37315,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         __pyx_L7:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":137
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":138
  *                     else:
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])             # <<<<<<<<<<<<<<
@@ -37321,7 +37324,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (__pyx_v_self->sa->arr[__pyx_v_val]));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":138
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":139
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -37336,7 +37339,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":140
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":141
  *                     i = i + stepsize
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns             # <<<<<<<<<<<<<<
@@ -37346,15 +37349,15 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     __pyx_t_5 = (__pyx_v_phrase_location->arr_high - __pyx_v_phrase_location->arr_low);
     if (unlikely(__pyx_v_phrase_location->num_subpatterns == 0)) {
       PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
     else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_phrase_location->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
       PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
     __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, __pyx_v_phrase_location->num_subpatterns);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":141
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":142
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
@@ -37370,7 +37373,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":142
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":143
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr             # <<<<<<<<<<<<<<
@@ -37384,7 +37387,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":144
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":145
  *                 sample = phrase_location.arr
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
@@ -37393,11 +37396,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
       if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":145
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":146
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low             # <<<<<<<<<<<<<<
@@ -37406,7 +37409,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
       __pyx_v_i = __pyx_v_phrase_location->arr_low;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":146
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":147
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -37423,7 +37426,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         if (!__pyx_t_4) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":149
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":150
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -37433,7 +37436,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         __pyx_t_4 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":150
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":151
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -37445,7 +37448,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":152
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":153
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -37456,7 +37459,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         __pyx_L11:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":153
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":154
  *                     else:
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
@@ -37465,7 +37468,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
         __pyx_v_j = (__pyx_v_phrase_location->arr_low + (__pyx_v_val * __pyx_v_phrase_location->num_subpatterns));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":154
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":155
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
@@ -37474,7 +37477,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_phrase_location->arr->arr + __pyx_v_j), __pyx_v_phrase_location->num_subpatterns);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":155
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":156
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -37488,7 +37491,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":156
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":157
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  *         return sample             # <<<<<<<<<<<<<<
@@ -37513,7 +37516,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":168
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":169
  * 
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):             # <<<<<<<<<<<<<<
@@ -37525,7 +37528,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("assign_matching", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":169
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":170
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr             # <<<<<<<<<<<<<<
@@ -37534,7 +37537,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->arr = __pyx_v_arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":170
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":171
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr
  *     m.start = start             # <<<<<<<<<<<<<<
@@ -37543,7 +37546,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->start = __pyx_v_start;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":172
  *     m.arr = arr
  *     m.start = start
  *     m.end = start + step             # <<<<<<<<<<<<<<
@@ -37552,7 +37555,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->end = (__pyx_v_start + __pyx_v_step);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":172
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":173
  *     m.start = start
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]             # <<<<<<<<<<<<<<
@@ -37561,7 +37564,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->sent_id = (__pyx_v_sent_id_arr[(__pyx_v_arr[__pyx_v_start])]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":173
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":174
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]
  *     m.size = step             # <<<<<<<<<<<<<<
@@ -37573,7 +37576,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":176
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":177
  * 
  * 
  * cdef int* append_combined_matching(int* arr, Matching* loc1, Matching* loc2,             # <<<<<<<<<<<<<<
@@ -37590,7 +37593,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("append_combined_matching", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":180
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":181
  *     cdef int i, new_len
  * 
  *     new_len = result_len[0] + num_subpatterns             # <<<<<<<<<<<<<<
@@ -37599,7 +37602,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_new_len = ((__pyx_v_result_len[0]) + __pyx_v_num_subpatterns);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":182
  * 
  *     new_len = result_len[0] + num_subpatterns
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -37608,7 +37611,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":184
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  * 
  *     for i from 0 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -37618,7 +37621,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_1 = __pyx_v_loc1->size;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":184
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":185
  * 
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]             # <<<<<<<<<<<<<<
@@ -37628,7 +37631,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
     (__pyx_v_arr[((__pyx_v_result_len[0]) + __pyx_v_i)]) = (__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":186
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:             # <<<<<<<<<<<<<<
@@ -37638,7 +37641,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_2 = (__pyx_v_num_subpatterns > __pyx_v_loc1->size);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":186
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":187
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]             # <<<<<<<<<<<<<<
@@ -37650,7 +37653,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":187
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":188
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -37659,7 +37662,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   (__pyx_v_result_len[0]) = __pyx_v_new_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":188
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":189
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -37675,7 +37678,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":191
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":192
  * 
  * 
  * cdef int* extend_arr(int* arr, int* arr_len, int* appendix, int appendix_len):             # <<<<<<<<<<<<<<
@@ -37689,7 +37692,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("extend_arr", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":194
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":195
  *     cdef int new_len
  * 
  *     new_len = arr_len[0] + appendix_len             # <<<<<<<<<<<<<<
@@ -37698,7 +37701,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_appendix_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":195
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":196
  * 
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -37707,7 +37710,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":196
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":197
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -37716,7 +37719,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_appendix, (__pyx_v_appendix_len * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":197
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":198
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -37725,7 +37728,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":198
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":199
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -37741,7 +37744,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":200
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":201
  *     return arr
  * 
  * cdef int median(int low, int high, int step):             # <<<<<<<<<<<<<<
@@ -37758,7 +37761,7 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("median", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":201
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":202
  * 
  * cdef int median(int low, int high, int step):
  *     return low + (((high - low)/step)/2)*step             # <<<<<<<<<<<<<<
@@ -37768,11 +37771,11 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   __pyx_t_1 = (__pyx_v_high - __pyx_v_low);
   if (unlikely(__pyx_v_step == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_step == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_1))) {
     PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_r = (__pyx_v_low + (__Pyx_div_long(__Pyx_div_int(__pyx_t_1, __pyx_v_step), 2) * __pyx_v_step));
   goto __pyx_L0;
@@ -37787,7 +37790,7 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":204
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":205
  * 
  * 
  * cdef void find_comparable_matchings(int low, int high, int* arr, int step, int loc, int* loc_minus, int* loc_plus):             # <<<<<<<<<<<<<<
@@ -37802,7 +37805,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("find_comparable_matchings", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":208
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":209
  *     # in which all matchings have the same first index as the one
  *     # starting at loc
  *     loc_plus[0] = loc + step             # <<<<<<<<<<<<<<
@@ -37811,7 +37814,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_plus[0]) = (__pyx_v_loc + __pyx_v_step);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":209
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":210
  *     # starting at loc
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -37828,7 +37831,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":210
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":211
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step             # <<<<<<<<<<<<<<
@@ -37838,7 +37841,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     (__pyx_v_loc_plus[0]) = ((__pyx_v_loc_plus[0]) + __pyx_v_step);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":211
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":212
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc             # <<<<<<<<<<<<<<
@@ -37847,7 +37850,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_minus[0]) = __pyx_v_loc;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":212
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":213
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -37864,7 +37867,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_2) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":213
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":214
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:
  *         loc_minus[0] = loc_minus[0] - step             # <<<<<<<<<<<<<<
@@ -37908,7 +37911,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_103,&__pyx_n_s_104,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
     PyObject* values[21] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":273
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":274
  *             char* category="[X]",
  *             # maximum number of contiguous chunks of terminal symbols in RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_chunks=None,             # <<<<<<<<<<<<<<
@@ -37917,7 +37920,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[3] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":281
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":282
  *             unsigned max_nonterminals=2,
  *             # maximum number of contiguous chunks of terminal symbols in target-side RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_target_chunks=None,             # <<<<<<<<<<<<<<
@@ -37926,7 +37929,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[7] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":283
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":284
  *             max_target_chunks=None,
  *             # maximum number of target side symbols (both T and NT) allowed in a rule. If None, defaults to max_initial_size
  *             max_target_length=None,             # <<<<<<<<<<<<<<
@@ -37935,7 +37938,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[8] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":287
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":288
  *             unsigned min_gap_size=2,
  *             # filename of file containing precomputed collocations
  *             precompute_file=None,             # <<<<<<<<<<<<<<
@@ -38078,7 +38081,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -38109,10 +38112,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
     }
     __pyx_v_alignment = ((struct __pyx_obj_3_sa_Alignment *)values[0]);
     if (values[1]) {
-      __pyx_v_by_slack_factor = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_by_slack_factor = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":269
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":270
  *             Alignment alignment,
  *             # parameter for double-binary search; doesn't seem to matter much
  *             float by_slack_factor=1.0,             # <<<<<<<<<<<<<<
@@ -38122,49 +38125,49 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_by_slack_factor = ((float)1.0);
     }
     if (values[2]) {
-      __pyx_v_category = PyBytes_AsString(values[2]); if (unlikely((!__pyx_v_category) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_category = PyBytes_AsString(values[2]); if (unlikely((!__pyx_v_category) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_category = ((char *)__pyx_k_105);
     }
     __pyx_v_max_chunks = values[3];
     if (values[4]) {
-      __pyx_v_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[4]); if (unlikely((__pyx_v_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[4]); if (unlikely((__pyx_v_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_max_initial_size = ((unsigned int)10);
     }
     if (values[5]) {
-      __pyx_v_max_length = __Pyx_PyInt_AsUnsignedInt(values[5]); if (unlikely((__pyx_v_max_length == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_max_length = __Pyx_PyInt_AsUnsignedInt(values[5]); if (unlikely((__pyx_v_max_length == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_max_length = ((unsigned int)5);
     }
     if (values[6]) {
-      __pyx_v_max_nonterminals = __Pyx_PyInt_AsUnsignedInt(values[6]); if (unlikely((__pyx_v_max_nonterminals == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_max_nonterminals = __Pyx_PyInt_AsUnsignedInt(values[6]); if (unlikely((__pyx_v_max_nonterminals == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_max_nonterminals = ((unsigned int)2);
     }
     __pyx_v_max_target_chunks = values[7];
     __pyx_v_max_target_length = values[8];
     if (values[9]) {
-      __pyx_v_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[9]); if (unlikely((__pyx_v_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[9]); if (unlikely((__pyx_v_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_min_gap_size = ((unsigned int)2);
     }
     __pyx_v_precompute_file = values[10];
     if (values[11]) {
-      __pyx_v_precompute_secondary_rank = __Pyx_PyInt_AsUnsignedInt(values[11]); if (unlikely((__pyx_v_precompute_secondary_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_precompute_secondary_rank = __Pyx_PyInt_AsUnsignedInt(values[11]); if (unlikely((__pyx_v_precompute_secondary_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_precompute_secondary_rank = ((unsigned int)20);
     }
     if (values[12]) {
-      __pyx_v_precompute_rank = __Pyx_PyInt_AsUnsignedInt(values[12]); if (unlikely((__pyx_v_precompute_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_precompute_rank = __Pyx_PyInt_AsUnsignedInt(values[12]); if (unlikely((__pyx_v_precompute_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_precompute_rank = ((unsigned int)100);
     }
     if (values[13]) {
-      __pyx_v_require_aligned_terminal = __Pyx_PyObject_IsTrue(values[13]); if (unlikely((__pyx_v_require_aligned_terminal == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_require_aligned_terminal = __Pyx_PyObject_IsTrue(values[13]); if (unlikely((__pyx_v_require_aligned_terminal == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":293
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":294
  *             unsigned precompute_rank=100,
  *             # require extracted rules to have at least one aligned word
  *             bint require_aligned_terminal=True,             # <<<<<<<<<<<<<<
@@ -38174,10 +38177,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_require_aligned_terminal = ((int)1);
     }
     if (values[14]) {
-      __pyx_v_require_aligned_chunks = __Pyx_PyObject_IsTrue(values[14]); if (unlikely((__pyx_v_require_aligned_chunks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_require_aligned_chunks = __Pyx_PyObject_IsTrue(values[14]); if (unlikely((__pyx_v_require_aligned_chunks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":295
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":296
  *             bint require_aligned_terminal=True,
  *             # require each contiguous chunk of extracted rules to have at least one aligned word
  *             bint require_aligned_chunks=False,             # <<<<<<<<<<<<<<
@@ -38187,20 +38190,20 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_require_aligned_chunks = ((int)0);
     }
     if (values[15]) {
-      __pyx_v_train_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[15]); if (unlikely((__pyx_v_train_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_train_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[15]); if (unlikely((__pyx_v_train_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_train_max_initial_size = ((unsigned int)10);
     }
     if (values[16]) {
-      __pyx_v_train_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[16]); if (unlikely((__pyx_v_train_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_train_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[16]); if (unlikely((__pyx_v_train_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_train_min_gap_size = ((unsigned int)2);
     }
     if (values[17]) {
-      __pyx_v_tight_phrases = __Pyx_PyObject_IsTrue(values[17]); if (unlikely((__pyx_v_tight_phrases == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_tight_phrases = __Pyx_PyObject_IsTrue(values[17]); if (unlikely((__pyx_v_tight_phrases == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":301
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":302
  *             unsigned train_min_gap_size=2,
  *             # True if phrases should be tight, False otherwise (False == slower but better results)
  *             bint tight_phrases=False,             # <<<<<<<<<<<<<<
@@ -38210,10 +38213,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_tight_phrases = ((int)0);
     }
     if (values[18]) {
-      __pyx_v_use_baeza_yates = __Pyx_PyObject_IsTrue(values[18]); if (unlikely((__pyx_v_use_baeza_yates == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_use_baeza_yates = __Pyx_PyObject_IsTrue(values[18]); if (unlikely((__pyx_v_use_baeza_yates == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":303
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":304
  *             bint tight_phrases=False,
  *             # True to require use of double-binary alg, false otherwise
  *             bint use_baeza_yates=True,             # <<<<<<<<<<<<<<
@@ -38223,10 +38226,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_use_baeza_yates = ((int)1);
     }
     if (values[19]) {
-      __pyx_v_use_collocations = __Pyx_PyObject_IsTrue(values[19]); if (unlikely((__pyx_v_use_collocations == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_use_collocations = __Pyx_PyObject_IsTrue(values[19]); if (unlikely((__pyx_v_use_collocations == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":305
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":306
  *             bint use_baeza_yates=True,
  *             # True to enable used of precomputed collocations
  *             bint use_collocations=True,             # <<<<<<<<<<<<<<
@@ -38236,10 +38239,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_use_collocations = ((int)1);
     }
     if (values[20]) {
-      __pyx_v_use_index = __Pyx_PyObject_IsTrue(values[20]); if (unlikely((__pyx_v_use_index == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_use_index = __Pyx_PyObject_IsTrue(values[20]); if (unlikely((__pyx_v_use_index == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":307
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":308
  *             bint use_collocations=True,
  *             # True to enable use of precomputed inverted indices
  *             bint use_index=True):             # <<<<<<<<<<<<<<
@@ -38251,13 +38254,13 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 1, 21, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 1, 21, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_alignment), __pyx_ptype_3_sa_Alignment, 1, "alignment", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_alignment), __pyx_ptype_3_sa_Alignment, 1, "alignment", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_alignment, __pyx_v_by_slack_factor, __pyx_v_category, __pyx_v_max_chunks, __pyx_v_max_initial_size, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_max_target_chunks, __pyx_v_max_target_length, __pyx_v_min_gap_size, __pyx_v_precompute_file, __pyx_v_precompute_secondary_rank, __pyx_v_precompute_rank, __pyx_v_require_aligned_terminal, __pyx_v_require_aligned_chunks, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size, __pyx_v_tight_phrases, __pyx_v_use_baeza_yates, __pyx_v_use_collocations, __pyx_v_use_index);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -38267,7 +38270,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":265
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":266
  *     cdef IntList findexes1
  * 
  *     def __cinit__(self,             # <<<<<<<<<<<<<<
@@ -38287,21 +38290,21 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":313
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":314
  *         respectively.    This is because Chiang's model does not require
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache             # <<<<<<<<<<<<<<
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieTable)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieTable)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
@@ -38310,20 +38313,20 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":314
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":315
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
@@ -38332,7 +38335,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->rules->root = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":315
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":316
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:             # <<<<<<<<<<<<<<
@@ -38342,23 +38345,23 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (((PyObject *)__pyx_v_alignment) == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":316
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":317
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
  *         self.alignment = alignment
  * 
  */
-    __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_107), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_107), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":317
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":318
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")
  *         self.alignment = alignment             # <<<<<<<<<<<<<<
@@ -38371,7 +38374,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_DECREF(((PyObject *)__pyx_v_self->alignment));
   __pyx_v_self->alignment = __pyx_v_alignment;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":321
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":322
  *         # grammar parameters and settings
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
@@ -38380,7 +38383,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->max_length = __pyx_v_max_length;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":322
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":323
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
@@ -38389,7 +38392,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->max_nonterminals = __pyx_v_max_nonterminals;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":323
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":324
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size             # <<<<<<<<<<<<<<
@@ -38398,7 +38401,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->max_initial_size = __pyx_v_max_initial_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":324
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":325
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
@@ -38407,7 +38410,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->train_max_initial_size = __pyx_v_train_max_initial_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":325
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":326
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size             # <<<<<<<<<<<<<<
@@ -38416,7 +38419,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->min_gap_size = __pyx_v_min_gap_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":326
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":327
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size             # <<<<<<<<<<<<<<
@@ -38425,7 +38428,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->train_min_gap_size = __pyx_v_train_min_gap_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":327
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":328
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)             # <<<<<<<<<<<<<<
@@ -38434,7 +38437,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->category = __pyx_f_3_sa_sym_fromstring(__pyx_v_category, 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":329
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":330
  *         self.category = sym_fromstring(category, False)
  * 
  *         if max_chunks is None:             # <<<<<<<<<<<<<<
@@ -38444,7 +38447,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (__pyx_v_max_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":330
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":331
  * 
  *         if max_chunks is None:
  *             self.max_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
@@ -38456,19 +38459,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":332
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":333
  *             self.max_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_chunks = max_chunks             # <<<<<<<<<<<<<<
  * 
  *         if max_target_chunks is None:
  */
-    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_self->max_chunks = __pyx_t_4;
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":334
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":335
  *             self.max_chunks = max_chunks
  * 
  *         if max_target_chunks is None:             # <<<<<<<<<<<<<<
@@ -38478,7 +38481,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (__pyx_v_max_target_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":335
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":336
  * 
  *         if max_target_chunks is None:
  *             self.max_target_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
@@ -38490,19 +38493,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":337
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":338
  *             self.max_target_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_target_chunks = max_target_chunks             # <<<<<<<<<<<<<<
  * 
  *         if max_target_length is None:
  */
-    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_self->max_target_chunks = __pyx_t_4;
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":339
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":340
  *             self.max_target_chunks = max_target_chunks
  * 
  *         if max_target_length is None:             # <<<<<<<<<<<<<<
@@ -38512,7 +38515,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (__pyx_v_max_target_length == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":340
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":341
  * 
  *         if max_target_length is None:
  *             self.max_target_length = max_initial_size             # <<<<<<<<<<<<<<
@@ -38524,26 +38527,26 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":342
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":343
  *             self.max_target_length = max_initial_size
  *         else:
  *             self.max_target_length = max_target_length             # <<<<<<<<<<<<<<
  * 
  *         # algorithmic parameters and settings
  */
-    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_self->max_target_length = __pyx_t_4;
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":345
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":346
  * 
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}             # <<<<<<<<<<<<<<
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
@@ -38551,14 +38554,14 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->precomputed_collocations = ((PyObject *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":346
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":347
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}             # <<<<<<<<<<<<<<
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __Pyx_GOTREF(__pyx_v_self->precomputed_index);
@@ -38566,7 +38569,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->precomputed_index = ((PyObject *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":347
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":348
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}
  *         self.use_index = use_index             # <<<<<<<<<<<<<<
@@ -38575,7 +38578,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->use_index = __pyx_v_use_index;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":348
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":349
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations             # <<<<<<<<<<<<<<
@@ -38584,14 +38587,14 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->use_collocations = __pyx_v_use_collocations;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":349
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":350
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}             # <<<<<<<<<<<<<<
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 349; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __Pyx_GOTREF(__pyx_v_self->max_rank);
@@ -38599,7 +38602,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->max_rank = ((PyObject *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":350
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":351
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file             # <<<<<<<<<<<<<<
@@ -38612,7 +38615,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_DECREF(__pyx_v_self->precompute_file);
   __pyx_v_self->precompute_file = __pyx_v_precompute_file;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":351
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":352
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
@@ -38621,7 +38624,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->precompute_rank = __pyx_v_precompute_rank;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":352
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":353
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
@@ -38630,7 +38633,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":353
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":354
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates             # <<<<<<<<<<<<<<
@@ -38639,7 +38642,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->use_baeza_yates = __pyx_v_use_baeza_yates;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":354
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":355
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor             # <<<<<<<<<<<<<<
@@ -38648,7 +38651,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->by_slack_factor = __pyx_v_by_slack_factor;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":355
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":356
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:             # <<<<<<<<<<<<<<
@@ -38657,7 +38660,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_tight_phrases) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":356
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":357
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  *             self.tight_phrases = 1             # <<<<<<<<<<<<<<
@@ -38669,7 +38672,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":358
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":359
  *             self.tight_phrases = 1
  *         else:
  *             self.tight_phrases = 0             # <<<<<<<<<<<<<<
@@ -38680,7 +38683,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":360
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":361
  *             self.tight_phrases = 0
  * 
  *         if require_aligned_chunks:             # <<<<<<<<<<<<<<
@@ -38689,7 +38692,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_require_aligned_chunks) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":362
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":363
  *         if require_aligned_chunks:
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1             # <<<<<<<<<<<<<<
@@ -38698,7 +38701,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
     __pyx_v_self->require_aligned_chunks = 1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":363
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":364
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
@@ -38709,7 +38712,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
     goto __pyx_L8;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":364
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":365
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -38718,7 +38721,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_require_aligned_terminal) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":365
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":366
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -38727,7 +38730,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
     __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":366
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":367
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
@@ -38739,7 +38742,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":368
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":369
  *             self.require_aligned_terminal = 1
  *         else:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -38748,7 +38751,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
     __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":369
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":370
  *         else:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 0             # <<<<<<<<<<<<<<
@@ -38759,7 +38762,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   __pyx_L8:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":373
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":374
  * 
  *         # diagnostics
  *         self.prev_norm_prefix = ()             # <<<<<<<<<<<<<<
@@ -38772,17 +38775,17 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_DECREF(__pyx_v_self->prev_norm_prefix);
   __pyx_v_self->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":375
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":376
  *         self.prev_norm_prefix = ()
  * 
  *         self.findexes = IntList(initial_len=10)             # <<<<<<<<<<<<<<
  *         self.findexes1 = IntList(initial_len=10)
  * 
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
@@ -38791,17 +38794,17 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":376
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":377
  * 
  *         self.findexes = IntList(initial_len=10)
  *         self.findexes1 = IntList(initial_len=10)             # <<<<<<<<<<<<<<
  * 
  *     def configure(self, SuffixArray fsarray, DataArray edarray,
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
@@ -38855,21 +38858,21 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
         if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -38886,16 +38889,16 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.configure", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_edarray), __pyx_ptype_3_sa_DataArray, 1, "edarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sampler), __pyx_ptype_3_sa_Sampler, 1, "sampler", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_scorer), __pyx_ptype_3_sa_Scorer, 1, "scorer", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_edarray), __pyx_ptype_3_sa_DataArray, 1, "edarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sampler), __pyx_ptype_3_sa_Sampler, 1, "sampler", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_scorer), __pyx_ptype_3_sa_Scorer, 1, "scorer", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_edarray, __pyx_v_sampler, __pyx_v_scorer);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -38905,7 +38908,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":378
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":379
  *         self.findexes1 = IntList(initial_len=10)
  * 
  *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
@@ -38923,7 +38926,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("configure", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":383
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":384
  *         Here we also use it to precompute the most expensive intersections
  *         in the corpus quickly.'''
  *         self.fsa = fsarray             # <<<<<<<<<<<<<<
@@ -38936,7 +38939,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   __Pyx_DECREF(((PyObject *)__pyx_v_self->fsa));
   __pyx_v_self->fsa = __pyx_v_fsarray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":384
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":385
  *         in the corpus quickly.'''
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray             # <<<<<<<<<<<<<<
@@ -38949,7 +38952,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   __Pyx_DECREF(((PyObject *)__pyx_v_self->fda));
   __pyx_v_self->fda = __pyx_v_fsarray->darray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":385
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":386
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray
  *         self.eda = edarray             # <<<<<<<<<<<<<<
@@ -38962,7 +38965,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   __Pyx_DECREF(((PyObject *)__pyx_v_self->eda));
   __pyx_v_self->eda = __pyx_v_edarray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":386
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":387
  *         self.fda = fsarray.darray
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)             # <<<<<<<<<<<<<<
@@ -38971,17 +38974,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __pyx_t_1 = ((PyObject *)__pyx_v_self->fda);
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_2);
   __Pyx_GOTREF(__pyx_v_self->fid2symid);
   __Pyx_DECREF(((PyObject *)__pyx_v_self->fid2symid));
   __pyx_v_self->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":387
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":388
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)             # <<<<<<<<<<<<<<
@@ -38990,31 +38993,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __pyx_t_2 = ((PyObject *)__pyx_v_self->eda);
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_1);
   __Pyx_GOTREF(__pyx_v_self->eid2symid);
   __Pyx_DECREF(((PyObject *)__pyx_v_self->eid2symid));
   __pyx_v_self->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":388
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":389
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()             # <<<<<<<<<<<<<<
  *         self.sampler = sampler
  *         self.scorer = scorer
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":389
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":390
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  *         self.sampler = sampler             # <<<<<<<<<<<<<<
@@ -39027,7 +39030,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   __Pyx_DECREF(((PyObject *)__pyx_v_self->sampler));
   __pyx_v_self->sampler = __pyx_v_sampler;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":390
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":391
  *         self.precompute()
  *         self.sampler = sampler
  *         self.scorer = scorer             # <<<<<<<<<<<<<<
@@ -39053,7 +39056,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":392
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":393
  *         self.scorer = scorer
  * 
  *     cdef set_idmap(self, DataArray darray):             # <<<<<<<<<<<<<<
@@ -39078,7 +39081,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("set_idmap", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":396
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":397
  *         cdef IntList idmap
  * 
  *         N = len(darray.id2word)             # <<<<<<<<<<<<<<
@@ -39087,30 +39090,30 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
  */
   __pyx_t_1 = __pyx_v_darray->id2word;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_N = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":397
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":398
  * 
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)             # <<<<<<<<<<<<<<
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_3 = PyInt_FromLong(__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromLong(__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_idmap = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":398
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":399
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:             # <<<<<<<<<<<<<<
@@ -39120,20 +39123,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_word_id = 0; __pyx_v_word_id < __pyx_t_4; __pyx_v_word_id++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":399
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":400
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             idmap.arr[word_id] = new_word_id
  *         return idmap
  */
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_darray->id2word, __pyx_v_word_id, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_darray->id2word, __pyx_v_word_id, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyBytes_AsString(__pyx_t_3); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyBytes_AsString(__pyx_t_3); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_v_new_word_id = __pyx_f_3_sa_sym_fromstring(__pyx_t_5, 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":400
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":401
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id             # <<<<<<<<<<<<<<
@@ -39143,7 +39146,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
     (__pyx_v_idmap->arr[__pyx_v_word_id]) = __pyx_v_new_word_id;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":401
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":402
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id
  *         return idmap             # <<<<<<<<<<<<<<
@@ -39180,7 +39183,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":404
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":405
  * 
  * 
  *     def pattern2phrase(self, pattern):             # <<<<<<<<<<<<<<
@@ -39208,7 +39211,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("pattern2phrase", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":406
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":407
  *     def pattern2phrase(self, pattern):
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()             # <<<<<<<<<<<<<<
@@ -39218,7 +39221,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":407
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":408
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -39228,7 +39231,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":408
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":409
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -39239,7 +39242,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
     __pyx_t_1 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -39247,23 +39250,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -39273,74 +39276,74 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":409
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":410
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":410
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":411
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  */
-      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_v_arity);
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":411
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":412
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_v_new_id = __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6);
       goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":413
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":414
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             result = result + (new_id,)
  *         return Phrase(result)
  */
-      __pyx_t_4 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyBytes_AsString(__pyx_t_4); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyBytes_AsString(__pyx_t_4); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_v_new_id = __pyx_f_3_sa_sym_fromstring(__pyx_t_7, 1);
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":414
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":415
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
  *         return Phrase(result)
  * 
  */
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_new_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_new_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_result));
@@ -39349,7 +39352,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":415
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":416
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         return Phrase(result)             # <<<<<<<<<<<<<<
@@ -39357,12 +39360,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  *     def pattern2phrase_plus(self, pattern):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_r = __pyx_t_4;
@@ -39397,7 +39400,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(Py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":417
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":418
  *         return Phrase(result)
  * 
  *     def pattern2phrase_plus(self, pattern):             # <<<<<<<<<<<<<<
@@ -39427,19 +39430,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("pattern2phrase_plus", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":420
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":421
  *         # returns a list containing both the pattern, and pattern
  *         # suffixed/prefixed with the NT category.
  *         patterns = []             # <<<<<<<<<<<<<<
  *         result = ()
  *         arity = 0
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_patterns = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":421
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":422
  *         # suffixed/prefixed with the NT category.
  *         patterns = []
  *         result = ()             # <<<<<<<<<<<<<<
@@ -39449,7 +39452,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":422
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":423
  *         patterns = []
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -39459,7 +39462,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":423
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":424
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -39470,7 +39473,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
     __pyx_t_1 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -39478,23 +39481,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -39504,74 +39507,74 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":424
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":425
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":425
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":426
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  */
-      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_v_arity);
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":426
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":427
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_v_new_id = __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6);
       goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":428
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":429
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))
  */
-      __pyx_t_4 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyBytes_AsString(__pyx_t_4); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyBytes_AsString(__pyx_t_4); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_v_new_id = __pyx_f_3_sa_sym_fromstring(__pyx_t_7, 1);
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":429
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":430
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  */
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_new_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_new_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_result));
@@ -39580,81 +39583,81 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":430
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":431
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  */
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":431
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":432
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns
  */
-  __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   __pyx_t_4 = 0;
-  __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
   __pyx_t_4 = 0;
-  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":432
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":433
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))             # <<<<<<<<<<<<<<
  *         return patterns
  * 
  */
-  __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   __pyx_t_4 = 0;
-  __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_t_1), ((PyObject *)__pyx_v_result)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_t_1), ((PyObject *)__pyx_v_result)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
   __pyx_t_4 = 0;
-  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":433
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":434
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns             # <<<<<<<<<<<<<<
@@ -39695,7 +39698,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":435
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":436
  *         return patterns
  * 
  *     def precompute(self):             # <<<<<<<<<<<<<<
@@ -39729,7 +39732,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("precompute", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":438
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":439
  *         cdef Precomputation pre
  * 
  *         if self.precompute_file is not None:             # <<<<<<<<<<<<<<
@@ -39739,31 +39742,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   __pyx_t_1 = (__pyx_v_self->precompute_file != Py_None);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":439
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":440
  * 
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  *             pre = Precomputation(from_binary=self.precompute_file)
  */
-    __pyx_t_2 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_start_time = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":440
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":441
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)             # <<<<<<<<<<<<<<
  *             pre = Precomputation(from_binary=self.precompute_file)
  *             # check parameters of precomputation -- some are critical and some are not
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_108));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_108));
@@ -39771,29 +39774,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __Pyx_INCREF(__pyx_v_self->precompute_file);
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->precompute_file);
     __Pyx_GIVEREF(__pyx_v_self->precompute_file);
-    __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":441
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":442
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  *             pre = Precomputation(from_binary=self.precompute_file)             # <<<<<<<<<<<<<<
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:
  */
-    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), __pyx_v_self->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), __pyx_v_self->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_v_pre = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_t_2);
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":443
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":444
  *             pre = Precomputation(from_binary=self.precompute_file)
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:             # <<<<<<<<<<<<<<
@@ -39803,23 +39806,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_t_1 = (__pyx_v_pre->max_nonterminals != __pyx_v_self->max_nonterminals);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":444
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":445
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)             # <<<<<<<<<<<<<<
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  */
-      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__warn); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__warn); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_109));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_s_109));
@@ -39830,7 +39833,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -39839,7 +39842,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":445
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":446
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:             # <<<<<<<<<<<<<<
@@ -39849,23 +39852,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_t_1 = (__pyx_v_pre->max_length != __pyx_v_self->max_length);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":446
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":447
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)             # <<<<<<<<<<<<<<
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  */
-      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyInt_FromLong(__pyx_v_self->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_v_self->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_110));
@@ -39876,7 +39879,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_4);
       __pyx_t_3 = 0;
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -39885,7 +39888,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":447
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":448
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -39895,18 +39898,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != __pyx_v_self->train_max_initial_size);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":448
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":449
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))             # <<<<<<<<<<<<<<
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  */
-      __pyx_t_4 = PyInt_FromLong(__pyx_v_pre->train_max_initial_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_v_pre->train_max_initial_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
@@ -39914,25 +39917,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_4 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_111), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_111), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __Pyx_Raise(__pyx_t_2, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L6;
     }
     __pyx_L6:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":449
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":450
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:             # <<<<<<<<<<<<<<
@@ -39942,18 +39945,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != __pyx_v_self->train_min_gap_size);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":450
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":451
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))             # <<<<<<<<<<<<<<
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  */
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyInt_FromLong(__pyx_v_self->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(__pyx_v_self->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -39961,25 +39964,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_2 = 0;
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_112), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_112), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_5));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_Raise(__pyx_t_5, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L7;
     }
     __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":451
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":452
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:             # <<<<<<<<<<<<<<
@@ -39988,25 +39991,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
     if (__pyx_v_self->use_index) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":452
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":453
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))             # <<<<<<<<<<<<<<
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)
  */
-      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_5 = __pyx_v_pre->precomputed_index;
       __Pyx_INCREF(__pyx_t_5);
-      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_113));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_113));
@@ -40014,13 +40017,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":453
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":454
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():             # <<<<<<<<<<<<<<
@@ -40030,9 +40033,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __pyx_t_6 = 0;
       if (unlikely(__pyx_v_pre->precomputed_index == Py_None)) {
         PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_index, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_index, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_XDECREF(__pyx_t_5);
       __pyx_t_5 = __pyx_t_2;
@@ -40040,7 +40043,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       while (1) {
         __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_7, &__pyx_t_6, &__pyx_t_2, &__pyx_t_4, NULL, __pyx_t_8);
         if (unlikely(__pyx_t_9 == 0)) break;
-        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_XDECREF(__pyx_v_pattern);
@@ -40050,21 +40053,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
         __pyx_v_arr = __pyx_t_4;
         __pyx_t_4 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":454
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":455
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)             # <<<<<<<<<<<<<<
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  */
-        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(__pyx_v_pattern);
         PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
-        __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -40072,7 +40075,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
         __pyx_v_phrases = __pyx_t_3;
         __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":455
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":456
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:             # <<<<<<<<<<<<<<
@@ -40083,7 +40086,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
           __pyx_t_3 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
           __pyx_t_11 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
         }
@@ -40091,23 +40094,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
           if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_3)) {
             if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_3)) {
             if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else {
             __pyx_t_2 = __pyx_t_11(__pyx_t_3);
             if (unlikely(!__pyx_t_2)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
@@ -40117,14 +40120,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
           __pyx_v_phrase = __pyx_t_2;
           __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":456
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":457
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr             # <<<<<<<<<<<<<<
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  */
-          if (PyObject_SetItem(__pyx_v_self->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyObject_SetItem(__pyx_v_self->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       }
@@ -40133,7 +40136,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     }
     __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":457
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":458
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:             # <<<<<<<<<<<<<<
@@ -40142,25 +40145,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
     if (__pyx_v_self->use_collocations) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":458
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":459
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))             # <<<<<<<<<<<<<<
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)
  */
-      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_5 = __pyx_v_pre->precomputed_collocations;
       __Pyx_INCREF(__pyx_t_5);
-      __pyx_t_7 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_114));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_114));
@@ -40168,13 +40171,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":459
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":460
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():             # <<<<<<<<<<<<<<
@@ -40184,9 +40187,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __pyx_t_7 = 0;
       if (unlikely(__pyx_v_pre->precomputed_collocations == Py_None)) {
         PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_6), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_6), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_XDECREF(__pyx_t_5);
       __pyx_t_5 = __pyx_t_2;
@@ -40194,7 +40197,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       while (1) {
         __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_6, &__pyx_t_7, &__pyx_t_2, &__pyx_t_3, NULL, __pyx_t_8);
         if (unlikely(__pyx_t_9 == 0)) break;
-        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_XDECREF(__pyx_v_pattern);
@@ -40204,21 +40207,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
         __pyx_v_arr = __pyx_t_3;
         __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":460
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":461
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)             # <<<<<<<<<<<<<<
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  */
-        __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(__pyx_v_pattern);
         PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
-        __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -40226,47 +40229,47 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
         __pyx_v_phrase = __pyx_t_4;
         __pyx_t_4 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":461
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":462
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr             # <<<<<<<<<<<<<<
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)
  */
-        if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":462
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":463
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)
  * 
  */
-    __pyx_t_5 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_v_stop_time = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":463
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":464
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_115));
@@ -40274,7 +40277,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -40316,7 +40319,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collo
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":466
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":467
  * 
  * 
  *     def get_precomputed_collocation(self, phrase):             # <<<<<<<<<<<<<<
@@ -40338,29 +40341,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_precomputed_collocation", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":467
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":468
  * 
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:             # <<<<<<<<<<<<<<
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_phrase, __pyx_v_self->precomputed_collocations, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_phrase, __pyx_v_self->precomputed_collocations, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":468
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":469
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]             # <<<<<<<<<<<<<<
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_arr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":469
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":470
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)             # <<<<<<<<<<<<<<
@@ -40368,26 +40371,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
  * 
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr), __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_3 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr), __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_phrase, __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_phrase, __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Add(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Add(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_r = __pyx_t_4;
@@ -40397,7 +40400,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":470
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":471
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None             # <<<<<<<<<<<<<<
@@ -40424,7 +40427,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":473
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":474
  * 
  * 
  *     cdef int* baeza_yates_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -40470,7 +40473,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("baeza_yates_helper", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":486
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":487
  *         cdef Matching loc1, loc2
  * 
  *         result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -40479,7 +40482,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":488
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":489
  *         result = <int*> malloc(0*sizeof(int*))
  * 
  *         d_first = 0             # <<<<<<<<<<<<<<
@@ -40488,7 +40491,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_d_first = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":489
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":490
  * 
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:             # <<<<<<<<<<<<<<
@@ -40498,7 +40501,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_1 = ((__pyx_v_high1 - __pyx_v_low1) > (__pyx_v_high2 - __pyx_v_low2));
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":490
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":491
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:
  *             d_first = 1             # <<<<<<<<<<<<<<
@@ -40510,7 +40513,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":494
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":495
  *         # First, check to see if we are at any of the recursive base cases
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:             # <<<<<<<<<<<<<<
@@ -40526,7 +40529,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":495
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":496
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:
  *             return result             # <<<<<<<<<<<<<<
@@ -40539,7 +40542,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":498
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":499
  * 
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40548,7 +40551,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, (__pyx_v_high1 - __pyx_v_step1), __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":499
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":500
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40557,7 +40560,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_low2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":500
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":501
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:             # <<<<<<<<<<<<<<
@@ -40567,7 +40570,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == -1);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":501
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":502
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:
  *             return result             # <<<<<<<<<<<<<<
@@ -40580,7 +40583,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":503
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":504
  *             return result
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40589,7 +40592,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_low1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":504
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":505
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40598,7 +40601,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_high2 - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":505
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":506
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -40608,7 +40611,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":506
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":507
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *             return result             # <<<<<<<<<<<<<<
@@ -40621,7 +40624,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":510
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":511
  *         # Case 3: query set and data set do not meet size mismatch constraints;
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1             # <<<<<<<<<<<<<<
@@ -40631,15 +40634,15 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_4 = (__pyx_v_high1 - __pyx_v_low1);
   if (unlikely(__pyx_v_step1 == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_step1 == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_4))) {
     PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_v_qsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":511
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":512
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2             # <<<<<<<<<<<<<<
@@ -40649,15 +40652,15 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_4 = (__pyx_v_high2 - __pyx_v_low2);
   if (unlikely(__pyx_v_step2 == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_step2 == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_4))) {
     PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_v_dsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":512
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":513
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -40666,7 +40669,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":513
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":514
  *         dsetsize = (high2-low2) / step2
  *         if d_first:
  *             tmp = qsetsize             # <<<<<<<<<<<<<<
@@ -40675,7 +40678,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_qsetsize;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":514
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":515
  *         if d_first:
  *             tmp = qsetsize
  *             qsetsize = dsetsize             # <<<<<<<<<<<<<<
@@ -40684,7 +40687,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_qsetsize = __pyx_v_dsetsize;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":515
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":516
  *             tmp = qsetsize
  *             qsetsize = dsetsize
  *             dsetsize = tmp             # <<<<<<<<<<<<<<
@@ -40696,7 +40699,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":517
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":518
  *             dsetsize = tmp
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:             # <<<<<<<<<<<<<<
@@ -40707,12 +40710,12 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_6 = log(2.0);
   if (unlikely(__pyx_t_6 == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "float division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_t_3 = ((__pyx_t_5 / __pyx_t_6) > __pyx_v_dsetsize);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":518
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":519
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)             # <<<<<<<<<<<<<<
@@ -40721,7 +40724,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     free(__pyx_v_result);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":519
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":520
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)
  *             return self.merge_helper(low1, high1, arr1, step1, low2, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -40734,7 +40737,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L8:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":523
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":524
  *         # binary search.    There are two flavors, depending on
  *         # whether the queryset or dataset is first
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -40743,7 +40746,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":524
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":525
  *         # whether the queryset or dataset is first
  *         if d_first:
  *             med2 = median(low2, high2, step2)             # <<<<<<<<<<<<<<
@@ -40752,7 +40755,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_low2, __pyx_v_high2, __pyx_v_step2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":525
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":526
  *         if d_first:
  *             med2 = median(low2, high2, step2)
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40761,7 +40764,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":527
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":528
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  * 
  *             search_low = low1             # <<<<<<<<<<<<<<
@@ -40770,7 +40773,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":528
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":529
  * 
  *             search_low = low1
  *             search_high = high1             # <<<<<<<<<<<<<<
@@ -40779,7 +40782,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":529
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":530
  *             search_low = low1
  *             search_high = high1
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -40790,7 +40793,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":530
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":531
  *             search_high = high1
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)             # <<<<<<<<<<<<<<
@@ -40799,7 +40802,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":531
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":532
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -40808,7 +40811,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":532
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":533
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -40817,7 +40820,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":535
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":536
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -40826,7 +40829,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":533
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":534
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -40835,7 +40838,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":534
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":535
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_low = med1_plus             # <<<<<<<<<<<<<<
@@ -40845,7 +40848,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_low = __pyx_v_med1_plus;
         break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":535
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":536
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -40854,7 +40857,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":536
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":537
  *                     search_low = med1_plus
  *                 elif comparison == 1:
  *                     search_high = med1_minus             # <<<<<<<<<<<<<<
@@ -40865,7 +40868,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":538
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":539
  *                     search_high = med1_minus
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -40881,7 +40884,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":540
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":541
  *                     break
  *         else:
  *             med1 = median(low1, high1, step1)             # <<<<<<<<<<<<<<
@@ -40890,7 +40893,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_low1, __pyx_v_high1, __pyx_v_step1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":541
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":542
  *         else:
  *             med1 = median(low1, high1, step1)
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -40899,7 +40902,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":543
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":544
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  * 
  *             search_low = low2             # <<<<<<<<<<<<<<
@@ -40908,7 +40911,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":544
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":545
  * 
  *             search_low = low2
  *             search_high = high2             # <<<<<<<<<<<<<<
@@ -40917,7 +40920,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":545
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":546
  *             search_low = low2
  *             search_high = high2
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -40928,7 +40931,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":546
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":547
  *             search_high = high2
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)             # <<<<<<<<<<<<<<
@@ -40937,7 +40940,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step2);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":547
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":548
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40946,7 +40949,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":548
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":549
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -40955,7 +40958,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":551
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":552
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -40964,7 +40967,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":549
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":550
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -40973,7 +40976,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":550
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":551
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_high = med2             # <<<<<<<<<<<<<<
@@ -40983,7 +40986,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_high = __pyx_v_med2;
         break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":551
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":552
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -40992,7 +40995,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":552
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":553
  *                     search_high = med2
  *                 elif comparison == 1:
  *                     search_low = med2 + step2             # <<<<<<<<<<<<<<
@@ -41003,7 +41006,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":554
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":555
  *                     search_low = med2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -41018,7 +41021,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L9:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":556
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":557
  *                     break
  * 
  *         med_result_len = 0             # <<<<<<<<<<<<<<
@@ -41027,7 +41030,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":557
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":558
  * 
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -41036,7 +41039,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":558
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":559
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))
  *         if search_high > search_low:             # <<<<<<<<<<<<<<
@@ -41046,7 +41049,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (__pyx_v_search_high > __pyx_v_search_low);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":564
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":565
  *             # want to store the bindings for all of those elements.    We can
  *             # subsequently throw all of them away.
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -41055,7 +41058,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":565
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":566
  *             # subsequently throw all of them away.
  *             med2_minus = med2
  *             med2_plus = med2 + step2             # <<<<<<<<<<<<<<
@@ -41064,7 +41067,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = (__pyx_v_med2 + __pyx_v_step2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":566
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":567
  *             med2_minus = med2
  *             med2_plus = med2 + step2
  *             i1 = med1_minus             # <<<<<<<<<<<<<<
@@ -41073,7 +41076,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_i1 = __pyx_v_med1_minus;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":567
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":568
  *             med2_plus = med2 + step2
  *             i1 = med1_minus
  *             while i1 < med1_plus:             # <<<<<<<<<<<<<<
@@ -41084,7 +41087,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i1 < __pyx_v_med1_plus);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":568
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":569
  *             i1 = med1_minus
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41093,7 +41096,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":569
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":570
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:             # <<<<<<<<<<<<<<
@@ -41104,7 +41107,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = ((__pyx_v_med2_minus - __pyx_v_step2) >= __pyx_v_low2);
         if (!__pyx_t_3) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":570
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":571
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41113,7 +41116,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_med2_minus - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":571
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":572
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:             # <<<<<<<<<<<<<<
@@ -41123,7 +41126,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) < 1);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":572
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":573
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:
  *                         med2_minus = med2_minus - step2             # <<<<<<<<<<<<<<
@@ -41135,7 +41138,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":574
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":575
  *                         med2_minus = med2_minus - step2
  *                     else:
  *                         break             # <<<<<<<<<<<<<<
@@ -41148,7 +41151,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L18_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":575
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":576
  *                     else:
  *                         break
  *                 i2 = med2_minus             # <<<<<<<<<<<<<<
@@ -41157,7 +41160,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_i2 = __pyx_v_med2_minus;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":576
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":577
  *                         break
  *                 i2 = med2_minus
  *                 while i2 < high2:             # <<<<<<<<<<<<<<
@@ -41168,7 +41171,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
         if (!__pyx_t_3) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":577
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":578
  *                 i2 = med2_minus
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41177,7 +41180,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":578
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":579
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -41186,7 +41189,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":579
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":580
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -41196,7 +41199,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == 0);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":581
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":582
  *                     if comparison == 0:
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)             # <<<<<<<<<<<<<<
@@ -41208,7 +41211,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L22:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":582
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":583
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -41218,7 +41221,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == -1);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":583
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":584
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -41230,7 +41233,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L23:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":584
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":585
  *                     if comparison == -1:
  *                         break
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -41241,7 +41244,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L21_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":585
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":586
  *                         break
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:             # <<<<<<<<<<<<<<
@@ -41251,7 +41254,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i2 > __pyx_v_med2_plus);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":586
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":587
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:
  *                     med2_plus = i2             # <<<<<<<<<<<<<<
@@ -41263,7 +41266,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L24:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":587
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":588
  *                 if i2 > med2_plus:
  *                     med2_plus = i2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -41273,7 +41276,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_v_i1 = (__pyx_v_i1 + __pyx_v_step1);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":589
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":590
  *                 i1 = i1 + step1
  * 
  *             tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -41282,7 +41285,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_med1_minus;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":590
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":591
  * 
  *             tmp = med1_minus
  *             med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -41291,7 +41294,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":591
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":592
  *             tmp = med1_minus
  *             med1_minus = med1_plus
  *             med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -41303,7 +41306,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":594
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":595
  *         else:
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -41312,7 +41315,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":595
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":596
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2
  *             med2_plus = med2             # <<<<<<<<<<<<<<
@@ -41321,7 +41324,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = __pyx_v_med2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":596
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":597
  *             med2_minus = med2
  *             med2_plus = med2
  *             if d_first:             # <<<<<<<<<<<<<<
@@ -41330,7 +41333,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     if (__pyx_v_d_first) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":597
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":598
  *             med2_plus = med2
  *             if d_first:
  *                 med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -41339,7 +41342,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":598
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":599
  *             if d_first:
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -41349,7 +41352,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == -1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":599
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":600
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:
  *                     med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -41361,7 +41364,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L26:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":600
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":601
  *                 if comparison == -1:
  *                     med1_minus = med1_plus
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -41371,7 +41374,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":601
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":602
  *                     med1_minus = med1_plus
  *                 if comparison == 1:
  *                     med1_plus = med1_minus             # <<<<<<<<<<<<<<
@@ -41386,7 +41389,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":603
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":604
  *                     med1_plus = med1_minus
  *             else:
  *                 tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -41395,7 +41398,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_tmp = __pyx_v_med1_minus;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":604
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":605
  *             else:
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -41404,7 +41407,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":605
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":606
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -41413,7 +41416,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_plus = __pyx_v_tmp;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":606
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":607
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -41423,7 +41426,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":607
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":608
  *                 med1_plus = tmp
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -41432,7 +41435,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":608
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":609
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2
  *                     med2_plus = med2_plus + step2             # <<<<<<<<<<<<<<
@@ -41448,7 +41451,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L14:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":610
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":611
  *                     med2_plus = med2_plus + step2
  * 
  *         low_result_len = 0             # <<<<<<<<<<<<<<
@@ -41457,7 +41460,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":611
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":612
  * 
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)             # <<<<<<<<<<<<<<
@@ -41466,7 +41469,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_low1, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, __pyx_v_low2, __pyx_v_med2_plus, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_low_result_len));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":612
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":613
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0             # <<<<<<<<<<<<<<
@@ -41475,7 +41478,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":613
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":614
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)             # <<<<<<<<<<<<<<
@@ -41484,7 +41487,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med2_minus, __pyx_v_high2, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_high_result_len));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":615
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":616
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)             # <<<<<<<<<<<<<<
@@ -41493,7 +41496,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_low_result, __pyx_v_low_result_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":616
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":617
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)             # <<<<<<<<<<<<<<
@@ -41502,7 +41505,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_med_result, __pyx_v_med_result_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":617
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":618
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)             # <<<<<<<<<<<<<<
@@ -41511,7 +41514,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_high_result, __pyx_v_high_result_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":618
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":619
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)             # <<<<<<<<<<<<<<
@@ -41520,7 +41523,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_low_result);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":619
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":620
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)
  *         free(med_result)             # <<<<<<<<<<<<<<
@@ -41529,7 +41532,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_med_result);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":620
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":621
  *         free(low_result)
  *         free(med_result)
  *         free(high_result)             # <<<<<<<<<<<<<<
@@ -41538,7 +41541,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_high_result);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":622
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":623
  *         free(high_result)
  * 
  *         return result             # <<<<<<<<<<<<<<
@@ -41558,7 +41561,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":626
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":627
  * 
  * 
  *     cdef long compare_matchings_set(self, int i1_minus, int i1_plus, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -41577,7 +41580,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("compare_matchings_set", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":637
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":638
  *         cdef Matching* loc1
  * 
  *         loc1 = &l1_stack             # <<<<<<<<<<<<<<
@@ -41586,7 +41589,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_loc1 = (&__pyx_v_l1_stack);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":639
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":640
  *         loc1 = &l1_stack
  * 
  *         i1 = i1_minus             # <<<<<<<<<<<<<<
@@ -41595,7 +41598,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_i1 = __pyx_v_i1_minus;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":640
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":641
  * 
  *         i1 = i1_minus
  *         while i1 < i1_plus:             # <<<<<<<<<<<<<<
@@ -41606,7 +41609,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 < __pyx_v_i1_plus);
     if (!__pyx_t_1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":641
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":642
  *         i1 = i1_minus
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41615,7 +41618,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_f_3_sa_assign_matching(__pyx_v_loc1, __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":642
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":643
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -41624,7 +41627,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, __pyx_v_loc1, __pyx_v_loc2, __pyx_v_offset_by_one, __pyx_v_len_last);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":643
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":644
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:             # <<<<<<<<<<<<<<
@@ -41634,7 +41637,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_comparison == 0);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":644
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":645
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:
  *                 prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -41643,7 +41646,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
       __pyx_v_prev_comparison = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":645
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":646
  *             if comparison == 0:
  *                 prev_comparison = 0
  *                 break             # <<<<<<<<<<<<<<
@@ -41654,7 +41657,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       goto __pyx_L5;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":646
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":647
  *                 prev_comparison = 0
  *                 break
  *             elif i1 == i1_minus:             # <<<<<<<<<<<<<<
@@ -41664,7 +41667,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 == __pyx_v_i1_minus);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":647
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":648
  *                 break
  *             elif i1 == i1_minus:
  *                 prev_comparison = comparison             # <<<<<<<<<<<<<<
@@ -41676,7 +41679,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":649
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":650
  *                 prev_comparison = comparison
  *             else:
  *                 if comparison != prev_comparison:             # <<<<<<<<<<<<<<
@@ -41686,7 +41689,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       __pyx_t_1 = (__pyx_v_comparison != __pyx_v_prev_comparison);
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":650
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":651
  *             else:
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -41695,7 +41698,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
         __pyx_v_prev_comparison = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":651
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":652
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -41709,7 +41712,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":652
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":653
  *                     prev_comparison = 0
  *                     break
  *             i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -41720,7 +41723,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   }
   __pyx_L4_break:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":653
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":654
  *                     break
  *             i1 = i1 + step1
  *         return prev_comparison             # <<<<<<<<<<<<<<
@@ -41736,7 +41739,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":656
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":657
  * 
  * 
  *     cdef long compare_matchings(self, Matching* loc1, Matching* loc2, int offset_by_one, int len_last):             # <<<<<<<<<<<<<<
@@ -41754,7 +41757,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   int __pyx_t_4;
   __Pyx_RefNannySetupContext("compare_matchings", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":659
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":660
  *         cdef int i
  * 
  *         if loc1.sent_id > loc2.sent_id:             # <<<<<<<<<<<<<<
@@ -41764,7 +41767,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc1->sent_id > __pyx_v_loc2->sent_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":660
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":661
  * 
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1             # <<<<<<<<<<<<<<
@@ -41777,7 +41780,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":661
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":662
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:             # <<<<<<<<<<<<<<
@@ -41787,7 +41790,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc2->sent_id > __pyx_v_loc1->sent_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":662
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":663
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:
  *             return -1             # <<<<<<<<<<<<<<
@@ -41800,7 +41803,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":664
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":665
  *             return -1
  * 
  *         if loc1.size == 1 and loc2.size == 1:             # <<<<<<<<<<<<<<
@@ -41816,7 +41819,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":665
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":666
  * 
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:             # <<<<<<<<<<<<<<
@@ -41826,7 +41829,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc2->arr[__pyx_v_loc2->start]) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) <= __pyx_v_self->train_min_gap_size);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":666
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":667
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -41841,7 +41844,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     goto __pyx_L5;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":668
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":669
  *                 return 1
  * 
  *         elif offset_by_one:             # <<<<<<<<<<<<<<
@@ -41850,7 +41853,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
  */
   if (__pyx_v_offset_by_one) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":669
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":670
  * 
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -41860,7 +41863,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":670
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":671
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -41870,7 +41873,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":671
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":672
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -41883,7 +41886,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L9:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":672
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":673
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -41893,7 +41896,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":673
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":674
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -41910,7 +41913,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":676
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":677
  * 
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -41920,7 +41923,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) > (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":677
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":678
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -41933,7 +41936,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L11:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":678
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":679
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -41943,7 +41946,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) < (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":679
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":680
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -41956,7 +41959,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L12:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":681
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":682
  *                 return -1
  * 
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -41966,7 +41969,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":682
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":683
  * 
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -41976,7 +41979,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":683
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":684
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -41989,7 +41992,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L15:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":684
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":685
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -41999,7 +42002,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":685
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":686
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -42015,7 +42018,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":687
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":688
  *                     return -1
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -42025,7 +42028,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_3 = ((((__pyx_v_loc2->arr[(__pyx_v_loc2->end - 1)]) + __pyx_v_len_last) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) > __pyx_v_self->train_max_initial_size);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":688
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":689
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1             # <<<<<<<<<<<<<<
@@ -42038,7 +42041,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L17:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":689
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":690
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1
  *         return 0             # <<<<<<<<<<<<<<
@@ -42054,7 +42057,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":692
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":693
  * 
  * 
  *     cdef int* merge_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -42078,7 +42081,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("merge_helper", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":700
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":701
  *         cdef Matching loc1, loc2
  * 
  *         result_len[0] = 0             # <<<<<<<<<<<<<<
@@ -42087,7 +42090,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   (__pyx_v_result_len[0]) = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":701
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":702
  * 
  *         result_len[0] = 0
  *         result = <int*> malloc(0*sizeof(int))             # <<<<<<<<<<<<<<
@@ -42096,7 +42099,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":703
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":704
  *         result = <int*> malloc(0*sizeof(int))
  * 
  *         i1 = low1             # <<<<<<<<<<<<<<
@@ -42105,7 +42108,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i1 = __pyx_v_low1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":704
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":705
  * 
  *         i1 = low1
  *         i2 = low2             # <<<<<<<<<<<<<<
@@ -42114,7 +42117,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i2 = __pyx_v_low2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":705
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":706
  *         i1 = low1
  *         i2 = low2
  *         while i1 < high1 and i2 < high2:             # <<<<<<<<<<<<<<
@@ -42131,7 +42134,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":708
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":709
  * 
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42140,7 +42143,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":709
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":710
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:             # <<<<<<<<<<<<<<
@@ -42151,7 +42154,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":710
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":711
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42160,7 +42163,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":711
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":712
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -42170,7 +42173,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":712
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":713
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -42182,7 +42185,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":714
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":715
  *                     i2 = i2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -42195,7 +42198,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     __pyx_L6_break:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":717
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":718
  * 
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1             # <<<<<<<<<<<<<<
@@ -42204,7 +42207,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_v_j1 = __pyx_v_i1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":718
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":719
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:             # <<<<<<<<<<<<<<
@@ -42221,7 +42224,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       if (!__pyx_t_2) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":719
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":720
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42230,7 +42233,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":720
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":721
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2             # <<<<<<<<<<<<<<
@@ -42239,7 +42242,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_v_j2 = __pyx_v_i2;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":721
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":722
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2
  *                 while j2 < high2:             # <<<<<<<<<<<<<<
@@ -42250,7 +42253,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_j2 < __pyx_v_high2);
         if (!__pyx_t_2) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":722
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":723
  *                 j2 = i2
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42259,7 +42262,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_j2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":723
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":724
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -42268,7 +42271,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":724
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":725
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -42278,7 +42281,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == 0);
         if (__pyx_t_2) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":725
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":726
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -42290,7 +42293,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L12:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":726
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":727
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)
  *                     if comparison == 1:             # <<<<<<<<<<<<<<
@@ -42303,7 +42306,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L13:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":728
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":729
  *                     if comparison == 1:
  *                         pass
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -42313,7 +42316,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == -1);
         if (__pyx_t_2) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":729
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":730
  *                         pass
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -42325,7 +42328,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":731
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":732
  *                         break
  *                     else:
  *                         j2 = j2 + step2             # <<<<<<<<<<<<<<
@@ -42338,7 +42341,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       __pyx_L11_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":732
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":733
  *                     else:
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -42349,7 +42352,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":733
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":734
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1
  *         return result             # <<<<<<<<<<<<<<
@@ -42365,7 +42368,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":736
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":737
  * 
  * 
  *     cdef void sort_phrase_loc(self, IntList arr, PhraseLocation loc, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -42387,26 +42390,26 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("sort_phrase_loc", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":741
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":742
  *         cdef IntList result
  * 
  *         if phrase in self.precomputed_index:             # <<<<<<<<<<<<<<
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_phrase), __pyx_v_self->precomputed_index, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_phrase), __pyx_v_self->precomputed_index, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":742
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":743
  * 
  *         if phrase in self.precomputed_index:
  *             loc.arr = self.precomputed_index[phrase]             # <<<<<<<<<<<<<<
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GIVEREF(__pyx_t_2);
     __Pyx_GOTREF(__pyx_v_loc->arr);
     __Pyx_DECREF(((PyObject *)__pyx_v_loc->arr));
@@ -42416,20 +42419,20 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":744
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":745
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)             # <<<<<<<<<<<<<<
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:
  */
-    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_loc->sa_high - __pyx_v_loc->sa_low)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_loc->sa_high - __pyx_v_loc->sa_low)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_GIVEREF(__pyx_t_3);
@@ -42438,27 +42441,27 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_v_loc->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":745
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":746
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)             # <<<<<<<<<<<<<<
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])
  */
-    __pyx_t_3 = PyInt_FromLong(__pyx_v_arr->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong(__pyx_v_arr->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_VEB)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_VEB)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":746
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":747
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:             # <<<<<<<<<<<<<<
@@ -42468,7 +42471,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = __pyx_v_loc->sa_high;
     for (__pyx_v_i = __pyx_v_loc->sa_low; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":747
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":748
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])             # <<<<<<<<<<<<<<
@@ -42478,7 +42481,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
       ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_v_veb->__pyx_vtab)->_insert(__pyx_v_veb, (__pyx_v_arr->arr[__pyx_v_i]));
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":748
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":749
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -42487,7 +42490,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
     __pyx_v_i = __pyx_v_veb->veb->min_val;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":749
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":750
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:             # <<<<<<<<<<<<<<
@@ -42497,7 +42500,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = (__pyx_v_loc->sa_high - __pyx_v_loc->sa_low);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":750
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":751
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i             # <<<<<<<<<<<<<<
@@ -42506,7 +42509,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
       (__pyx_v_loc->arr->arr[__pyx_v_j]) = __pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":751
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":752
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -42518,7 +42521,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":752
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":753
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0             # <<<<<<<<<<<<<<
@@ -42527,7 +42530,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
   __pyx_v_loc->arr_low = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":753
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":754
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0
  *         loc.arr_high = loc.arr.len             # <<<<<<<<<<<<<<
@@ -42546,7 +42549,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":756
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":757
  * 
  * 
  *     cdef intersect_helper(self, Phrase prefix, Phrase suffix,             # <<<<<<<<<<<<<<
@@ -42583,7 +42586,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("intersect_helper", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":763
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":764
  *         cdef int* result_ptr
  * 
  *         result_len = 0             # <<<<<<<<<<<<<<
@@ -42592,21 +42595,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":765
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":766
  *         result_len = 0
  * 
  *         if sym_isvar(suffix[0]):             # <<<<<<<<<<<<<<
  *             offset_by_one = 1
  *         else:
  */
-  __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_suffix), 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_suffix), 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_t_2);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":766
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":767
  * 
  *         if sym_isvar(suffix[0]):
  *             offset_by_one = 1             # <<<<<<<<<<<<<<
@@ -42618,7 +42621,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":768
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":769
  *             offset_by_one = 1
  *         else:
  *             offset_by_one = 0             # <<<<<<<<<<<<<<
@@ -42629,34 +42632,34 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":770
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":771
  *             offset_by_one = 0
  * 
  *         len_last = len(suffix.getchunk(suffix.arity()))             # <<<<<<<<<<<<<<
  * 
  *         if prefix_loc.arr is None:
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__getchunk); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__getchunk); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
   __Pyx_GIVEREF(__pyx_t_5);
   __pyx_t_5 = 0;
-  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-  __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_len_last = __pyx_t_6;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":772
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":773
  *         len_last = len(suffix.getchunk(suffix.arity()))
  * 
  *         if prefix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -42666,7 +42669,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_prefix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":773
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":774
  * 
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)             # <<<<<<<<<<<<<<
@@ -42681,7 +42684,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":774
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":775
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr             # <<<<<<<<<<<<<<
@@ -42691,7 +42694,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_prefix_loc->arr));
   __pyx_v_arr1 = __pyx_v_prefix_loc->arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":775
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":776
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -42700,7 +42703,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low1 = __pyx_v_prefix_loc->arr_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":776
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":777
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -42709,7 +42712,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high1 = __pyx_v_prefix_loc->arr_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":777
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":778
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high
  *         step1 = prefix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -42718,7 +42721,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step1 = __pyx_v_prefix_loc->num_subpatterns;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":779
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":780
  *         step1 = prefix_loc.num_subpatterns
  * 
  *         if suffix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -42728,7 +42731,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_suffix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":780
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":781
  * 
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)             # <<<<<<<<<<<<<<
@@ -42743,7 +42746,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":781
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":782
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr             # <<<<<<<<<<<<<<
@@ -42753,7 +42756,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_suffix_loc->arr));
   __pyx_v_arr2 = __pyx_v_suffix_loc->arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":782
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":783
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -42762,7 +42765,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low2 = __pyx_v_suffix_loc->arr_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":783
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":784
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -42771,7 +42774,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high2 = __pyx_v_suffix_loc->arr_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":784
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":785
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high
  *         step2 = suffix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -42780,26 +42783,26 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step2 = __pyx_v_suffix_loc->num_subpatterns;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":786
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":787
  *         step2 = suffix_loc.num_subpatterns
  * 
  *         num_subpatterns = prefix.arity()+1             # <<<<<<<<<<<<<<
  * 
  *         if algorithm == MERGE:
  */
-  __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_prefix), __pyx_n_s__arity); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_prefix), __pyx_n_s__arity); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_num_subpatterns = __pyx_t_3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":788
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":789
  *         num_subpatterns = prefix.arity()+1
  * 
  *         if algorithm == MERGE:             # <<<<<<<<<<<<<<
@@ -42809,7 +42812,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_algorithm == __pyx_v_3_sa_MERGE);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":791
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":792
  *             result_ptr = self.merge_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -42821,7 +42824,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":795
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":796
  *             result_ptr = self.baeza_yates_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -42832,7 +42835,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":797
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":798
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)
  * 
  *         if result_len == 0:             # <<<<<<<<<<<<<<
@@ -42842,7 +42845,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_result_len == 0);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":798
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":799
  * 
  *         if result_len == 0:
  *             free(result_ptr)             # <<<<<<<<<<<<<<
@@ -42851,7 +42854,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result_ptr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":799
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":800
  *         if result_len == 0:
  *             free(result_ptr)
  *             return None             # <<<<<<<<<<<<<<
@@ -42866,19 +42869,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":801
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":802
  *             return None
  *         else:
  *             result = IntList()             # <<<<<<<<<<<<<<
  *             free(result.arr)
  *             result.arr = result_ptr
  */
-    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_v_result = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":802
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":803
  *         else:
  *             result = IntList()
  *             free(result.arr)             # <<<<<<<<<<<<<<
@@ -42887,7 +42890,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":803
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":804
  *             result = IntList()
  *             free(result.arr)
  *             result.arr = result_ptr             # <<<<<<<<<<<<<<
@@ -42896,7 +42899,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->arr = __pyx_v_result_ptr;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":804
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":805
  *             free(result.arr)
  *             result.arr = result_ptr
  *             result.len = result_len             # <<<<<<<<<<<<<<
@@ -42905,7 +42908,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->len = __pyx_v_result_len;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":805
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":806
  *             result.arr = result_ptr
  *             result.len = result_len
  *             result.size = result_len             # <<<<<<<<<<<<<<
@@ -42914,7 +42917,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->size = __pyx_v_result_len;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":806
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":807
  *             result.len = result_len
  *             result.size = result_len
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)             # <<<<<<<<<<<<<<
@@ -42922,19 +42925,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  *     cdef loc2str(self, PhraseLocation loc):
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_result_len); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_result_len); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr), ((PyObject *)__pyx_v_result)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr), ((PyObject *)__pyx_v_result)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_r = __pyx_t_4;
@@ -42960,7 +42963,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":808
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":809
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)
  * 
  *     cdef loc2str(self, PhraseLocation loc):             # <<<<<<<<<<<<<<
@@ -42983,7 +42986,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("loc2str", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":810
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":811
  *     cdef loc2str(self, PhraseLocation loc):
  *         cdef int i, j
  *         result = "{"             # <<<<<<<<<<<<<<
@@ -42993,7 +42996,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_116));
   __pyx_v_result = ((PyObject *)__pyx_kp_s_116);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":811
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":812
  *         cdef int i, j
  *         result = "{"
  *         i = 0             # <<<<<<<<<<<<<<
@@ -43002,7 +43005,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":812
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":813
  *         result = "{"
  *         i = 0
  *         while i < loc.arr_high:             # <<<<<<<<<<<<<<
@@ -43013,20 +43016,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_t_1 = (__pyx_v_i < __pyx_v_loc->arr_high);
     if (!__pyx_t_1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":813
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":814
  *         i = 0
  *         while i < loc.arr_high:
  *             result = result + "("             # <<<<<<<<<<<<<<
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  */
-    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_117)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_117)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_v_result);
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":814
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":815
  *         while i < loc.arr_high:
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -43036,19 +43039,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_t_3 = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
     for (__pyx_v_j = __pyx_v_i; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":815
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":816
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])             # <<<<<<<<<<<<<<
  *             result = result + ")"
  *             i = i + loc.num_subpatterns
  */
-      __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_loc->arr), __pyx_v_j, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_loc->arr), __pyx_v_j, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_v_result);
@@ -43056,20 +43059,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
       __pyx_t_2 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":816
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":817
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"             # <<<<<<<<<<<<<<
  *             i = i + loc.num_subpatterns
  *         result = result + "}"
  */
-    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_59)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_59)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_v_result);
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":817
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":818
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"
  *             i = i + loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -43079,20 +43082,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_v_i = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":818
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":819
  *             result = result + ")"
  *             i = i + loc.num_subpatterns
  *         result = result + "}"             # <<<<<<<<<<<<<<
  *         return result
  * 
  */
-  __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_118)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_118)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_v_result);
   __pyx_v_result = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":819
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":820
  *             i = i + loc.num_subpatterns
  *         result = result + "}"
  *         return result             # <<<<<<<<<<<<<<
@@ -43118,7 +43121,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":821
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":822
  *         return result
  * 
  *     cdef PhraseLocation intersect(self, prefix_node, suffix_node, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -43144,81 +43147,81 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("intersect", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":825
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":826
  *         cdef PhraseLocation prefix_loc, suffix_loc, result
  * 
  *         prefix = prefix_node.phrase             # <<<<<<<<<<<<<<
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_prefix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":826
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":827
  * 
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase             # <<<<<<<<<<<<<<
  *         prefix_loc = prefix_node.phrase_location
  *         suffix_loc = suffix_node.phrase_location
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_suffix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":827
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":828
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location             # <<<<<<<<<<<<<<
  *         suffix_loc = suffix_node.phrase_location
  * 
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_prefix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":828
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":829
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location
  *         suffix_loc = suffix_node.phrase_location             # <<<<<<<<<<<<<<
  * 
  *         result = self.get_precomputed_collocation(phrase)
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_suffix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":830
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":831
  *         suffix_loc = suffix_node.phrase_location
  * 
  *         result = self.get_precomputed_collocation(phrase)             # <<<<<<<<<<<<<<
  *         if result is not None:
  *             intersect_method = "precomputed"
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_119); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_119); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)__pyx_v_phrase));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_phrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_phrase));
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":831
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":832
  * 
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:             # <<<<<<<<<<<<<<
@@ -43228,7 +43231,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) != Py_None);
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":832
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":833
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:
  *             intersect_method = "precomputed"             # <<<<<<<<<<<<<<
@@ -43241,7 +43244,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":834
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":835
  *             intersect_method = "precomputed"
  * 
  *         if result is None:             # <<<<<<<<<<<<<<
@@ -43251,7 +43254,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) == Py_None);
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":835
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":836
  * 
  *         if result is None:
  *             if self.use_baeza_yates:             # <<<<<<<<<<<<<<
@@ -43260,21 +43263,21 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
  */
     if (__pyx_v_self->use_baeza_yates) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":836
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":837
  *         if result is None:
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)             # <<<<<<<<<<<<<<
  *                 intersect_method="double binary"
  *             else:
  */
-      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_BAEZA_YATES); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_BAEZA_YATES); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_v_result));
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":837
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":838
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)
  *                 intersect_method="double binary"             # <<<<<<<<<<<<<<
@@ -43288,21 +43291,21 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":839
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":840
  *                 intersect_method="double binary"
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)             # <<<<<<<<<<<<<<
  *                 intersect_method="merge"
  *         return result
  */
-      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_MERGE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_MERGE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_v_result));
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":840
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":841
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"             # <<<<<<<<<<<<<<
@@ -43318,7 +43321,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":841
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":842
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"
  *         return result             # <<<<<<<<<<<<<<
@@ -43380,16 +43383,16 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -43404,7 +43407,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -43415,7 +43418,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":843
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":844
  *         return result
  * 
  *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
@@ -43456,19 +43459,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("advance", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":845
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":846
  *     def advance(self, frontier, res, fwords):
  *         cdef unsigned na
  *         nf = []             # <<<<<<<<<<<<<<
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_nf = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":846
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":847
  *         cdef unsigned na
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:             # <<<<<<<<<<<<<<
@@ -43479,7 +43482,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_t_1 = __pyx_v_frontier; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_frontier); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_frontier); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -43487,23 +43490,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -43519,7 +43522,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       if (unlikely(size != 2)) {
         if (size > 2) __Pyx_RaiseTooManyValuesError(2);
         else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
@@ -43532,14 +43535,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
       #else
-      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     } else
     {
       Py_ssize_t index = -1;
-      __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
@@ -43547,7 +43550,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_GOTREF(__pyx_t_5);
       index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L6_unpacking_done;
@@ -43555,7 +43558,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       __pyx_t_8 = NULL;
       if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L6_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_toskip);
@@ -43571,7 +43574,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       if (unlikely(size != 3)) {
         if (size > 3) __Pyx_RaiseTooManyValuesError(3);
         else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
@@ -43587,15 +43590,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_INCREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_t_10);
       #else
-      __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_10 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     } else
     {
       Py_ssize_t index = -1;
-      __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_11)->tp_iternext;
@@ -43605,7 +43608,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_GOTREF(__pyx_t_9);
       index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_10);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
       goto __pyx_L8_unpacking_done;
@@ -43613,7 +43616,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
       __pyx_t_8 = NULL;
       if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L8_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_i);
@@ -43626,45 +43629,45 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_v_pathlen = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":847
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":848
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))
  */
-    __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_i); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_i); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_6 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_XDECREF(__pyx_v_spanlen);
     __pyx_v_spanlen = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":848
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":849
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):             # <<<<<<<<<<<<<<
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":849
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":850
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))             # <<<<<<<<<<<<<<
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  */
-      __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_v_i);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
@@ -43675,7 +43678,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_INCREF(__pyx_v_pathlen);
       PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_pathlen);
       __Pyx_GIVEREF(__pyx_v_pathlen);
-      __pyx_t_6 = __Pyx_PyObject_Append(__pyx_v_res, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Append(__pyx_v_res, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
@@ -43683,42 +43686,42 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     }
     __pyx_L9:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":850
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":851
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen             # <<<<<<<<<<<<<<
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):
  */
-    __pyx_t_6 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_XDECREF(__pyx_v_ni);
     __pyx_v_ni = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":851
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":852
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):             # <<<<<<<<<<<<<<
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  */
-    __pyx_t_13 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
-      __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_6 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_15 = __pyx_t_14;
     } else {
@@ -43726,34 +43729,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     }
     if (__pyx_t_15) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":852
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":853
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):             # <<<<<<<<<<<<<<
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):
  */
-      __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ni); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ni); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_13 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_13 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_13; __pyx_t_16+=1) {
         __pyx_v_na = __pyx_t_16;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":853
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":854
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))             # <<<<<<<<<<<<<<
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)
  */
-        __pyx_t_5 = PyNumber_Subtract(__pyx_v_toskip, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyNumber_Subtract(__pyx_v_toskip, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_na); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_na); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_INCREF(__pyx_v_ni);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_ni);
@@ -43764,7 +43767,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
         __Pyx_GIVEREF(__pyx_t_4);
         __pyx_t_6 = 0;
         __pyx_t_4 = 0;
-        __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
@@ -43772,7 +43775,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
         __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
         __pyx_t_5 = 0;
         __pyx_t_10 = 0;
-        __pyx_t_17 = PyList_Append(__pyx_v_nf, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = PyList_Append(__pyx_v_nf, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       }
       goto __pyx_L10;
@@ -43781,18 +43784,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":854
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":855
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):             # <<<<<<<<<<<<<<
  *             return self.advance(nf, res, fwords)
  *         else:
  */
-  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_15 = (__pyx_t_2 > 0);
   if (__pyx_t_15) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":855
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":856
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)             # <<<<<<<<<<<<<<
@@ -43800,9 +43803,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *             return res
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 856; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 856; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_v_nf));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_nf));
@@ -43813,7 +43816,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
-    __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 856; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -43824,7 +43827,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":857
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":858
  *             return self.advance(nf, res, fwords)
  *         else:
  *             return res             # <<<<<<<<<<<<<<
@@ -43902,36 +43905,36 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
         if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
         if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
         if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  6:
         if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 7) {
       goto __pyx_L5_argtuple_error;
@@ -43954,7 +43957,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_all_nodes_isteps_away", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -43965,7 +43968,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":859
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":860
  *             return res
  * 
  *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
@@ -44003,41 +44006,41 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_all_nodes_isteps_away", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":861
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":862
  *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):
  *         cdef unsigned alt_it
  *         frontier = []             # <<<<<<<<<<<<<<
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_frontier = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":862
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":863
  *         cdef unsigned alt_it
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):             # <<<<<<<<<<<<<<
  *             return frontier
  *         key = tuple([i,spanlen])
  */
-  __pyx_t_1 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_skip); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_skip); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = PyObject_Length(__pyx_v_next_states); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Length(__pyx_v_next_states); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":863
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":864
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier             # <<<<<<<<<<<<<<
@@ -44052,14 +44055,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":864
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":865
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier
  *         key = tuple([i,spanlen])             # <<<<<<<<<<<<<<
  *         reachable = []
  *         if (key in reachable_buffer):
  */
-  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(__pyx_v_i);
   PyList_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
@@ -44067,42 +44070,42 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   __Pyx_INCREF(__pyx_v_spanlen);
   PyList_SET_ITEM(__pyx_t_4, 1, __pyx_v_spanlen);
   __Pyx_GIVEREF(__pyx_v_spanlen);
-  __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_t_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_t_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
   __pyx_v_key = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":865
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":866
  *             return frontier
  *         key = tuple([i,spanlen])
  *         reachable = []             # <<<<<<<<<<<<<<
  *         if (key in reachable_buffer):
  *             reachable = reachable_buffer[key]
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_reachable = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":866
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":867
  *         key = tuple([i,spanlen])
  *         reachable = []
  *         if (key in reachable_buffer):             # <<<<<<<<<<<<<<
  *             reachable = reachable_buffer[key]
  *         else:
  */
-  __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_key), __pyx_v_reachable_buffer, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_key), __pyx_v_reachable_buffer, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":867
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":868
  *         reachable = []
  *         if (key in reachable_buffer):
  *             reachable = reachable_buffer[key]             # <<<<<<<<<<<<<<
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)
  */
-    __pyx_t_1 = PyObject_GetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_v_reachable);
     __pyx_v_reachable = __pyx_t_1;
@@ -44111,16 +44114,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":869
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":870
  *             reachable = reachable_buffer[key]
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)             # <<<<<<<<<<<<<<
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_fwords);
@@ -44131,7 +44134,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __Pyx_INCREF(__pyx_v_spanlen);
     PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_spanlen);
     __Pyx_GIVEREF(__pyx_v_spanlen);
-    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -44139,18 +44142,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_v_reachable = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":870
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":871
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable             # <<<<<<<<<<<<<<
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:
  */
-    if (PyObject_SetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key), __pyx_v_reachable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key), __pyx_v_reachable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":871
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":872
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:             # <<<<<<<<<<<<<<
@@ -44161,7 +44164,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_t_2 = __pyx_v_reachable; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_6 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_reachable); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_reachable); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
@@ -44169,23 +44172,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     if (!__pyx_t_6 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_6 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_6(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -44195,20 +44198,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_v_nextreachable = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":872
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":873
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:             # <<<<<<<<<<<<<<
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:
  */
-    __pyx_t_4 = PyObject_GetItem(__pyx_v_next_states, __pyx_v_nextreachable); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetItem(__pyx_v_next_states, __pyx_v_nextreachable); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
       __pyx_t_1 = __pyx_t_4; __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
       __pyx_t_8 = NULL;
     } else {
-      __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
     }
@@ -44217,23 +44220,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else {
         __pyx_t_4 = __pyx_t_8(__pyx_t_1);
         if (unlikely(!__pyx_t_4)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -44243,16 +44246,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       __pyx_v_next_id = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":873
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":874
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)             # <<<<<<<<<<<<<<
  *                 if jump < skip:
  *                     continue
  */
-      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_fwords);
@@ -44263,7 +44266,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       __Pyx_INCREF(__pyx_v_next_id);
       PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_v_next_id);
       __Pyx_GIVEREF(__pyx_v_next_id);
-      __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
@@ -44271,19 +44274,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       __pyx_v_jump = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":874
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":875
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:             # <<<<<<<<<<<<<<
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  */
-      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":875
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":876
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:
  *                     continue             # <<<<<<<<<<<<<<
@@ -44295,50 +44298,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       }
       __pyx_L9:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":876
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":877
  *                 if jump < skip:
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  */
-      __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":877
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":878
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):             # <<<<<<<<<<<<<<
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)
  */
-        __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_11 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4);
         __Pyx_GIVEREF(__pyx_t_4);
         __pyx_t_4 = 0;
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
         if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
           __pyx_t_9 = __pyx_t_4; __Pyx_INCREF(__pyx_t_9); __pyx_t_11 = 0;
           __pyx_t_12 = NULL;
         } else {
-          __pyx_t_11 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_12 = Py_TYPE(__pyx_t_9)->tp_iternext;
         }
@@ -44347,23 +44350,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
           if (!__pyx_t_12 && PyList_CheckExact(__pyx_t_9)) {
             if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_9)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else if (!__pyx_t_12 && PyTuple_CheckExact(__pyx_t_9)) {
             if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else {
             __pyx_t_4 = __pyx_t_12(__pyx_t_9);
             if (unlikely(!__pyx_t_4)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
@@ -44373,40 +44376,40 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
           __pyx_v_alt_id = __pyx_t_4;
           __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":878
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":879
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:
  */
-          __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_10 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt_id); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt_id); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_13 = PyObject_RichCompare(__pyx_t_4, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_13 = PyObject_RichCompare(__pyx_t_4, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
           if (__pyx_t_5) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":879
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":880
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)             # <<<<<<<<<<<<<<
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  */
-            __pyx_t_13 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_13);
-            __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_INCREF(__pyx_v_next_id);
             PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
@@ -44421,26 +44424,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
             __pyx_v_newel = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":880
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":881
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:             # <<<<<<<<<<<<<<
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier
  */
-            __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_newel), ((PyObject *)__pyx_v_frontier), Py_NE)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_newel), ((PyObject *)__pyx_v_frontier), Py_NE)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (__pyx_t_5) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":881
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":882
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))             # <<<<<<<<<<<<<<
  *         return frontier
  * 
  */
-              __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_13);
               __Pyx_INCREF(__pyx_v_next_id);
               PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_v_next_id);
@@ -44451,7 +44454,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
               PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
               __Pyx_GIVEREF(__pyx_t_10);
               __pyx_t_10 = 0;
-              __pyx_t_14 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
               goto __pyx_L14;
             }
@@ -44470,7 +44473,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":882
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":883
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier             # <<<<<<<<<<<<<<
@@ -44537,16 +44540,16 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -44561,7 +44564,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.reachable", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -44572,7 +44575,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":884
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":885
  *         return frontier
  * 
  *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
@@ -44602,35 +44605,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("reachable", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":885
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":886
  * 
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []             # <<<<<<<<<<<<<<
  *         if (ifrom >= len(fwords)):
  *             return ret
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":886
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":887
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []
  *         if (ifrom >= len(fwords)):             # <<<<<<<<<<<<<<
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):
  */
-  __pyx_t_2 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":887
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":888
  *         ret = []
  *         if (ifrom >= len(fwords)):
  *             return ret             # <<<<<<<<<<<<<<
@@ -44645,32 +44648,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":888
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":889
  *         if (ifrom >= len(fwords)):
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
  *             if (fwords[ifrom][alt_id][0] == EPSILON):
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  */
-  __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_2 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
     __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -44679,23 +44682,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_3 = __pyx_t_5(__pyx_t_1);
       if (unlikely(!__pyx_t_3)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -44705,53 +44708,53 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
     __pyx_v_alt_id = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":889
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":890
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):             # <<<<<<<<<<<<<<
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  *             else:
  */
-    __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_6 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":890
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":891
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))             # <<<<<<<<<<<<<<
  *             else:
  *                 if (dist==0):
  */
-      __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_8 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_8, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_8, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fwords);
@@ -44762,16 +44765,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
       PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_dist);
       __Pyx_GIVEREF(__pyx_v_dist);
       __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_8);
       __Pyx_GIVEREF(__pyx_t_8);
       __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -44780,36 +44783,36 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":892
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":893
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  *             else:
  *                 if (dist==0):             # <<<<<<<<<<<<<<
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)
  */
-      __pyx_t_8 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":893
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":894
  *             else:
  *                 if (dist==0):
  *                     if (ifrom not in ret):             # <<<<<<<<<<<<<<
  *                         ret.append(ifrom)
  *                 else:
  */
-        __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifrom, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifrom, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":894
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":895
  *                 if (dist==0):
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)             # <<<<<<<<<<<<<<
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  */
-          __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           goto __pyx_L8;
         }
         __pyx_L8:;
@@ -44817,29 +44820,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":896
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":897
  *                         ret.append(ifrom)
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):             # <<<<<<<<<<<<<<
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)
  */
-        __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_7 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = PyNumber_Subtract(__pyx_v_dist, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyNumber_Subtract(__pyx_v_dist, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
         __Pyx_INCREF(__pyx_v_fwords);
         PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_fwords);
@@ -44850,7 +44853,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
         __Pyx_GIVEREF(__pyx_t_3);
         __pyx_t_7 = 0;
         __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
@@ -44858,7 +44861,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
           __pyx_t_6 = __pyx_t_3; __Pyx_INCREF(__pyx_t_6); __pyx_t_10 = 0;
           __pyx_t_11 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_6);
           __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext;
         }
@@ -44867,23 +44870,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
           if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_6)) {
             if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_6)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_6)) {
             if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else {
             __pyx_t_3 = __pyx_t_11(__pyx_t_6);
             if (unlikely(!__pyx_t_3)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
@@ -44893,24 +44896,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
           __pyx_v_ifromchild = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":897
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":898
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):             # <<<<<<<<<<<<<<
  *                             ret.append(ifromchild)
  * 
  */
-          __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifromchild, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifromchild, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_4) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":898
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":899
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)             # <<<<<<<<<<<<<<
  * 
  *         return ret
  */
-            __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             goto __pyx_L11;
           }
           __pyx_L11:;
@@ -44923,7 +44926,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":900
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":901
  *                             ret.append(ifromchild)
  * 
  *         return ret             # <<<<<<<<<<<<<<
@@ -44984,16 +44987,16 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -45008,7 +45011,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.shortest", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -45019,7 +45022,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":902
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":903
  *         return ret
  * 
  *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
@@ -45044,7 +45047,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("shortest", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":904
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":905
  *     def shortest(self, fwords, ifrom, ito):
  *         cdef unsigned alt_id
  *         min = 1000             # <<<<<<<<<<<<<<
@@ -45054,19 +45057,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   __Pyx_INCREF(__pyx_int_1000);
   __pyx_v_min = __pyx_int_1000;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":905
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":906
  *         cdef unsigned alt_id
  *         min = 1000
  *         if (ifrom > ito):             # <<<<<<<<<<<<<<
  *             return min
  *         if (ifrom == ito):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":906
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":907
  *         min = 1000
  *         if (ifrom > ito):
  *             return min             # <<<<<<<<<<<<<<
@@ -45081,19 +45084,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":907
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":908
  *         if (ifrom > ito):
  *             return min
  *         if (ifrom == ito):             # <<<<<<<<<<<<<<
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":908
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":909
  *             return min
  *         if (ifrom == ito):
  *             return 0             # <<<<<<<<<<<<<<
@@ -45108,41 +45111,41 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":909
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":910
  *         if (ifrom == ito):
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  */
-  __pyx_t_1 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_alt_id = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":910
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":911
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)             # <<<<<<<<<<<<<<
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_fwords);
@@ -45153,7 +45156,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_ito);
     __Pyx_GIVEREF(__pyx_v_ito);
     __pyx_t_6 = 0;
-    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -45161,38 +45164,38 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __pyx_v_currmin = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":911
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":912
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
  *                 currmin += 1
  *             if (currmin<min):
  */
-    __pyx_t_6 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":912
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":913
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1             # <<<<<<<<<<<<<<
  *             if (currmin<min):
  *                 min = currmin
  */
-      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_currmin, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_currmin, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_v_currmin);
       __pyx_v_currmin = __pyx_t_1;
@@ -45201,19 +45204,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     }
     __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":913
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":914
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  *             if (currmin<min):             # <<<<<<<<<<<<<<
  *                 min = currmin
  *         return min
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 914; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 914; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":914
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":915
  *                 currmin += 1
  *             if (currmin<min):
  *                 min = currmin             # <<<<<<<<<<<<<<
@@ -45228,7 +45231,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __pyx_L8:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":915
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":916
  *             if (currmin<min):
  *                 min = currmin
  *         return min             # <<<<<<<<<<<<<<
@@ -45287,7 +45290,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (kw_args > 0) {
@@ -45296,7 +45299,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -45313,7 +45316,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_next_states", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -45324,7 +45327,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":917
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":918
  *         return min
  * 
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
@@ -45357,26 +45360,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_next_states", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":918
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":919
  * 
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []             # <<<<<<<<<<<<<<
  *         candidate = [[curr_idx,0]]
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":919
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":920
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []
  *         candidate = [[curr_idx,0]]             # <<<<<<<<<<<<<<
  * 
  *         while len(candidate) > 0:
  */
-  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_v_curr_idx);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_curr_idx);
@@ -45384,7 +45387,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   __Pyx_INCREF(__pyx_int_0);
   PyList_SET_ITEM(__pyx_t_1, 1, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
-  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
@@ -45392,7 +45395,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   __pyx_v_candidate = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":921
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":922
  *         candidate = [[curr_idx,0]]
  * 
  *         while len(candidate) > 0:             # <<<<<<<<<<<<<<
@@ -45400,43 +45403,43 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *             if curr[0] >= len(_columns):
  */
   while (1) {
-    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 922; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_4 = (__pyx_t_3 > 0);
     if (!__pyx_t_4) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":922
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":923
  * 
  *         while len(candidate) > 0:
  *             curr = candidate.pop()             # <<<<<<<<<<<<<<
  *             if curr[0] >= len(_columns):
  *                 continue
  */
-    __pyx_t_2 = __Pyx_PyObject_Pop(((PyObject *)__pyx_v_candidate)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 922; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Pop(((PyObject *)__pyx_v_candidate)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_XDECREF(__pyx_v_curr);
     __pyx_v_curr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":923
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":924
  *         while len(candidate) > 0:
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):             # <<<<<<<<<<<<<<
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  */
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyObject_Length(__pyx_v__columns); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Length(__pyx_v__columns); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":924
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":925
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):
  *                 continue             # <<<<<<<<<<<<<<
@@ -45448,30 +45451,30 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":925
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":926
  *             if curr[0] >= len(_columns):
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]
  */
-    __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_t_5, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_t_5, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
-      __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
         __Pyx_DECREF(__pyx_t_1);
-        __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __pyx_t_7 = __pyx_t_6;
     } else {
@@ -45479,38 +45482,38 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":926
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":927
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);             # <<<<<<<<<<<<<<
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  */
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_8 = PyList_Append(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyList_Append(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L6;
     }
     __pyx_L6:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":927
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":928
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]             # <<<<<<<<<<<<<<
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_GetItem(__pyx_v__columns, __pyx_t_1); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetItem(__pyx_v__columns, __pyx_t_1); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_XDECREF(__pyx_v_curr_col);
     __pyx_v_curr_col = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":928
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":929
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:             # <<<<<<<<<<<<<<
@@ -45521,7 +45524,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_t_5 = __pyx_v_curr_col; __Pyx_INCREF(__pyx_t_5); __pyx_t_3 = 0;
       __pyx_t_9 = NULL;
     } else {
-      __pyx_t_3 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_curr_col); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_curr_col); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_9 = Py_TYPE(__pyx_t_5)->tp_iternext;
     }
@@ -45529,23 +45532,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_5)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else {
         __pyx_t_1 = __pyx_t_9(__pyx_t_5);
         if (unlikely(!__pyx_t_1)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -45555,18 +45558,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_v_alt = __pyx_t_1;
       __pyx_t_1 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":929
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":930
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]             # <<<<<<<<<<<<<<
  *                 jump = 1
  *                 if (alt[0] == EPSILON):
  */
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_alt, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_alt, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_10 = PyNumber_Add(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyNumber_Add(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -45574,7 +45577,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_v_next_id = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":930
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":931
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1             # <<<<<<<<<<<<<<
@@ -45585,25 +45588,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __Pyx_XDECREF(__pyx_v_jump);
       __pyx_v_jump = __pyx_int_1;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":931
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":932
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1
  *                 if (alt[0] == EPSILON):             # <<<<<<<<<<<<<<
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  */
-      __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_alt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_alt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":932
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":933
  *                 jump = 1
  *                 if (alt[0] == EPSILON):
  *                     jump = 0             # <<<<<<<<<<<<<<
@@ -45617,30 +45620,30 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       }
       __pyx_L9:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":933
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":934
  *                 if (alt[0] == EPSILON):
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:             # <<<<<<<<<<<<<<
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);
  */
-      __pyx_t_7 = (__Pyx_PySequence_Contains(__pyx_v_next_id, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = (__Pyx_PySequence_Contains(__pyx_v_next_id, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_7) {
-        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
           __Pyx_DECREF(__pyx_t_1);
-          __pyx_t_10 = PyInt_FromLong((__pyx_v_self->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_v_self->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __pyx_t_6 = __pyx_t_4;
       } else {
@@ -45648,19 +45651,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       }
       if (__pyx_t_6) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":934
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":935
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])             # <<<<<<<<<<<<<<
  *         return sorted(result);
  * 
  */
-        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __Pyx_INCREF(__pyx_v_next_id);
         PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_next_id);
@@ -45668,7 +45671,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
         PyList_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
         __Pyx_GIVEREF(__pyx_t_2);
         __pyx_t_2 = 0;
-        __pyx_t_8 = PyList_Append(__pyx_v_candidate, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyList_Append(__pyx_v_candidate, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
         goto __pyx_L10;
       }
@@ -45678,20 +45681,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     __pyx_L3_continue:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":935
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":936
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);             # <<<<<<<<<<<<<<
  * 
- *     def input(self, fwords):
+ *     def input(self, fwords, meta):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
   __pyx_r = __pyx_t_1;
@@ -45722,13 +45725,58 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
 static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords); /*proto*/
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static char __pyx_doc_3_sa_23HieroCachingRuleFactory_22input[] = "When this function is called on the RuleFactory,\n        it looks up all of the rules that can be used to translate\n        the input sentence";
-static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_v_fwords) {
+static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_fwords = 0;
+  PyObject *__pyx_v_meta = 0;
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("input (wrapper)", 0);
-  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_22input(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), ((PyObject *)__pyx_v_fwords));
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__meta,0};
+    PyObject* values[2] = {0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        case  1:
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__meta)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("input", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "input") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    __pyx_v_fwords = values[0];
+    __pyx_v_meta = values[1];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("input", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_22input(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fwords, __pyx_v_meta);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
@@ -45757,7 +45805,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1097
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1098
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
@@ -45776,14 +45824,14 @@ static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda2", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyList_Type))));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)(&PyList_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyList_Type))));
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -45816,16 +45864,16 @@ static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda1", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -45859,7 +45907,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1103
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1104
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
@@ -45877,11 +45925,11 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda3", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -45899,15 +45947,15 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":937
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":938
  *         return sorted(result);
  * 
- *     def input(self, fwords):             # <<<<<<<<<<<<<<
+ *     def input(self, fwords, meta):             # <<<<<<<<<<<<<<
  *         '''When this function is called on the RuleFactory,
  *         it looks up all of the rules that can be used to translate
  */
 
-static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords) {
+static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_obj_3_sa_HieroCachingRuleFactory *__pyx_v_self, PyObject *__pyx_v_fwords, PyObject *__pyx_v_meta) {
   struct __pyx_obj_3_sa___pyx_scope_struct_15_input *__pyx_cur_scope;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -45927,8 +45975,11 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_ob
   __pyx_cur_scope->__pyx_v_fwords = __pyx_v_fwords;
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
+  __pyx_cur_scope->__pyx_v_meta = __pyx_v_meta;
+  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_meta);
+  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_meta);
   {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_cur_scope);
     __Pyx_RefNannyFinishContext();
     return (PyObject *) gen;
@@ -45987,19 +46038,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     return NULL;
   }
   __pyx_L3_first_run:;
-  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":948
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":949
  *         cdef Phrase hiero_phrase
  * 
  *         flen = len(fwords)             # <<<<<<<<<<<<<<
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 948; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_cur_scope->__pyx_v_flen = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":949
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":950
  * 
  *         flen = len(fwords)
  *         start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -46008,7 +46059,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":950
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":951
  *         flen = len(fwords)
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0             # <<<<<<<<<<<<<<
@@ -46017,20 +46068,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_self->extract_time = 0.0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":951
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":952
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}             # <<<<<<<<<<<<<<
  *         hit = 0
  *         reachable_buffer = {}
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":952
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":953
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}
  *         hit = 0             # <<<<<<<<<<<<<<
@@ -46039,33 +46090,33 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_hit = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":953
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":954
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  *         reachable_buffer = {}             # <<<<<<<<<<<<<<
  * 
  *         # Do not cache between sentences
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_cur_scope->__pyx_v_reachable_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":956
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":957
  * 
  *         # Do not cache between sentences
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
  * 
  *         frontier = []
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
@@ -46074,84 +46125,84 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __pyx_cur_scope->__pyx_v_self->rules->root = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":958
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":959
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  * 
  *         frontier = []             # <<<<<<<<<<<<<<
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  */
-  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
   __pyx_cur_scope->__pyx_v_frontier = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":959
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":960
  * 
  *         frontier = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":960
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":961
  *         frontier = []
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
  */
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":961
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":962
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
  * 
  */
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":962
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":963
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))             # <<<<<<<<<<<<<<
  * 
  *         xroot = None
  */
-        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_9 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_10 = PyTuple_New(7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyTuple_New(7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
@@ -46174,7 +46225,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_2 = 0;
         __pyx_t_3 = 0;
         __pyx_t_9 = 0;
-        __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_10)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_10)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
         goto __pyx_L8;
       }
@@ -46182,7 +46233,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":964
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":965
  *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
  * 
  *         xroot = None             # <<<<<<<<<<<<<<
@@ -46193,7 +46244,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_GIVEREF(Py_None);
   __pyx_cur_scope->__pyx_v_xroot = Py_None;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":965
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":966
  * 
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)             # <<<<<<<<<<<<<<
@@ -46202,32 +46253,32 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":966
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":967
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:             # <<<<<<<<<<<<<<
  *             xroot = self.rules.root.children[x1]
  *         else:
  */
-  __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_t_10, __pyx_t_9, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_t_10, __pyx_t_9, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   if (__pyx_t_8) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":967
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":968
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]             # <<<<<<<<<<<<<<
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  */
-    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
-    __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
@@ -46239,21 +46290,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":969
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":970
  *             xroot = self.rules.root.children[x1]
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
  *             self.rules.root.children[x1] = xroot
  * 
  */
-    __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
-    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
     __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
@@ -46262,94 +46313,94 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_cur_scope->__pyx_v_xroot = __pyx_t_9;
     __pyx_t_9 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":970
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":971
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  *             self.rules.root.children[x1] = xroot             # <<<<<<<<<<<<<<
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  */
-    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
-    if (__Pyx_SetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   }
   __pyx_L9:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":972
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":973
  *             self.rules.root.children[x1] = xroot
  * 
  *         for i in range(self.min_gap_size, len(fwords)):             # <<<<<<<<<<<<<<
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_4 = __pyx_cur_scope->__pyx_v_self->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":973
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":974
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
  */
-    __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
-    __pyx_t_5 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":974
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":975
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
  * 
  */
-      __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-      __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":975
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":976
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))             # <<<<<<<<<<<<<<
  * 
  *         next_states = []
  */
-        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_12);
         PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         __pyx_t_7 = 0;
-        __pyx_t_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_13);
         PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
@@ -46372,7 +46423,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_2 = 0;
         __pyx_t_12 = 0;
         __pyx_t_7 = 0;
-        __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
         goto __pyx_L14;
       }
@@ -46380,44 +46431,44 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":977
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":978
  *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
  * 
  *         next_states = []             # <<<<<<<<<<<<<<
  *         for i in range(len(fwords)):
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  */
-  __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 978; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
   __pyx_cur_scope->__pyx_v_next_states = __pyx_t_13;
   __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":978
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":979
  * 
  *         next_states = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  * 
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 978; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":979
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":980
  *         next_states = []
  *         for i in range(len(fwords)):
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))             # <<<<<<<<<<<<<<
  * 
  *         while len(frontier) > 0:
  */
-    __pyx_t_13 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
-    __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
-    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_fwords);
@@ -46428,15 +46479,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __Pyx_GIVEREF(__pyx_t_12);
     __pyx_t_7 = 0;
     __pyx_t_12 = 0;
-    __pyx_t_12 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
     __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_next_states, __pyx_t_12); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_next_states, __pyx_t_12); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":981
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":982
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  * 
  *         while len(frontier) > 0:             # <<<<<<<<<<<<<<
@@ -46444,18 +46495,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  */
   while (1) {
-    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_8 = (__pyx_t_1 > 0);
     if (!__pyx_t_8) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":982
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":983
  * 
  *         while len(frontier) > 0:
  *             new_frontier = []             # <<<<<<<<<<<<<<
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]
  */
-    __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
     __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
@@ -46463,7 +46514,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_cur_scope->__pyx_v_new_frontier = __pyx_t_12;
     __pyx_t_12 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":983
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":984
  *         while len(frontier) > 0:
  *             new_frontier = []
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:             # <<<<<<<<<<<<<<
@@ -46474,9 +46525,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     for (;;) {
       if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_12)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_12, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_12, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
       if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
         PyObject* sequence = __pyx_t_2;
@@ -46488,7 +46539,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         if (unlikely(size != 7)) {
           if (size > 7) __Pyx_RaiseTooManyValuesError(7);
           else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         #if CYTHON_COMPILING_IN_CPYTHON
         if (likely(PyTuple_CheckExact(sequence))) {
@@ -46519,7 +46570,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         Py_ssize_t i;
         PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
         for (i=0; i < 7; i++) {
-          PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           *(temps[i]) = item;
         }
         #endif
@@ -46528,7 +46579,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       {
         Py_ssize_t index = -1;
         PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
-        __pyx_t_16 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_16 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_16);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
@@ -46537,7 +46588,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GOTREF(item);
           *(temps[index]) = item;
         }
-        if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 7) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 7) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_17 = NULL;
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         goto __pyx_L22_unpacking_done;
@@ -46545,14 +46596,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         __pyx_t_17 = NULL;
         if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_L22_unpacking_done:;
       }
-      __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_13); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_13); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __pyx_cur_scope->__pyx_v_k = __pyx_t_4;
       __pyx_cur_scope->__pyx_v_i = __pyx_t_6;
@@ -46578,19 +46629,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_is_shadow_path = __pyx_t_15;
       __pyx_t_15 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":984
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":985
  *             new_frontier = []
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]             # <<<<<<<<<<<<<<
  *                 spanlen = fwords[i][alt][2]
  *                 # TODO get rid of k -- pathlen is replacing it
  */
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_15, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_15, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_word_id);
@@ -46599,19 +46650,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_word_id = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":985
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":986
  *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
  *                 # TODO get rid of k -- pathlen is replacing it
  *                 if word_id == EPSILON:
  */
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 986; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 986; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_15, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_15, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 986; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_spanlen);
@@ -46620,44 +46671,44 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":987
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":988
  *                 spanlen = fwords[i][alt][2]
  *                 # TODO get rid of k -- pathlen is replacing it
  *                 if word_id == EPSILON:             # <<<<<<<<<<<<<<
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):
  */
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":989
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":990
  *                 if word_id == EPSILON:
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):             # <<<<<<<<<<<<<<
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  */
-        __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_2 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_15 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":990
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":991
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):
  *                         continue             # <<<<<<<<<<<<<<
@@ -46669,43 +46720,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         __pyx_L24:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":991
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":992
  *                     if i+spanlen >= len(fwords):
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue
  */
-        __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_14);
-        __pyx_t_15 = PyNumber_Add(__pyx_t_14, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyNumber_Add(__pyx_t_14, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
         __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-        __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_15); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_15); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_14);
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_t_14); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Length(__pyx_t_14); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
         for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_nualt = __pyx_t_18;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":992
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":993
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     continue
  * 
  */
-          __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
-          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_2 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_14);
           __Pyx_GIVEREF(__pyx_t_14);
@@ -46728,11 +46779,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_14 = 0;
           __pyx_t_2 = 0;
           __pyx_t_15 = 0;
-          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":993
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":994
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue             # <<<<<<<<<<<<<<
@@ -46744,19 +46795,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L23:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":995
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":996
  *                     continue
  * 
  *                 phrase = prefix + (word_id,)             # <<<<<<<<<<<<<<
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()
  */
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_word_id);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_word_id);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_word_id);
-      __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_prefix, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_prefix, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_phrase);
@@ -46765,19 +46816,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_phrase = __pyx_t_15;
       __pyx_t_15 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":996
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":997
  * 
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)             # <<<<<<<<<<<<<<
  *                 arity = hiero_phrase.arity()
  * 
  */
-      __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
-      __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
       __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase));
@@ -46786,23 +46837,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_hiero_phrase = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":997
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":998
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()             # <<<<<<<<<<<<<<
  * 
  *                 lookup_required = False
  */
-      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase), __pyx_n_s__arity); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase), __pyx_n_s__arity); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_15 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_15); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_15); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       __pyx_cur_scope->__pyx_v_arity = __pyx_t_18;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":999
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1000
  *                 arity = hiero_phrase.arity()
  * 
  *                 lookup_required = False             # <<<<<<<<<<<<<<
@@ -46811,36 +46862,36 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       __pyx_cur_scope->__pyx_v_lookup_required = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1000
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1001
  * 
  *                 lookup_required = False
  *                 if word_id in node.children:             # <<<<<<<<<<<<<<
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  */
-      __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_15, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_15, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1001
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1002
  *                 lookup_required = False
  *                 if word_id in node.children:
  *                     if node.children[word_id] is None:             # <<<<<<<<<<<<<<
  *                         # Path dead-ends at this node
  *                         continue
  */
-        __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_3 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         __pyx_t_8 = (__pyx_t_3 == Py_None);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1003
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1004
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  *                         continue             # <<<<<<<<<<<<<<
@@ -46852,16 +46903,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1006
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1007
  *                     else:
  *                         # Path continues at this node
  *                         node = node.children[word_id]             # <<<<<<<<<<<<<<
  *                 else:
  *                     if node.suffix_link is None:
  */
-          __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_15 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_node);
@@ -46875,20 +46926,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1008
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1009
  *                         node = node.children[word_id]
  *                 else:
  *                     if node.suffix_link is None:             # <<<<<<<<<<<<<<
  *                         # Current node is root; lookup required
  *                         lookup_required = True
  */
-        __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
         __pyx_t_8 = (__pyx_t_15 == Py_None);
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1010
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1011
  *                     if node.suffix_link is None:
  *                         # Current node is root; lookup required
  *                         lookup_required = True             # <<<<<<<<<<<<<<
@@ -46900,54 +46951,54 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1012
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1013
  *                         lookup_required = True
  *                     else:
  *                         if word_id in node.suffix_link.children:             # <<<<<<<<<<<<<<
  *                             if node.suffix_link.children[word_id] is None:
  *                                 # Suffix link reports path is dead end
  */
-          __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_3 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1013
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1014
  *                     else:
  *                         if word_id in node.suffix_link.children:
  *                             if node.suffix_link.children[word_id] is None:             # <<<<<<<<<<<<<<
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_15 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             __pyx_t_8 = (__pyx_t_3 == Py_None);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             if (__pyx_t_8) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1015
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1016
  *                             if node.suffix_link.children[word_id] is None:
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None             # <<<<<<<<<<<<<<
  *                                 continue
  *                             else:
  */
-              __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
-              if (PyObject_SetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyObject_SetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1016
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1017
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None
  *                                 continue             # <<<<<<<<<<<<<<
@@ -46959,7 +47010,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             /*else*/ {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1019
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1020
  *                             else:
  *                                 # Suffix link indicates lookup is reqired
  *                                 lookup_required = True             # <<<<<<<<<<<<<<
@@ -46973,18 +47024,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1022
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1023
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-            __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_122), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_122), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_Raise(__pyx_t_3, 0, 0, 0);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_L30:;
         }
@@ -46992,7 +47043,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L27:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1024
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1025
  *                             raise Exception("Keyword trie error")
  *                 # checking whether lookup_required
  *                 if lookup_required:             # <<<<<<<<<<<<<<
@@ -47001,7 +47052,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       if (__pyx_cur_scope->__pyx_v_lookup_required) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1025
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1026
  *                 # checking whether lookup_required
  *                 if lookup_required:
  *                     new_node = None             # <<<<<<<<<<<<<<
@@ -47014,66 +47065,66 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_GIVEREF(Py_None);
         __pyx_cur_scope->__pyx_v_new_node = Py_None;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1026
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1027
  *                 if lookup_required:
  *                     new_node = None
  *                     if is_shadow_path:             # <<<<<<<<<<<<<<
  *                         # Extending shadow path
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1029
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1030
  *                         # Extending shadow path
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=node.suffix_link.children[word_id],
  *                                 phrase=hiero_phrase)
  */
-          __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-          __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_15 = PyObject_GetItem(__pyx_t_2, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyObject_GetItem(__pyx_t_2, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1030
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1031
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],             # <<<<<<<<<<<<<<
  *                                 phrase=hiero_phrase)
  *                     else:
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_15 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1031
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1032
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
  *                     else:
  *                         if arity > 0:
  */
-          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -47085,7 +47136,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1033
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1034
  *                                 phrase=hiero_phrase)
  *                     else:
  *                         if arity > 0:             # <<<<<<<<<<<<<<
@@ -47095,22 +47146,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity > 0);
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1035
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1036
  *                         if arity > 0:
  *                             # Intersecting because of arity > 0
  *                             phrase_location = self.intersect(node, node.suffix_link.children[word_id], hiero_phrase)             # <<<<<<<<<<<<<<
  *                         else:
  *                             # Suffix array search
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->intersect(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->intersect(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -47122,45 +47173,45 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1038
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1039
  *                         else:
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location             # <<<<<<<<<<<<<<
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
             __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_cur_scope->__pyx_v_phrase_location = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1039
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1040
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)             # <<<<<<<<<<<<<<
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_2 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_18)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_18)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __pyx_t_15 = PyInt_FromSsize_t((__pyx_t_5 - 1)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyInt_FromSsize_t((__pyx_t_5 - 1)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_low); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_low); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_2));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
@@ -47174,7 +47225,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_15 = 0;
             __pyx_t_14 = 0;
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
@@ -47184,7 +47235,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_sa_range = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1040
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1041
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:             # <<<<<<<<<<<<<<
@@ -47194,24 +47245,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_8 = (__pyx_cur_scope->__pyx_v_sa_range != Py_None);
             if (__pyx_t_8) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1041
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1042
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])             # <<<<<<<<<<<<<<
  *                             else:
  *                                 phrase_location = None
  */
-              __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_low), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_low), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
               __Pyx_GOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -47223,7 +47274,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             /*else*/ {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1043
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1044
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  *                             else:
  *                                 phrase_location = None             # <<<<<<<<<<<<<<
@@ -47240,7 +47291,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L34:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1045
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1046
  *                                 phrase_location = None
  * 
  *                         if phrase_location is None:             # <<<<<<<<<<<<<<
@@ -47250,19 +47301,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_8 = (((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location) == Py_None);
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1046
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1047
  * 
  *                         if phrase_location is None:
  *                             node.children[word_id] = None             # <<<<<<<<<<<<<<
  *                             # Search failed
  *                             continue
  */
-            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            if (PyObject_SetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (PyObject_SetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1048
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1049
  *                             node.children[word_id] = None
  *                             # Search failed
  *                             continue             # <<<<<<<<<<<<<<
@@ -47274,7 +47325,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L36:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1050
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1051
  *                             continue
  *                         # Search succeeded
  *                         suffix_link = self.rules.root             # <<<<<<<<<<<<<<
@@ -47287,32 +47338,32 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
           __pyx_cur_scope->__pyx_v_suffix_link = __pyx_cur_scope->__pyx_v_self->rules->root;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1051
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1052
  *                         # Search succeeded
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:             # <<<<<<<<<<<<<<
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_8 = (__pyx_t_9 != Py_None);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1052
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1053
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]             # <<<<<<<<<<<<<<
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,
  */
-            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            __pyx_t_9 = PyObject_GetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_suffix_link);
@@ -47324,35 +47375,35 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L37:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1053
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1054
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)
  */
-          __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1054
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1055
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,             # <<<<<<<<<<<<<<
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node
  */
-          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1055
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1056
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
  *                     node.children[word_id] = new_node
  *                     node = new_node
  */
-          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -47363,19 +47414,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         __pyx_L33:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1056
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1057
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node             # <<<<<<<<<<<<<<
  *                     node = new_node
  * 
  */
-        __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        if (PyObject_SetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyObject_SetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1057
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1058
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node
  *                     node = new_node             # <<<<<<<<<<<<<<
@@ -47388,7 +47439,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_new_node);
         __pyx_cur_scope->__pyx_v_node = __pyx_cur_scope->__pyx_v_new_node;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1062
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1063
  *                     This should happen before we get to extraction (so that
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:             # <<<<<<<<<<<<<<
@@ -47398,14 +47449,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1063
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1064
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1             # <<<<<<<<<<<<<<
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index
  */
-          __pyx_t_10 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_arity + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_arity + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xcat_index);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_xcat_index);
@@ -47413,17 +47464,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_xcat_index = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1064
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1065
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)             # <<<<<<<<<<<<<<
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:
  */
-          __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1065; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1065
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1066
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index             # <<<<<<<<<<<<<<
@@ -47436,24 +47487,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xcat_index);
           __pyx_cur_scope->__pyx_v_suffix_link_xcat_index = __pyx_cur_scope->__pyx_v_xcat_index;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1066
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1067
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:             # <<<<<<<<<<<<<<
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  */
-          __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1067
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1068
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1             # <<<<<<<<<<<<<<
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  */
-            __pyx_t_10 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_xcat_index, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_xcat_index, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index);
@@ -47464,159 +47515,159 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L39:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1068
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1069
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)             # <<<<<<<<<<<<<<
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  */
-          __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1069
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1070
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))
  */
-          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1070
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1071
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],             # <<<<<<<<<<<<<<
  *                                 phrase= Phrase(phrase + (xcat,)))
  * 
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_3 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_suffix_link_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_suffix_link_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1071
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1072
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))             # <<<<<<<<<<<<<<
  * 
  *                     # sample from range
  */
-          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
-          __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
-          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1069
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1070
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))
  */
-          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          if (__Pyx_SetItemInt(__pyx_t_10, __pyx_cur_scope->__pyx_v_xcat, __pyx_t_9, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (__Pyx_SetItemInt(__pyx_t_10, __pyx_cur_scope->__pyx_v_xcat, __pyx_t_9, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           goto __pyx_L38;
         }
         __pyx_L38:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1074
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1075
  * 
  *                     # sample from range
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1074; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1075
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1076
  *                     # sample from range
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)             # <<<<<<<<<<<<<<
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  */
-          __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_t_10 = 0;
-          __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-          if (!(likely(((__pyx_t_10) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_10, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (!(likely(((__pyx_t_10) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_10, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_sample));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_sample));
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_cur_scope->__pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_10);
           __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1076
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1077
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns             # <<<<<<<<<<<<<<
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:
  */
-          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_cur_scope->__pyx_v_num_subpatterns = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_10)->num_subpatterns;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1077
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1078
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)             # <<<<<<<<<<<<<<
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  */
-          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_chunklen));
@@ -47625,7 +47676,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_chunklen = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1078
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1079
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:             # <<<<<<<<<<<<<<
@@ -47635,7 +47686,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_18 = __pyx_cur_scope->__pyx_v_num_subpatterns;
           for (__pyx_cur_scope->__pyx_v_j = 0; __pyx_cur_scope->__pyx_v_j < __pyx_t_18; __pyx_cur_scope->__pyx_v_j++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1079
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1080
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)             # <<<<<<<<<<<<<<
@@ -47645,14 +47696,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             (__pyx_cur_scope->__pyx_v_chunklen->arr[__pyx_cur_scope->__pyx_v_j]) = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_hiero_phrase->__pyx_vtab)->chunklen(__pyx_cur_scope->__pyx_v_hiero_phrase, __pyx_cur_scope->__pyx_v_j);
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1080
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1081
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []             # <<<<<<<<<<<<<<
  *                         j = 0
  *                         extract_start = monitor_cpu()
  */
-          __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
@@ -47660,7 +47711,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_extracts = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1081
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1082
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []
  *                         j = 0             # <<<<<<<<<<<<<<
@@ -47669,14 +47720,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
           __pyx_cur_scope->__pyx_v_j = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1082
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1083
  *                         extracts = []
  *                         j = 0
  *                         extract_start = monitor_cpu()             # <<<<<<<<<<<<<<
  *                         while j < sample.len:
  *                             extract = []
  */
-          __pyx_t_3 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1083; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract_start);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract_start);
@@ -47684,7 +47735,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_extract_start = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1083
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1084
  *                         j = 0
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:             # <<<<<<<<<<<<<<
@@ -47695,14 +47746,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_19 = (__pyx_cur_scope->__pyx_v_j < __pyx_cur_scope->__pyx_v_sample->len);
             if (!__pyx_t_19) break;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1084
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1085
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:
  *                             extract = []             # <<<<<<<<<<<<<<
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  */
-            __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1085; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -47710,7 +47761,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_extract = ((PyObject *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1086
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1087
  *                             extract = []
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -47719,21 +47770,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
             __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, __pyx_cur_scope->__pyx_v_self->fda->sent_id->arr);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1087
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1088
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])             # <<<<<<<<<<<<<<
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])
  */
-            __pyx_t_3 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_t_3 = 0;
-            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_loc);
@@ -47742,14 +47793,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_loc = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1088
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1089
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)             # <<<<<<<<<<<<<<
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns
  */
-            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->extract(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->extract(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -47757,22 +47808,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_extract = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1089
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1090
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])             # <<<<<<<<<<<<<<
  *                             j = j + num_subpatterns
  * 
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_10 = PyList_New(0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyList_New(0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_extract) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_extract)) {
               __pyx_t_9 = __pyx_cur_scope->__pyx_v_extract; __Pyx_INCREF(__pyx_t_9); __pyx_t_5 = 0;
               __pyx_t_20 = NULL;
             } else {
-              __pyx_t_5 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_extract); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_5 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_extract); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __pyx_t_20 = Py_TYPE(__pyx_t_9)->tp_iternext;
             }
@@ -47780,23 +47831,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_9)) break;
                 #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 #else
-                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 #endif
               } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
                 #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 #else
-                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 #endif
               } else {
                 __pyx_t_14 = __pyx_t_20(__pyx_t_9);
                 if (unlikely(!__pyx_t_14)) {
                   if (PyErr_Occurred()) {
                     if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   break;
                 }
@@ -47807,7 +47858,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_GIVEREF(__pyx_t_14);
               __pyx_cur_scope->__pyx_v_e = __pyx_t_14;
               __pyx_t_14 = 0;
-              __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
               PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_cur_scope->__pyx_v_e);
@@ -47815,23 +47866,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loc);
               PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_cur_scope->__pyx_v_loc);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loc);
-              if (unlikely(__Pyx_PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (unlikely(__Pyx_PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
             }
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __Pyx_INCREF(((PyObject *)__pyx_t_10));
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_10));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1090
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1091
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns             # <<<<<<<<<<<<<<
@@ -47841,7 +47892,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns);
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1092
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1093
  *                             j = j + num_subpatterns
  * 
  *                         num_samples = sample.len/num_subpatterns             # <<<<<<<<<<<<<<
@@ -47850,22 +47901,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
           if (unlikely(__pyx_cur_scope->__pyx_v_num_subpatterns == 0)) {
             PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           else if (sizeof(int) == sizeof(long) && unlikely(__pyx_cur_scope->__pyx_v_num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_cur_scope->__pyx_v_sample->len))) {
             PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_cur_scope->__pyx_v_num_samples = __Pyx_div_int(__pyx_cur_scope->__pyx_v_sample->len, __pyx_cur_scope->__pyx_v_num_subpatterns);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1093
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1094
  * 
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()             # <<<<<<<<<<<<<<
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:
  */
-          __pyx_t_10 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract_stop);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract_stop);
@@ -47873,46 +47924,46 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_extract_stop = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1094
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1095
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start             # <<<<<<<<<<<<<<
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  */
-          __pyx_t_10 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyNumber_Subtract(__pyx_t_9, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyNumber_Subtract(__pyx_t_9, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_21 = __pyx_PyFloat_AsFloat(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_21 = __pyx_PyFloat_AsFloat(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __pyx_cur_scope->__pyx_v_self->extract_time = __pyx_t_21;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1095
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1096
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:             # <<<<<<<<<<<<<<
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  */
-          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_19 = (__pyx_t_5 > 0);
           if (__pyx_t_19) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1096
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1097
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:
  *                             fcount = Counter()             # <<<<<<<<<<<<<<
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:
  */
-            __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__Counter); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__Counter); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_fcount);
@@ -47921,23 +47972,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_fcount = __pyx_t_9;
             __pyx_t_9 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1097
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1098
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count
  */
-            __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -47947,7 +47998,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_fphrases = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1098
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1099
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:             # <<<<<<<<<<<<<<
@@ -47958,9 +48009,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             for (;;) {
               if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_3 = PySequence_ITEM(__pyx_t_10, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PySequence_ITEM(__pyx_t_10, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
               if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
                 PyObject* sequence = __pyx_t_3;
@@ -47972,7 +48023,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 if (unlikely(size != 2)) {
                   if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                   else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
@@ -47985,14 +48036,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(__pyx_t_9);
                 __Pyx_INCREF(__pyx_t_14);
                 #else
-                __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 #endif
                 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               } else
               {
                 Py_ssize_t index = -1;
-                __pyx_t_15 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
                 __pyx_t_17 = Py_TYPE(__pyx_t_15)->tp_iternext;
@@ -48000,7 +48051,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_GOTREF(__pyx_t_9);
                 index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_15); if (unlikely(!__pyx_t_14)) goto __pyx_L50_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_14);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_15), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_15), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 goto __pyx_L51_unpacking_done;
@@ -48008,7 +48059,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __pyx_t_17 = NULL;
                 if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L51_unpacking_done:;
               }
               if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
@@ -48021,7 +48072,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 if (unlikely(size != 4)) {
                   if (size > 4) __Pyx_RaiseTooManyValuesError(4);
                   else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
@@ -48043,7 +48094,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 Py_ssize_t i;
                 PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
                 for (i=0; i < 4; i++) {
-                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   *(temps[i]) = item;
                 }
                 #endif
@@ -48052,7 +48103,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               {
                 Py_ssize_t index = -1;
                 PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
-                __pyx_t_16 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_16 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
                 __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
@@ -48061,7 +48112,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                   __Pyx_GOTREF(item);
                   *(temps[index]) = item;
                 }
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_t_17 = NULL;
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
                 goto __pyx_L53_unpacking_done;
@@ -48069,7 +48120,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
                 __pyx_t_17 = NULL;
                 if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L53_unpacking_done:;
               }
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
@@ -48098,7 +48149,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_cur_scope->__pyx_v_loc = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1099
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1100
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count             # <<<<<<<<<<<<<<
@@ -48107,38 +48158,38 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
               __pyx_t_3 = __pyx_cur_scope->__pyx_v_f;
-              __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_9 = PyNumber_InPlaceAdd(__pyx_t_14, __pyx_cur_scope->__pyx_v_count); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyNumber_InPlaceAdd(__pyx_t_14, __pyx_cur_scope->__pyx_v_count); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-              if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1100
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1101
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)             # <<<<<<<<<<<<<<
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  */
-              __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fphrases, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fphrases, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
-              __pyx_t_9 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_e); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_e); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              __pyx_t_3 = PyObject_GetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_als); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyObject_GetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_als); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_cur_scope->__pyx_v_loc); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_cur_scope->__pyx_v_loc); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1101
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1102
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():             # <<<<<<<<<<<<<<
@@ -48148,9 +48199,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_5 = 0;
             if (unlikely(__pyx_cur_scope->__pyx_v_fphrases == Py_None)) {
               PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
-            __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_fphrases, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_22), (&__pyx_t_18)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_fphrases, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_22), (&__pyx_t_18)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __Pyx_XDECREF(__pyx_t_10);
             __pyx_t_10 = __pyx_t_9;
@@ -48158,7 +48209,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             while (1) {
               __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_10, __pyx_t_22, &__pyx_t_5, &__pyx_t_9, &__pyx_t_3, NULL, __pyx_t_18);
               if (unlikely(__pyx_t_6 == 0)) break;
-              if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_GOTREF(__pyx_t_3);
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
@@ -48172,7 +48223,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_cur_scope->__pyx_v_elist = __pyx_t_3;
               __pyx_t_3 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1102
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1103
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():             # <<<<<<<<<<<<<<
@@ -48182,9 +48233,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_t_23 = 0;
               if (unlikely(__pyx_cur_scope->__pyx_v_elist == Py_None)) {
                 PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
-              __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_elist, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_24), (&__pyx_t_6)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_elist, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_24), (&__pyx_t_6)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_XDECREF(__pyx_t_3);
               __pyx_t_3 = __pyx_t_9;
@@ -48192,7 +48243,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               while (1) {
                 __pyx_t_4 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_24, &__pyx_t_23, &__pyx_t_9, &__pyx_t_14, NULL, __pyx_t_6);
                 if (unlikely(__pyx_t_4 == 0)) break;
-                if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
@@ -48206,30 +48257,30 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_alslist = __pyx_t_14;
                 __pyx_t_14 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1103
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1104
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
  *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
  *                                     count = len(locs)
  */
-                __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
                 __Pyx_GIVEREF(__pyx_t_9);
                 __pyx_t_9 = 0;
-                __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-                __pyx_t_13 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__key), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__key), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
@@ -48243,7 +48294,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
@@ -48256,14 +48307,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                   __Pyx_INCREF(__pyx_t_9);
                   __Pyx_INCREF(__pyx_t_14);
                   #else
-                  __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_7 = PyObject_GetIter(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_7 = PyObject_GetIter(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_7);
                   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_7)->tp_iternext;
@@ -48271,7 +48322,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                   __Pyx_GOTREF(__pyx_t_9);
                   index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_14)) goto __pyx_L58_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_14);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
                   goto __pyx_L59_unpacking_done;
@@ -48279,7 +48330,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
                   __pyx_t_17 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L59_unpacking_done:;
                 }
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alignment);
@@ -48293,41 +48344,41 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_max_locs = __pyx_t_14;
                 __pyx_t_14 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1104
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1105
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))             # <<<<<<<<<<<<<<
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  */
-                __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_14 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__chain); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__chain); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__from_iterable); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__from_iterable); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
                 __Pyx_GIVEREF(__pyx_t_9);
                 __pyx_t_9 = 0;
-                __pyx_t_9 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
                 __Pyx_GIVEREF(__pyx_t_9);
                 __pyx_t_9 = 0;
-                __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
@@ -48336,15 +48387,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_9);
                 __pyx_t_9 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1105
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1106
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
  *                                     count = len(locs)             # <<<<<<<<<<<<<<
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  */
-                __pyx_t_25 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); if (unlikely(__pyx_t_25 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_25 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); if (unlikely(__pyx_t_25 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
@@ -48352,43 +48403,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_count = __pyx_t_9;
                 __pyx_t_9 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1106
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1107
  *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(             # <<<<<<<<<<<<<<
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
+ *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda,
  */
-                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1107
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1108
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,             # <<<<<<<<<<<<<<
- *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
- *                                                ))
+ *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda,
+ *                                                meta))
  */
-                __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_13);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1108
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1109
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda             # <<<<<<<<<<<<<<
- *                                                ))
+ *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda,             # <<<<<<<<<<<<<<
+ *                                                meta))
  *                                     yield Rule(self.category, f, e, scores, alignment)
  */
-                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_7);
-                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyNumber_Add(__pyx_t_2, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyNumber_Add(__pyx_t_2, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-                __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7);
                 __Pyx_GIVEREF(__pyx_t_7);
@@ -48396,7 +48447,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_GIVEREF(__pyx_t_15);
                 __pyx_t_7 = 0;
                 __pyx_t_15 = 0;
-                __pyx_t_15 = PyTuple_New(10); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1110
+ *                                                f, e, count, fcount[f], num_samples,
+ *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda,
+ *                                                meta))             # <<<<<<<<<<<<<<
+ *                                     yield Rule(self.category, f, e, scores, alignment)
+ * 
+ */
+                __pyx_t_15 = PyTuple_New(11); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                 PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_f);
@@ -48425,14 +48484,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
                 PyTuple_SET_ITEM(__pyx_t_15, 9, ((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
                 __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
+                __Pyx_INCREF(__pyx_cur_scope->__pyx_v_meta);
+                PyTuple_SET_ITEM(__pyx_t_15, 10, __pyx_cur_scope->__pyx_v_meta);
+                __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_meta);
                 __pyx_t_14 = 0;
                 __pyx_t_13 = 0;
                 __pyx_t_2 = 0;
-                __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
@@ -48441,16 +48503,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_15);
                 __pyx_t_15 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1110
- *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda
- *                                                ))
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1111
+ *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda,
+ *                                                meta))
  *                                     yield Rule(self.category, f, e, scores, alignment)             # <<<<<<<<<<<<<<
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  */
-                __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_15);
                 __Pyx_GIVEREF(__pyx_t_15);
@@ -48467,7 +48529,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_alignment);
                 __pyx_t_15 = 0;
-                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
                 __pyx_r = __pyx_t_15;
@@ -48507,7 +48569,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_t_22 = __pyx_cur_scope->__pyx_t_7;
                 __pyx_t_23 = __pyx_cur_scope->__pyx_t_8;
                 __pyx_t_24 = __pyx_cur_scope->__pyx_t_9;
-                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             }
@@ -48522,38 +48584,38 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L32:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1112
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1113
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  */
-      __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_19 = (__pyx_t_22 < __pyx_cur_scope->__pyx_v_self->max_length);
       if (__pyx_t_19) {
-        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_3 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_22); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_22); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_15 = PyObject_RichCompare(__pyx_t_3, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyObject_RichCompare(__pyx_t_3, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
         if (__pyx_t_8) {
-          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_3 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __pyx_t_27 = __pyx_t_26;
         } else {
@@ -48565,45 +48627,45 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1113
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1114
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  */
-        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_10 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_22 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_22 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_22; __pyx_t_18+=1) {
           __pyx_cur_scope->__pyx_v_alt_id = __pyx_t_18;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1114
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1115
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  */
-          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_15 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyTuple_New(7); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyTuple_New(7); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
@@ -48626,11 +48688,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_15 = 0;
           __pyx_t_10 = 0;
           __pyx_t_2 = 0;
-          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_9)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_9)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1115
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1116
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity             # <<<<<<<<<<<<<<
@@ -48639,18 +48701,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
         __pyx_cur_scope->__pyx_v_num_subpatterns = __pyx_cur_scope->__pyx_v_arity;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1116
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1117
  *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_19 = (!__pyx_t_8);
         if (__pyx_t_19) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1117
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1118
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1             # <<<<<<<<<<<<<<
@@ -48662,14 +48724,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         __pyx_L64:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1118
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1119
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:             # <<<<<<<<<<<<<<
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]
  */
-        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_19 = ((__pyx_t_22 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
         if (__pyx_t_19) {
           __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
@@ -48685,7 +48747,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1119
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1120
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)             # <<<<<<<<<<<<<<
@@ -48694,16 +48756,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
           __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, (__pyx_cur_scope->__pyx_v_arity + 1));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1120
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1121
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]             # <<<<<<<<<<<<<<
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xnode);
@@ -48712,18 +48774,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_xnode = __pyx_t_2;
           __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1122
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1123
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])             # <<<<<<<<<<<<<<
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
@@ -48737,7 +48799,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
           __pyx_t_2 = 0;
           __pyx_t_9 = 0;
-          __pyx_t_9 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_9));
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
@@ -48746,14 +48808,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_key = __pyx_t_9;
           __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1123
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1124
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []             # <<<<<<<<<<<<<<
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  */
-          __pyx_t_9 = PyList_New(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyList_New(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
@@ -48761,24 +48823,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_9);
           __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1124
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1125
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):             # <<<<<<<<<<<<<<
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  */
-          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1125
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1126
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]             # <<<<<<<<<<<<<<
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  */
-            __pyx_t_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
@@ -48789,20 +48851,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1127
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1128
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)             # <<<<<<<<<<<<<<
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  */
-            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_123); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_123); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_15 = PyTuple_New(7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
@@ -48825,7 +48887,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
             __pyx_t_10 = 0;
             __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
@@ -48835,18 +48897,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1128
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1129
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  *                             nodes_isteps_away_buffer[key] = frontier_nodes             # <<<<<<<<<<<<<<
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  */
-            if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_L66:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1130
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1131
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:             # <<<<<<<<<<<<<<
@@ -48857,7 +48919,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_22 = 0;
             __pyx_t_20 = NULL;
           } else {
-            __pyx_t_22 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_22 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __pyx_t_20 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
@@ -48865,23 +48927,23 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_2)) {
               if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_2)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_2)) {
               if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else {
               __pyx_t_15 = __pyx_t_20(__pyx_t_2);
               if (unlikely(!__pyx_t_15)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -48897,7 +48959,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               if (unlikely(size != 3)) {
                 if (size > 3) __Pyx_RaiseTooManyValuesError(3);
                 else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
@@ -48913,15 +48975,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_3);
               #else
-              __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             } else
             {
               Py_ssize_t index = -1;
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_13);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __pyx_t_17 = Py_TYPE(__pyx_t_13)->tp_iternext;
@@ -48931,7 +48993,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_GOTREF(__pyx_t_10);
               index = 2; __pyx_t_3 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L69_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_3);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
               goto __pyx_L70_unpacking_done;
@@ -48939,12 +49001,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
               __pyx_t_17 = NULL;
               if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L70_unpacking_done:;
             }
-            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __pyx_cur_scope->__pyx_v_i = __pyx_t_18;
             __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
@@ -48954,30 +49016,30 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1131
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1132
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))             # <<<<<<<<<<<<<<
  *             frontier = new_frontier
  * 
  */
-            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_13);
             PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
             __Pyx_GIVEREF(__pyx_t_9);
             __pyx_t_9 = 0;
-            __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-            __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_13);
             PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_15);
             __Pyx_GIVEREF(__pyx_t_15);
@@ -49000,7 +49062,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_3 = 0;
             __pyx_t_10 = 0;
             __pyx_t_9 = 0;
-            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -49014,7 +49076,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     }
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1132
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1133
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
  *             frontier = new_frontier             # <<<<<<<<<<<<<<
@@ -49028,37 +49090,37 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_cur_scope->__pyx_v_frontier = __pyx_cur_scope->__pyx_v_new_frontier;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1134
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1135
  *             frontier = new_frontier
  * 
  *         stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  */
-  __pyx_t_12 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_GIVEREF(__pyx_t_12);
   __pyx_cur_scope->__pyx_v_stop_time = __pyx_t_12;
   __pyx_t_12 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1135
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1136
  * 
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  */
-  __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_13 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_124));
   PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_124));
@@ -49066,44 +49128,44 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_13);
   __Pyx_GIVEREF(__pyx_t_13);
   __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1136
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1137
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()             # <<<<<<<<<<<<<<
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  * 
  */
-  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1137
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1138
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_125));
@@ -49111,7 +49173,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_13);
   __Pyx_GIVEREF(__pyx_t_13);
   __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -49138,7 +49200,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1140
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1141
  * 
  * 
  *     cdef int find_fixpoint(self,             # <<<<<<<<<<<<<<
@@ -49168,7 +49230,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("find_fixpoint", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1155
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1156
  *         cdef int e_low_prev, e_high_prev, f_low_prev, f_high_prev, new_x, new_low_x, new_high_x
  * 
  *         e_low[0] = e_in_low             # <<<<<<<<<<<<<<
@@ -49177,7 +49239,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_low[0]) = __pyx_v_e_in_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1156
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1157
  * 
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high             # <<<<<<<<<<<<<<
@@ -49186,19 +49248,19 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_high[0]) = __pyx_v_e_in_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1157
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1158
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *         if e_low[0] == -1:
  *             # low-priority corner case: if phrase w is unaligned,
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1158
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1159
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)
  *         if e_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -49208,7 +49270,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_3 = ((__pyx_v_e_low[0]) == -1);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1164
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1165
  *             # rule X -> X_1 w X_2 / X_1 X_2.    This is probably
  *             # not worth the bother, though.
  *             return 0             # <<<<<<<<<<<<<<
@@ -49220,7 +49282,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1165
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1166
  *             # not worth the bother, though.
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:             # <<<<<<<<<<<<<<
@@ -49236,7 +49298,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1166
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1167
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:             # <<<<<<<<<<<<<<
@@ -49246,7 +49308,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = ((__pyx_v_e_in_low - (__pyx_v_e_low[0])) < __pyx_v_min_ex_size);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1167
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1168
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size             # <<<<<<<<<<<<<<
@@ -49255,7 +49317,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_low[0]) = (__pyx_v_e_in_low - __pyx_v_min_ex_size);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1168
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1169
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -49265,7 +49327,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_5 = ((__pyx_v_e_low[0]) < 0);
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1169
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1170
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -49284,7 +49346,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1171
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1172
  *                     return 0
  * 
  *         if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -49294,7 +49356,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_5 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1172
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1173
  * 
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0             # <<<<<<<<<<<<<<
@@ -49306,7 +49368,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L6;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1173
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1174
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:             # <<<<<<<<<<<<<<
@@ -49322,7 +49384,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1174
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1175
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:             # <<<<<<<<<<<<<<
@@ -49332,7 +49394,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (((__pyx_v_e_high[0]) - __pyx_v_e_in_high) < __pyx_v_min_ex_size);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1175
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1176
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size             # <<<<<<<<<<<<<<
@@ -49341,7 +49403,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_high[0]) = (__pyx_v_e_in_high + __pyx_v_min_ex_size);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1176
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1177
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:             # <<<<<<<<<<<<<<
@@ -49351,7 +49413,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_e_high[0]) > __pyx_v_e_sent_len);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1177
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1178
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -49370,7 +49432,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1179
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1180
  *                     return 0
  * 
  *         f_back_low[0] = -1             # <<<<<<<<<<<<<<
@@ -49379,7 +49441,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_low[0]) = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1180
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1181
  * 
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1             # <<<<<<<<<<<<<<
@@ -49388,7 +49450,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_high[0]) = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1181
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1182
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1
  *         f_low_prev = f_low             # <<<<<<<<<<<<<<
@@ -49397,17 +49459,17 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_f_low_prev = __pyx_v_f_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1182
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1183
  *         f_back_high[0] = -1
  *         f_low_prev = f_low
  *         f_high_prev = f_high             # <<<<<<<<<<<<<<
  *         new_x = 0
  *         new_low_x = 0
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_f_high_prev = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1183
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1184
  *         f_low_prev = f_low
  *         f_high_prev = f_high
  *         new_x = 0             # <<<<<<<<<<<<<<
@@ -49416,7 +49478,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1184
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1185
  *         f_high_prev = f_high
  *         new_x = 0
  *         new_low_x = 0             # <<<<<<<<<<<<<<
@@ -49425,7 +49487,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_low_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1185
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1186
  *         new_x = 0
  *         new_low_x = 0
  *         new_high_x = 0             # <<<<<<<<<<<<<<
@@ -49434,7 +49496,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_high_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1187
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1188
  *         new_high_x = 0
  * 
  *         while True:             # <<<<<<<<<<<<<<
@@ -49444,7 +49506,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   while (1) {
     if (!1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1189
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1190
  *         while True:
  * 
  *             if f_back_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -49454,45 +49516,45 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) == -1);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1190
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1191
  * 
  *             if f_back_low[0] == -1:
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       goto __pyx_L11;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1192
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1193
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), __pyx_v_e_low_prev, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), __pyx_v_e_low_prev, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1193
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1194
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  * 
  *             if f_back_low[0] > f_low:
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_e_high_prev, (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_e_high_prev, (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     }
     __pyx_L11:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1195
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1196
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  *             if f_back_low[0] > f_low:             # <<<<<<<<<<<<<<
@@ -49502,7 +49564,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) > __pyx_v_f_low);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1196
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1197
  * 
  *             if f_back_low[0] > f_low:
  *                 f_back_low[0] = f_low             # <<<<<<<<<<<<<<
@@ -49514,35 +49576,35 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L12:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1198
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1199
  *                 f_back_low[0] = f_low
  * 
  *             if f_back_high[0] < f_high:             # <<<<<<<<<<<<<<
  *                 f_back_high[0] = f_high
  * 
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1199
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1200
  * 
  *             if f_back_high[0] < f_high:
  *                 f_back_high[0] = f_high             # <<<<<<<<<<<<<<
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  */
-      __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       (__pyx_v_f_back_high[0]) = __pyx_t_1;
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1201
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1202
  *                 f_back_high[0] = f_high
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:             # <<<<<<<<<<<<<<
@@ -49558,7 +49620,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1202
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1203
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -49571,7 +49633,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1204
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1205
  *                 return 1
  * 
  *             if allow_low_x == 0 and f_back_low[0] < f_low:             # <<<<<<<<<<<<<<
@@ -49587,7 +49649,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1206
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1207
  *             if allow_low_x == 0 and f_back_low[0] < f_low:
  *                 # FAIL: f phrase is not tight
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49600,7 +49662,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1208
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1209
  *                 return 0
  * 
  *             if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -49610,7 +49672,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1210
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1211
  *             if f_back_high[0] - f_back_low[0] > max_f_len:
  *                 # FAIL: f back projection is too wide
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49623,7 +49685,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1212
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1213
  *                 return 0
  * 
  *             if allow_high_x == 0 and f_back_high[0] > f_high:             # <<<<<<<<<<<<<<
@@ -49632,11 +49694,11 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_5 = (__pyx_v_allow_high_x == 0);
     if (__pyx_t_5) {
-      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_4 = __pyx_t_3;
     } else {
@@ -49644,7 +49706,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1214
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1215
  *             if allow_high_x == 0 and f_back_high[0] > f_high:
  *                 # FAIL: extension on high side not allowed
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49657,7 +49719,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1216
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1217
  *                 return 0
  * 
  *             if f_low != f_back_low[0]:             # <<<<<<<<<<<<<<
@@ -49667,7 +49729,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (__pyx_v_f_low != (__pyx_v_f_back_low[0]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1217
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1218
  * 
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:             # <<<<<<<<<<<<<<
@@ -49677,7 +49739,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_low_x == 0);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1218
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1219
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -49687,7 +49749,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1220
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1221
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on low side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49700,7 +49762,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1222
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1223
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -49709,7 +49771,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1223
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1224
  *                     else:
  *                         new_x = new_x + 1
  *                         new_low_x = 1             # <<<<<<<<<<<<<<
@@ -49723,7 +49785,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L19:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1224
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1225
  *                         new_x = new_x + 1
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:             # <<<<<<<<<<<<<<
@@ -49733,7 +49795,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_f_low - (__pyx_v_f_back_low[0])) < __pyx_v_min_fx_size);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1225
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1226
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size             # <<<<<<<<<<<<<<
@@ -49742,7 +49804,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
         (__pyx_v_f_back_low[0]) = (__pyx_v_f_low - __pyx_v_min_fx_size);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1226
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1227
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -49752,7 +49814,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1228
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1229
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49765,7 +49827,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L22:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1229
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1230
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0
  *                     if f_back_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -49775,7 +49837,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_low[0]) < 0);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1231
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1232
  *                     if f_back_low[0] < 0:
  *                         # FAIL: extension required on low side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49794,22 +49856,22 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L18:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1233
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1234
  *                         return 0
  * 
  *             if f_high != f_back_high[0]:             # <<<<<<<<<<<<<<
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1234
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1235
  * 
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:             # <<<<<<<<<<<<<<
@@ -49819,7 +49881,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_high_x == 0);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1235
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1236
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -49829,7 +49891,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1237
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1238
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on high side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49842,7 +49904,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1239
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1240
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -49851,7 +49913,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1240
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1241
  *                     else:
  *                         new_x = new_x + 1
  *                         new_high_x = 1             # <<<<<<<<<<<<<<
@@ -49865,44 +49927,44 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L25:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1241
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1242
  *                         new_x = new_x + 1
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:             # <<<<<<<<<<<<<<
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  */
-      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_f_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_f_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1242
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1243
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size             # <<<<<<<<<<<<<<
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  */
-        __pyx_t_7 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_6 = PyNumber_Add(__pyx_v_f_high, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyNumber_Add(__pyx_v_f_high, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         (__pyx_v_f_back_high[0]) = __pyx_t_1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1243
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1244
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -49912,7 +49974,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1245
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1246
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49925,7 +49987,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L28:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1246
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1247
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0
  *                     if f_back_high[0] > f_sent_len:             # <<<<<<<<<<<<<<
@@ -49935,7 +49997,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_high[0]) > __pyx_v_f_sent_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1248
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1249
  *                     if f_back_high[0] > f_sent_len:
  *                         # FAIL: extension required on high side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49954,7 +50016,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L24:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1250
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1251
  *                         return 0
  * 
  *             e_low_prev = e_low[0]             # <<<<<<<<<<<<<<
@@ -49963,7 +50025,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_low_prev = (__pyx_v_e_low[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1251
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1252
  * 
  *             e_low_prev = e_low[0]
  *             e_high_prev = e_high[0]             # <<<<<<<<<<<<<<
@@ -49972,29 +50034,29 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_high_prev = (__pyx_v_e_high[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1253
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1254
  *             e_high_prev = e_high[0]
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  */
-    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_f_back_low[0]), __pyx_v_f_low_prev, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_f_back_low[0]), __pyx_v_f_low_prev, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1254
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1255
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  */
-    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_high_prev, (__pyx_v_f_back_high[0]), __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_high_prev, (__pyx_v_f_back_high[0]), __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1255
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1256
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:             # <<<<<<<<<<<<<<
@@ -50010,7 +50072,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1256
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1257
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -50023,7 +50085,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L30:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1257
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1258
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  *             if allow_arbitrary_x == 0:             # <<<<<<<<<<<<<<
@@ -50033,7 +50095,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (__pyx_v_allow_arbitrary_x == 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1259
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1260
  *             if allow_arbitrary_x == 0:
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0             # <<<<<<<<<<<<<<
@@ -50046,7 +50108,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L31:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1260
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1261
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0
  *             if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -50056,7 +50118,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1262
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1263
  *             if e_high[0] - e_low[0] > max_e_len:
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0             # <<<<<<<<<<<<<<
@@ -50069,7 +50131,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L32:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1263
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1264
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0
  *             f_low_prev = f_back_low[0]             # <<<<<<<<<<<<<<
@@ -50078,7 +50140,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_f_low_prev = (__pyx_v_f_back_low[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1264
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1265
  *                 return 0
  *             f_low_prev = f_back_low[0]
  *             f_high_prev = f_back_high[0]             # <<<<<<<<<<<<<<
@@ -50101,7 +50163,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1267
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1268
  * 
  * 
  *     cdef find_projection(self, int in_low, int in_high, int* in_links_low, int* in_links_high,             # <<<<<<<<<<<<<<
@@ -50119,7 +50181,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   int __pyx_t_4;
   __Pyx_RefNannySetupContext("find_projection", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1270
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1271
  *                         int* out_low, int* out_high):
  *         cdef int i
  *         for i from in_low <= i < in_high:             # <<<<<<<<<<<<<<
@@ -50129,7 +50191,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   __pyx_t_1 = __pyx_v_in_high;
   for (__pyx_v_i = __pyx_v_in_low; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1271
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1272
  *         cdef int i
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:             # <<<<<<<<<<<<<<
@@ -50139,7 +50201,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
     __pyx_t_2 = ((__pyx_v_in_links_low[__pyx_v_i]) != -1);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1272
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1273
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:             # <<<<<<<<<<<<<<
@@ -50155,7 +50217,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1273
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1274
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]             # <<<<<<<<<<<<<<
@@ -50167,7 +50229,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       __pyx_L6:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1274
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1275
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:             # <<<<<<<<<<<<<<
@@ -50183,7 +50245,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1275
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1276
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:
  *                     out_high[0] = in_links_high[i]             # <<<<<<<<<<<<<<
@@ -50205,7 +50267,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1278
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1279
  * 
  * 
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):             # <<<<<<<<<<<<<<
@@ -50219,7 +50281,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("int_arr_extend", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1280
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1281
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len             # <<<<<<<<<<<<<<
@@ -50228,7 +50290,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_data_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1281
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1282
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50237,7 +50299,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1282
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1283
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50246,7 +50308,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_data, (__pyx_v_data_len * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1283
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1284
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -50255,7 +50317,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1284
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1285
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len
  *         return arr             # <<<<<<<<<<<<<<
@@ -50271,7 +50333,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1287
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1288
  * 
  * 
  *     cdef extract_phrases(self, int e_low, int e_high, int* e_gap_low, int* e_gap_high, int* e_links_low, int num_gaps,             # <<<<<<<<<<<<<<
@@ -50317,19 +50379,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("extract_phrases", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1295
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1296
  *         cdef result
  * 
  *         result = []             # <<<<<<<<<<<<<<
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1296
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1297
  * 
  *         result = []
  *         len1 = 0             # <<<<<<<<<<<<<<
@@ -50338,7 +50400,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1297
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1298
  *         result = []
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -50347,19 +50409,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = ((int *)malloc(0));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1298
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1299
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  *         ephr_arr = IntList()             # <<<<<<<<<<<<<<
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ephr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1300
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1301
  *         ephr_arr = IntList()
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50368,7 +50430,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gap_order = ((int *)malloc((__pyx_v_num_gaps * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1301
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1302
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:             # <<<<<<<<<<<<<<
@@ -50378,7 +50440,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_num_gaps > 0);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1302
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1303
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0             # <<<<<<<<<<<<<<
@@ -50387,7 +50449,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     (__pyx_v_e_gap_order[0]) = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1303
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1304
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -50397,7 +50459,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_3 = __pyx_v_num_gaps;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1304
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1305
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:             # <<<<<<<<<<<<<<
@@ -50407,7 +50469,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = __pyx_v_i;
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1305
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1306
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -50417,7 +50479,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_2 = ((__pyx_v_e_gap_low[__pyx_v_i]) < (__pyx_v_e_gap_low[__pyx_v_j]));
         if (__pyx_t_2) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1306
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1307
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:             # <<<<<<<<<<<<<<
@@ -50427,7 +50489,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_i;
           for (__pyx_v_k = __pyx_v_j; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1307
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1308
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]             # <<<<<<<<<<<<<<
@@ -50437,7 +50499,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             (__pyx_v_e_gap_order[(__pyx_v_k + 1)]) = (__pyx_v_e_gap_order[__pyx_v_k]);
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1308
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1309
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i             # <<<<<<<<<<<<<<
@@ -50446,7 +50508,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
           (__pyx_v_e_gap_order[__pyx_v_j]) = __pyx_v_i;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1309
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1310
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i
  *                         break             # <<<<<<<<<<<<<<
@@ -50460,7 +50522,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1311
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1312
  *                         break
  *                 else:
  *                     e_gap_order[i] = i             # <<<<<<<<<<<<<<
@@ -50475,7 +50537,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1313
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1314
  *                     e_gap_order[i] = i
  * 
  *         e_x_low = e_low             # <<<<<<<<<<<<<<
@@ -50484,7 +50546,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_low = __pyx_v_e_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1314
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1315
  * 
  *         e_x_low = e_low
  *         e_x_high = e_high             # <<<<<<<<<<<<<<
@@ -50493,7 +50555,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_high = __pyx_v_e_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1315
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1316
  *         e_x_low = e_low
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -50503,7 +50565,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1316
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1317
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -50526,7 +50588,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1317
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1318
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1             # <<<<<<<<<<<<<<
@@ -50536,7 +50598,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_e_x_low = (__pyx_v_e_x_low - 1);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1318
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1319
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:             # <<<<<<<<<<<<<<
@@ -50559,7 +50621,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_2) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1319
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1320
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:
  *                 e_x_high = e_x_high + 1             # <<<<<<<<<<<<<<
@@ -50572,7 +50634,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L11:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1321
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1322
  *                 e_x_high = e_x_high + 1
  * 
  *         for i from e_x_low <= i <= e_low:             # <<<<<<<<<<<<<<
@@ -50582,7 +50644,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_low;
   for (__pyx_v_i = __pyx_v_e_x_low; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1322
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1323
  * 
  *         for i from e_x_low <= i <= e_low:
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)             # <<<<<<<<<<<<<<
@@ -50592,7 +50654,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_e_gaps1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps1, (&__pyx_v_len1), (&__pyx_v_i), 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1324
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1325
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)
  * 
  *         for i from 0 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -50602,7 +50664,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_num_gaps;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1325
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1326
  * 
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -50611,7 +50673,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1326
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1327
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)
  *             len2 = 0             # <<<<<<<<<<<<<<
@@ -50620,7 +50682,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_len2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1328
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1329
  *             len2 = 0
  * 
  *             j = e_gap_order[i]             # <<<<<<<<<<<<<<
@@ -50629,7 +50691,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = (__pyx_v_e_gap_order[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1329
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1330
  * 
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]             # <<<<<<<<<<<<<<
@@ -50638,7 +50700,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_low = (__pyx_v_e_gap_low[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1330
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1331
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]             # <<<<<<<<<<<<<<
@@ -50647,7 +50709,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_high = (__pyx_v_e_gap_high[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1331
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1332
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -50657,7 +50719,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1332
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1333
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -50674,7 +50736,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_7) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1333
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1334
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1             # <<<<<<<<<<<<<<
@@ -50684,7 +50746,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_v_e_x_gap_low = (__pyx_v_e_x_gap_low - 1);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1334
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1335
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:             # <<<<<<<<<<<<<<
@@ -50701,7 +50763,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_6) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1335
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1336
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:
  *                     e_x_gap_high = e_x_gap_high + 1             # <<<<<<<<<<<<<<
@@ -50714,7 +50776,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     __pyx_L20:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1337
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1338
  *                     e_x_gap_high = e_x_gap_high + 1
  * 
  *             k = 0             # <<<<<<<<<<<<<<
@@ -50723,7 +50785,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_k = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1338
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1339
  * 
  *             k = 0
  *             step = 1+(i*2)             # <<<<<<<<<<<<<<
@@ -50732,7 +50794,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_step = (1 + (__pyx_v_i * 2));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1339
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1340
  *             k = 0
  *             step = 1+(i*2)
  *             while k < len1:             # <<<<<<<<<<<<<<
@@ -50743,7 +50805,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_k < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1340
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1341
  *             step = 1+(i*2)
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -50753,7 +50815,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = (__pyx_v_e_gap_low[__pyx_v_j]);
       for (__pyx_v_m = __pyx_v_e_x_gap_low; __pyx_v_m <= __pyx_t_4; __pyx_v_m++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1341
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1342
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:             # <<<<<<<<<<<<<<
@@ -50763,7 +50825,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_6 = (__pyx_v_m >= (__pyx_v_e_gaps1[((__pyx_v_k + __pyx_v_step) - 1)]));
         if (__pyx_t_6) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1342
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1343
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:             # <<<<<<<<<<<<<<
@@ -50773,7 +50835,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_e_x_gap_high;
           for (__pyx_v_n = (__pyx_v_e_gap_high[__pyx_v_j]); __pyx_v_n <= __pyx_t_5; __pyx_v_n++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1343
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1344
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length             # <<<<<<<<<<<<<<
@@ -50783,7 +50845,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             __pyx_t_6 = ((__pyx_v_n - __pyx_v_m) >= 1);
             if (__pyx_t_6) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1344
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1345
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)             # <<<<<<<<<<<<<<
@@ -50792,7 +50854,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_k), __pyx_v_step);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1345
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1346
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)             # <<<<<<<<<<<<<<
@@ -50801,7 +50863,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (&__pyx_v_m), 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1346
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1347
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)             # <<<<<<<<<<<<<<
@@ -50818,7 +50880,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_L29:;
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1347
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1348
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step             # <<<<<<<<<<<<<<
@@ -50828,7 +50890,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_k = (__pyx_v_k + __pyx_v_step);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1348
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1349
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step
  *             free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -50837,7 +50899,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     free(__pyx_v_e_gaps1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1349
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1350
  *                 k = k + step
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -50846,7 +50908,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1350
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1351
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2
  *             len1 = len2             # <<<<<<<<<<<<<<
@@ -50856,7 +50918,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_len1 = __pyx_v_len2;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1352
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1353
  *             len1 = len2
  * 
  *         step = 1+(num_gaps*2)             # <<<<<<<<<<<<<<
@@ -50865,7 +50927,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = (1 + (__pyx_v_num_gaps * 2));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1353
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1354
  * 
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -50874,7 +50936,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1354
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1355
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0             # <<<<<<<<<<<<<<
@@ -50883,7 +50945,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1355
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1356
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:             # <<<<<<<<<<<<<<
@@ -50893,7 +50955,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_x_high;
   for (__pyx_v_i = __pyx_v_e_high; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1356
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1357
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:
  *             j = 0             # <<<<<<<<<<<<<<
@@ -50902,7 +50964,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1357
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1358
  *         for i from e_high <= i <= e_x_high:
  *             j = 0
  *             while j < len1:             # <<<<<<<<<<<<<<
@@ -50913,7 +50975,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_j < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1358
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1359
  *             j = 0
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:             # <<<<<<<<<<<<<<
@@ -50929,7 +50991,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1359
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1360
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)             # <<<<<<<<<<<<<<
@@ -50938,7 +51000,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
         __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_j), __pyx_v_step);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1360
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1361
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)             # <<<<<<<<<<<<<<
@@ -50950,7 +51012,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L37:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1361
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1362
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step             # <<<<<<<<<<<<<<
@@ -50961,7 +51023,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1362
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1363
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -50970,7 +51032,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1363
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1364
  *                 j = j + step
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -50979,7 +51041,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1364
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1365
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2
  *         len1 = len2             # <<<<<<<<<<<<<<
@@ -50988,7 +51050,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = __pyx_v_len2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1366
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1367
  *         len1 = len2
  * 
  *         step = (num_gaps+1)*2             # <<<<<<<<<<<<<<
@@ -50997,7 +51059,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = ((__pyx_v_num_gaps + 1) * 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1367
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1368
  * 
  *         step = (num_gaps+1)*2
  *         i = 0             # <<<<<<<<<<<<<<
@@ -51006,7 +51068,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1369
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1370
  *         i = 0
  * 
  *         while i < len1:             # <<<<<<<<<<<<<<
@@ -51017,7 +51079,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_i < __pyx_v_len1);
     if (!__pyx_t_2) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1370
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1371
  * 
  *         while i < len1:
  *             ephr_arr._clear()             # <<<<<<<<<<<<<<
@@ -51026,7 +51088,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_clear(__pyx_v_ephr_arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1371
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1372
  *         while i < len1:
  *             ephr_arr._clear()
  *             num_chunks = 0             # <<<<<<<<<<<<<<
@@ -51035,20 +51097,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_num_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1372
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1373
  *             ephr_arr._clear()
  *             num_chunks = 0
  *             indexes = []             # <<<<<<<<<<<<<<
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  */
-    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1372; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(((PyObject *)__pyx_v_indexes));
     __pyx_v_indexes = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1373
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1374
  *             num_chunks = 0
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:             # <<<<<<<<<<<<<<
@@ -51058,7 +51120,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_9 = (__pyx_v_num_gaps + 1);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_9; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1374
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1375
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -51068,7 +51130,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = ((__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]) < (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]));
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1375
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1376
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1             # <<<<<<<<<<<<<<
@@ -51080,7 +51142,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L42:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1376
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1377
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -51090,19 +51152,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_3 = (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]);
       for (__pyx_v_k = (__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1377
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1378
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  */
-        __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1378
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1379
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])             # <<<<<<<<<<<<<<
@@ -51110,14 +51172,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  */
         __pyx_t_4 = (__pyx_v_self->eda->data->arr[(__pyx_v_e_sent_start + __pyx_v_k)]);
-        __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->eid2symid), __pyx_t_4, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->eid2symid), __pyx_t_4, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_append(__pyx_v_ephr_arr, __pyx_t_4);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1379
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1380
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:             # <<<<<<<<<<<<<<
@@ -51127,19 +51189,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = (__pyx_v_j < __pyx_v_num_gaps);
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1380
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1381
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  */
-        __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1381
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1382
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
@@ -51152,7 +51214,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_L45:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1382
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1383
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step             # <<<<<<<<<<<<<<
@@ -51161,7 +51223,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_i = (__pyx_v_i + __pyx_v_step);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1383
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1384
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:             # <<<<<<<<<<<<<<
@@ -51177,22 +51239,22 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1384
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1385
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:
  *                 result.append((Phrase(ephr_arr),indexes))             # <<<<<<<<<<<<<<
  * 
  *         free(e_gaps1)
  */
-      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(((PyObject *)__pyx_v_ephr_arr));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_ephr_arr));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_ephr_arr));
-      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
       __Pyx_GIVEREF(__pyx_t_11);
@@ -51200,7 +51262,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_indexes));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_indexes));
       __pyx_t_11 = 0;
-      __pyx_t_11 = __Pyx_PyObject_Append(__pyx_v_result, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = __Pyx_PyObject_Append(__pyx_v_result, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
@@ -51209,7 +51271,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_L46:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1386
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1387
  *                 result.append((Phrase(ephr_arr),indexes))
  * 
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -51218,7 +51280,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1387
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1388
  * 
  *         free(e_gaps1)
  *         free(e_gap_order)             # <<<<<<<<<<<<<<
@@ -51227,7 +51289,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gap_order);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1388
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1389
  *         free(e_gaps1)
  *         free(e_gap_order)
  *         return result             # <<<<<<<<<<<<<<
@@ -51255,7 +51317,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1390
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1391
  *         return result
  * 
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):             # <<<<<<<<<<<<<<
@@ -51283,55 +51345,55 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("create_alignments", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1392
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1393
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):
  *         cdef unsigned i
  *         cdef IntList ret = IntList()             # <<<<<<<<<<<<<<
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1393
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1394
  *         cdef unsigned i
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):             # <<<<<<<<<<<<<<
  *             s = findexes[i]
  *             if (s<0):
  */
-  __pyx_t_2 = PyObject_Length(__pyx_v_findexes); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_v_findexes); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
     __pyx_v_i = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1394
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1395
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):
  *             s = findexes[i]             # <<<<<<<<<<<<<<
  *             if (s<0):
  *                 continue
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_findexes, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_findexes, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_s);
     __pyx_v_s = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1395
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1396
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  *             if (s<0):             # <<<<<<<<<<<<<<
  *                 continue
  *             idx = 0
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1396
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1397
  *             s = findexes[i]
  *             if (s<0):
  *                 continue             # <<<<<<<<<<<<<<
@@ -51343,7 +51405,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1397
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1398
  *             if (s<0):
  *                 continue
  *             idx = 0             # <<<<<<<<<<<<<<
@@ -51354,7 +51416,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __Pyx_XDECREF(__pyx_v_idx);
     __pyx_v_idx = __pyx_int_0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1398
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1399
  *                 continue
  *             idx = 0
  *             while (idx < num_links*2):             # <<<<<<<<<<<<<<
@@ -51362,51 +51424,51 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
  *                     j = eindexes.index(sent_links[idx+1])
  */
     while (1) {
-      __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (!__pyx_t_4) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1399
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1400
  *             idx = 0
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):             # <<<<<<<<<<<<<<
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  */
-      __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1400
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1401
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])             # <<<<<<<<<<<<<<
  *                     ret.append(i*65536+j)
  *                 idx += 2
  */
-        __pyx_t_1 = PyObject_GetAttr(__pyx_v_eindexes, __pyx_n_s__index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(__pyx_v_eindexes, __pyx_n_s__index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_5 = PyNumber_Add(__pyx_v_idx, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyNumber_Add(__pyx_v_idx, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         __pyx_t_5 = 0;
-        __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
@@ -51414,19 +51476,19 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
         __pyx_v_j = __pyx_t_5;
         __pyx_t_5 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1401
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1402
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)             # <<<<<<<<<<<<<<
  *                 idx += 2
  *         return ret
  */
-        __pyx_t_5 = PyInt_FromLong((__pyx_v_i * 65536)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyInt_FromLong((__pyx_v_i * 65536)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_v_j); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_v_j); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_t_5 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_ret), __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_ret), __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -51434,14 +51496,14 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       }
       __pyx_L8:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1402
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1403
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  *                 idx += 2             # <<<<<<<<<<<<<<
  *         return ret
  * 
  */
-      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_idx, __pyx_int_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_idx, __pyx_int_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_v_idx);
       __pyx_v_idx = __pyx_t_5;
@@ -51450,7 +51512,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __pyx_L3_continue:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1403
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1404
  *                     ret.append(i*65536+j)
  *                 idx += 2
  *         return ret             # <<<<<<<<<<<<<<
@@ -51480,7 +51542,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1405
+/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1406
  *         return ret
  * 
  *     cdef extract(self, Phrase phrase, Matching* matching, int* chunklen, int num_chunks):             # <<<<<<<<<<<<<<
@@ -51574,19 +51636,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("extract", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1418
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1419
  *         cdef reason_for_failure
  * 
  *         fphr_arr = IntList()             # <<<<<<<<<<<<<<
  *         phrase_len = phrase.n
  *         extracts = []
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_fphr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1419
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1420
  * 
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n             # <<<<<<<<<<<<<<
@@ -51595,19 +51657,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_phrase_len = __pyx_v_phrase->n;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1420
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1421
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n
  *         extracts = []             # <<<<<<<<<<<<<<
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_extracts = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1421
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1422
  *         phrase_len = phrase.n
  *         extracts = []
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -51616,7 +51678,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_sent_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->alignment->__pyx_vtab)->_get_sent_links(__pyx_v_self->alignment, __pyx_v_matching->sent_id, (&__pyx_v_num_links));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1423
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1424
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -51625,7 +51687,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_start = (__pyx_v_self->eda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1424
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1425
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -51634,7 +51696,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_end = (__pyx_v_self->eda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1425
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1426
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1             # <<<<<<<<<<<<<<
@@ -51643,7 +51705,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_len = ((__pyx_v_e_sent_end - __pyx_v_e_sent_start) - 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1426
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1427
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -51652,7 +51714,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_start = (__pyx_v_self->fda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1427
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1428
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -51661,7 +51723,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_end = (__pyx_v_self->fda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1428
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1429
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]
  *         f_sent_len = f_sent_end - f_sent_start - 1             # <<<<<<<<<<<<<<
@@ -51670,21 +51732,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_len = ((__pyx_v_f_sent_end - __pyx_v_f_sent_start) - 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1430
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1431
  *         f_sent_len = f_sent_end - f_sent_start - 1
  * 
  *         self.findexes1.reset()             # <<<<<<<<<<<<<<
  *         sofar = 0
  *         for i in range(num_chunks):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes1), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes1), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1431
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1432
  * 
  *         self.findexes1.reset()
  *         sofar = 0             # <<<<<<<<<<<<<<
@@ -51694,7 +51756,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_sofar = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1432
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1433
  *         self.findexes1.reset()
  *         sofar = 0
  *         for i in range(num_chunks):             # <<<<<<<<<<<<<<
@@ -51705,7 +51767,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1433
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1434
  *         sofar = 0
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):             # <<<<<<<<<<<<<<
@@ -51716,35 +51778,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_v_j = __pyx_t_6;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1434
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1435
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);             # <<<<<<<<<<<<<<
  *                 sofar += 1
  *             if (i+1<num_chunks):
  */
-      __pyx_t_2 = PyInt_FromLong((((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong((((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1435
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1436
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1             # <<<<<<<<<<<<<<
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  */
-      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_1;
       __pyx_t_1 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1436
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1437
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1
  *             if (i+1<num_chunks):             # <<<<<<<<<<<<<<
@@ -51754,28 +51816,28 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = ((__pyx_v_i + 1) < __pyx_v_num_chunks);
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1437
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1438
  *                 sofar += 1
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])             # <<<<<<<<<<<<<<
  *                 sofar += 1
  * 
  */
-      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_phrase), __pyx_v_sofar); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_phrase), __pyx_v_sofar); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1438
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1439
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  *                 sofar += 1             # <<<<<<<<<<<<<<
  * 
  * 
  */
-      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_2;
@@ -51785,7 +51847,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1441
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1442
  * 
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51794,7 +51856,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_low = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1442
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1443
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51803,7 +51865,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_high = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1443
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1444
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51812,7 +51874,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_low = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1444
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1445
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51821,7 +51883,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_high = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1445
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1446
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51830,7 +51892,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1446
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1447
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51839,7 +51901,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1447
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1448
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51848,7 +51910,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1448
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1449
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51857,7 +51919,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1449
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1450
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51866,7 +51928,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1450
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1451
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51875,7 +51937,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1451
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1452
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51884,7 +51946,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1452
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1453
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51893,7 +51955,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1454
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1455
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))
  * 
  *         reason_for_failure = ""             # <<<<<<<<<<<<<<
@@ -51903,7 +51965,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_45);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1456
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1457
  *         reason_for_failure = ""
  * 
  *         for i from 0 <= i < e_sent_len:             # <<<<<<<<<<<<<<
@@ -51913,7 +51975,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_e_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1457
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1458
  * 
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -51922,7 +51984,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_e_links_low[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1458
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1459
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -51932,7 +51994,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_e_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1459
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1460
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:             # <<<<<<<<<<<<<<
@@ -51942,7 +52004,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_f_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1460
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1461
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -51951,7 +52013,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_f_links_low[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1461
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1462
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1
  *             f_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -51961,7 +52023,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_f_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1467
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1468
  *         # links that we care about (but then how to look up
  *         # when we want to check something on the e side?)
  *         i = 0             # <<<<<<<<<<<<<<
@@ -51970,7 +52032,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1468
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1469
  *         # when we want to check something on the e side?)
  *         i = 0
  *         while i < num_links*2:             # <<<<<<<<<<<<<<
@@ -51981,7 +52043,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = (__pyx_v_i < (__pyx_v_num_links * 2));
     if (!__pyx_t_7) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1469
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1470
  *         i = 0
  *         while i < num_links*2:
  *             f_i = sent_links[i]             # <<<<<<<<<<<<<<
@@ -51990,7 +52052,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_f_i = (__pyx_v_sent_links[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1470
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1471
  *         while i < num_links*2:
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]             # <<<<<<<<<<<<<<
@@ -51999,7 +52061,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_e_i = (__pyx_v_sent_links[(__pyx_v_i + 1)]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1471
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1472
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:             # <<<<<<<<<<<<<<
@@ -52015,7 +52077,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1472
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1473
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i             # <<<<<<<<<<<<<<
@@ -52027,7 +52089,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1473
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1474
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:             # <<<<<<<<<<<<<<
@@ -52043,7 +52105,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_8) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1474
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1475
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1             # <<<<<<<<<<<<<<
@@ -52055,7 +52117,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1475
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1476
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:             # <<<<<<<<<<<<<<
@@ -52071,7 +52133,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1476
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1477
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i             # <<<<<<<<<<<<<<
@@ -52083,7 +52145,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1477
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1478
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:             # <<<<<<<<<<<<<<
@@ -52099,7 +52161,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1478
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1479
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1             # <<<<<<<<<<<<<<
@@ -52111,7 +52173,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1479
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1480
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1
  *             i = i + 2             # <<<<<<<<<<<<<<
@@ -52121,19 +52183,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + 2);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1481
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1482
  *             i = i + 2
  * 
  *         als = []             # <<<<<<<<<<<<<<
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  */
-  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_als = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1482
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1483
  * 
  *         als = []
  *         for x in range(matching.start,matching.end):             # <<<<<<<<<<<<<<
@@ -52144,18 +52206,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = __pyx_v_matching->start; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_x = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1483
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1484
  *         als = []
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])             # <<<<<<<<<<<<<<
  *             als.append(al)
  *         # check all source-side alignment constraints
  */
-    __pyx_t_2 = PyInt_FromLong(((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
@@ -52167,17 +52229,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_al = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1484
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1485
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  *             als.append(al)             # <<<<<<<<<<<<<<
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  */
-    __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1486
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1487
  *             als.append(al)
  *         # check all source-side alignment constraints
  *         met_constraints = 1             # <<<<<<<<<<<<<<
@@ -52186,7 +52248,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_met_constraints = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1487
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1488
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  *         if self.require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -52195,7 +52257,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_self->require_aligned_terminal) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1488
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1489
  *         met_constraints = 1
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -52204,7 +52266,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_num_aligned_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1489
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1490
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:             # <<<<<<<<<<<<<<
@@ -52214,7 +52276,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_3 = __pyx_v_num_chunks;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1490
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1491
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:             # <<<<<<<<<<<<<<
@@ -52224,7 +52286,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_chunklen[__pyx_v_i]);
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1491
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1492
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:             # <<<<<<<<<<<<<<
@@ -52234,7 +52296,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_9 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)]) > -1);
         if (__pyx_t_9) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1492
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1493
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1             # <<<<<<<<<<<<<<
@@ -52243,7 +52305,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_num_aligned_chunks = (__pyx_v_num_aligned_chunks + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1493
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1494
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break             # <<<<<<<<<<<<<<
@@ -52258,7 +52320,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_L24_break:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1494
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1495
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break
  *             if num_aligned_chunks == 0:             # <<<<<<<<<<<<<<
@@ -52268,7 +52330,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_9 = (__pyx_v_num_aligned_chunks == 0);
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1495
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1496
  *                         break
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"             # <<<<<<<<<<<<<<
@@ -52279,7 +52341,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_126);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1496
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1497
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52291,7 +52353,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L26:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1497
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1498
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:             # <<<<<<<<<<<<<<
@@ -52306,7 +52368,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1498
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1499
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"             # <<<<<<<<<<<<<<
@@ -52317,7 +52379,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_127);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1499
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1500
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52332,7 +52394,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L20:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1501
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1502
  *                 met_constraints = 0
  * 
  *         if met_constraints and self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52346,7 +52408,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1503
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1504
  *         if met_constraints and self.tight_phrases:
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:             # <<<<<<<<<<<<<<
@@ -52356,7 +52418,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_12 = (__pyx_v_num_chunks - 1);
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1504
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1505
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -52366,7 +52428,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1505
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1506
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -52377,7 +52439,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1506
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1507
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52386,7 +52448,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1507
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1508
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -52398,7 +52460,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L31:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1508
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1509
  *                     met_constraints = 0
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -52408,7 +52470,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - 1) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1509
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1510
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -52419,7 +52481,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1510
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1511
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52428,7 +52490,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1511
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1512
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -52445,7 +52507,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L28:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1513
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1514
  *                     break
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52454,7 +52516,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_low = ((__pyx_v_matching->arr[__pyx_v_matching->start]) - __pyx_v_f_sent_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1514
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1515
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52463,7 +52525,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_high = (((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_matching->size) - 1)]) + (__pyx_v_chunklen[(__pyx_v_num_chunks - 1)])) - __pyx_v_f_sent_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1515
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1516
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start
  *         if met_constraints:             # <<<<<<<<<<<<<<
@@ -52472,17 +52534,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_met_constraints) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1517
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1518
  *         if met_constraints:
  * 
  *             if self.find_fixpoint(f_low, f_high, f_links_low, f_links_high, e_links_low, e_links_high,             # <<<<<<<<<<<<<<
  *                                 -1, -1, &e_low, &e_high, &f_back_low, &f_back_high, f_sent_len, e_sent_len,
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  */
-    __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1521
+    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1522
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):             # <<<<<<<<<<<<<<
@@ -52493,7 +52555,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1522
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1523
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0             # <<<<<<<<<<<<<<
@@ -52502,7 +52564,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_gap_error = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1523
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1524
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0
  *                 num_gaps = 0             # <<<<<<<<<<<<<<
@@ -52511,7 +52573,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_num_gaps = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1525
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1526
  *                 num_gaps = 0
  * 
  *                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -52521,7 +52583,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1526
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1527
  * 
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low             # <<<<<<<<<<<<<<
@@ -52530,7 +52592,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[0]) = __pyx_v_f_back_low;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1527
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1528
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low             # <<<<<<<<<<<<<<
@@ -52539,7 +52601,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[0]) = __pyx_v_f_low;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1528
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1529
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1             # <<<<<<<<<<<<<<
@@ -52548,7 +52610,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1529
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1530
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1
  *                     gap_start = 0             # <<<<<<<<<<<<<<
@@ -52557,7 +52619,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1530
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1531
  *                     num_gaps = 1
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -52566,7 +52628,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1531
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1532
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -52576,7 +52638,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1532
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1533
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -52588,7 +52650,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L36:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1533
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1534
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52597,7 +52659,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1534
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1535
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -52613,7 +52675,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1535
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1536
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -52622,7 +52684,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1536
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1537
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -52642,7 +52704,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1538
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1539
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"
  *                 else:
  *                     gap_start = 1             # <<<<<<<<<<<<<<
@@ -52651,7 +52713,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1539
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1540
  *                 else:
  *                     gap_start = 1
  *                     if self.tight_phrases and f_links_low[f_low] == -1:             # <<<<<<<<<<<<<<
@@ -52666,7 +52728,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1542
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1543
  *                         # this is not a hard error.    we can't extract this phrase
  *                         # but we still might be able to extract a superphrase
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52680,7 +52742,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L35:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1544
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1545
  *                         met_constraints = 0
  * 
  *                 for i from 0 <= i < matching.size - 1:             # <<<<<<<<<<<<<<
@@ -52690,7 +52752,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_12 = (__pyx_v_matching->size - 1);
       for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1545
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1546
  * 
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52699,7 +52761,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(1 + __pyx_v_i)]) = (((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1546
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1547
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52708,7 +52770,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(1 + __pyx_v_i)]) = ((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - __pyx_v_f_sent_start);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1547
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1548
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -52718,7 +52780,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1549
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1550
  *                     num_gaps = num_gaps + 1
  * 
  *                 if f_high < f_back_high:             # <<<<<<<<<<<<<<
@@ -52728,7 +52790,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_high < __pyx_v_f_back_high);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1550
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1551
  * 
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high             # <<<<<<<<<<<<<<
@@ -52737,7 +52799,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_high;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1551
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1552
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high             # <<<<<<<<<<<<<<
@@ -52746,7 +52808,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_back_high;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1552
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1553
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -52755,7 +52817,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1553
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1554
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -52764,7 +52826,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1554
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1555
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -52774,7 +52836,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1555
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1556
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -52786,7 +52848,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L43:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1556
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1557
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52795,7 +52857,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1557
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1558
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:             # <<<<<<<<<<<<<<
@@ -52811,7 +52873,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1558
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1559
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -52820,7 +52882,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1559
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1560
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -52840,7 +52902,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1561
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1562
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -52855,7 +52917,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1562
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1563
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52869,7 +52931,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L42:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1564
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1565
  *                         met_constraints = 0
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -52879,7 +52941,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1565
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1566
  * 
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low             # <<<<<<<<<<<<<<
@@ -52888,7 +52950,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_e_word_count = (__pyx_v_e_high - __pyx_v_e_low);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1566
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1567
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases             # <<<<<<<<<<<<<<
@@ -52898,17 +52960,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_num_gaps;
         for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1567
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1568
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases
  *                         if self.find_fixpoint(f_gap_low[gap_start+i], f_gap_high[gap_start+i],             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low+gap_start+i, e_gap_high+gap_start+i,
  */
-          __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1567; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1572
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1573
  *                                             f_gap_low+gap_start+i, f_gap_high+gap_start+i,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -52919,7 +52981,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1574
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1575
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -52928,18 +52990,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1575
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1576
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])             # <<<<<<<<<<<<<<
  *                             break
  * 
  */
-            __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
@@ -52947,14 +53009,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_10 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_131), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_131), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
             __pyx_v_reason_for_failure = ((PyObject *)__pyx_t_1);
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1576
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1577
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])
  *                             break             # <<<<<<<<<<<<<<
@@ -52971,7 +53033,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L47:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1578
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1579
  *                             break
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -52981,7 +53043,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1579
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1580
  * 
  *                 if gap_error == 0:
  *                     i = 1             # <<<<<<<<<<<<<<
@@ -52990,21 +53052,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_i = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1580
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1581
  *                 if gap_error == 0:
  *                     i = 1
  *                     self.findexes.reset()             # <<<<<<<<<<<<<<
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  */
-        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1580; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1581
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1582
  *                     i = 1
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -53014,7 +53076,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1582
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1583
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53023,7 +53085,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1583
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1584
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1             # <<<<<<<<<<<<<<
@@ -53032,16 +53094,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_i = (__pyx_v_i + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1584
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1585
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -53049,27 +53111,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L52:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1585
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1586
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  */
-        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->findexes1));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-        __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1586
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1587
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -53079,7 +53141,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_phrase->n;
         for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1587
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1588
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -53089,7 +53151,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
           if (__pyx_t_4) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1588
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1589
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53098,7 +53160,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1589
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1590
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))
  *                             i = i + 1             # <<<<<<<<<<<<<<
@@ -53110,7 +53172,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1591
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1592
  *                             i = i + 1
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -53122,7 +53184,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_L55:;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1592
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1593
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -53132,7 +53194,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_high > __pyx_v_f_high);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1593
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1594
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53141,16 +53203,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1594
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1595
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  * 
  *                     fphr = Phrase(fphr_arr)
  */
-          __pyx_t_10 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -53158,25 +53220,25 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L56:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1596
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1597
  *                         self.findexes.append(sym_setindex(self.category, i))
  * 
  *                     fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                     if met_constraints:
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  */
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1596; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_fphr_arr));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-        __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1596; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_10);
         __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1597
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1598
  * 
  *                     fphr = Phrase(fphr_arr)
  *                     if met_constraints:             # <<<<<<<<<<<<<<
@@ -53185,47 +53247,47 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_met_constraints) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1600
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1601
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)
  */
-          __pyx_t_10 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_low, __pyx_v_e_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, __pyx_v_num_gaps, __pyx_v_f_back_low, __pyx_v_f_back_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_low, __pyx_v_e_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, __pyx_v_num_gaps, __pyx_v_f_back_low, __pyx_v_f_back_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_v_phrase_list = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1601
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1602
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  */
-          __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_7 = (__pyx_t_13 > 0);
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1602
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1603
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                         else:
  *                             pair_count = 0
  */
-            __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (unlikely(__pyx_t_13 == 0)) {
               PyErr_Format(PyExc_ZeroDivisionError, "float division");
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             __pyx_v_pair_count = (1.0 / __pyx_t_13);
             goto __pyx_L58;
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1604
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1605
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  *                             pair_count = 0             # <<<<<<<<<<<<<<
@@ -53234,22 +53296,22 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_pair_count = 0.0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1605
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1606
  *                         else:
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  */
-            __pyx_t_10 = PyInt_FromLong(__pyx_v_f_back_low); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_v_f_back_low); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyInt_FromLong(__pyx_v_e_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromLong(__pyx_v_e_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
@@ -53263,7 +53325,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
             __pyx_t_14 = 0;
-            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_14));
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
@@ -53272,7 +53334,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L58:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1606
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1607
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:             # <<<<<<<<<<<<<<
@@ -53283,7 +53345,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_14 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_14); __pyx_t_13 = 0;
             __pyx_t_16 = NULL;
           } else {
-            __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
             __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
           }
@@ -53291,23 +53353,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else {
               __pyx_t_15 = __pyx_t_16(__pyx_t_14);
               if (unlikely(!__pyx_t_15)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -53323,7 +53385,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (unlikely(size != 2)) {
                 if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                 else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
@@ -53336,14 +53398,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_2);
               #else
-              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             } else
             {
               Py_ssize_t index = -1;
-              __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -53351,7 +53413,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_GOTREF(__pyx_t_1);
               index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L61_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_2);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               goto __pyx_L62_unpacking_done;
@@ -53359,7 +53421,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               __pyx_t_17 = NULL;
               if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L62_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_phrase2);
@@ -53369,7 +53431,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_eindexes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1607
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1608
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -53378,31 +53440,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_t_15 = ((PyObject *)__pyx_v_self->findexes);
             __Pyx_INCREF(__pyx_t_15);
-            __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             __Pyx_XDECREF(((PyObject *)__pyx_v_als1));
             __pyx_v_als1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1608
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1609
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))             # <<<<<<<<<<<<<<
  * 
  *                     if (num_gaps < self.max_nonterminals and
  */
-            __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_als1));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als1));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_als1));
-            __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
@@ -53416,7 +53478,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -53426,7 +53488,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L57:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1610
+        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1611
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))
  * 
  *                     if (num_gaps < self.max_nonterminals and             # <<<<<<<<<<<<<<
@@ -53436,7 +53498,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_num_gaps < __pyx_v_self->max_nonterminals);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1611
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1612
  * 
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and             # <<<<<<<<<<<<<<
@@ -53446,7 +53508,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_phrase_len < __pyx_v_self->max_length);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1612
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1613
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):             # <<<<<<<<<<<<<<
@@ -53464,7 +53526,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_9) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1613
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1614
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -53474,7 +53536,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_low == __pyx_v_f_low);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1614
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1615
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -53484,7 +53546,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1615
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1616
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):             # <<<<<<<<<<<<<<
@@ -53514,7 +53576,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1616
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1617
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -53523,7 +53585,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1617
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1618
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -53532,7 +53594,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1618
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1619
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -53541,7 +53603,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1619
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1620
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -53558,7 +53620,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1620
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1621
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -53571,7 +53633,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L65:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1621
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1622
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -53587,7 +53649,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1622
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1623
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -53599,7 +53661,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L68:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1624
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1625
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -53608,17 +53670,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1625
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1626
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_back_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1625; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1629
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1630
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -53628,7 +53690,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_14, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 1, 0, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1631
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1632
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and             # <<<<<<<<<<<<<<
@@ -53644,17 +53706,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1632
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1633
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and
  *                                 self.find_fixpoint(f_x_low, f_low,    # check integrity of new subphrase             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  */
-                  __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1632; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_1);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1636
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1637
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -53677,7 +53739,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1638
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1639
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -53686,7 +53748,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1639
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1640
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -53695,35 +53757,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1640
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1641
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_1 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1641
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1642
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1642
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1643
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53732,7 +53794,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1643
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1644
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -53741,27 +53803,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1644
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1645
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1645
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1646
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -53771,7 +53833,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1646
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1647
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -53781,7 +53843,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1647
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1648
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53790,7 +53852,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1648
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1649
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -53802,7 +53864,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1650
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1651
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -53814,7 +53876,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L72:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1651
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1652
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -53824,7 +53886,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_high > __pyx_v_f_high);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1652
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1653
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53833,16 +53895,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1653
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1654
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  */
-                __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1653; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -53850,67 +53912,67 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L73:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1654
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1655
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  */
-              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_15);
               __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1657
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1658
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_15 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_15;
               __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1658
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1659
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1658; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1659
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1660
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L74;
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1661
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1662
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -53921,7 +53983,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L74:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1662
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1663
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -53932,7 +53994,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_15 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_15); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __pyx_t_16 = Py_TYPE(__pyx_t_15)->tp_iternext;
               }
@@ -53940,23 +54002,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_15)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else {
                   __pyx_t_1 = __pyx_t_16(__pyx_t_15);
                   if (unlikely(!__pyx_t_1)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -53972,7 +54034,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
@@ -53985,14 +54047,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_INCREF(__pyx_t_14);
                   __Pyx_INCREF(__pyx_t_2);
                   #else
-                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -54000,7 +54062,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_14);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L77_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L78_unpacking_done;
@@ -54008,7 +54070,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   __pyx_t_17 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L78_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -54018,7 +54080,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1663
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1664
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -54027,31 +54089,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_1 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_1);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_1, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_1, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als2));
                 __pyx_v_als2 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1664
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1665
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))             # <<<<<<<<<<<<<<
  * 
  *                         if (f_back_high == f_high and
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als2));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_als2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als2));
-                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-                __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr));
@@ -54065,7 +54127,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_t_2 = 0;
                 __pyx_t_14 = 0;
-                __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
@@ -54078,7 +54140,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L64:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1666
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1667
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))
  * 
  *                         if (f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -54088,7 +54150,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_high == __pyx_v_f_high);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1667
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1668
  * 
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -54098,7 +54160,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_f_sent_len - __pyx_v_f_high) >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1668
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1669
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):             # <<<<<<<<<<<<<<
@@ -54128,7 +54190,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1669
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1670
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -54137,7 +54199,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1670
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1671
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -54146,7 +54208,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1671
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1672
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -54155,7 +54217,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1672
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1673
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -54172,7 +54234,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1673
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1674
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -54185,7 +54247,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L80:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1674
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1675
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -54201,7 +54263,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1675
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1676
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -54213,7 +54275,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L83:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1677
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1678
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -54222,17 +54284,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1678
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1679
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_back_low, f_x_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1678; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1679; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1682
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1683
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -54242,7 +54304,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_back_low, __pyx_t_15, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 0, 1, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1684
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1685
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and             # <<<<<<<<<<<<<<
@@ -54258,17 +54320,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1685
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1686
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low+gap_start+num_gaps, e_gap_high+gap_start+num_gaps,
  */
-                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1685; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_14);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1690
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1691
  *                                             f_gap_low+gap_start+num_gaps, f_gap_high+gap_start+num_gaps,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -54291,7 +54353,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1692
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1693
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -54300,7 +54362,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1693
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1694
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -54309,21 +54371,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1694
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1695
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1694; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1695; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1694; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1695; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1695
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1696
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -54333,7 +54395,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_low < __pyx_v_f_low);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1696
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1697
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54342,7 +54404,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1697
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1698
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1             # <<<<<<<<<<<<<<
@@ -54351,16 +54413,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_v_i = (__pyx_v_i + 1);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1698
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1699
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  */
-                __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1698; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1698; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -54368,27 +54430,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L85:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1699
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1700
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1700
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1701
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -54398,7 +54460,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1701
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1702
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -54408,7 +54470,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1702
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1703
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54417,7 +54479,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1703
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1704
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -54429,7 +54491,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1705
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1706
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -54441,7 +54503,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L88:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1706
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1707
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54450,81 +54512,81 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1707
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1708
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1707; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1708
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1709
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  */
-              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
               __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1711
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1712
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_1;
               __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1712
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1713
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1713
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1714
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L89;
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1715
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1716
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -54535,7 +54597,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L89:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1716
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1717
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -54546,7 +54608,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_1 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_1); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __pyx_t_16 = Py_TYPE(__pyx_t_1)->tp_iternext;
               }
@@ -54554,23 +54616,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_1)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else {
                   __pyx_t_14 = __pyx_t_16(__pyx_t_1);
                   if (unlikely(!__pyx_t_14)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -54586,7 +54648,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
@@ -54599,14 +54661,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_INCREF(__pyx_t_15);
                   __Pyx_INCREF(__pyx_t_2);
                   #else
-                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -54614,7 +54676,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_15);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L92_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L93_unpacking_done;
@@ -54622,7 +54684,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   __pyx_t_17 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L93_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -54632,7 +54694,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1717
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1718
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -54641,31 +54703,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_14 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_14);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_14, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_14, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als3));
                 __pyx_v_als3 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1718
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1719
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))             # <<<<<<<<<<<<<<
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als3));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_als3));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als3));
-                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr));
@@ -54679,7 +54741,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_15);
                 __pyx_t_2 = 0;
                 __pyx_t_15 = 0;
-                __pyx_t_15 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -54692,7 +54754,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L79:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1719
+          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1720
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and             # <<<<<<<<<<<<<<
@@ -54702,7 +54764,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_num_gaps < (__pyx_v_self->max_nonterminals - 1));
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1720
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1721
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and             # <<<<<<<<<<<<<<
@@ -54712,7 +54774,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_phrase_len + 1) < __pyx_v_self->max_length);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1721
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1722
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -54722,7 +54784,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_18 = (__pyx_v_f_back_high == __pyx_v_f_high);
               if (__pyx_t_18) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1722
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1723
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -54732,7 +54794,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_8 = (__pyx_v_f_back_low == __pyx_v_f_low);
                 if (__pyx_t_8) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1723
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1724
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
@@ -54742,7 +54804,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_19 = (((__pyx_v_f_back_high - __pyx_v_f_back_low) + (2 * __pyx_v_self->train_min_gap_size)) <= __pyx_v_self->train_max_initial_size);
                   if (__pyx_t_19) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1724
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1725
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -54752,7 +54814,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                     __pyx_t_20 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
                     if (__pyx_t_20) {
 
-                      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1725
+                      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1726
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -54762,7 +54824,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                       __pyx_t_21 = (__pyx_v_f_high <= (__pyx_v_f_sent_len - __pyx_v_self->train_min_gap_size));
                       if (__pyx_t_21) {
 
-                        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1726
+                        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1727
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):             # <<<<<<<<<<<<<<
@@ -54812,7 +54874,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1728
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1729
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):
  * 
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -54821,7 +54883,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1729
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1730
  * 
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -54830,7 +54892,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1730
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1731
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -54839,7 +54901,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1731
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1732
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -54856,7 +54918,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1732
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1733
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -54869,7 +54931,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L95:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1733
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1734
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:             # <<<<<<<<<<<<<<
@@ -54879,7 +54941,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_18 = (__pyx_v_f_x_low < 0);
             if (__pyx_t_18) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1734
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1735
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -54891,7 +54953,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L98:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1736
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1737
  *                                 met_constraints = 0
  * 
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -54900,7 +54962,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1737
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1738
  * 
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -54909,7 +54971,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1738
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1739
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -54926,7 +54988,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_9) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1739
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1740
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -54939,7 +55001,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L99:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1740
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1741
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -54955,7 +55017,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1741
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1742
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -54967,7 +55029,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L102:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1743
+            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1744
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -54976,17 +55038,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1744
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1745
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_x_high,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1748
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1749
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -54996,7 +55058,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 2, 1, 1, 1, 1)) {
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1750
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1751
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and             # <<<<<<<<<<<<<<
@@ -55018,17 +55080,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_9) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1751
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1752
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and
  *                                 self.find_fixpoint(f_x_low, f_low,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  */
-                  __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_15);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1755
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1756
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -55039,17 +55101,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   if (__pyx_t_3) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1757
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1758
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 -1, -1, e_gap_low+1+num_gaps, e_gap_high+1+num_gaps,
  */
-                    __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1757; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1758; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     __Pyx_GOTREF(__pyx_t_15);
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1762
+                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1763
  *                                                 f_gap_low+1+num_gaps, f_gap_high+1+num_gaps,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -55077,7 +55139,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_8) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1764
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1765
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -55086,7 +55148,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1765
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1766
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -55095,35 +55157,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1766
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1767
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1767
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1768
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  */
-              __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1768
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1769
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -55132,7 +55194,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1769
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1770
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -55141,27 +55203,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1770
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1771
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_14 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1771
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1772
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -55171,7 +55233,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1772
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1773
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -55181,7 +55243,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1773
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1774
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -55190,7 +55252,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1774
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1775
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -55202,7 +55264,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1776
+                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1777
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -55214,7 +55276,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L106:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1777
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1778
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -55223,81 +55285,81 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1778
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1779
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  */
-              __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1779
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1780
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  */
-              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_14);
               __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1782
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1783
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_14 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 2), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 2), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1783
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1784
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_8 = (__pyx_t_13 > 0);
               if (__pyx_t_8) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1784
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1785
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L107;
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1786
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1787
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -55308,7 +55370,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L107:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1787
+              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1788
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -55319,7 +55381,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_14 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_14); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
               }
@@ -55327,23 +55389,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else {
                   __pyx_t_15 = __pyx_t_16(__pyx_t_14);
                   if (unlikely(!__pyx_t_15)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -55359,7 +55421,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
@@ -55372,14 +55434,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_INCREF(__pyx_t_1);
                   __Pyx_INCREF(__pyx_t_2);
                   #else
-                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -55387,7 +55449,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_1);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L110_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L111_unpacking_done;
@@ -55395,7 +55457,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   __pyx_t_17 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L111_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -55405,7 +55467,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1788
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1789
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -55414,31 +55476,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_15 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_15);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als4));
                 __pyx_v_als4 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1789
+                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1790
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))             # <<<<<<<<<<<<<<
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als4));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als4));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als4));
-                __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
@@ -55452,7 +55514,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_1);
                 __pyx_t_2 = 0;
                 __pyx_t_1 = 0;
-                __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -55474,7 +55536,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1791
+      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1792
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"             # <<<<<<<<<<<<<<
@@ -55490,7 +55552,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L33:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1793
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1794
  *                 reason_for_failure = "Unable to extract basic phrase"
  * 
  *         free(sent_links)             # <<<<<<<<<<<<<<
@@ -55499,7 +55561,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_sent_links);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1794
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1795
  * 
  *         free(sent_links)
  *         free(f_links_low)             # <<<<<<<<<<<<<<
@@ -55508,7 +55570,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1795
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1796
  *         free(sent_links)
  *         free(f_links_low)
  *         free(f_links_high)             # <<<<<<<<<<<<<<
@@ -55517,7 +55579,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1796
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1797
  *         free(f_links_low)
  *         free(f_links_high)
  *         free(e_links_low)             # <<<<<<<<<<<<<<
@@ -55526,7 +55588,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1797
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1798
  *         free(f_links_high)
  *         free(e_links_low)
  *         free(e_links_high)             # <<<<<<<<<<<<<<
@@ -55535,7 +55597,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1798
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1799
  *         free(e_links_low)
  *         free(e_links_high)
  *         free(f_gap_low)             # <<<<<<<<<<<<<<
@@ -55544,7 +55606,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1799
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1800
  *         free(e_links_high)
  *         free(f_gap_low)
  *         free(f_gap_high)             # <<<<<<<<<<<<<<
@@ -55553,7 +55615,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1800
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1801
  *         free(f_gap_low)
  *         free(f_gap_high)
  *         free(e_gap_low)             # <<<<<<<<<<<<<<
@@ -55562,7 +55624,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1801
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1802
  *         free(f_gap_high)
  *         free(e_gap_low)
  *         free(e_gap_high)             # <<<<<<<<<<<<<<
@@ -55571,7 +55633,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1803
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1804
  *         free(e_gap_high)
  * 
  *         return extracts             # <<<<<<<<<<<<<<
@@ -61576,7 +61638,7 @@ static PyMethodDef __pyx_methods_3_sa_HieroCachingRuleFactory[] = {
   {__Pyx_NAMESTR("reachable"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("shortest"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("get_next_states"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_23input, METH_O, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_22input)},
+  {__Pyx_NAMESTR("input"), (PyCFunction)__pyx_pw_3_sa_23HieroCachingRuleFactory_23input, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_3_sa_23HieroCachingRuleFactory_22input)},
   {0, 0, 0, 0}
 };
 
@@ -65036,6 +65098,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_15_input(PyTypeObject *t,
   p->__pyx_v_loc = 0;
   p->__pyx_v_locs = 0;
   p->__pyx_v_max_locs = 0;
+  p->__pyx_v_meta = 0;
   p->__pyx_v_new_frontier = 0;
   p->__pyx_v_new_node = 0;
   p->__pyx_v_next_states = 0;
@@ -65089,6 +65152,7 @@ static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_15_input(PyObject *o) {
   Py_CLEAR(p->__pyx_v_loc);
   Py_CLEAR(p->__pyx_v_locs);
   Py_CLEAR(p->__pyx_v_max_locs);
+  Py_CLEAR(p->__pyx_v_meta);
   Py_CLEAR(p->__pyx_v_new_frontier);
   Py_CLEAR(p->__pyx_v_new_node);
   Py_CLEAR(p->__pyx_v_next_states);
@@ -65189,6 +65253,9 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_15_input(PyObject *o, visit
   if (p->__pyx_v_max_locs) {
     e = (*v)(p->__pyx_v_max_locs, a); if (e) return e;
   }
+  if (p->__pyx_v_meta) {
+    e = (*v)(p->__pyx_v_meta, a); if (e) return e;
+  }
   if (p->__pyx_v_new_frontier) {
     e = (*v)(p->__pyx_v_new_frontier, a); if (e) return e;
   }
@@ -65339,6 +65406,9 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_15_input(PyObject *o) {
   tmp = ((PyObject*)p->__pyx_v_max_locs);
   p->__pyx_v_max_locs = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_meta);
+  p->__pyx_v_meta = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_new_frontier);
   p->__pyx_v_new_frontier = ((PyObject*)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -66386,6 +66456,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__max_target_chunks, __pyx_k__max_target_chunks, sizeof(__pyx_k__max_target_chunks), 0, 0, 1, 1},
   {&__pyx_n_s__max_target_length, __pyx_k__max_target_length, sizeof(__pyx_k__max_target_length), 0, 0, 1, 1},
   {&__pyx_n_s__merge, __pyx_k__merge, sizeof(__pyx_k__merge), 0, 0, 1, 1},
+  {&__pyx_n_s__meta, __pyx_k__meta, sizeof(__pyx_k__meta), 0, 0, 1, 1},
   {&__pyx_n_s__min_dist, __pyx_k__min_dist, sizeof(__pyx_k__min_dist), 0, 0, 1, 1},
   {&__pyx_n_s__min_gap_size, __pyx_k__min_gap_size, sizeof(__pyx_k__min_gap_size), 0, 0, 1, 1},
   {&__pyx_n_s__name, __pyx_k__name, sizeof(__pyx_k__name), 0, 0, 1, 1},
@@ -66474,8 +66545,8 @@ static int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_zip = __Pyx_GetName(__pyx_b, __pyx_n_s__zip); if (!__pyx_builtin_zip) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_StopIteration = __Pyx_GetName(__pyx_b, __pyx_n_s__StopIteration); if (!__pyx_builtin_StopIteration) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_cmp = __Pyx_GetName(__pyx_b, __pyx_n_s__cmp); if (!__pyx_builtin_cmp) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_sorted = __Pyx_GetName(__pyx_b, __pyx_n_s__sorted); if (!__pyx_builtin_sorted) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_max = __Pyx_GetName(__pyx_b, __pyx_n_s__max); if (!__pyx_builtin_max) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_sorted = __Pyx_GetName(__pyx_b, __pyx_n_s__sorted); if (!__pyx_builtin_sorted) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_max = __Pyx_GetName(__pyx_b, __pyx_n_s__max); if (!__pyx_builtin_max) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -67195,42 +67266,42 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_98));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":107
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":108
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
  * 
  *     def sample(self, PhraseLocation phrase_location):
  */
-  __pyx_k_tuple_102 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_102)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_102 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_102)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_102);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_101));
   PyTuple_SET_ITEM(__pyx_k_tuple_102, 0, ((PyObject *)__pyx_kp_s_101));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_101));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_102));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":316
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":317
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
  *         self.alignment = alignment
  * 
  */
-  __pyx_k_tuple_107 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_107)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_107 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_107)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_107);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_106));
   PyTuple_SET_ITEM(__pyx_k_tuple_107, 0, ((PyObject *)__pyx_kp_s_106));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_106));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_107));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1022
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1023
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-  __pyx_k_tuple_122 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_122)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_122 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_122)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_122);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_121));
   PyTuple_SET_ITEM(__pyx_k_tuple_122, 0, ((PyObject *)__pyx_kp_s_121));
@@ -67556,24 +67627,24 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetVtable(__pyx_type_3_sa_SuffixArray.tp_dict, __pyx_vtabptr_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "SuffixArray", (PyObject *)&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_SuffixArray = &__pyx_type_3_sa_SuffixArray;
-  if (PyType_Ready(&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "TrieNode", (PyObject *)&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "TrieNode", (PyObject *)&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_TrieNode = &__pyx_type_3_sa_TrieNode;
   __pyx_type_3_sa_ExtendedTrieNode.tp_base = __pyx_ptype_3_sa_TrieNode;
-  if (PyType_Ready(&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "ExtendedTrieNode", (PyObject *)&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "ExtendedTrieNode", (PyObject *)&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_ExtendedTrieNode = &__pyx_type_3_sa_ExtendedTrieNode;
-  if (PyType_Ready(&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "TrieTable", (PyObject *)&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "TrieTable", (PyObject *)&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_TrieTable = &__pyx_type_3_sa_TrieTable;
   __pyx_vtabptr_3_sa_PhraseLocation = &__pyx_vtable_3_sa_PhraseLocation;
   __pyx_vtable_3_sa_PhraseLocation.contains = (int (*)(struct __pyx_obj_3_sa_PhraseLocation *, int))__pyx_f_3_sa_14PhraseLocation_contains;
-  if (PyType_Ready(&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_3_sa_PhraseLocation.tp_dict, __pyx_vtabptr_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "PhraseLocation", (PyObject *)&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_3_sa_PhraseLocation.tp_dict, __pyx_vtabptr_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "PhraseLocation", (PyObject *)&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_PhraseLocation = &__pyx_type_3_sa_PhraseLocation;
-  if (PyType_Ready(&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Sampler", (PyObject *)&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Sampler", (PyObject *)&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Sampler = &__pyx_type_3_sa_Sampler;
   __pyx_vtabptr_3_sa_HieroCachingRuleFactory = &__pyx_vtable_3_sa_HieroCachingRuleFactory;
   __pyx_vtable_3_sa_HieroCachingRuleFactory.set_idmap = (PyObject *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, struct __pyx_obj_3_sa_DataArray *))__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap;
@@ -67591,9 +67662,9 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_vtable_3_sa_HieroCachingRuleFactory.extract_phrases = (PyObject *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, int, int, int *, int *, int *, int, int, int, int *, int *, int *, int, int, int))__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases;
   __pyx_vtable_3_sa_HieroCachingRuleFactory.create_alignments = (struct __pyx_obj_3_sa_IntList *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, int *, int, PyObject *, PyObject *))__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments;
   __pyx_vtable_3_sa_HieroCachingRuleFactory.extract = (PyObject *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, struct __pyx_obj_3_sa_Phrase *, struct __pyx_t_3_sa_Matching *, int *, int))__pyx_f_3_sa_23HieroCachingRuleFactory_extract;
-  if (PyType_Ready(&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_3_sa_HieroCachingRuleFactory.tp_dict, __pyx_vtabptr_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "HieroCachingRuleFactory", (PyObject *)&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_3_sa_HieroCachingRuleFactory.tp_dict, __pyx_vtabptr_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "HieroCachingRuleFactory", (PyObject *)&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_HieroCachingRuleFactory = &__pyx_type_3_sa_HieroCachingRuleFactory;
   __pyx_vtabptr_3_sa_Scorer = &__pyx_vtable_3_sa_Scorer;
   __pyx_vtable_3_sa_Scorer.score = (struct __pyx_obj_3_sa_FeatureVector *(*)(struct __pyx_obj_3_sa_Scorer *, PyObject *))__pyx_f_3_sa_6Scorer_score;
@@ -67631,7 +67702,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_ptype_3_sa___pyx_scope_struct_13_genexpr = &__pyx_type_3_sa___pyx_scope_struct_13_genexpr;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_14_alignments) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_14_alignments = &__pyx_type_3_sa___pyx_scope_struct_14_alignments;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_15_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_15_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_15_input = &__pyx_type_3_sa___pyx_scope_struct_15_input;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_16___iter__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_16___iter__ = &__pyx_type_3_sa___pyx_scope_struct_16___iter__;
@@ -67903,7 +67974,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  *      'ephrase',
  *      'paircount',
  */
-  __pyx_t_1 = PyList_New(10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(11); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__fphrase));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__fphrase));
@@ -67935,6 +68006,9 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_INCREF(((PyObject *)__pyx_n_s__e_text));
   PyList_SET_ITEM(__pyx_t_1, 9, ((PyObject *)__pyx_n_s__e_text));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__e_text));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__meta));
+  PyList_SET_ITEM(__pyx_t_1, 10, ((PyObject *)__pyx_n_s__meta));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__meta));
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__FeatureContext));
@@ -67950,7 +68024,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FeatureContext, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":27
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":28
  *     ])
  * 
  * cdef int PRECOMPUTE = 0             # <<<<<<<<<<<<<<
@@ -67959,7 +68033,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_PRECOMPUTE = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":28
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":29
  * 
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1             # <<<<<<<<<<<<<<
@@ -67968,7 +68042,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MERGE = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":29
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":30
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1
  * cdef int BAEZA_YATES = 2             # <<<<<<<<<<<<<<
@@ -67977,7 +68051,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_BAEZA_YATES = 2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":32
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":33
  * 
  * # NOTE: was encoded as a non-terminal in the previous version
  * cdef int EPSILON = sym_fromstring('*EPS*', True)             # <<<<<<<<<<<<<<
@@ -67986,14 +68060,14 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_EPSILON = __pyx_f_3_sa_sym_fromstring(__pyx_k_147, 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":55
+  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":56
  *     cdef public int count
  *     cdef public root
  *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
  *         self.count = 0
  *         self.extended = extended
  */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_k_99 = __pyx_t_1;
   __Pyx_GIVEREF(__pyx_t_1);
diff --git a/python/src/sa/rulefactory.pxi b/python/src/sa/rulefactory.pxi
index 3973554c..248105d3 100644
--- a/python/src/sa/rulefactory.pxi
+++ b/python/src/sa/rulefactory.pxi
@@ -21,7 +21,8 @@ FeatureContext = namedtuple('FeatureContext',
      'matches',
      'test_sentence',
      'f_text',
-     'e_text'
+     'e_text',
+     'meta'
     ])
 
 cdef int PRECOMPUTE = 0
@@ -934,7 +935,7 @@ cdef class HieroCachingRuleFactory:
                     candidate.append([next_id,curr[1]+jump])
         return sorted(result);
 
-    def input(self, fwords):
+    def input(self, fwords, meta):
         '''When this function is called on the RuleFactory,
         it looks up all of the rules that can be used to translate
         the input sentence'''
@@ -1105,8 +1106,8 @@ cdef class HieroCachingRuleFactory:
                                     count = len(locs)
                                     scores = self.scorer.score(FeatureContext(
                                                f, e, count, fcount[f], num_samples,
-                                               (k,i+spanlen), locs, fwords, self.fda, self.eda
-                                               ))
+                                               (k,i+spanlen), locs, fwords, self.fda, self.eda,
+                                               meta))
                                     yield Rule(self.category, f, e, scores, alignment)
 
                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
-- 
cgit v1.2.3


From 5d159b948ad71850bcb03d0882ea7183a3a59b7e Mon Sep 17 00:00:00 2001
From: Adam Lopez <alopez@cs.jhu.edu>
Date: Thu, 6 Sep 2012 15:00:45 -0400
Subject: add FeatureContext.input_span

---
 python/src/sa/_sa.c           | 9715 +++++++++++++++++++++--------------------
 python/src/sa/rulefactory.pxi |   16 +-
 2 files changed, 4896 insertions(+), 4835 deletions(-)

(limited to 'python/src/sa')

diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index 6b6f0ef9..5b47fe8a 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.17 on Thu Sep  6 17:27:34 2012 */
+/* Generated by Cython 0.17 on Thu Sep  6 14:56:12 2012 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -409,7 +409,7 @@ struct __pyx_t_3_sa__Trie_Node;
 struct __pyx_t_3_sa_match_node;
 struct __pyx_t_3_sa_Matching;
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef struct _node:             # <<<<<<<<<<<<<<
@@ -423,7 +423,7 @@ struct __pyx_t_3_sa__node {
   int val;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":30
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":30
  * _init_lower_mask()
  * 
  * cdef struct _BitSet:             # <<<<<<<<<<<<<<
@@ -437,7 +437,7 @@ struct __pyx_t_3_sa__BitSet {
   int size;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":168
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":168
  *     return result
  * 
  * cdef struct _VEB:             # <<<<<<<<<<<<<<
@@ -454,7 +454,7 @@ struct __pyx_t_3_sa__VEB {
   void **bottom;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":10
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":10
  * cdef struct _Trie_Node    # forward decl
  * 
  * cdef struct _Trie_Edge:             # <<<<<<<<<<<<<<
@@ -468,7 +468,7 @@ struct __pyx_t_3_sa__Trie_Edge {
   struct __pyx_t_3_sa__Trie_Edge *smaller;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":8
  * from libc.string cimport memset, memcpy
  * 
  * cdef struct _Trie_Node    # forward decl             # <<<<<<<<<<<<<<
@@ -481,7 +481,7 @@ struct __pyx_t_3_sa__Trie_Node {
   int arr_len;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":65
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":66
  * 
  * # linked list structure for storing matches in BaselineRuleFactory
  * cdef struct match_node:             # <<<<<<<<<<<<<<
@@ -493,7 +493,7 @@ struct __pyx_t_3_sa_match_node {
   struct __pyx_t_3_sa_match_node *next;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":161
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":162
  * 
  * # struct used to encapsulate a single matching
  * cdef struct Matching:             # <<<<<<<<<<<<<<
@@ -508,7 +508,7 @@ struct __pyx_t_3_sa_Matching {
   int size;
 };
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":217
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":218
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -557,7 +557,7 @@ struct __pyx_obj_3_sa_HieroCachingRuleFactory {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":115
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":115
  *             for arc in node for node in lattice)
  * 
  * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
@@ -569,7 +569,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":36
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
  * 
  *     def compute_stats(self, int max_n):             # <<<<<<<<<<<<<<
@@ -600,7 +600,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -634,7 +634,7 @@ struct __pyx_obj_3_sa_IntList {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":340
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":340
  * 
  * 
  * cdef class VEBIterator:             # <<<<<<<<<<<<<<
@@ -648,7 +648,7 @@ struct __pyx_obj_3_sa_VEBIterator {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":47
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":47
  * 
  * 
  * cdef class BiLex:             # <<<<<<<<<<<<<<
@@ -669,7 +669,7 @@ struct __pyx_obj_3_sa_BiLex {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":354
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":354
  * 
  * 
  * cdef class VEB:             # <<<<<<<<<<<<<<
@@ -683,7 +683,7 @@ struct __pyx_obj_3_sa_VEB {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":5
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":5
  * as k most frequent n-grams"""
  * 
  * cdef class LCP:             # <<<<<<<<<<<<<<
@@ -697,7 +697,7 @@ struct __pyx_obj_3_sa_LCP {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
@@ -716,7 +716,7 @@ struct __pyx_obj_3_sa_DataArray {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":100
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":100
  * 
  * 
  * cdef class BitSetIterator:             # <<<<<<<<<<<<<<
@@ -730,7 +730,7 @@ struct __pyx_obj_3_sa_BitSetIterator {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":190
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
  * 
  *     def alignments(self):             # <<<<<<<<<<<<<<
@@ -747,7 +747,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_14_alignments {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":188
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":188
  * 
  * 
  * cdef class Precomputation:             # <<<<<<<<<<<<<<
@@ -768,7 +768,7 @@ struct __pyx_obj_3_sa_Precomputation {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":6
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":6
  * from libc.stdio cimport FILE, fclose, fopen
  * 
  * cdef class SuffixArray:             # <<<<<<<<<<<<<<
@@ -784,7 +784,7 @@ struct __pyx_obj_3_sa_SuffixArray {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":7
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":7
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1
  * 
  * cdef class Alphabet:             # <<<<<<<<<<<<<<
@@ -820,7 +820,7 @@ struct __pyx_obj_3_sa_Rule {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":109
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":109
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)
  *     return tuple(((word, None, 1), ) for word in word_ids)             # <<<<<<<<<<<<<<
@@ -837,7 +837,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -853,14 +853,6 @@ struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
   PyObject *(*__pyx_t_2)(PyObject *);
 };
 
-
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":73
- * # in the suffix array; if discontiguous, it is the set of
- * # actual locations (packed into an array)
- * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
- *     cdef int sa_low
- *     cdef int sa_high
- */
 struct __pyx_obj_3_sa_PhraseLocation {
   PyObject_HEAD
   struct __pyx_vtabstruct_3_sa_PhraseLocation *__pyx_vtab;
@@ -873,7 +865,7 @@ struct __pyx_obj_3_sa_PhraseLocation {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":15
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -889,7 +881,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_16___iter__ {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -917,7 +909,7 @@ struct __pyx_obj_3_sa_FeatureVector {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":111
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":111
  *     return tuple(((word, None, 1), ) for word in word_ids)
  * 
  * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
@@ -930,7 +922,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":23
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":23
  *         return ' '.join('%s=%s' % feat for feat in self)
  * 
  * cdef class Scorer:             # <<<<<<<<<<<<<<
@@ -944,7 +936,7 @@ struct __pyx_obj_3_sa_Scorer {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":8
  * # May need to revisit if things get really tight, though.
  * 
  * cdef class Alignment:             # <<<<<<<<<<<<<<
@@ -959,7 +951,7 @@ struct __pyx_obj_3_sa_Alignment {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":118
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":118
  * # (entirely C-implemented) _BitSet struct.
  * # Very slow; use only for debugging
  * cdef class BitSet:             # <<<<<<<<<<<<<<
@@ -972,7 +964,7 @@ struct __pyx_obj_3_sa_BitSet {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":95
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":96
  * 
  * 
  * cdef class Sampler:             # <<<<<<<<<<<<<<
@@ -986,7 +978,7 @@ struct __pyx_obj_3_sa_Sampler {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":8
  *     char* stringmap_word(StrMap *vocab, int i)
  * 
  * cdef class StringMap:             # <<<<<<<<<<<<<<
@@ -1000,7 +992,7 @@ struct __pyx_obj_3_sa_StringMap {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":20
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -1013,7 +1005,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_17___str__ {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":35
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":36
  * cdef int EPSILON = sym_fromstring('*EPS*', True)
  * 
  * cdef class TrieNode:             # <<<<<<<<<<<<<<
@@ -1026,7 +1018,7 @@ struct __pyx_obj_3_sa_TrieNode {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":41
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":42
  *         self.children = {}
  * 
  * cdef class ExtendedTrieNode(TrieNode):             # <<<<<<<<<<<<<<
@@ -1041,7 +1033,7 @@ struct __pyx_obj_3_sa_ExtendedTrieNode {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":109
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":109
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)
  * 
  * cdef class TrieMap:             # <<<<<<<<<<<<<<
@@ -1056,7 +1048,7 @@ struct __pyx_obj_3_sa_TrieMap {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":112
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":112
  * 
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
@@ -1083,7 +1075,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":107
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":107
  *     return ALPHABET.fromstring(string, terminal)
  * 
  * def make_lattice(words):             # <<<<<<<<<<<<<<
@@ -1097,7 +1089,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_4_make_lattice {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":183
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":183
  *         return self.f.arity()
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -1110,7 +1102,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_12___str__ {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":938
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":939
  *         return sorted(result);
  * 
  *     def input(self, fwords, meta):             # <<<<<<<<<<<<<<
@@ -1143,6 +1135,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_15_input {
   struct __pyx_obj_3_sa_Phrase *__pyx_v_hiero_phrase;
   long __pyx_v_hit;
   int __pyx_v_i;
+  PyObject *__pyx_v_input_match;
   PyObject *__pyx_v_is_shadow_path;
   int __pyx_v_j;
   int __pyx_v_k;
@@ -1195,7 +1188,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_15_input {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
@@ -1229,7 +1222,7 @@ struct __pyx_obj_3_sa_Phrase {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":81
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -1245,7 +1238,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct____iter__ {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":52
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":53
  * 
  * 
  * cdef class TrieTable:             # <<<<<<<<<<<<<<
@@ -1260,7 +1253,7 @@ struct __pyx_obj_3_sa_TrieTable {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":141
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -1275,7 +1268,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_11___iter__ {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":108
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":108
  * 
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
@@ -1292,7 +1285,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr {
 };
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":116
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":116
  * 
  * def decode_sentence(lattice):
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)             # <<<<<<<<<<<<<<
@@ -1326,7 +1319,7 @@ struct __pyx_obj_3_sa_FloatList {
 
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":8
  *     char* stringmap_word(StrMap *vocab, int i)
  * 
  * cdef class StringMap:             # <<<<<<<<<<<<<<
@@ -1341,7 +1334,7 @@ struct __pyx_vtabstruct_3_sa_StringMap {
 static struct __pyx_vtabstruct_3_sa_StringMap *__pyx_vtabptr_3_sa_StringMap;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
@@ -1356,7 +1349,7 @@ struct __pyx_vtabstruct_3_sa_DataArray {
 static struct __pyx_vtabstruct_3_sa_DataArray *__pyx_vtabptr_3_sa_DataArray;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":109
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":109
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)
  * 
  * cdef class TrieMap:             # <<<<<<<<<<<<<<
@@ -1371,7 +1364,7 @@ struct __pyx_vtabstruct_3_sa_TrieMap {
 static struct __pyx_vtabstruct_3_sa_TrieMap *__pyx_vtabptr_3_sa_TrieMap;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":8
  * # May need to revisit if things get really tight, though.
  * 
  * cdef class Alignment:             # <<<<<<<<<<<<<<
@@ -1387,7 +1380,7 @@ struct __pyx_vtabstruct_3_sa_Alignment {
 static struct __pyx_vtabstruct_3_sa_Alignment *__pyx_vtabptr_3_sa_Alignment;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":47
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":47
  * 
  * 
  * cdef class BiLex:             # <<<<<<<<<<<<<<
@@ -1406,7 +1399,7 @@ struct __pyx_vtabstruct_3_sa_BiLex {
 static struct __pyx_vtabstruct_3_sa_BiLex *__pyx_vtabptr_3_sa_BiLex;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":9
  * from libc.string cimport memset, memcpy
  * 
  * cdef class IntList:             # <<<<<<<<<<<<<<
@@ -1426,7 +1419,7 @@ struct __pyx_vtabstruct_3_sa_IntList {
 static struct __pyx_vtabstruct_3_sa_IntList *__pyx_vtabptr_3_sa_IntList;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":4
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":4
  * from libc.string cimport strsep, strcpy, strlen
  * 
  * cdef class Phrase:             # <<<<<<<<<<<<<<
@@ -1441,7 +1434,7 @@ struct __pyx_vtabstruct_3_sa_Phrase {
 static struct __pyx_vtabstruct_3_sa_Phrase *__pyx_vtabptr_3_sa_Phrase;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":73
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":74
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -1455,7 +1448,7 @@ struct __pyx_vtabstruct_3_sa_PhraseLocation {
 static struct __pyx_vtabstruct_3_sa_PhraseLocation *__pyx_vtabptr_3_sa_PhraseLocation;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":188
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":188
  * 
  * 
  * cdef class Precomputation:             # <<<<<<<<<<<<<<
@@ -1470,7 +1463,7 @@ struct __pyx_vtabstruct_3_sa_Precomputation {
 static struct __pyx_vtabstruct_3_sa_Precomputation *__pyx_vtabptr_3_sa_Precomputation;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":23
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":23
  *         return ' '.join('%s=%s' % feat for feat in self)
  * 
  * cdef class Scorer:             # <<<<<<<<<<<<<<
@@ -1484,7 +1477,7 @@ struct __pyx_vtabstruct_3_sa_Scorer {
 static struct __pyx_vtabstruct_3_sa_Scorer *__pyx_vtabptr_3_sa_Scorer;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":9
  * from libc.string cimport memset, strcpy, strlen
  * 
  * cdef class FloatList:             # <<<<<<<<<<<<<<
@@ -1500,7 +1493,7 @@ struct __pyx_vtabstruct_3_sa_FloatList {
 static struct __pyx_vtabstruct_3_sa_FloatList *__pyx_vtabptr_3_sa_FloatList;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":354
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":354
  * 
  * 
  * cdef class VEB:             # <<<<<<<<<<<<<<
@@ -1516,7 +1509,7 @@ struct __pyx_vtabstruct_3_sa_VEB {
 static struct __pyx_vtabstruct_3_sa_VEB *__pyx_vtabptr_3_sa_VEB;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":7
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":7
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1
  * 
  * cdef class Alphabet:             # <<<<<<<<<<<<<<
@@ -1539,7 +1532,7 @@ struct __pyx_vtabstruct_3_sa_Alphabet {
 static struct __pyx_vtabstruct_3_sa_Alphabet *__pyx_vtabptr_3_sa_Alphabet;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":217
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":218
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -1567,7 +1560,7 @@ struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory {
 static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *__pyx_vtabptr_3_sa_HieroCachingRuleFactory;
 
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":6
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":6
  * from libc.stdio cimport FILE, fclose, fopen
  * 
  * cdef class SuffixArray:             # <<<<<<<<<<<<<<
@@ -2572,9 +2565,9 @@ static char __pyx_k_131[] = "Subphrase [%d, %d] failed integrity check";
 static char __pyx_k_132[] = "Didn't extract anything from [%d, %d] -> [%d, %d]";
 static char __pyx_k_133[] = "Unable to extract basic phrase";
 static char __pyx_k_134[] = "%s=%s";
-static char __pyx_k_137[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/_sa.pyx";
+static char __pyx_k_137[] = "/home/hltcoe/alopez/dev/cdec/python/src/sa/_sa.pyx";
 static char __pyx_k_138[] = "cdec.sa";
-static char __pyx_k_142[] = "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi";
+static char __pyx_k_142[] = "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi";
 static char __pyx_k_147[] = "*EPS*";
 static char __pyx_k__gc[] = "gc";
 static char __pyx_k__sa[] = "sa";
@@ -2723,6 +2716,7 @@ static char __pyx_k__collections[] = "collections";
 static char __pyx_k__defaultdict[] = "defaultdict";
 static char __pyx_k__from_binary[] = "from_binary";
 static char __pyx_k__initial_len[] = "initial_len";
+static char __pyx_k__input_match[] = "input_match";
 static char __pyx_k__next_states[] = "next_states";
 static char __pyx_k__precomputed[] = "precomputed";
 static char __pyx_k__read_binary[] = "read_binary";
@@ -2938,6 +2932,7 @@ static PyObject *__pyx_n_s__increment;
 static PyObject *__pyx_n_s__index;
 static PyObject *__pyx_n_s__info;
 static PyObject *__pyx_n_s__initial_len;
+static PyObject *__pyx_n_s__input_match;
 static PyObject *__pyx_n_s__input_span;
 static PyObject *__pyx_n_s__insert;
 static PyObject *__pyx_n_s__isa;
@@ -3419,7 +3414,7 @@ static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":11
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":11
  * cdef class FloatList:
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
@@ -3433,7 +3428,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":12
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":12
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:             # <<<<<<<<<<<<<<
@@ -3443,7 +3438,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
   __pyx_t_1 = (__pyx_v_initial_len > __pyx_v_size);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":13
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":13
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:
  *             size = initial_len             # <<<<<<<<<<<<<<
@@ -3455,7 +3450,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":14
  *         if initial_len > size:
  *             size = initial_len
  *         self.size = size             # <<<<<<<<<<<<<<
@@ -3464,7 +3459,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  */
   __pyx_v_self->size = __pyx_v_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":15
  *             size = initial_len
  *         self.size = size
  *         self.increment = increment             # <<<<<<<<<<<<<<
@@ -3473,7 +3468,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  */
   __pyx_v_self->increment = __pyx_v_increment;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":16
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":16
  *         self.size = size
  *         self.increment = increment
  *         self.len = initial_len             # <<<<<<<<<<<<<<
@@ -3482,7 +3477,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  */
   __pyx_v_self->len = __pyx_v_initial_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":17
  *         self.increment = increment
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))             # <<<<<<<<<<<<<<
@@ -3491,7 +3486,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  */
   __pyx_v_self->arr = ((float *)malloc((__pyx_v_size * (sizeof(float)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":18
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))
  *         memset(self.arr, 0, initial_len*sizeof(float))             # <<<<<<<<<<<<<<
@@ -3514,7 +3509,7 @@ static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -3526,7 +3521,7 @@ static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatLis
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":21
  * 
  *     def __dealloc__(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -3549,7 +3544,7 @@ static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":23
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":23
  *         free(self.arr)
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -3572,7 +3567,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":24
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":24
  * 
  *     def __getitem__(self, i):
  *         j = i             # <<<<<<<<<<<<<<
@@ -3582,7 +3577,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   __Pyx_INCREF(__pyx_v_i);
   __pyx_v_j = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":25
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":25
  *     def __getitem__(self, i):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -3594,7 +3589,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":26
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":26
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -3613,7 +3608,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":27
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -3636,7 +3631,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   }
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":28
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":28
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))             # <<<<<<<<<<<<<<
@@ -3671,7 +3666,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":29
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":29
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         return self.arr[j]             # <<<<<<<<<<<<<<
@@ -3700,7 +3695,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":31
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":31
  *         return self.arr[j]
  * 
  *     cdef void set(self, int i, float v):             # <<<<<<<<<<<<<<
@@ -3722,7 +3717,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("set", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":32
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":32
  * 
  *     cdef void set(self, int i, float v):
  *         j = i             # <<<<<<<<<<<<<<
@@ -3731,7 +3726,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
  */
   __pyx_v_j = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":33
  *     cdef void set(self, int i, float v):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -3741,7 +3736,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   __pyx_t_1 = (__pyx_v_i < 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":34
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":34
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -3753,7 +3748,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":35
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":35
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -3769,7 +3764,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":36
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":36
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))             # <<<<<<<<<<<<<<
@@ -3806,7 +3801,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":37
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":37
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length FloatList" % (i, self.len))
  *         self.arr[j] = v             # <<<<<<<<<<<<<<
@@ -3836,7 +3831,7 @@ static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":39
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":39
  *         self.arr[j] = v
  * 
  *     def __setitem__(self, i, val):             # <<<<<<<<<<<<<<
@@ -3854,7 +3849,7 @@ static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__setitem__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":40
  * 
  *     def __setitem__(self, i, val):
  *         self.set(i, val)             # <<<<<<<<<<<<<<
@@ -3886,7 +3881,7 @@ static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":42
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":42
  *         self.set(i, val)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -3899,7 +3894,7 @@ static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatL
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":43
  * 
  *     def __len__(self):
  *         return self.len             # <<<<<<<<<<<<<<
@@ -3936,7 +3931,7 @@ static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":45
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":45
  *         return self.len
  * 
  *     def append(self, float val):             # <<<<<<<<<<<<<<
@@ -3950,7 +3945,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("append", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":46
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":46
  * 
  *     def append(self, float val):
  *         if self.len == self.size:             # <<<<<<<<<<<<<<
@@ -3960,7 +3955,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
   __pyx_t_1 = (__pyx_v_self->len == __pyx_v_self->size);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":47
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":47
  *     def append(self, float val):
  *         if self.len == self.size:
  *             self.size = self.size + self.increment             # <<<<<<<<<<<<<<
@@ -3969,7 +3964,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
  */
     __pyx_v_self->size = (__pyx_v_self->size + __pyx_v_self->increment);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":48
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":48
  *         if self.len == self.size:
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))             # <<<<<<<<<<<<<<
@@ -3981,7 +3976,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":49
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":49
  *             self.size = self.size + self.increment
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val             # <<<<<<<<<<<<<<
@@ -3990,7 +3985,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
  */
   (__pyx_v_self->arr[__pyx_v_self->len]) = __pyx_v_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":50
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":50
  *             self.arr = <float*> realloc(self.arr, self.size*sizeof(float))
  *         self.arr[self.len] = val
  *         self.len = self.len + 1             # <<<<<<<<<<<<<<
@@ -4005,7 +4000,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":52
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":52
  *         self.len = self.len + 1
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -4017,7 +4012,7 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":53
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":53
  * 
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(float), 1, f)             # <<<<<<<<<<<<<<
@@ -4026,7 +4021,7 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
  */
   fwrite((&__pyx_v_self->len), (sizeof(float)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":54
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(float), 1, f)
  *         fwrite(self.arr, sizeof(float), self.len, f)             # <<<<<<<<<<<<<<
@@ -4059,7 +4054,7 @@ static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":56
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":56
  *         fwrite(self.arr, sizeof(float), self.len, f)
  * 
  *     def write(self, char* filename):             # <<<<<<<<<<<<<<
@@ -4073,7 +4068,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":58
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":58
  *     def write(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -4082,7 +4077,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":59
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":59
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
@@ -4091,7 +4086,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
  */
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":60
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -4106,7 +4101,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":62
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":62
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -4118,7 +4113,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":63
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":63
  * 
  *     cdef void read_handle(self, FILE* f):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -4127,7 +4122,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   free(__pyx_v_self->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":64
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":64
  *     cdef void read_handle(self, FILE* f):
  *         free(self.arr)
  *         fread(&(self.len), sizeof(float), 1, f)             # <<<<<<<<<<<<<<
@@ -4136,7 +4131,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   fread((&__pyx_v_self->len), (sizeof(float)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":65
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":65
  *         free(self.arr)
  *         fread(&(self.len), sizeof(float), 1, f)
  *         self.arr = <float*> malloc(self.len * sizeof(float))             # <<<<<<<<<<<<<<
@@ -4145,7 +4140,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   __pyx_v_self->arr = ((float *)malloc((__pyx_v_self->len * (sizeof(float)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":66
  *         fread(&(self.len), sizeof(float), 1, f)
  *         self.arr = <float*> malloc(self.len * sizeof(float))
  *         self.size = self.len             # <<<<<<<<<<<<<<
@@ -4154,7 +4149,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   __pyx_v_self->size = __pyx_v_self->len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":67
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":67
  *         self.arr = <float*> malloc(self.len * sizeof(float))
  *         self.size = self.len
  *         fread(self.arr, sizeof(float), self.len, f)             # <<<<<<<<<<<<<<
@@ -4187,7 +4182,7 @@ static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":69
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":69
  *         fread(self.arr, sizeof(float), self.len, f)
  * 
  *     def read(self, char* filename):             # <<<<<<<<<<<<<<
@@ -4201,7 +4196,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":71
  *     def read(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -4210,7 +4205,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":72
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
@@ -4218,7 +4213,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList
  */
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/float_list.pxi":73
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/float_list.pxi":73
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -4312,7 +4307,7 @@ static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":11
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":11
  * cdef class IntList:
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
@@ -4326,7 +4321,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":12
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":12
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:             # <<<<<<<<<<<<<<
@@ -4336,7 +4331,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
   __pyx_t_1 = (__pyx_v_initial_len > __pyx_v_size);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":13
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":13
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):
  *         if initial_len > size:
  *             size = initial_len             # <<<<<<<<<<<<<<
@@ -4348,7 +4343,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":14
  *         if initial_len > size:
  *             size = initial_len
  *         self.size = size             # <<<<<<<<<<<<<<
@@ -4357,7 +4352,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  */
   __pyx_v_self->size = __pyx_v_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":15
  *             size = initial_len
  *         self.size = size
  *         self.increment = increment             # <<<<<<<<<<<<<<
@@ -4366,7 +4361,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  */
   __pyx_v_self->increment = __pyx_v_increment;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":16
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":16
  *         self.size = size
  *         self.increment = increment
  *         self.len = initial_len             # <<<<<<<<<<<<<<
@@ -4375,7 +4370,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  */
   __pyx_v_self->len = __pyx_v_initial_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":17
  *         self.increment = increment
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))             # <<<<<<<<<<<<<<
@@ -4384,7 +4379,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  */
   __pyx_v_self->arr = ((int *)malloc((__pyx_v_size * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":18
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))
  *         memset(self.arr, 0, initial_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -4409,7 +4404,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -4432,7 +4427,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":22
  *     def __str__(self):
  *         cdef unsigned i
  *         ret = "IntList["             # <<<<<<<<<<<<<<
@@ -4442,7 +4437,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_3));
   __pyx_v_ret = ((PyObject *)__pyx_kp_s_3);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":23
  *         cdef unsigned i
  *         ret = "IntList["
  *         for idx in range(self.size):             # <<<<<<<<<<<<<<
@@ -4453,7 +4448,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_idx = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":24
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":24
  *         ret = "IntList["
  *         for idx in range(self.size):
  *             if idx>0:             # <<<<<<<<<<<<<<
@@ -4463,7 +4458,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
     __pyx_t_3 = (__pyx_v_idx > 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":25
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":25
  *         for idx in range(self.size):
  *             if idx>0:
  *                 ret += ","             # <<<<<<<<<<<<<<
@@ -4479,7 +4474,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":26
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":26
  *             if idx>0:
  *                 ret += ","
  *             ret += str(self.arr[idx])             # <<<<<<<<<<<<<<
@@ -4504,7 +4499,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
     __pyx_t_5 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":27
  *                 ret += ","
  *             ret += str(self.arr[idx])
  *         ret += "]"             # <<<<<<<<<<<<<<
@@ -4517,7 +4512,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   __pyx_v_ret = __pyx_t_5;
   __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":28
  *             ret += str(self.arr[idx])
  *         ret += "]"
  *         ret += "len="             # <<<<<<<<<<<<<<
@@ -4530,7 +4525,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   __pyx_v_ret = __pyx_t_5;
   __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":29
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":29
  *         ret += "]"
  *         ret += "len="
  *         ret += self.len             # <<<<<<<<<<<<<<
@@ -4546,7 +4541,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   __pyx_v_ret = __pyx_t_4;
   __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":30
  *         ret += "len="
  *         ret += self.len
  *         return ret             # <<<<<<<<<<<<<<
@@ -4583,7 +4578,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":32
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":32
  *         return ret
  * 
  *     def index(self, val):             # <<<<<<<<<<<<<<
@@ -4605,7 +4600,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("index", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":34
  *     def index(self, val):
  *         cdef unsigned i
  *         for i in range(self.len):             # <<<<<<<<<<<<<<
@@ -4616,7 +4611,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":35
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":35
  *         cdef unsigned i
  *         for i in range(self.len):
  *             if self.arr[i] == val:             # <<<<<<<<<<<<<<
@@ -4631,7 +4626,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":36
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":36
  *         for i in range(self.len):
  *             if self.arr[i] == val:
  *                 return i             # <<<<<<<<<<<<<<
@@ -4649,7 +4644,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
     __pyx_L5:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":37
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":37
  *             if self.arr[i] == val:
  *                 return i
  *         return IndexError             # <<<<<<<<<<<<<<
@@ -4730,7 +4725,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":39
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":39
  *         return IndexError
  * 
  *     def partition(self,start,end):             # <<<<<<<<<<<<<<
@@ -4756,7 +4751,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("partition", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":40
  * 
  *     def partition(self,start,end):
  *         pivot = self.arr[end]             # <<<<<<<<<<<<<<
@@ -4769,7 +4764,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
   __pyx_v_pivot = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":41
  *     def partition(self,start,end):
  *         pivot = self.arr[end]
  *         bottom = start-1             # <<<<<<<<<<<<<<
@@ -4781,7 +4776,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
   __pyx_v_bottom = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":42
  *         pivot = self.arr[end]
  *         bottom = start-1
  *         top = end             # <<<<<<<<<<<<<<
@@ -4791,7 +4786,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
   __Pyx_INCREF(__pyx_v_end);
   __pyx_v_top = __pyx_v_end;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":43
  *         bottom = start-1
  *         top = end
  *         done = 0             # <<<<<<<<<<<<<<
@@ -4800,7 +4795,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
   __pyx_v_done = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":44
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":44
  *         top = end
  *         done = 0
  *         while not done:             # <<<<<<<<<<<<<<
@@ -4811,7 +4806,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
     __pyx_t_3 = (!__pyx_v_done);
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":45
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":45
  *         done = 0
  *         while not done:
  *             while not done:             # <<<<<<<<<<<<<<
@@ -4822,7 +4817,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __pyx_t_3 = (!__pyx_v_done);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":46
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":46
  *         while not done:
  *             while not done:
  *                 bottom += 1             # <<<<<<<<<<<<<<
@@ -4835,7 +4830,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __pyx_v_bottom = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":47
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":47
  *             while not done:
  *                 bottom += 1
  *                 if bottom == top:             # <<<<<<<<<<<<<<
@@ -4847,7 +4842,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":48
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":48
  *                 bottom += 1
  *                 if bottom == top:
  *                     done = 1             # <<<<<<<<<<<<<<
@@ -4856,7 +4851,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
         __pyx_v_done = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":49
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":49
  *                 if bottom == top:
  *                     done = 1
  *                     break             # <<<<<<<<<<<<<<
@@ -4868,7 +4863,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       }
       __pyx_L7:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":50
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":50
  *                     done = 1
  *                     break
  *                 if self.arr[bottom] > pivot:             # <<<<<<<<<<<<<<
@@ -4884,7 +4879,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":51
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":51
  *                     break
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]             # <<<<<<<<<<<<<<
@@ -4895,7 +4890,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":52
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":52
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]
  *                     break             # <<<<<<<<<<<<<<
@@ -4909,7 +4904,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
     }
     __pyx_L6_break:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":53
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":53
  *                     self.arr[top] = self.arr[bottom]
  *                     break
  *             while not done:             # <<<<<<<<<<<<<<
@@ -4920,7 +4915,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __pyx_t_3 = (!__pyx_v_done);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":54
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":54
  *                     break
  *             while not done:
  *                 top -= 1             # <<<<<<<<<<<<<<
@@ -4933,7 +4928,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __pyx_v_top = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":55
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":55
  *             while not done:
  *                 top -= 1
  *                 if top == bottom:             # <<<<<<<<<<<<<<
@@ -4945,7 +4940,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":56
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":56
  *                 top -= 1
  *                 if top == bottom:
  *                     done = 1             # <<<<<<<<<<<<<<
@@ -4954,7 +4949,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
         __pyx_v_done = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":57
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":57
  *                 if top == bottom:
  *                     done = 1
  *                     break             # <<<<<<<<<<<<<<
@@ -4966,7 +4961,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       }
       __pyx_L11:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":58
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":58
  *                     done = 1
  *                     break
  *                 if self.arr[top] < pivot:             # <<<<<<<<<<<<<<
@@ -4982,7 +4977,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":59
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":59
  *                     break
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]             # <<<<<<<<<<<<<<
@@ -4993,7 +4988,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
         __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_bottom); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         (__pyx_v_self->arr[__pyx_t_5]) = (__pyx_v_self->arr[__pyx_t_1]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":60
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":60
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]
  *                     break             # <<<<<<<<<<<<<<
@@ -5008,7 +5003,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
     __pyx_L10_break:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":61
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":61
  *                     self.arr[bottom] = self.arr[top]
  *                     break
  *         self.arr[top] = pivot             # <<<<<<<<<<<<<<
@@ -5019,7 +5014,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_top); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   (__pyx_v_self->arr[__pyx_t_1]) = __pyx_t_6;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":62
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":62
  *                     break
  *         self.arr[top] = pivot
  *         return top             # <<<<<<<<<<<<<<
@@ -5103,7 +5098,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":64
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":64
  *         return top
  * 
  *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
@@ -5124,7 +5119,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("_doquicksort", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":65
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":65
  * 
  *     def _doquicksort(self,start,end):
  *         if start < end:             # <<<<<<<<<<<<<<
@@ -5136,7 +5131,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":66
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":66
  *     def _doquicksort(self,start,end):
  *         if start < end:
  *             split = self.partition(start,end)             # <<<<<<<<<<<<<<
@@ -5160,7 +5155,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
     __pyx_v_split = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":67
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":67
  *         if start < end:
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)             # <<<<<<<<<<<<<<
@@ -5185,7 +5180,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":68
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":68
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)
  *             self._doquicksort(split+1,end)             # <<<<<<<<<<<<<<
@@ -5213,7 +5208,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":70
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":70
  *             self._doquicksort(split+1,end)
  *         else:
  *             return             # <<<<<<<<<<<<<<
@@ -5252,7 +5247,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":72
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":72
  *             return
  * 
  *     def sort(self):             # <<<<<<<<<<<<<<
@@ -5271,7 +5266,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("sort", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":73
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":73
  * 
  *     def sort(self):
  *         self._doquicksort(0,self.len-1)             # <<<<<<<<<<<<<<
@@ -5321,7 +5316,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_U
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":75
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":75
  *         self._doquicksort(0,self.len-1)
  * 
  *     def reset(self):             # <<<<<<<<<<<<<<
@@ -5334,7 +5329,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("reset", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":76
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":76
  * 
  *     def reset(self):
  *         self.len = 0             # <<<<<<<<<<<<<<
@@ -5358,7 +5353,7 @@ static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":78
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":78
  *         self.len = 0
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -5370,7 +5365,7 @@ static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":79
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":79
  * 
  *     def __dealloc__(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -5394,7 +5389,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":81
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -5457,7 +5452,7 @@ static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":83
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":83
  *     def __iter__(self):
  *         cdef int i
  *         for i in range(self.len):             # <<<<<<<<<<<<<<
@@ -5468,7 +5463,7 @@ static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":84
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":84
  *         cdef int i
  *         for i in range(self.len):
  *             yield self.arr[i]             # <<<<<<<<<<<<<<
@@ -5515,7 +5510,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":86
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":86
  *             yield self.arr[i]
  * 
  *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
@@ -5545,7 +5540,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":88
  *     def __getitem__(self, index):
  *         cdef int i, j, k
  *         if isinstance(index, int):             # <<<<<<<<<<<<<<
@@ -5558,7 +5553,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":89
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":89
  *         cdef int i, j, k
  *         if isinstance(index, int):
  *             j = index             # <<<<<<<<<<<<<<
@@ -5568,7 +5563,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_index); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_j = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":90
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":90
  *         if isinstance(index, int):
  *             j = index
  *             if j < 0:             # <<<<<<<<<<<<<<
@@ -5578,7 +5573,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_2 = (__pyx_v_j < 0);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":91
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":91
  *             j = index
  *             if j < 0:
  *                 j = self.len + j             # <<<<<<<<<<<<<<
@@ -5590,7 +5585,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":92
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":92
  *             if j < 0:
  *                 j = self.len + j
  *             if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -5606,7 +5601,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":93
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":93
  *                 j = self.len + j
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))             # <<<<<<<<<<<<<<
@@ -5641,7 +5636,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":94
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":94
  *             if j<0 or j>=self.len:
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  *             return self.arr[j]             # <<<<<<<<<<<<<<
@@ -5657,7 +5652,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":95
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":95
  *                 raise IndexError("Requested index %d of %d-length IntList" % (index, self.len))
  *             return self.arr[j]
  *         elif isinstance(index, slice):             # <<<<<<<<<<<<<<
@@ -5670,7 +5665,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":96
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":96
  *             return self.arr[j]
  *         elif isinstance(index, slice):
  *             i = index.start             # <<<<<<<<<<<<<<
@@ -5683,7 +5678,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_v_i = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":97
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":97
  *         elif isinstance(index, slice):
  *             i = index.start
  *             j = index.stop             # <<<<<<<<<<<<<<
@@ -5696,7 +5691,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_v_j = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":98
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":98
  *             i = index.start
  *             j = index.stop
  *             if i < 0:             # <<<<<<<<<<<<<<
@@ -5706,7 +5701,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_5 = (__pyx_v_i < 0);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":99
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":99
  *             j = index.stop
  *             if i < 0:
  *                 i = self.len + i             # <<<<<<<<<<<<<<
@@ -5718,7 +5713,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     __pyx_L6:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":100
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":100
  *             if i < 0:
  *                 i = self.len + i
  *             if j < 0:             # <<<<<<<<<<<<<<
@@ -5728,7 +5723,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_5 = (__pyx_v_j < 0);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":101
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":101
  *                 i = self.len + i
  *             if j < 0:
  *                 j = self.len + j             # <<<<<<<<<<<<<<
@@ -5740,7 +5735,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":102
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":102
  *             if j < 0:
  *                 j = self.len + j
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:             # <<<<<<<<<<<<<<
@@ -5768,7 +5763,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":103
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":103
  *                 j = self.len + j
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))             # <<<<<<<<<<<<<<
@@ -5810,7 +5805,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":104
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":104
  *             if i < 0 or i >= self.len or j < 0 or j > self.len:
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  *             result = ()             # <<<<<<<<<<<<<<
@@ -5820,7 +5815,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
     __pyx_v_result = __pyx_empty_tuple;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":105
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":105
  *                 raise IndexError("Requested index %d:%d of %d-length IntList" % (index.start, index.stop, self.len))
  *             result = ()
  *             for k from i <= k < j:             # <<<<<<<<<<<<<<
@@ -5830,7 +5825,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     __pyx_t_3 = __pyx_v_j;
     for (__pyx_v_k = __pyx_v_i; __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":106
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":106
  *             result = ()
  *             for k from i <= k < j:
  *                 result = result + (self.arr[k],)             # <<<<<<<<<<<<<<
@@ -5852,7 +5847,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __pyx_t_9 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":107
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":107
  *             for k from i <= k < j:
  *                 result = result + (self.arr[k],)
  *             return result             # <<<<<<<<<<<<<<
@@ -5867,7 +5862,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":109
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":109
  *             return result
  *         else:
  *             raise TypeError("Illegal key type %s for IntList" % type(index))             # <<<<<<<<<<<<<<
@@ -5906,7 +5901,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":111
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":111
  *             raise TypeError("Illegal key type %s for IntList" % type(index))
  * 
  *     cdef void set(self, int i, int val):             # <<<<<<<<<<<<<<
@@ -5928,7 +5923,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("set", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":112
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":112
  * 
  *     cdef void set(self, int i, int val):
  *         j = i             # <<<<<<<<<<<<<<
@@ -5937,7 +5932,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
  */
   __pyx_v_j = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":113
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":113
  *     cdef void set(self, int i, int val):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -5947,7 +5942,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   __pyx_t_1 = (__pyx_v_i < 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":114
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":114
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -5959,7 +5954,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":115
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":115
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -5975,7 +5970,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":116
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":116
  *             j = self.len + i
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length IntList" % (i, self.len))             # <<<<<<<<<<<<<<
@@ -6012,7 +6007,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":117
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":117
  *         if j<0 or j>=self.len:
  *             raise IndexError("Requested index %d of %d-length IntList" % (i, self.len))
  *         self.arr[j] = val             # <<<<<<<<<<<<<<
@@ -6042,7 +6037,7 @@ static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":119
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":119
  *         self.arr[j] = val
  * 
  *     def __setitem__(self, i, val):             # <<<<<<<<<<<<<<
@@ -6060,7 +6055,7 @@ static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__setitem__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":120
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":120
  * 
  *     def __setitem__(self, i, val):
  *         self.set(i, val)             # <<<<<<<<<<<<<<
@@ -6092,7 +6087,7 @@ static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":122
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":122
  *         self.set(i, val)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -6105,7 +6100,7 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":123
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":123
  * 
  *     def __len__(self):
  *         return self.len             # <<<<<<<<<<<<<<
@@ -6132,7 +6127,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_26get_size(PyObject *__pyx_v_self, CYTHO
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":125
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":125
  *         return self.len
  * 
  *     def get_size(self):             # <<<<<<<<<<<<<<
@@ -6149,7 +6144,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_25get_size(struct __pyx_obj_3_sa_IntList
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_size", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":126
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":126
  * 
  *     def get_size(self):
  *         return self.size             # <<<<<<<<<<<<<<
@@ -6196,7 +6191,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":128
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":128
  *         return self.size
  * 
  *     def append(self, int val):             # <<<<<<<<<<<<<<
@@ -6209,7 +6204,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("append", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":129
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":129
  * 
  *     def append(self, int val):
  *         self._append(val)             # <<<<<<<<<<<<<<
@@ -6224,7 +6219,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":131
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":131
  *         self._append(val)
  * 
  *     cdef void _append(self, int val):             # <<<<<<<<<<<<<<
@@ -6237,7 +6232,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("_append", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":132
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":132
  * 
  *     cdef void _append(self, int val):
  *         if self.len == self.size:             # <<<<<<<<<<<<<<
@@ -6247,7 +6242,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   __pyx_t_1 = (__pyx_v_self->len == __pyx_v_self->size);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":133
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":133
  *     cdef void _append(self, int val):
  *         if self.len == self.size:
  *             self.size = self.size + self.increment             # <<<<<<<<<<<<<<
@@ -6256,7 +6251,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  */
     __pyx_v_self->size = (__pyx_v_self->size + __pyx_v_self->increment);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":134
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":134
  *         if self.len == self.size:
  *             self.size = self.size + self.increment
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))             # <<<<<<<<<<<<<<
@@ -6268,7 +6263,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":135
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":135
  *             self.size = self.size + self.increment
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         self.arr[self.len] = val             # <<<<<<<<<<<<<<
@@ -6277,7 +6272,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
  */
   (__pyx_v_self->arr[__pyx_v_self->len]) = __pyx_v_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":136
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         self.arr[self.len] = val
  *         self.len = self.len + 1             # <<<<<<<<<<<<<<
@@ -6300,7 +6295,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":138
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":138
  *         self.len = self.len + 1
  * 
  *     def extend(self, other):             # <<<<<<<<<<<<<<
@@ -6317,7 +6312,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("extend", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":139
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":139
  * 
  *     def extend(self, other):
  *         self._extend(other)             # <<<<<<<<<<<<<<
@@ -6342,7 +6337,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":141
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":141
  *         self._extend(other)
  * 
  *     cdef void _extend(self, IntList other):             # <<<<<<<<<<<<<<
@@ -6354,7 +6349,7 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_extend", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":142
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":142
  * 
  *     cdef void _extend(self, IntList other):
  *         self._extend_arr(other.arr, other.len)             # <<<<<<<<<<<<<<
@@ -6366,7 +6361,7 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":144
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":144
  *         self._extend_arr(other.arr, other.len)
  * 
  *     cdef void _extend_arr(self, int* other, int other_len):             # <<<<<<<<<<<<<<
@@ -6379,7 +6374,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("_extend_arr", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":145
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":145
  * 
  *     cdef void _extend_arr(self, int* other, int other_len):
  *         if self.size < self.len + other_len:             # <<<<<<<<<<<<<<
@@ -6389,7 +6384,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   __pyx_t_1 = (__pyx_v_self->size < (__pyx_v_self->len + __pyx_v_other_len));
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":146
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":146
  *     cdef void _extend_arr(self, int* other, int other_len):
  *         if self.size < self.len + other_len:
  *             self.size = self.len + other_len             # <<<<<<<<<<<<<<
@@ -6398,7 +6393,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
  */
     __pyx_v_self->size = (__pyx_v_self->len + __pyx_v_other_len);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":147
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":147
  *         if self.size < self.len + other_len:
  *             self.size = self.len + other_len
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))             # <<<<<<<<<<<<<<
@@ -6410,7 +6405,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":148
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":148
  *             self.size = self.len + other_len
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         memcpy(self.arr+self.len, other, other_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -6419,7 +6414,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
  */
   memcpy((__pyx_v_self->arr + __pyx_v_self->len), __pyx_v_other, (__pyx_v_other_len * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":149
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":149
  *             self.arr = <int*> realloc(self.arr, self.size*sizeof(int))
  *         memcpy(self.arr+self.len, other, other_len*sizeof(int))
  *         self.len = self.len + other_len             # <<<<<<<<<<<<<<
@@ -6431,7 +6426,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":151
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":151
  *         self.len = self.len + other_len
  * 
  *     cdef void _clear(self):             # <<<<<<<<<<<<<<
@@ -6443,7 +6438,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_clear", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":152
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":152
  * 
  *     cdef void _clear(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -6452,7 +6447,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   free(__pyx_v_self->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":153
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":153
  *     cdef void _clear(self):
  *         free(self.arr)
  *         self.len = 0             # <<<<<<<<<<<<<<
@@ -6461,7 +6456,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   __pyx_v_self->len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":154
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":154
  *         free(self.arr)
  *         self.len = 0
  *         self.size = 0             # <<<<<<<<<<<<<<
@@ -6470,7 +6465,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   __pyx_v_self->size = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":155
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":155
  *         self.len = 0
  *         self.size = 0
  *         self.arr = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -6482,7 +6477,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":157
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":157
  *         self.arr = <int*> malloc(0)
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -6494,7 +6489,7 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":158
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":158
  * 
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -6503,7 +6498,7 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
  */
   fwrite((&__pyx_v_self->len), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":159
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":159
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(int), 1, f)
  *         fwrite(self.arr, sizeof(int), self.len, f)             # <<<<<<<<<<<<<<
@@ -6536,7 +6531,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":161
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":161
  *         fwrite(self.arr, sizeof(int), self.len, f)
  * 
  *     def write(self, char* filename):             # <<<<<<<<<<<<<<
@@ -6550,7 +6545,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":163
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":163
  *     def write(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -6559,7 +6554,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":164
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":164
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
@@ -6568,7 +6563,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":165
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":165
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -6583,7 +6578,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":167
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":167
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -6595,7 +6590,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":168
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":168
  * 
  *     cdef void read_handle(self, FILE* f):
  *         (self.arr)             # <<<<<<<<<<<<<<
@@ -6604,7 +6599,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":169
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":169
  *     cdef void read_handle(self, FILE* f):
  *         (self.arr)
  *         fread(&(self.len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -6613,7 +6608,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   fread((&__pyx_v_self->len), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":170
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":170
  *         (self.arr)
  *         fread(&(self.len), sizeof(int), 1, f)
  *         self.arr = <int*> malloc(self.len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -6622,7 +6617,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->arr = ((int *)malloc((__pyx_v_self->len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":171
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":171
  *         fread(&(self.len), sizeof(int), 1, f)
  *         self.arr = <int*> malloc(self.len * sizeof(int))
  *         self.size = self.len             # <<<<<<<<<<<<<<
@@ -6631,7 +6626,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->size = __pyx_v_self->len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":172
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":172
  *         self.arr = <int*> malloc(self.len * sizeof(int))
  *         self.size = self.len
  *         fread(self.arr, sizeof(int), self.len, f)             # <<<<<<<<<<<<<<
@@ -6664,7 +6659,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":174
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":174
  *         fread(self.arr, sizeof(int), self.len, f)
  * 
  *     def read(self, char* filename):             # <<<<<<<<<<<<<<
@@ -6678,7 +6673,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":176
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":176
  *     def read(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -6687,7 +6682,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":177
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
@@ -6695,7 +6690,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/int_list.pxi":178
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/int_list.pxi":178
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -6722,7 +6717,7 @@ static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":13
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":13
  *     cdef int index(self, char *s)
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -6735,7 +6730,7 @@ static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":14
  * 
  *     def __cinit__(self):
  *         self.vocab = stringmap_new()             # <<<<<<<<<<<<<<
@@ -6758,7 +6753,7 @@ static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":16
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":16
  *         self.vocab = stringmap_new()
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -6770,7 +6765,7 @@ static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMa
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":17
  * 
  *     def __dealloc__(self):
  *         stringmap_delete(self.vocab)             # <<<<<<<<<<<<<<
@@ -6782,7 +6777,7 @@ static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMa
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":19
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":19
  *         stringmap_delete(self.vocab)
  * 
  *     cdef char *word(self, int i):             # <<<<<<<<<<<<<<
@@ -6795,7 +6790,7 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("word", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":20
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":20
  * 
  *     cdef char *word(self, int i):
  *         return stringmap_word(self.vocab, i)             # <<<<<<<<<<<<<<
@@ -6811,7 +6806,7 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":22
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":22
  *         return stringmap_word(self.vocab, i)
  * 
  *     cdef int index(self, char *s):             # <<<<<<<<<<<<<<
@@ -6823,7 +6818,7 @@ static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("index", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/str_map.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/str_map.pxi":23
  * 
  *     cdef int index(self, char *s):
  *         return stringmap_index(self.vocab, s)             # <<<<<<<<<<<<<<
@@ -6851,7 +6846,7 @@ static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,&__pyx_n_s__use_sent_id,0};
     PyObject* values[4] = {0,0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":17
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":17
  *     cdef bint use_sent_id
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):             # <<<<<<<<<<<<<<
@@ -6943,7 +6938,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":18
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}             # <<<<<<<<<<<<<<
@@ -6960,7 +6955,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_v_self->word2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":19
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":19
  *     def __cinit__(self, from_binary=None, from_text=None, side=None, bint use_sent_id=False):
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]             # <<<<<<<<<<<<<<
@@ -6981,7 +6976,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_v_self->id2word = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":20
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -6996,7 +6991,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_v_self->data = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":21
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -7011,7 +7006,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_v_self->sent_id = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":22
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -7026,7 +7021,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":23
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  *         self.use_sent_id = use_sent_id             # <<<<<<<<<<<<<<
@@ -7035,7 +7030,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
  */
   __pyx_v_self->use_sent_id = __pyx_v_use_sent_id;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":24
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":24
  *         self.sent_index = IntList(1000,1000)
  *         self.use_sent_id = use_sent_id
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -7045,7 +7040,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":25
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":25
  *         self.use_sent_id = use_sent_id
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
@@ -7067,7 +7062,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":26
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -7077,7 +7072,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":27
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":27
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             if side:             # <<<<<<<<<<<<<<
@@ -7087,7 +7082,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
     __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_side); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":28
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":28
  *         elif from_text:
  *             if side:
  *                 self.read_bitext(from_text, (0 if side == 'source' else 1))             # <<<<<<<<<<<<<<
@@ -7123,7 +7118,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":30
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":30
  *                 self.read_bitext(from_text, (0 if side == 'source' else 1))
  *             else:
  *                 self.read_text(from_text)             # <<<<<<<<<<<<<<
@@ -7172,7 +7167,7 @@ static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":32
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":32
  *                 self.read_text(from_text)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -7190,7 +7185,7 @@ static Py_ssize_t __pyx_pf_3_sa_9DataArray_2__len__(struct __pyx_obj_3_sa_DataAr
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":33
  * 
  *     def __len__(self):
  *         return len(self.data)             # <<<<<<<<<<<<<<
@@ -7226,7 +7221,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_5get_sentence_id(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":35
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":35
  *         return len(self.data)
  * 
  *     def get_sentence_id(self, i):             # <<<<<<<<<<<<<<
@@ -7244,7 +7239,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_4get_sentence_id(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_sentence_id", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":36
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":36
  * 
  *     def get_sentence_id(self, i):
  *         return self.sent_id.arr[i]             # <<<<<<<<<<<<<<
@@ -7282,7 +7277,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":38
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":38
  *         return self.sent_id.arr[i]
  * 
  *     def get_sentence(self, i):             # <<<<<<<<<<<<<<
@@ -7307,7 +7302,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
   __Pyx_RefNannySetupContext("get_sentence", 0);
   __Pyx_INCREF(__pyx_v_i);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":40
  *     def get_sentence(self, i):
  *         cdef int j, start, stop
  *         sent = []             # <<<<<<<<<<<<<<
@@ -7319,7 +7314,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
   __pyx_v_sent = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":41
  *         cdef int j, start, stop
  *         sent = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
@@ -7329,7 +7324,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":42
  *         sent = []
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
@@ -7342,7 +7337,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_stop = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -7357,7 +7352,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":44
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":44
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])             # <<<<<<<<<<<<<<
@@ -7372,7 +7367,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
     __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":43
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -7385,7 +7380,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_6get_sentence(struct __pyx_obj_3_sa_Da
   __pyx_v_i = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":45
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":45
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])
  *         return sent             # <<<<<<<<<<<<<<
@@ -7422,7 +7417,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_9get_id(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":47
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":47
  *         return sent
  * 
  *     def get_id(self, word):             # <<<<<<<<<<<<<<
@@ -7442,7 +7437,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_id(struct __pyx_obj_3_sa_DataArra
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_id", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":48
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":48
  * 
  *     def get_id(self, word):
  *         if not word in self.word2id:             # <<<<<<<<<<<<<<
@@ -7453,7 +7448,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_id(struct __pyx_obj_3_sa_DataArra
   __pyx_t_2 = (!__pyx_t_1);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":49
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":49
  *     def get_id(self, word):
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
@@ -7469,7 +7464,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_id(struct __pyx_obj_3_sa_DataArra
     if (PyObject_SetItem(__pyx_v_self->word2id, __pyx_v_word, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":50
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":50
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
@@ -7483,7 +7478,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_id(struct __pyx_obj_3_sa_DataArra
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":51
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":51
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *         return self.word2id[word]             # <<<<<<<<<<<<<<
@@ -7520,7 +7515,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_11__getitem__(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":53
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":53
  *         return self.word2id[word]
  * 
  *     def __getitem__(self, loc):             # <<<<<<<<<<<<<<
@@ -7538,7 +7533,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10__getitem__(struct __pyx_obj_3_sa_Da
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":54
  * 
  *     def __getitem__(self, loc):
  *         return self.id2word[self.data.arr[loc]]             # <<<<<<<<<<<<<<
@@ -7576,7 +7571,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_13get_sentence_bounds(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":56
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":56
  *         return self.id2word[self.data.arr[loc]]
  * 
  *     def get_sentence_bounds(self, loc):             # <<<<<<<<<<<<<<
@@ -7597,7 +7592,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_sentence_bounds(struct __pyx_obj
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_sentence_bounds", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":57
  * 
  *     def get_sentence_bounds(self, loc):
  *         cdef int sid = self.sent_id.arr[loc]             # <<<<<<<<<<<<<<
@@ -7607,7 +7602,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_sentence_bounds(struct __pyx_obj
   __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loc); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_sid = (__pyx_v_self->sent_id->arr[__pyx_t_1]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":58
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":58
  *     def get_sentence_bounds(self, loc):
  *         cdef int sid = self.sent_id.arr[loc]
  *         return (self.sent_index.arr[sid], self.sent_index.arr[sid+1])             # <<<<<<<<<<<<<<
@@ -7666,7 +7661,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":60
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":60
  *         return (self.sent_index.arr[sid], self.sent_index.arr[sid+1])
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -7698,7 +7693,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":61
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":61
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7738,7 +7733,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":62
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":62
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             for w_id in self.data:             # <<<<<<<<<<<<<<
@@ -7783,7 +7778,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
             __pyx_v_w_id = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":63
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":63
  *         with open(filename, "w") as f:
  *             for w_id in self.data:
  *                 if w_id > 1:             # <<<<<<<<<<<<<<
@@ -7795,7 +7790,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             if (__pyx_t_10) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":64
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":64
  *             for w_id in self.data:
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))             # <<<<<<<<<<<<<<
@@ -7832,7 +7827,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
             }
             __pyx_L18:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":65
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":65
  *                 if w_id > 1:
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:             # <<<<<<<<<<<<<<
@@ -7844,7 +7839,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
             __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             if (__pyx_t_10) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":66
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":66
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -7874,7 +7869,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":61
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":61
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -7993,7 +7988,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":68
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":68
  *                     f.write("\n")
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -8021,7 +8016,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":69
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":69
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8061,7 +8056,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
           __pyx_v_fp = __pyx_t_1;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":70
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":70
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:
  *             self.read_text_data(fp)             # <<<<<<<<<<<<<<
@@ -8090,7 +8085,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_16read_text(struct __pyx_obj_3_sa_Data
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":69
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":69
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8243,7 +8238,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self,
 }
 static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -8390,7 +8385,7 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":72
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":72
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -8426,7 +8421,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
   __Pyx_GOTREF(__pyx_cur_scope);
   __pyx_cur_scope->__pyx_v_side = __pyx_v_side;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8467,7 +8462,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
           __pyx_cur_scope->__pyx_v_fp = __pyx_t_1;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -8479,7 +8474,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
           __pyx_v_data = __pyx_t_1;
           __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":75
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":75
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)
  *             self.read_text_data(data)             # <<<<<<<<<<<<<<
@@ -8508,7 +8503,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_18read_bitext(struct __pyx_obj_3_sa_Da
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8616,7 +8611,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":77
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":77
  *             self.read_text_data(data)
  * 
  *     def read_text_data(self, data):             # <<<<<<<<<<<<<<
@@ -8646,7 +8641,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_text_data", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":78
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":78
  * 
  *     def read_text_data(self, data):
  *         cdef int word_count = 0             # <<<<<<<<<<<<<<
@@ -8655,7 +8650,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
   __pyx_v_word_count = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":79
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":79
  *     def read_text_data(self, data):
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):             # <<<<<<<<<<<<<<
@@ -8710,7 +8705,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":80
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":80
  *         cdef int word_count = 0
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
@@ -8724,7 +8719,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":81
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":81
  *         for line_num, line in enumerate(data):
  *             self.sent_index.append(word_count)
  *             for word in line.split():             # <<<<<<<<<<<<<<
@@ -8775,7 +8770,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
       __pyx_v_word = __pyx_t_5;
       __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":82
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":82
  *             self.sent_index.append(word_count)
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))             # <<<<<<<<<<<<<<
@@ -8798,7 +8793,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":83
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":83
  *             for word in line.split():
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:             # <<<<<<<<<<<<<<
@@ -8807,7 +8802,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
       if (__pyx_v_self->use_sent_id) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":84
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":84
  *                 self.data.append(self.get_id(word))
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
@@ -8821,7 +8816,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
       }
       __pyx_L7:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":85
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":85
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -8832,7 +8827,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     }
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":86
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":86
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  *             self.data.append(1)             # <<<<<<<<<<<<<<
@@ -8843,7 +8838,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":87
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":87
  *                 word_count = word_count + 1
  *             self.data.append(1)
  *             if self.use_sent_id:             # <<<<<<<<<<<<<<
@@ -8852,7 +8847,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
     if (__pyx_v_self->use_sent_id) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":88
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":88
  *             self.data.append(1)
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
@@ -8866,7 +8861,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     }
     __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":89
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":89
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -8878,7 +8873,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":90
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":90
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  *         self.data.append(0)             # <<<<<<<<<<<<<<
@@ -8889,7 +8884,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":91
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":91
  *             word_count = word_count + 1
  *         self.data.append(0)
  *         self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
@@ -8944,7 +8939,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":94
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":94
  * 
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -8958,7 +8953,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":96
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":96
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -8967,7 +8962,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":97
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":97
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
@@ -8976,7 +8971,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
  */
   ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->read_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":98
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":98
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -8991,7 +8986,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":100
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":100
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -9016,7 +9011,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":105
  *         cdef char* word
  * 
  *         self.data.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9025,7 +9020,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->read_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":106
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":106
  * 
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9034,7 +9029,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":107
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":107
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9043,7 +9038,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->read_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":108
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":108
  *         self.sent_index.read_handle(f)
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9052,7 +9047,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":109
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":109
  *         self.sent_id.read_handle(f)
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):             # <<<<<<<<<<<<<<
@@ -9063,7 +9058,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":110
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":110
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9072,7 +9067,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":111
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":111
  *         for i in range(num_words):
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -9081,7 +9076,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":112
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":112
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -9090,7 +9085,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":113
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":113
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)             # <<<<<<<<<<<<<<
@@ -9109,7 +9104,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":114
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":114
  *             fread(word, sizeof(char), word_len, f)
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
@@ -9123,7 +9118,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":115
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":115
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -9133,7 +9128,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     free(__pyx_v_word);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":116
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":116
  *             self.id2word.append(word)
  *             free(word)
  *         if len(self.sent_id) == 0:             # <<<<<<<<<<<<<<
@@ -9147,7 +9142,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __pyx_t_6 = (__pyx_t_4 == 0);
   if (__pyx_t_6) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":117
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":117
  *             free(word)
  *         if len(self.sent_id) == 0:
  *             self.use_sent_id = False             # <<<<<<<<<<<<<<
@@ -9159,7 +9154,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":119
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":119
  *             self.use_sent_id = False
  *         else:
  *             self.use_sent_id = True             # <<<<<<<<<<<<<<
@@ -9179,7 +9174,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":121
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":121
  *             self.use_sent_id = True
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -9203,7 +9198,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":125
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":125
  *         cdef int num_words
  * 
  *         self.data.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9212,7 +9207,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->data->__pyx_vtab)->write_handle(__pyx_v_self->data, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":126
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":126
  * 
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9221,7 +9216,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":127
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":127
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9230,7 +9225,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_id->__pyx_vtab)->write_handle(__pyx_v_self->sent_id, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":128
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":128
  *         self.sent_index.write_handle(f)
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2             # <<<<<<<<<<<<<<
@@ -9243,7 +9238,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_num_words = (__pyx_t_2 - 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":129
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":129
  *         self.sent_id.write_handle(f)
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9252,7 +9247,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":130
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":130
  *         num_words = len(self.id2word) - 2
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:             # <<<<<<<<<<<<<<
@@ -9300,7 +9295,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_v_word = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":131
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":131
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
@@ -9310,7 +9305,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
     __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":132
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":132
  *         for word in self.id2word[2:]:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -9319,7 +9314,7 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":133
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":133
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -9362,7 +9357,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":135
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":135
  *             fwrite(<char *>word, sizeof(char), word_len, f)
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9376,7 +9371,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":137
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":137
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -9385,7 +9380,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":138
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":138
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9394,7 +9389,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
  */
   ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->__pyx_vtab)->write_handle(__pyx_v_self, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":139
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":139
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -9420,7 +9415,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":141
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":141
  *         fclose(f)
  * 
  *     def write_enhanced_handle(self, f):             # <<<<<<<<<<<<<<
@@ -9444,7 +9439,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced_handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":142
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":142
  * 
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:             # <<<<<<<<<<<<<<
@@ -9489,7 +9484,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":143
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":143
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -9513,7 +9508,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":144
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":144
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -9527,7 +9522,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":145
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":145
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_index:             # <<<<<<<<<<<<<<
@@ -9572,7 +9567,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":146
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":146
  *         f.write("\n")
  *         for i in self.sent_index:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -9596,7 +9591,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":147
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":147
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -9610,7 +9605,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":148
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":148
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_id:             # <<<<<<<<<<<<<<
@@ -9655,7 +9650,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":149
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":149
  *         f.write("\n")
  *         for i in self.sent_id:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -9679,7 +9674,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":150
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":150
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -9693,7 +9688,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":151
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":151
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for word in self.id2word:             # <<<<<<<<<<<<<<
@@ -9738,7 +9733,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_word = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":152
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":152
  *         f.write("\n")
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))             # <<<<<<<<<<<<<<
@@ -9773,7 +9768,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":153
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":153
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -9825,7 +9820,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":155
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":155
  *         f.write("\n")
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9853,7 +9848,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":156
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":156
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -9892,7 +9887,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":157
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":157
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.write_enhanced_handle(self, f)             # <<<<<<<<<<<<<<
@@ -9922,7 +9917,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":156
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":156
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10028,7 +10023,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_7word2id_1__get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":10
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":10
  * 
  * cdef class DataArray:
  *     cdef public word2id             # <<<<<<<<<<<<<<
@@ -10115,7 +10110,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_7id2word_1__get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":11
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":11
  * cdef class DataArray:
  *     cdef public word2id
  *     cdef public id2word             # <<<<<<<<<<<<<<
@@ -10202,7 +10197,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_4data_1__get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":12
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":12
  *     cdef public word2id
  *     cdef public id2word
  *     cdef public IntList data             # <<<<<<<<<<<<<<
@@ -10298,7 +10293,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_7sent_id_1__get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":13
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":13
  *     cdef public id2word
  *     cdef public IntList data
  *     cdef public IntList sent_id             # <<<<<<<<<<<<<<
@@ -10394,7 +10389,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_10sent_index_1__get__(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":14
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":14
  *     cdef public IntList data
  *     cdef public IntList sent_id
  *     cdef public IntList sent_index             # <<<<<<<<<<<<<<
@@ -10479,7 +10474,7 @@ static int __pyx_pf_3_sa_9DataArray_10sent_index_4__del__(struct __pyx_obj_3_sa_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":12
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":12
  *     cdef IntList sent_index
  * 
  *     cdef int link(self, int i, int j):             # <<<<<<<<<<<<<<
@@ -10492,7 +10487,7 @@ static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alig
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("link", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":14
  *     cdef int link(self, int i, int j):
  *         """Integerizes an alignment link pair"""
  *         return i*65536 + j             # <<<<<<<<<<<<<<
@@ -10520,7 +10515,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":16
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":16
  *         return i*65536 + j
  * 
  *     def unlink(self, link):             # <<<<<<<<<<<<<<
@@ -10539,7 +10534,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("unlink", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":18
  *     def unlink(self, link):
  *         """De-integerizes an alignment link pair"""
  *         return (link/65536, link%65536)             # <<<<<<<<<<<<<<
@@ -10577,7 +10572,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":20
  *         return (link/65536, link%65536)
  * 
  *     cdef _unlink(self, int link, int* f, int* e):             # <<<<<<<<<<<<<<
@@ -10590,7 +10585,7 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_unlink", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":21
  * 
  *     cdef _unlink(self, int link, int* f, int* e):
  *         f[0] = link/65536             # <<<<<<<<<<<<<<
@@ -10599,7 +10594,7 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_
  */
   (__pyx_v_f[0]) = __Pyx_div_long(__pyx_v_link, 65536);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":22
  *     cdef _unlink(self, int link, int* f, int* e):
  *         f[0] = link/65536
  *         e[0] = link%65536             # <<<<<<<<<<<<<<
@@ -10635,7 +10630,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":24
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":24
  *         e[0] = link%65536
  * 
  *     def get_sent_links(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -10655,7 +10650,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_sent_links", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":28
  *         cdef int* arr
  *         cdef int arr_len
  *         sent_links = IntList()             # <<<<<<<<<<<<<<
@@ -10667,7 +10662,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
   __pyx_v_sent_links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":29
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":29
  *         cdef int arr_len
  *         sent_links = IntList()
  *         arr = self._get_sent_links(sent_id, &arr_len)             # <<<<<<<<<<<<<<
@@ -10676,7 +10671,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
  */
   __pyx_v_arr = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->__pyx_vtab)->_get_sent_links(__pyx_v_self, __pyx_v_sent_id, (&__pyx_v_arr_len));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":30
  *         sent_links = IntList()
  *         arr = self._get_sent_links(sent_id, &arr_len)
  *         sent_links._extend_arr(arr, arr_len*2)             # <<<<<<<<<<<<<<
@@ -10685,7 +10680,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sent_links->__pyx_vtab)->_extend_arr(__pyx_v_sent_links, __pyx_v_arr, (__pyx_v_arr_len * 2));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":31
  *         arr = self._get_sent_links(sent_id, &arr_len)
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)             # <<<<<<<<<<<<<<
@@ -10694,7 +10689,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
  */
   free(__pyx_v_arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":32
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":32
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)
  *         return sent_links             # <<<<<<<<<<<<<<
@@ -10719,7 +10714,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":34
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":34
  *         return sent_links
  * 
  *     cdef int* _get_sent_links(self, int sent_id, int* num_links):             # <<<<<<<<<<<<<<
@@ -10741,7 +10736,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("_get_sent_links", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":37
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":37
  *         cdef int* sent_links
  *         cdef int i, start, end
  *         start = self.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -10750,7 +10745,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_v_sent_id]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":38
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":38
  *         cdef int i, start, end
  *         start = self.sent_index.arr[sent_id]
  *         end = self.sent_index.arr[sent_id+1]             # <<<<<<<<<<<<<<
@@ -10759,7 +10754,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_end = (__pyx_v_self->sent_index->arr[(__pyx_v_sent_id + 1)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":39
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":39
  *         start = self.sent_index.arr[sent_id]
  *         end = self.sent_index.arr[sent_id+1]
  *         num_links[0] = end - start             # <<<<<<<<<<<<<<
@@ -10768,7 +10763,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   (__pyx_v_num_links[0]) = (__pyx_v_end - __pyx_v_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":40
  *         end = self.sent_index.arr[sent_id+1]
  *         num_links[0] = end - start
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))             # <<<<<<<<<<<<<<
@@ -10777,7 +10772,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
  */
   __pyx_v_sent_links = ((int *)malloc(((2 * (__pyx_v_num_links[0])) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":41
  *         num_links[0] = end - start
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))
  *         for i from 0 <= i < num_links[0]:             # <<<<<<<<<<<<<<
@@ -10787,7 +10782,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
   __pyx_t_1 = (__pyx_v_num_links[0]);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":42
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":42
  *         sent_links = <int*> malloc(2*num_links[0]*sizeof(int))
  *         for i from 0 <= i < num_links[0]:
  *             self._unlink(self.links.arr[start + i], sent_links + (2*i), sent_links + (2*i) + 1)             # <<<<<<<<<<<<<<
@@ -10799,7 +10794,7 @@ static int *__pyx_f_3_sa_9Alignment__get_sent_links(struct __pyx_obj_3_sa_Alignm
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":43
  *         for i from 0 <= i < num_links[0]:
  *             self._unlink(self.links.arr[start + i], sent_links + (2*i), sent_links + (2*i) + 1)
  *         return sent_links             # <<<<<<<<<<<<<<
@@ -10832,7 +10827,7 @@ static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,0};
     PyObject* values[2] = {0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":45
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":45
  *         return sent_links
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):             # <<<<<<<<<<<<<<
@@ -10902,7 +10897,7 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":46
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":46
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -10917,7 +10912,7 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   __pyx_v_self->links = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":47
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":47
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -10932,7 +10927,7 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   __pyx_v_self->sent_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":48
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":48
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -10942,7 +10937,7 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":49
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":49
  *         self.sent_index = IntList(1000,1000)
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
@@ -10964,7 +10959,7 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":50
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":50
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -10974,7 +10969,7 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":51
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":51
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             self.read_text(from_text)             # <<<<<<<<<<<<<<
@@ -11031,7 +11026,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":53
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":53
  *             self.read_text(from_text)
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -11073,7 +11068,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -11113,7 +11108,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
           __pyx_v_f = __pyx_t_1;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":55
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":55
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -11158,7 +11153,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
             __pyx_v_line = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":56
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":56
  *         with gzip_or_text(filename) as f:
  *             for line in f:
  *                 self.sent_index.append(len(self.links))             # <<<<<<<<<<<<<<
@@ -11176,7 +11171,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":57
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":57
  *             for line in f:
  *                 self.sent_index.append(len(self.links))
  *                 pairs = line.split()             # <<<<<<<<<<<<<<
@@ -11192,7 +11187,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
             __pyx_v_pairs = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":58
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":58
  *                 self.sent_index.append(len(self.links))
  *                 pairs = line.split()
  *                 for pair in pairs:             # <<<<<<<<<<<<<<
@@ -11237,7 +11232,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
               __pyx_v_pair = __pyx_t_3;
               __pyx_t_3 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":59
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))             # <<<<<<<<<<<<<<
@@ -11316,7 +11311,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
               __pyx_v_j = __pyx_t_13;
               __pyx_t_13 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":60
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":60
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))
  *                     self.links.append(self.link(i, j))             # <<<<<<<<<<<<<<
@@ -11336,7 +11331,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
           }
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":61
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":61
  *                     (i, j) = map(int, pair.split('-'))
  *                     self.links.append(self.link(i, j))
  *             self.sent_index.append(len(self.links))             # <<<<<<<<<<<<<<
@@ -11366,7 +11361,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -11490,7 +11485,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":63
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":63
  *             self.sent_index.append(len(self.links))
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -11504,7 +11499,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Ali
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":65
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":65
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -11513,7 +11508,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Ali
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":66
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.links.read_handle(f)             # <<<<<<<<<<<<<<
@@ -11522,7 +11517,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Ali
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->read_handle(__pyx_v_self->links, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":67
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":67
  *         f = fopen(filename, "r")
  *         self.links.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -11531,7 +11526,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Ali
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->read_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":68
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":68
  *         self.links.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -11567,7 +11562,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":70
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":70
  *         fclose(f)
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -11602,7 +11597,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -11642,7 +11637,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":72
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":72
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             sent_num = 0             # <<<<<<<<<<<<<<
@@ -11652,7 +11647,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_sent_num = __pyx_int_0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":73
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":73
  *         with open(filename, "w") as f:
  *             sent_num = 0
  *             for i, link in enumerate(self.links):             # <<<<<<<<<<<<<<
@@ -11707,7 +11702,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
             __pyx_t_4 = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":74
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":74
  *             sent_num = 0
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:             # <<<<<<<<<<<<<<
@@ -11723,7 +11718,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               if (!__pyx_t_11) break;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":75
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":75
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -11737,7 +11732,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":76
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":76
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")
  *                     sent_num = sent_num + 1             # <<<<<<<<<<<<<<
@@ -11751,7 +11746,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
               __pyx_t_2 = 0;
             }
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":77
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":77
  *                     f.write("\n")
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))             # <<<<<<<<<<<<<<
@@ -11788,7 +11783,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":78
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -11814,7 +11809,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
         __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -11936,7 +11931,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":80
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":80
  *             f.write("\n")
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -11950,7 +11945,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_A
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":82
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":82
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -11959,7 +11954,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_A
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":83
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":83
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.links.write_handle(f)             # <<<<<<<<<<<<<<
@@ -11968,7 +11963,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_A
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->links->__pyx_vtab)->write_handle(__pyx_v_self->links, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":84
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":84
  *         f = fopen(filename, "w")
  *         self.links.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -11977,7 +11972,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_A
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sent_index->__pyx_vtab)->write_handle(__pyx_v_self->sent_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":85
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":85
  *         self.links.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -12013,7 +12008,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":87
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":87
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -12046,7 +12041,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -12086,7 +12081,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":89
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":89
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             sent_num = 1             # <<<<<<<<<<<<<<
@@ -12095,7 +12090,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  */
           __pyx_v_sent_num = 1;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":90
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":90
  *         with open(filename, "w") as f:
  *             sent_num = 1
  *             for link in self.links:             # <<<<<<<<<<<<<<
@@ -12140,7 +12135,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
             __pyx_v_link = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":91
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":91
  *             sent_num = 1
  *             for link in self.links:
  *                 f.write("%d " % link)             # <<<<<<<<<<<<<<
@@ -12164,7 +12159,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
           }
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":92
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
  *                 f.write("%d " % link)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -12178,7 +12173,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":93
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":93
  *                 f.write("%d " % link)
  *             f.write("\n")
  *             for i in self.sent_index:             # <<<<<<<<<<<<<<
@@ -12223,7 +12218,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
             __pyx_v_i = __pyx_t_4;
             __pyx_t_4 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":94
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":94
  *             f.write("\n")
  *             for i in self.sent_index:
  *                 f.write("%d " % i)             # <<<<<<<<<<<<<<
@@ -12247,7 +12242,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":95
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -12271,7 +12266,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -12381,7 +12376,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":97
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":97
  *             f.write("\n")
  * 
  *     def alignment(self, i):             # <<<<<<<<<<<<<<
@@ -12407,7 +12402,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("alignment", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":100
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":100
  *         """Return all (e,f) pairs for sentence i"""
  *         cdef int j, start, end
  *         result = []             # <<<<<<<<<<<<<<
@@ -12419,7 +12414,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":101
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":101
  *         cdef int j, start, end
  *         result = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
@@ -12429,7 +12424,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_start = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":102
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":102
  *         result = []
  *         start = self.sent_index.arr[i]
  *         end = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
@@ -12442,7 +12437,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_end = (__pyx_v_self->sent_index->arr[__pyx_t_2]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":103
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":103
  *         start = self.sent_index.arr[i]
  *         end = self.sent_index.arr[i+1]
  *         for j from start <= j < end:             # <<<<<<<<<<<<<<
@@ -12452,7 +12447,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   __pyx_t_3 = __pyx_v_end;
   for (__pyx_v_j = __pyx_v_start; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":104
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":104
  *         end = self.sent_index.arr[i+1]
  *         for j from start <= j < end:
  *             result.append(self.unlink(self.links.arr[j]))             # <<<<<<<<<<<<<<
@@ -12475,7 +12470,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":105
  *         for j from start <= j < end:
  *             result.append(self.unlink(self.links.arr[j]))
  *         return result             # <<<<<<<<<<<<<<
@@ -12500,7 +12495,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":15
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":15
  *     int val
  * 
  * cdef _node* new_node(int key):             # <<<<<<<<<<<<<<
@@ -12514,7 +12509,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("new_node", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":17
  * cdef _node* new_node(int key):
  *     cdef _node* n
  *     n = <_node*> malloc(sizeof(_node))             # <<<<<<<<<<<<<<
@@ -12523,7 +12518,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n = ((struct __pyx_t_3_sa__node *)malloc((sizeof(struct __pyx_t_3_sa__node))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":18
  *     cdef _node* n
  *     n = <_node*> malloc(sizeof(_node))
  *     n.smaller = NULL             # <<<<<<<<<<<<<<
@@ -12532,7 +12527,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->smaller = NULL;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":19
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":19
  *     n = <_node*> malloc(sizeof(_node))
  *     n.smaller = NULL
  *     n.bigger = NULL             # <<<<<<<<<<<<<<
@@ -12541,7 +12536,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->bigger = NULL;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":20
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":20
  *     n.smaller = NULL
  *     n.bigger = NULL
  *     n.key = key             # <<<<<<<<<<<<<<
@@ -12550,7 +12545,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->key = __pyx_v_key;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":21
  *     n.bigger = NULL
  *     n.key = key
  *     n.val = 0             # <<<<<<<<<<<<<<
@@ -12559,7 +12554,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->val = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":22
  *     n.key = key
  *     n.val = 0
  *     return n             # <<<<<<<<<<<<<<
@@ -12575,7 +12570,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":25
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":25
  * 
  * 
  * cdef del_node(_node* n):             # <<<<<<<<<<<<<<
@@ -12593,7 +12588,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("del_node", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":26
  * 
  * cdef del_node(_node* n):
  *     if n.smaller != NULL:             # <<<<<<<<<<<<<<
@@ -12603,7 +12598,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   __pyx_t_1 = (__pyx_v_n->smaller != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":27
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":27
  * cdef del_node(_node* n):
  *     if n.smaller != NULL:
  *         del_node(n.smaller)             # <<<<<<<<<<<<<<
@@ -12617,7 +12612,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":28
  *     if n.smaller != NULL:
  *         del_node(n.smaller)
  *     if n.bigger != NULL:             # <<<<<<<<<<<<<<
@@ -12627,7 +12622,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   __pyx_t_1 = (__pyx_v_n->bigger != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":29
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":29
  *         del_node(n.smaller)
  *     if n.bigger != NULL:
  *         del_node(n.bigger)             # <<<<<<<<<<<<<<
@@ -12641,7 +12636,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":30
  *     if n.bigger != NULL:
  *         del_node(n.bigger)
  *     free(n)             # <<<<<<<<<<<<<<
@@ -12662,7 +12657,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":32
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":32
  *     free(n)
  * 
  * cdef int* get_val(_node* n, int key):             # <<<<<<<<<<<<<<
@@ -12676,7 +12671,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("get_val", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":33
  * 
  * cdef int* get_val(_node* n, int key):
  *     if key == n.key:             # <<<<<<<<<<<<<<
@@ -12686,7 +12681,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   __pyx_t_1 = (__pyx_v_key == __pyx_v_n->key);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":34
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":34
  * cdef int* get_val(_node* n, int key):
  *     if key == n.key:
  *         return &n.val             # <<<<<<<<<<<<<<
@@ -12698,7 +12693,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":35
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":35
  *     if key == n.key:
  *         return &n.val
  *     elif key < n.key:             # <<<<<<<<<<<<<<
@@ -12708,7 +12703,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   __pyx_t_1 = (__pyx_v_key < __pyx_v_n->key);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":36
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":36
  *         return &n.val
  *     elif key < n.key:
  *         if n.smaller == NULL:             # <<<<<<<<<<<<<<
@@ -12718,7 +12713,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     __pyx_t_1 = (__pyx_v_n->smaller == NULL);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":37
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":37
  *     elif key < n.key:
  *         if n.smaller == NULL:
  *             n.smaller = new_node(key)             # <<<<<<<<<<<<<<
@@ -12727,7 +12722,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
  */
       __pyx_v_n->smaller = __pyx_f_3_sa_new_node(__pyx_v_key);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":38
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":38
  *         if n.smaller == NULL:
  *             n.smaller = new_node(key)
  *             return &(n.smaller.val)             # <<<<<<<<<<<<<<
@@ -12740,7 +12735,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":39
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":39
  *             n.smaller = new_node(key)
  *             return &(n.smaller.val)
  *         return get_val(n.smaller, key)             # <<<<<<<<<<<<<<
@@ -12753,7 +12748,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":41
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":41
  *         return get_val(n.smaller, key)
  *     else:
  *         if n.bigger == NULL:             # <<<<<<<<<<<<<<
@@ -12763,7 +12758,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     __pyx_t_1 = (__pyx_v_n->bigger == NULL);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":42
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":42
  *     else:
  *         if n.bigger == NULL:
  *             n.bigger = new_node(key)             # <<<<<<<<<<<<<<
@@ -12772,7 +12767,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
  */
       __pyx_v_n->bigger = __pyx_f_3_sa_new_node(__pyx_v_key);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":43
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":43
  *         if n.bigger == NULL:
  *             n.bigger = new_node(key)
  *             return &(n.bigger.val)             # <<<<<<<<<<<<<<
@@ -12785,7 +12780,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":44
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":44
  *             n.bigger = new_node(key)
  *             return &(n.bigger.val)
  *         return get_val(n.bigger, key)             # <<<<<<<<<<<<<<
@@ -12819,7 +12814,7 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_text,&__pyx_n_s__from_data,&__pyx_n_s__from_binary,&__pyx_n_s__earray,&__pyx_n_s__fsarray,&__pyx_n_s__alignment,0};
     PyObject* values[6] = {0,0,0,0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
  *     cdef id2eword, id2fword, eword2id, fword2id
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
@@ -12830,7 +12825,7 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
     values[1] = __pyx_k_41;
     values[2] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":55
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":55
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,
  *             earray=None, fsarray=None, alignment=None):             # <<<<<<<<<<<<<<
@@ -12921,7 +12916,7 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
  *     cdef id2eword, id2fword, eword2id, fword2id
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
@@ -12942,7 +12937,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":56
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":56
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,
  *             earray=None, fsarray=None, alignment=None):
  *         self.id2eword = []             # <<<<<<<<<<<<<<
@@ -12957,7 +12952,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_v_self->id2eword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":57
  *             earray=None, fsarray=None, alignment=None):
  *         self.id2eword = []
  *         self.id2fword = []             # <<<<<<<<<<<<<<
@@ -12972,7 +12967,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_v_self->id2fword = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":58
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":58
  *         self.id2eword = []
  *         self.id2fword = []
  *         self.eword2id = {}             # <<<<<<<<<<<<<<
@@ -12987,7 +12982,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_v_self->eword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":59
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":59
  *         self.id2fword = []
  *         self.eword2id = {}
  *         self.fword2id = {}             # <<<<<<<<<<<<<<
@@ -13002,7 +12997,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_v_self->fword2id = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":60
  *         self.eword2id = {}
  *         self.fword2id = {}
  *         self.e_index = IntList()             # <<<<<<<<<<<<<<
@@ -13017,7 +13012,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":61
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":61
  *         self.fword2id = {}
  *         self.e_index = IntList()
  *         self.f_index = IntList()             # <<<<<<<<<<<<<<
@@ -13032,7 +13027,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":62
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":62
  *         self.e_index = IntList()
  *         self.f_index = IntList()
  *         self.col1 = FloatList()             # <<<<<<<<<<<<<<
@@ -13047,7 +13042,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":63
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":63
  *         self.f_index = IntList()
  *         self.col1 = FloatList()
  *         self.col2 = FloatList()             # <<<<<<<<<<<<<<
@@ -13062,7 +13057,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":64
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":64
  *         self.col1 = FloatList()
  *         self.col2 = FloatList()
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -13072,7 +13067,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":65
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":65
  *         self.col2 = FloatList()
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
@@ -13094,7 +13089,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":66
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_data:             # <<<<<<<<<<<<<<
@@ -13104,7 +13099,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_data); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":67
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":67
  *             self.read_binary(from_binary)
  *         elif from_data:
  *             self.compute_from_data(fsarray, earray, alignment)             # <<<<<<<<<<<<<<
@@ -13130,7 +13125,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":69
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":69
  *             self.compute_from_data(fsarray, earray, alignment)
  *         else:
  *             self.read_text(from_text)             # <<<<<<<<<<<<<<
@@ -13166,7 +13161,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":72
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":72
  * 
  * 
  *     cdef compute_from_data(self, SuffixArray fsa, DataArray eda, Alignment aa):             # <<<<<<<<<<<<<<
@@ -13220,7 +13215,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("compute_from_data", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":79
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":79
  *         cdef int null_word
  * 
  *         null_word = 0             # <<<<<<<<<<<<<<
@@ -13229,7 +13224,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_null_word = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":80
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":80
  * 
  *         null_word = 0
  *         for word in fsa.darray.id2word: # I miss list comprehensions             # <<<<<<<<<<<<<<
@@ -13274,7 +13269,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":81
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":81
  *         null_word = 0
  *         for word in fsa.darray.id2word: # I miss list comprehensions
  *             self.id2fword.append(word)             # <<<<<<<<<<<<<<
@@ -13287,7 +13282,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":82
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":82
  *         for word in fsa.darray.id2word: # I miss list comprehensions
  *             self.id2fword.append(word)
  *         self.id2fword[null_word] = "NULL"             # <<<<<<<<<<<<<<
@@ -13296,7 +13291,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   if (__Pyx_SetItemInt(__pyx_v_self->id2fword, __pyx_v_null_word, ((PyObject *)__pyx_n_s__NULL), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":83
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":83
  *             self.id2fword.append(word)
  *         self.id2fword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2fword):             # <<<<<<<<<<<<<<
@@ -13351,7 +13346,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":84
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":84
  *         self.id2fword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2fword):
  *             self.fword2id[word] = id             # <<<<<<<<<<<<<<
@@ -13363,7 +13358,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":86
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":86
  *             self.fword2id[word] = id
  * 
  *         for word in eda.id2word:             # <<<<<<<<<<<<<<
@@ -13408,7 +13403,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":87
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":87
  * 
  *         for word in eda.id2word:
  *             self.id2eword.append(word)             # <<<<<<<<<<<<<<
@@ -13421,7 +13416,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":88
  *         for word in eda.id2word:
  *             self.id2eword.append(word)
  *         self.id2eword[null_word] = "NULL"             # <<<<<<<<<<<<<<
@@ -13430,7 +13425,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   if (__Pyx_SetItemInt(__pyx_v_self->id2eword, __pyx_v_null_word, ((PyObject *)__pyx_n_s__NULL), sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":89
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":89
  *             self.id2eword.append(word)
  *         self.id2eword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2eword):             # <<<<<<<<<<<<<<
@@ -13485,7 +13480,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":90
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":90
  *         self.id2eword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2eword):
  *             self.eword2id[word] = id             # <<<<<<<<<<<<<<
@@ -13497,7 +13492,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":92
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":92
  *             self.eword2id[word] = id
  * 
  *         num_pairs = 0             # <<<<<<<<<<<<<<
@@ -13506,7 +13501,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_num_pairs = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":94
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":94
  *         num_pairs = 0
  * 
  *         V_E = len(eda.id2word)             # <<<<<<<<<<<<<<
@@ -13519,7 +13514,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_V_E = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":95
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":95
  * 
  *         V_E = len(eda.id2word)
  *         V_F = len(fsa.darray.id2word)             # <<<<<<<<<<<<<<
@@ -13532,7 +13527,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_V_F = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":96
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":96
  *         V_E = len(eda.id2word)
  *         V_F = len(fsa.darray.id2word)
  *         fmargin = <int*> malloc(V_F*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13541,7 +13536,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_fmargin = ((int *)malloc((__pyx_v_V_F * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":97
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":97
  *         V_F = len(fsa.darray.id2word)
  *         fmargin = <int*> malloc(V_F*sizeof(int))
  *         emargin = <int*> malloc(V_E*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13550,7 +13545,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_emargin = ((int *)malloc((__pyx_v_V_E * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":98
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":98
  *         fmargin = <int*> malloc(V_F*sizeof(int))
  *         emargin = <int*> malloc(V_E*sizeof(int))
  *         memset(fmargin, 0, V_F*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13559,7 +13554,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_fmargin, 0, (__pyx_v_V_F * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":99
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":99
  *         emargin = <int*> malloc(V_E*sizeof(int))
  *         memset(fmargin, 0, V_F*sizeof(int))
  *         memset(emargin, 0, V_E*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13568,7 +13563,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_emargin, 0, (__pyx_v_V_E * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":101
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":101
  *         memset(emargin, 0, V_E*sizeof(int))
  * 
  *         dict = <_node**> malloc(V_F*sizeof(_node*))             # <<<<<<<<<<<<<<
@@ -13577,7 +13572,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_dict = ((struct __pyx_t_3_sa__node **)malloc((__pyx_v_V_F * (sizeof(struct __pyx_t_3_sa__node *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":102
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":102
  * 
  *         dict = <_node**> malloc(V_F*sizeof(_node*))
  *         memset(dict, 0, V_F*sizeof(_node*))             # <<<<<<<<<<<<<<
@@ -13586,7 +13581,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   memset(__pyx_v_dict, 0, (__pyx_v_V_F * (sizeof(struct __pyx_t_3_sa__node *))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":104
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":104
  *         memset(dict, 0, V_F*sizeof(_node*))
  * 
  *         num_sents = len(fsa.darray.sent_index)             # <<<<<<<<<<<<<<
@@ -13602,7 +13597,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_num_sents = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":105
  * 
  *         num_sents = len(fsa.darray.sent_index)
  *         for sent_id from 0 <= sent_id < num_sents-1:             # <<<<<<<<<<<<<<
@@ -13615,7 +13610,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (__pyx_v_sent_id = 0; __pyx_v_sent_id < __pyx_t_6; __pyx_v_sent_id++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":107
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":107
  *         for sent_id from 0 <= sent_id < num_sents-1:
  * 
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -13624,7 +13619,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_fsent = (__pyx_v_fsa->darray->data->arr + (__pyx_v_fsa->darray->sent_index->arr[__pyx_v_sent_id]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":108
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":108
  * 
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1             # <<<<<<<<<<<<<<
@@ -13633,7 +13628,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_I = (((__pyx_v_fsa->darray->sent_index->arr[(__pyx_v_sent_id + 1)]) - (__pyx_v_fsa->darray->sent_index->arr[__pyx_v_sent_id])) - 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":109
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":109
  *             fsent = fsa.darray.data.arr + fsa.darray.sent_index.arr[sent_id]
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1
  *             faligned = <int*> malloc(I*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13642,7 +13637,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_faligned = ((int *)malloc((__pyx_v_I * (sizeof(int)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":110
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":110
  *             I = fsa.darray.sent_index.arr[sent_id+1] - fsa.darray.sent_index.arr[sent_id] - 1
  *             faligned = <int*> malloc(I*sizeof(int))
  *             memset(faligned, 0, I*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13651,7 +13646,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     memset(__pyx_v_faligned, 0, (__pyx_v_I * (sizeof(int))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":112
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":112
  *             memset(faligned, 0, I*sizeof(int))
  * 
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -13660,7 +13655,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_esent = (__pyx_v_eda->data->arr + (__pyx_v_eda->sent_index->arr[__pyx_v_sent_id]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":113
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":113
  * 
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1             # <<<<<<<<<<<<<<
@@ -13669,7 +13664,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_J = (((__pyx_v_eda->sent_index->arr[(__pyx_v_sent_id + 1)]) - (__pyx_v_eda->sent_index->arr[__pyx_v_sent_id])) - 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":114
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":114
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1
  *             ealigned = <int*> malloc(J*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13678,7 +13673,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_ealigned = ((int *)malloc((__pyx_v_J * (sizeof(int)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":115
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":115
  *             J = eda.sent_index.arr[sent_id+1] - eda.sent_index.arr[sent_id] - 1
  *             ealigned = <int*> malloc(J*sizeof(int))
  *             memset(ealigned, 0, J*sizeof(int))             # <<<<<<<<<<<<<<
@@ -13687,7 +13682,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     memset(__pyx_v_ealigned, 0, (__pyx_v_J * (sizeof(int))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":117
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":117
  *             memset(ealigned, 0, J*sizeof(int))
  * 
  *             links = aa._get_sent_links(sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -13696,7 +13691,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     __pyx_v_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_aa->__pyx_vtab)->_get_sent_links(__pyx_v_aa, __pyx_v_sent_id, (&__pyx_v_num_links));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":119
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":119
  *             links = aa._get_sent_links(sent_id, &num_links)
  * 
  *             for l from 0 <= l < num_links:             # <<<<<<<<<<<<<<
@@ -13706,7 +13701,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_num_links;
     for (__pyx_v_l = 0; __pyx_v_l < __pyx_t_7; __pyx_v_l++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":120
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":120
  * 
  *             for l from 0 <= l < num_links:
  *                 i = links[l*2]             # <<<<<<<<<<<<<<
@@ -13715,7 +13710,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_i = (__pyx_v_links[(__pyx_v_l * 2)]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":121
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":121
  *             for l from 0 <= l < num_links:
  *                 i = links[l*2]
  *                 j = links[l*2+1]             # <<<<<<<<<<<<<<
@@ -13724,7 +13719,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_j = (__pyx_v_links[((__pyx_v_l * 2) + 1)]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":122
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":122
  *                 i = links[l*2]
  *                 j = links[l*2+1]
  *                 if i >= I or j >= J:             # <<<<<<<<<<<<<<
@@ -13740,7 +13735,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       if (__pyx_t_10) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":123
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":123
  *                 j = links[l*2+1]
  *                 if i >= I or j >= J:
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))             # <<<<<<<<<<<<<<
@@ -13792,7 +13787,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       __pyx_L15:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":124
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":124
  *                 if i >= I or j >= J:
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))
  *                 f_i = fsent[i]             # <<<<<<<<<<<<<<
@@ -13801,7 +13796,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_f_i = (__pyx_v_fsent[__pyx_v_i]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":125
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":125
  *                     raise Exception("%d-%d out of bounds (I=%d,J=%d) in line %d\n" % (i,j,I,J,sent_id+1))
  *                 f_i = fsent[i]
  *                 e_j = esent[j]             # <<<<<<<<<<<<<<
@@ -13810,7 +13805,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       __pyx_v_e_j = (__pyx_v_esent[__pyx_v_j]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":126
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":126
  *                 f_i = fsent[i]
  *                 e_j = esent[j]
  *                 fmargin[f_i] = fmargin[f_i]+1             # <<<<<<<<<<<<<<
@@ -13819,7 +13814,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_fmargin[__pyx_v_f_i]) = ((__pyx_v_fmargin[__pyx_v_f_i]) + 1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":127
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":127
  *                 e_j = esent[j]
  *                 fmargin[f_i] = fmargin[f_i]+1
  *                 emargin[e_j] = emargin[e_j]+1             # <<<<<<<<<<<<<<
@@ -13828,7 +13823,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_emargin[__pyx_v_e_j]) = ((__pyx_v_emargin[__pyx_v_e_j]) + 1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":128
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":128
  *                 fmargin[f_i] = fmargin[f_i]+1
  *                 emargin[e_j] = emargin[e_j]+1
  *                 if dict[f_i] == NULL:             # <<<<<<<<<<<<<<
@@ -13838,7 +13833,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_dict[__pyx_v_f_i]) == NULL);
       if (__pyx_t_10) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":129
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":129
  *                 emargin[e_j] = emargin[e_j]+1
  *                 if dict[f_i] == NULL:
  *                     dict[f_i] = new_node(e_j)             # <<<<<<<<<<<<<<
@@ -13847,7 +13842,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_dict[__pyx_v_f_i]) = __pyx_f_3_sa_new_node(__pyx_v_e_j);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":130
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":130
  *                 if dict[f_i] == NULL:
  *                     dict[f_i] = new_node(e_j)
  *                     dict[f_i].val = 1             # <<<<<<<<<<<<<<
@@ -13856,7 +13851,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_dict[__pyx_v_f_i])->val = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":131
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":131
  *                     dict[f_i] = new_node(e_j)
  *                     dict[f_i].val = 1
  *                     num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -13868,7 +13863,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":133
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":133
  *                     num_pairs = num_pairs + 1
  *                 else:
  *                     count = get_val(dict[f_i], e_j)             # <<<<<<<<<<<<<<
@@ -13877,7 +13872,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_f_i]), __pyx_v_e_j);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":134
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":134
  *                 else:
  *                     count = get_val(dict[f_i], e_j)
  *                     if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -13887,7 +13882,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_count[0]) == 0);
         if (__pyx_t_10) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":135
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":135
  *                     count = get_val(dict[f_i], e_j)
  *                     if count[0] == 0:
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -13899,7 +13894,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         __pyx_L17:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":136
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":136
  *                     if count[0] == 0:
  *                         num_pairs = num_pairs + 1
  *                     count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -13910,7 +13905,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       __pyx_L16:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":138
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":138
  *                     count[0] = count[0] + 1
  *                 # add count
  *                 faligned[i] = 1             # <<<<<<<<<<<<<<
@@ -13919,7 +13914,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
       (__pyx_v_faligned[__pyx_v_i]) = 1;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":139
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":139
  *                 # add count
  *                 faligned[i] = 1
  *                 ealigned[j] = 1             # <<<<<<<<<<<<<<
@@ -13929,7 +13924,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       (__pyx_v_ealigned[__pyx_v_j]) = 1;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":140
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":140
  *                 faligned[i] = 1
  *                 ealigned[j] = 1
  *             for i from 0 <= i < I:             # <<<<<<<<<<<<<<
@@ -13939,7 +13934,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_I;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_7; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":141
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":141
  *                 ealigned[j] = 1
  *             for i from 0 <= i < I:
  *                 if faligned[i] == 0:             # <<<<<<<<<<<<<<
@@ -13949,7 +13944,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_faligned[__pyx_v_i]) == 0);
       if (__pyx_t_10) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":142
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":142
  *             for i from 0 <= i < I:
  *                 if faligned[i] == 0:
  *                     f_i = fsent[i]             # <<<<<<<<<<<<<<
@@ -13958,7 +13953,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_f_i = (__pyx_v_fsent[__pyx_v_i]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":143
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":143
  *                 if faligned[i] == 0:
  *                     f_i = fsent[i]
  *                     fmargin[f_i] = fmargin[f_i] + 1             # <<<<<<<<<<<<<<
@@ -13967,7 +13962,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_fmargin[__pyx_v_f_i]) = ((__pyx_v_fmargin[__pyx_v_f_i]) + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":144
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":144
  *                     f_i = fsent[i]
  *                     fmargin[f_i] = fmargin[f_i] + 1
  *                     emargin[null_word] = emargin[null_word] + 1             # <<<<<<<<<<<<<<
@@ -13976,7 +13971,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_emargin[__pyx_v_null_word]) = ((__pyx_v_emargin[__pyx_v_null_word]) + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":145
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":145
  *                     fmargin[f_i] = fmargin[f_i] + 1
  *                     emargin[null_word] = emargin[null_word] + 1
  *                     if dict[f_i] == NULL:             # <<<<<<<<<<<<<<
@@ -13986,7 +13981,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_dict[__pyx_v_f_i]) == NULL);
         if (__pyx_t_10) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":146
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":146
  *                     emargin[null_word] = emargin[null_word] + 1
  *                     if dict[f_i] == NULL:
  *                         dict[f_i] = new_node(null_word)             # <<<<<<<<<<<<<<
@@ -13995,7 +13990,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_f_i]) = __pyx_f_3_sa_new_node(__pyx_v_null_word);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":147
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":147
  *                     if dict[f_i] == NULL:
  *                         dict[f_i] = new_node(null_word)
  *                         dict[f_i].val = 1             # <<<<<<<<<<<<<<
@@ -14004,7 +13999,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_f_i])->val = 1;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":148
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":148
  *                         dict[f_i] = new_node(null_word)
  *                         dict[f_i].val = 1
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -14016,7 +14011,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":150
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":150
  *                         num_pairs = num_pairs + 1
  *                     else:
  *                         count = get_val(dict[f_i], null_word)             # <<<<<<<<<<<<<<
@@ -14025,7 +14020,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_f_i]), __pyx_v_null_word);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":151
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":151
  *                     else:
  *                         count = get_val(dict[f_i], null_word)
  *                         if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -14035,7 +14030,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           __pyx_t_10 = ((__pyx_v_count[0]) == 0);
           if (__pyx_t_10) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":152
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":152
  *                         count = get_val(dict[f_i], null_word)
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -14047,7 +14042,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           }
           __pyx_L22:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":153
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":153
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -14062,7 +14057,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_L20:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":154
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":154
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1
  *             for j from 0 <= j < J:             # <<<<<<<<<<<<<<
@@ -14072,7 +14067,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_7 = __pyx_v_J;
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_7; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":155
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":155
  *                         count[0] = count[0] + 1
  *             for j from 0 <= j < J:
  *                 if ealigned[j] == 0:             # <<<<<<<<<<<<<<
@@ -14082,7 +14077,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_t_10 = ((__pyx_v_ealigned[__pyx_v_j]) == 0);
       if (__pyx_t_10) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":156
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":156
  *             for j from 0 <= j < J:
  *                 if ealigned[j] == 0:
  *                     e_j = esent[j]             # <<<<<<<<<<<<<<
@@ -14091,7 +14086,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         __pyx_v_e_j = (__pyx_v_esent[__pyx_v_j]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":157
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":157
  *                 if ealigned[j] == 0:
  *                     e_j = esent[j]
  *                     fmargin[null_word] = fmargin[null_word] + 1             # <<<<<<<<<<<<<<
@@ -14100,7 +14095,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_fmargin[__pyx_v_null_word]) = ((__pyx_v_fmargin[__pyx_v_null_word]) + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":158
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":158
  *                     e_j = esent[j]
  *                     fmargin[null_word] = fmargin[null_word] + 1
  *                     emargin[e_j] = emargin[e_j] + 1             # <<<<<<<<<<<<<<
@@ -14109,7 +14104,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
         (__pyx_v_emargin[__pyx_v_e_j]) = ((__pyx_v_emargin[__pyx_v_e_j]) + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":159
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":159
  *                     fmargin[null_word] = fmargin[null_word] + 1
  *                     emargin[e_j] = emargin[e_j] + 1
  *                     if dict[null_word] == NULL:             # <<<<<<<<<<<<<<
@@ -14119,7 +14114,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         __pyx_t_10 = ((__pyx_v_dict[__pyx_v_null_word]) == NULL);
         if (__pyx_t_10) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":160
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":160
  *                     emargin[e_j] = emargin[e_j] + 1
  *                     if dict[null_word] == NULL:
  *                         dict[null_word] = new_node(e_j)             # <<<<<<<<<<<<<<
@@ -14128,7 +14123,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_null_word]) = __pyx_f_3_sa_new_node(__pyx_v_e_j);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":161
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":161
  *                     if dict[null_word] == NULL:
  *                         dict[null_word] = new_node(e_j)
  *                         dict[null_word].val = 1             # <<<<<<<<<<<<<<
@@ -14137,7 +14132,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           (__pyx_v_dict[__pyx_v_null_word])->val = 1;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":162
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":162
  *                         dict[null_word] = new_node(e_j)
  *                         dict[null_word].val = 1
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -14149,7 +14144,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":164
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":164
  *                         num_pairs = num_pairs + 1
  *                     else:
  *                         count = get_val(dict[null_word], e_j)             # <<<<<<<<<<<<<<
@@ -14158,7 +14153,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
           __pyx_v_count = __pyx_f_3_sa_get_val((__pyx_v_dict[__pyx_v_null_word]), __pyx_v_e_j);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":165
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":165
  *                     else:
  *                         count = get_val(dict[null_word], e_j)
  *                         if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -14168,7 +14163,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           __pyx_t_10 = ((__pyx_v_count[0]) == 0);
           if (__pyx_t_10) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":166
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":166
  *                         count = get_val(dict[null_word], e_j)
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -14180,7 +14175,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           }
           __pyx_L27:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":167
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":167
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -14195,7 +14190,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_L25:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":168
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":168
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1
  *             free(links)             # <<<<<<<<<<<<<<
@@ -14204,7 +14199,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     free(__pyx_v_links);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":169
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":169
  *                         count[0] = count[0] + 1
  *             free(links)
  *             free(faligned)             # <<<<<<<<<<<<<<
@@ -14213,7 +14208,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     free(__pyx_v_faligned);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":170
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":170
  *             free(links)
  *             free(faligned)
  *             free(ealigned)             # <<<<<<<<<<<<<<
@@ -14223,7 +14218,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     free(__pyx_v_ealigned);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":171
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":171
  *             free(faligned)
  *             free(ealigned)
  *         self.f_index = IntList(initial_len=V_F)             # <<<<<<<<<<<<<<
@@ -14245,7 +14240,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_13);
   __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":172
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":172
  *             free(ealigned)
  *         self.f_index = IntList(initial_len=V_F)
  *         self.e_index = IntList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -14267,7 +14262,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
   __pyx_t_12 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":173
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":173
  *         self.f_index = IntList(initial_len=V_F)
  *         self.e_index = IntList(initial_len=num_pairs)
  *         self.col1 = FloatList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -14289,7 +14284,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_13);
   __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":174
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":174
  *         self.e_index = IntList(initial_len=num_pairs)
  *         self.col1 = FloatList(initial_len=num_pairs)
  *         self.col2 = FloatList(initial_len=num_pairs)             # <<<<<<<<<<<<<<
@@ -14311,7 +14306,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
   __pyx_t_12 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":176
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":176
  *         self.col2 = FloatList(initial_len=num_pairs)
  * 
  *         num_pairs = 0             # <<<<<<<<<<<<<<
@@ -14320,7 +14315,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_num_pairs = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":177
  * 
  *         num_pairs = 0
  *         for i from 0 <= i < V_F:             # <<<<<<<<<<<<<<
@@ -14330,7 +14325,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   __pyx_t_6 = __pyx_v_V_F;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_6; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":179
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":179
  *         for i from 0 <= i < V_F:
  *             #self.f_index[i] = num_pairs
  *             self.f_index.set(i, num_pairs)             # <<<<<<<<<<<<<<
@@ -14339,7 +14334,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->set(__pyx_v_self->f_index, __pyx_v_i, __pyx_v_num_pairs);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":180
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":180
  *             #self.f_index[i] = num_pairs
  *             self.f_index.set(i, num_pairs)
  *             if dict[i] != NULL:             # <<<<<<<<<<<<<<
@@ -14349,7 +14344,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_t_10 = ((__pyx_v_dict[__pyx_v_i]) != NULL);
     if (__pyx_t_10) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":181
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":181
  *             self.f_index.set(i, num_pairs)
  *             if dict[i] != NULL:
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)             # <<<<<<<<<<<<<<
@@ -14360,7 +14355,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":182
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":182
  *             if dict[i] != NULL:
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)
  *                 del_node(dict[i])             # <<<<<<<<<<<<<<
@@ -14375,7 +14370,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_L30:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":183
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)
  *                 del_node(dict[i])
  *         free(fmargin)             # <<<<<<<<<<<<<<
@@ -14384,7 +14379,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_fmargin);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":184
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":184
  *                 del_node(dict[i])
  *         free(fmargin)
  *         free(emargin)             # <<<<<<<<<<<<<<
@@ -14393,7 +14388,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_emargin);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":185
  *         free(fmargin)
  *         free(emargin)
  *         free(dict)             # <<<<<<<<<<<<<<
@@ -14402,7 +14397,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_dict);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":186
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":186
  *         free(emargin)
  *         free(dict)
  *         return             # <<<<<<<<<<<<<<
@@ -14433,7 +14428,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":189
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":189
  * 
  * 
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):             # <<<<<<<<<<<<<<
@@ -14452,7 +14447,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("_add_node", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":191
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":191
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):
  *         cdef int loc
  *         if n.smaller != NULL:             # <<<<<<<<<<<<<<
@@ -14462,7 +14457,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   __pyx_t_1 = (__pyx_v_n->smaller != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":192
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":192
  *         cdef int loc
  *         if n.smaller != NULL:
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)             # <<<<<<<<<<<<<<
@@ -14476,7 +14471,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":193
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":193
  *         if n.smaller != NULL:
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)
  *         loc = num_pairs[0]             # <<<<<<<<<<<<<<
@@ -14485,7 +14480,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   __pyx_v_loc = (__pyx_v_num_pairs[0]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":194
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":194
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)
  *         loc = num_pairs[0]
  *         self.e_index.set(loc, n.key)             # <<<<<<<<<<<<<<
@@ -14494,7 +14489,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->set(__pyx_v_self->e_index, __pyx_v_loc, __pyx_v_n->key);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":195
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":195
  *         loc = num_pairs[0]
  *         self.e_index.set(loc, n.key)
  *         self.col1.set(loc, float(n.val)/fmargin)             # <<<<<<<<<<<<<<
@@ -14507,7 +14502,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->set(__pyx_v_self->col1, __pyx_v_loc, (((double)__pyx_v_n->val) / __pyx_v_fmargin));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":196
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":196
  *         self.e_index.set(loc, n.key)
  *         self.col1.set(loc, float(n.val)/fmargin)
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))             # <<<<<<<<<<<<<<
@@ -14520,7 +14515,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->set(__pyx_v_self->col2, __pyx_v_loc, (((double)__pyx_v_n->val) / ((double)(__pyx_v_emargin[__pyx_v_n->key]))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":197
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":197
  *         self.col1.set(loc, float(n.val)/fmargin)
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))
  *         num_pairs[0] = loc + 1             # <<<<<<<<<<<<<<
@@ -14529,7 +14524,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
  */
   (__pyx_v_num_pairs[0]) = (__pyx_v_loc + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":198
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":198
  *         self.col2.set(loc, float(n.val)/float(emargin[n.key]))
  *         num_pairs[0] = loc + 1
  *         if n.bigger != NULL:             # <<<<<<<<<<<<<<
@@ -14539,7 +14534,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   __pyx_t_1 = (__pyx_v_n->bigger != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":199
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":199
  *         num_pairs[0] = loc + 1
  *         if n.bigger != NULL:
  *             self._add_node(n.bigger, num_pairs, fmargin, emargin)             # <<<<<<<<<<<<<<
@@ -14586,7 +14581,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":202
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":202
  * 
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -14605,7 +14600,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":204
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":204
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -14614,7 +14609,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":205
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":205
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.f_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -14623,7 +14618,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->write_handle(__pyx_v_self->f_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":206
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":206
  *         f = fopen(filename, "w")
  *         self.f_index.write_handle(f)
  *         self.e_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -14632,7 +14627,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->write_handle(__pyx_v_self->e_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":207
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":207
  *         self.f_index.write_handle(f)
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)             # <<<<<<<<<<<<<<
@@ -14641,7 +14636,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  */
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->write_handle(__pyx_v_self->col1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":208
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":208
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)             # <<<<<<<<<<<<<<
@@ -14650,7 +14645,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
  */
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->write_handle(__pyx_v_self->col2, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":209
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":209
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)             # <<<<<<<<<<<<<<
@@ -14664,7 +14659,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":210
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":210
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)             # <<<<<<<<<<<<<<
@@ -14678,7 +14673,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":211
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":211
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -14700,7 +14695,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":214
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":214
  * 
  * 
  *     cdef write_wordlist(self, wordlist, FILE* f):             # <<<<<<<<<<<<<<
@@ -14725,7 +14720,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_wordlist", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":218
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":218
  *         cdef int num_words
  * 
  *         num_words = len(wordlist)             # <<<<<<<<<<<<<<
@@ -14735,7 +14730,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
   __pyx_t_1 = PyObject_Length(__pyx_v_wordlist); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_num_words = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":219
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":219
  * 
  *         num_words = len(wordlist)
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -14744,7 +14739,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
  */
   fwrite((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":220
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":220
  *         num_words = len(wordlist)
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in wordlist:             # <<<<<<<<<<<<<<
@@ -14789,7 +14784,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
     __pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":221
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":221
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in wordlist:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
@@ -14799,7 +14794,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
     __pyx_t_5 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_word_len = (__pyx_t_5 + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":222
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":222
  *         for word in wordlist:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -14808,7 +14803,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
  */
     fwrite((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":223
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":223
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)
  *             fwrite(<char *>word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -14834,7 +14829,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":226
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":226
  * 
  * 
  *     cdef read_wordlist(self, word2id, id2word, FILE* f):             # <<<<<<<<<<<<<<
@@ -14858,7 +14853,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_wordlist", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":231
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":231
  *         cdef char* word
  * 
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -14867,7 +14862,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
  */
   fread((&__pyx_v_num_words), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":232
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":232
  * 
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i from 0 <= i < num_words:             # <<<<<<<<<<<<<<
@@ -14877,7 +14872,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
   __pyx_t_1 = __pyx_v_num_words;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":233
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":233
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i from 0 <= i < num_words:
  *             fread(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -14886,7 +14881,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
  */
     fread((&__pyx_v_word_len), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":234
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":234
  *         for i from 0 <= i < num_words:
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))             # <<<<<<<<<<<<<<
@@ -14895,7 +14890,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
  */
     __pyx_v_word = ((char *)malloc((__pyx_v_word_len * (sizeof(char)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":235
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":235
  *             fread(&(word_len), sizeof(int), 1, f)
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)             # <<<<<<<<<<<<<<
@@ -14904,7 +14899,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
  */
     fread(__pyx_v_word, (sizeof(char)), __pyx_v_word_len, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":236
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":236
  *             word = <char*> malloc (word_len * sizeof(char))
  *             fread(word, sizeof(char), word_len, f)
  *             word2id[word] = len(id2word)             # <<<<<<<<<<<<<<
@@ -14920,7 +14915,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":237
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":237
  *             fread(word, sizeof(char), word_len, f)
  *             word2id[word] = len(id2word)
  *             id2word.append(word)             # <<<<<<<<<<<<<<
@@ -14934,7 +14929,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":238
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":238
  *             word2id[word] = len(id2word)
  *             id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -14978,7 +14973,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":240
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":240
  *             free(word)
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -14998,7 +14993,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":242
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":242
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -15007,7 +15002,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":243
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":243
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.f_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -15016,7 +15011,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->f_index->__pyx_vtab)->read_handle(__pyx_v_self->f_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":244
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":244
  *         f = fopen(filename, "r")
  *         self.f_index.read_handle(f)
  *         self.e_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -15025,7 +15020,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->e_index->__pyx_vtab)->read_handle(__pyx_v_self->e_index, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":245
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":245
  *         self.f_index.read_handle(f)
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)             # <<<<<<<<<<<<<<
@@ -15034,7 +15029,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  */
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col1->__pyx_vtab)->read_handle(__pyx_v_self->col1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":246
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":246
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)             # <<<<<<<<<<<<<<
@@ -15043,7 +15038,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
  */
   ((struct __pyx_vtabstruct_3_sa_FloatList *)__pyx_v_self->col2->__pyx_vtab)->read_handle(__pyx_v_self->col2, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":247
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":247
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)             # <<<<<<<<<<<<<<
@@ -15060,7 +15055,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":248
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":248
  *         self.col2.read_handle(f)
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)             # <<<<<<<<<<<<<<
@@ -15077,7 +15072,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_4read_binary(struct __pyx_obj_3_sa_BiLex *
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":249
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":249
  *         self.read_wordlist(self.fword2id, self.id2fword, f)
  *         self.read_wordlist(self.eword2id, self.id2eword, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -15111,7 +15106,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":252
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":252
  * 
  * 
  *     def get_e_id(self, eword):             # <<<<<<<<<<<<<<
@@ -15131,7 +15126,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_e_id", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":253
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":253
  * 
  *     def get_e_id(self, eword):
  *         if eword not in self.eword2id:             # <<<<<<<<<<<<<<
@@ -15141,7 +15136,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
   __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":254
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":254
  *     def get_e_id(self, eword):
  *         if eword not in self.eword2id:
  *             e_id = len(self.id2eword)             # <<<<<<<<<<<<<<
@@ -15157,7 +15152,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
     __pyx_v_e_id = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":255
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":255
  *         if eword not in self.eword2id:
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)             # <<<<<<<<<<<<<<
@@ -15168,7 +15163,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":256
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":256
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id             # <<<<<<<<<<<<<<
@@ -15180,7 +15175,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":257
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":257
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id
  *         return self.eword2id[eword]             # <<<<<<<<<<<<<<
@@ -15218,7 +15213,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":260
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":260
  * 
  * 
  *     def get_f_id(self, fword):             # <<<<<<<<<<<<<<
@@ -15238,7 +15233,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_f_id", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":261
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":261
  * 
  *     def get_f_id(self, fword):
  *         if fword not in self.fword2id:             # <<<<<<<<<<<<<<
@@ -15248,7 +15243,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
   __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":262
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":262
  *     def get_f_id(self, fword):
  *         if fword not in self.fword2id:
  *             f_id = len(self.id2fword)             # <<<<<<<<<<<<<<
@@ -15264,7 +15259,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
     __pyx_v_f_id = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":263
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":263
  *         if fword not in self.fword2id:
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)             # <<<<<<<<<<<<<<
@@ -15275,7 +15270,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":264
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":264
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id             # <<<<<<<<<<<<<<
@@ -15287,7 +15282,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":265
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":265
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id
  *         return self.fword2id[fword]             # <<<<<<<<<<<<<<
@@ -15335,7 +15330,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":268
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":268
  * 
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -15390,7 +15385,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":272
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":272
  *         cdef IntList fcount
  * 
  *         fcount = IntList()             # <<<<<<<<<<<<<<
@@ -15402,7 +15397,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
   __pyx_v_fcount = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -15442,7 +15437,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __pyx_v_f = __pyx_t_1;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":275
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":275
  *         with gzip_or_text(filename) as f:
  *             # first loop merely establishes size of array objects
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -15487,7 +15482,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_line = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":276
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":276
  *             # first loop merely establishes size of array objects
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()             # <<<<<<<<<<<<<<
@@ -15573,7 +15568,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_score2 = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":277
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":277
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)             # <<<<<<<<<<<<<<
@@ -15595,7 +15590,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_f_id = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":278
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":278
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)             # <<<<<<<<<<<<<<
@@ -15617,7 +15612,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_e_id = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":279
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":279
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):             # <<<<<<<<<<<<<<
@@ -15634,7 +15629,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               if (!__pyx_t_16) break;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":280
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":280
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)             # <<<<<<<<<<<<<<
@@ -15646,7 +15641,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             }
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":281
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":281
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1             # <<<<<<<<<<<<<<
@@ -15659,7 +15654,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           }
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":284
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":284
  * 
  *             # Allocate space for dictionary in arrays
  *             N = 0             # <<<<<<<<<<<<<<
@@ -15669,7 +15664,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_N = __pyx_int_0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":285
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":285
  *             # Allocate space for dictionary in arrays
  *             N = 0
  *             n_f = len(fcount)             # <<<<<<<<<<<<<<
@@ -15682,7 +15677,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __pyx_v_n_f = __pyx_t_1;
           __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":286
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":286
  *             N = 0
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)             # <<<<<<<<<<<<<<
@@ -15704,7 +15699,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __pyx_v_self->f_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":287
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:             # <<<<<<<<<<<<<<
@@ -15719,7 +15714,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_i = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":288
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":288
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N             # <<<<<<<<<<<<<<
@@ -15730,7 +15725,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":289
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":289
  *             for i from 0 <= i < n_f:
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]             # <<<<<<<<<<<<<<
@@ -15747,7 +15742,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_N = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":290
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":290
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0             # <<<<<<<<<<<<<<
@@ -15759,7 +15754,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_t_19 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_19 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":287
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":287
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)
  *             for i from 0 <= i < n_f:             # <<<<<<<<<<<<<<
@@ -15772,7 +15767,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __pyx_v_i = __pyx_t_1;
           __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":291
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":291
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N             # <<<<<<<<<<<<<<
@@ -15783,7 +15778,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_n_f); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           (__pyx_v_self->f_index->arr[__pyx_t_8]) = __pyx_t_20;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":292
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":292
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -15802,7 +15797,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __pyx_v_self->e_index = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":293
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":293
  *             self.f_index.arr[n_f] = N
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -15821,7 +15816,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __pyx_v_self->col1 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_1);
           __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":294
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":294
  *             self.e_index = IntList(initial_len=N)
  *             self.col1 = FloatList(initial_len=N)
  *             self.col2 = FloatList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -15840,7 +15835,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __pyx_v_self->col2 = ((struct __pyx_obj_3_sa_FloatList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":297
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":297
  * 
  *             # Re-read file, placing words into buckets
  *             f.seek(0)             # <<<<<<<<<<<<<<
@@ -15854,7 +15849,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":298
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":298
  *             # Re-read file, placing words into buckets
  *             f.seek(0)
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -15899,7 +15894,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_line = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":299
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":299
  *             f.seek(0)
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()             # <<<<<<<<<<<<<<
@@ -15985,7 +15980,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_score2 = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":300
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":300
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)             # <<<<<<<<<<<<<<
@@ -16007,7 +16002,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_f_id = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":301
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":301
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)             # <<<<<<<<<<<<<<
@@ -16029,7 +16024,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_e_id = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":302
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":302
  *                 f_id = self.get_f_id(fword)
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]             # <<<<<<<<<<<<<<
@@ -16044,7 +16039,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_v_index = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":303
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":303
  *                 e_id = self.get_e_id(eword)
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1             # <<<<<<<<<<<<<<
@@ -16055,7 +16050,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_id); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_fcount->arr[__pyx_t_15]) = ((__pyx_v_fcount->arr[__pyx_t_17]) + 1);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":304
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":304
  *                 index = self.f_index.arr[f_id] + fcount.arr[f_id]
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)             # <<<<<<<<<<<<<<
@@ -16075,7 +16070,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __pyx_t_17 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_17 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             (__pyx_v_self->e_index->arr[__pyx_t_17]) = __pyx_t_20;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":305
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":305
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)             # <<<<<<<<<<<<<<
@@ -16088,7 +16083,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             if (PyObject_SetItem(((PyObject *)__pyx_v_self->col1), __pyx_v_index, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":306
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":306
  *                 self.e_index.arr[index] = int(e_id)
  *                 self.col1[index] = float(score1)
  *                 self.col2[index] = float(score2)             # <<<<<<<<<<<<<<
@@ -16116,7 +16111,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -16196,7 +16191,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
     __pyx_L31:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":309
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":309
  * 
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:             # <<<<<<<<<<<<<<
@@ -16212,7 +16207,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
     __pyx_v_b = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":310
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":310
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:
  *             i = self.f_index.arr[b]             # <<<<<<<<<<<<<<
@@ -16226,7 +16221,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
     __pyx_v_i = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":311
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":311
  *         for b from 0 <= b < n_f:
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]             # <<<<<<<<<<<<<<
@@ -16243,7 +16238,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
     __pyx_v_j = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":312
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":312
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  *             self.qsort(i,j, "")             # <<<<<<<<<<<<<<
@@ -16261,7 +16256,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
     __pyx_t_18 = __Pyx_PyInt_AsLong(__pyx_v_b); if (unlikely((__pyx_t_18 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":309
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":309
  * 
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:             # <<<<<<<<<<<<<<
@@ -16307,7 +16302,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":315
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":315
  * 
  * 
  *     cdef swap(self, int i, int j):             # <<<<<<<<<<<<<<
@@ -16323,7 +16318,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("swap", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":319
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":319
  *         cdef float ftmp
  * 
  *         if i == j:             # <<<<<<<<<<<<<<
@@ -16333,7 +16328,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   __pyx_t_1 = (__pyx_v_i == __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":320
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":320
  * 
  *         if i == j:
  *             return             # <<<<<<<<<<<<<<
@@ -16347,7 +16342,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":322
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":322
  *             return
  * 
  *         itmp = self.e_index.arr[i]             # <<<<<<<<<<<<<<
@@ -16356,7 +16351,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_itmp = (__pyx_v_self->e_index->arr[__pyx_v_i]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":323
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":323
  * 
  *         itmp = self.e_index.arr[i]
  *         self.e_index.arr[i] = self.e_index.arr[j]             # <<<<<<<<<<<<<<
@@ -16365,7 +16360,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->e_index->arr[__pyx_v_i]) = (__pyx_v_self->e_index->arr[__pyx_v_j]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":324
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":324
  *         itmp = self.e_index.arr[i]
  *         self.e_index.arr[i] = self.e_index.arr[j]
  *         self.e_index.arr[j] = itmp             # <<<<<<<<<<<<<<
@@ -16374,7 +16369,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->e_index->arr[__pyx_v_j]) = __pyx_v_itmp;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":326
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":326
  *         self.e_index.arr[j] = itmp
  * 
  *         ftmp = self.col1.arr[i]             # <<<<<<<<<<<<<<
@@ -16383,7 +16378,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_ftmp = (__pyx_v_self->col1->arr[__pyx_v_i]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":327
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":327
  * 
  *         ftmp = self.col1.arr[i]
  *         self.col1.arr[i] = self.col1.arr[j]             # <<<<<<<<<<<<<<
@@ -16392,7 +16387,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col1->arr[__pyx_v_i]) = (__pyx_v_self->col1->arr[__pyx_v_j]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":328
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":328
  *         ftmp = self.col1.arr[i]
  *         self.col1.arr[i] = self.col1.arr[j]
  *         self.col1.arr[j] = ftmp             # <<<<<<<<<<<<<<
@@ -16401,7 +16396,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col1->arr[__pyx_v_j]) = __pyx_v_ftmp;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":330
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":330
  *         self.col1.arr[j] = ftmp
  * 
  *         ftmp = self.col2.arr[i]             # <<<<<<<<<<<<<<
@@ -16410,7 +16405,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   __pyx_v_ftmp = (__pyx_v_self->col2->arr[__pyx_v_i]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":331
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":331
  * 
  *         ftmp = self.col2.arr[i]
  *         self.col2.arr[i] = self.col2.arr[j]             # <<<<<<<<<<<<<<
@@ -16419,7 +16414,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
  */
   (__pyx_v_self->col2->arr[__pyx_v_i]) = (__pyx_v_self->col2->arr[__pyx_v_j]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":332
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":332
  *         ftmp = self.col2.arr[i]
  *         self.col2.arr[i] = self.col2.arr[j]
  *         self.col2.arr[j] = ftmp             # <<<<<<<<<<<<<<
@@ -16435,7 +16430,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":335
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":335
  * 
  * 
  *     cdef qsort(self, int i, int j, pad):             # <<<<<<<<<<<<<<
@@ -16458,7 +16453,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("qsort", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":338
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":338
  *         cdef int pval, p
  * 
  *         if i > j:             # <<<<<<<<<<<<<<
@@ -16468,7 +16463,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i > __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":339
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":339
  * 
  *         if i > j:
  *             raise Exception("Sort error in CLex")             # <<<<<<<<<<<<<<
@@ -16484,7 +16479,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":340
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":340
  *         if i > j:
  *             raise Exception("Sort error in CLex")
  *         if i == j: #empty interval             # <<<<<<<<<<<<<<
@@ -16494,7 +16489,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i == __pyx_v_j);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":341
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":341
  *             raise Exception("Sort error in CLex")
  *         if i == j: #empty interval
  *             return             # <<<<<<<<<<<<<<
@@ -16508,7 +16503,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":342
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":342
  *         if i == j: #empty interval
  *             return
  *         if i == j-1: # singleton interval             # <<<<<<<<<<<<<<
@@ -16518,7 +16513,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_1 = (__pyx_v_i == (__pyx_v_j - 1));
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":343
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":343
  *             return
  *         if i == j-1: # singleton interval
  *             return             # <<<<<<<<<<<<<<
@@ -16532,7 +16527,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":345
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":345
  *             return
  * 
  *         p = (i+j)/2             # <<<<<<<<<<<<<<
@@ -16541,7 +16536,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_p = __Pyx_div_long((__pyx_v_i + __pyx_v_j), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":346
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":346
  * 
  *         p = (i+j)/2
  *         pval = self.e_index.arr[p]             # <<<<<<<<<<<<<<
@@ -16550,7 +16545,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_pval = (__pyx_v_self->e_index->arr[__pyx_v_p]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":347
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":347
  *         p = (i+j)/2
  *         pval = self.e_index.arr[p]
  *         self.swap(i, p)             # <<<<<<<<<<<<<<
@@ -16561,7 +16556,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":348
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":348
  *         pval = self.e_index.arr[p]
  *         self.swap(i, p)
  *         p = i             # <<<<<<<<<<<<<<
@@ -16570,7 +16565,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_p = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":349
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":349
  *         self.swap(i, p)
  *         p = i
  *         for k from i+1 <= k < j:             # <<<<<<<<<<<<<<
@@ -16580,7 +16575,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __pyx_t_3 = __pyx_v_j;
   for (__pyx_v_k = (__pyx_v_i + 1); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":350
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":350
  *         p = i
  *         for k from i+1 <= k < j:
  *             if pval >= self.e_index.arr[k]:             # <<<<<<<<<<<<<<
@@ -16590,7 +16585,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
     __pyx_t_1 = (__pyx_v_pval >= (__pyx_v_self->e_index->arr[__pyx_v_k]));
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":351
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":351
  *         for k from i+1 <= k < j:
  *             if pval >= self.e_index.arr[k]:
  *                 self.swap(p+1, k)             # <<<<<<<<<<<<<<
@@ -16601,7 +16596,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":352
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":352
  *             if pval >= self.e_index.arr[k]:
  *                 self.swap(p+1, k)
  *                 self.swap(p, p+1)             # <<<<<<<<<<<<<<
@@ -16612,7 +16607,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":353
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":353
  *                 self.swap(p+1, k)
  *                 self.swap(p, p+1)
  *                 p = p + 1             # <<<<<<<<<<<<<<
@@ -16625,7 +16620,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
     __pyx_L8:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":354
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":354
  *                 self.swap(p, p+1)
  *                 p = p + 1
  *         self.qsort(i,p, pad+"    ")             # <<<<<<<<<<<<<<
@@ -16639,7 +16634,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":355
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":355
  *                 p = p + 1
  *         self.qsort(i,p, pad+"    ")
  *         self.qsort(p+1,j, pad+"    ")             # <<<<<<<<<<<<<<
@@ -16687,7 +16682,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":358
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":358
  * 
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -16724,7 +16719,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -16764,7 +16759,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":360
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":360
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             for i in self.f_index:             # <<<<<<<<<<<<<<
@@ -16809,7 +16804,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             __pyx_v_i = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":361
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":361
  *         with open(filename, "w") as f:
  *             for i in self.f_index:
  *                 f.write("%d " % i)             # <<<<<<<<<<<<<<
@@ -16833,7 +16828,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           }
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":362
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -16847,7 +16842,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":363
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":363
  *                 f.write("%d " % i)
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):             # <<<<<<<<<<<<<<
@@ -16968,7 +16963,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             __pyx_v_s2 = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":364
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":364
  *             f.write("\n")
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))             # <<<<<<<<<<<<<<
@@ -17004,7 +16999,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":365
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":365
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -17018,7 +17013,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":366
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":366
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):             # <<<<<<<<<<<<<<
@@ -17073,7 +17068,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             __pyx_t_1 = __pyx_t_11;
             __pyx_t_11 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":367
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":367
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))             # <<<<<<<<<<<<<<
@@ -17107,7 +17102,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":368
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -17121,7 +17116,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":369
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":369
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):             # <<<<<<<<<<<<<<
@@ -17176,7 +17171,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             __pyx_t_2 = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":370
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":370
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))             # <<<<<<<<<<<<<<
@@ -17210,7 +17205,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":371
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -17236,7 +17231,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -17403,7 +17398,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":374
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":374
  * 
  * 
  *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
@@ -17429,7 +17424,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_score", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":377
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":377
  *         cdef e_id, f_id, low, high, midpoint, val
  * 
  *         if eword not in self.eword2id:             # <<<<<<<<<<<<<<
@@ -17439,7 +17434,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_eword, __pyx_v_self->eword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":378
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":378
  * 
  *         if eword not in self.eword2id:
  *             return None             # <<<<<<<<<<<<<<
@@ -17454,7 +17449,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":379
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":379
  *         if eword not in self.eword2id:
  *             return None
  *         if fword not in self.fword2id:             # <<<<<<<<<<<<<<
@@ -17464,7 +17459,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_fword, __pyx_v_self->fword2id, Py_NE)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":380
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":380
  *             return None
  *         if fword not in self.fword2id:
  *             return None             # <<<<<<<<<<<<<<
@@ -17479,7 +17474,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":381
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":381
  *         if fword not in self.fword2id:
  *             return None
  *         f_id = self.fword2id[fword]             # <<<<<<<<<<<<<<
@@ -17491,7 +17486,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   __pyx_v_f_id = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":382
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":382
  *             return None
  *         f_id = self.fword2id[fword]
  *         e_id = self.eword2id[eword]             # <<<<<<<<<<<<<<
@@ -17503,7 +17498,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   __pyx_v_e_id = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":383
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":383
  *         f_id = self.fword2id[fword]
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]             # <<<<<<<<<<<<<<
@@ -17516,7 +17511,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   __pyx_v_low = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":384
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":384
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]             # <<<<<<<<<<<<<<
@@ -17532,7 +17527,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   __pyx_v_high = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":385
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":385
  *         low = self.f_index.arr[f_id]
  *         high = self.f_index.arr[f_id+1]
  *         while high - low > 0:             # <<<<<<<<<<<<<<
@@ -17548,7 +17543,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (!__pyx_t_1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":386
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":386
  *         high = self.f_index.arr[f_id+1]
  *         while high - low > 0:
  *             midpoint = (low+high)/2             # <<<<<<<<<<<<<<
@@ -17564,7 +17559,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __pyx_v_midpoint = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":387
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":387
  *         while high - low > 0:
  *             midpoint = (low+high)/2
  *             val = self.e_index.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -17578,7 +17573,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __pyx_v_val = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":388
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":388
  *             midpoint = (low+high)/2
  *             val = self.e_index.arr[midpoint]
  *             if val == e_id:             # <<<<<<<<<<<<<<
@@ -17590,7 +17585,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":389
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":389
  *             val = self.e_index.arr[midpoint]
  *             if val == e_id:
  *                 if col == 0:             # <<<<<<<<<<<<<<
@@ -17602,7 +17597,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":390
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":390
  *             if val == e_id:
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -17620,7 +17615,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
       }
       __pyx_L8:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":391
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":391
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:             # <<<<<<<<<<<<<<
@@ -17632,7 +17627,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":392
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":392
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:
  *                     return self.col2.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -17653,7 +17648,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     }
     __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":393
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":393
  *                 if col == 1:
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:             # <<<<<<<<<<<<<<
@@ -17665,7 +17660,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":394
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":394
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:
  *                 high = midpoint             # <<<<<<<<<<<<<<
@@ -17679,7 +17674,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     }
     __pyx_L10:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":395
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":395
  *             if val > e_id:
  *                 high = midpoint
  *             if val < e_id:             # <<<<<<<<<<<<<<
@@ -17691,7 +17686,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":396
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":396
  *                 high = midpoint
  *             if val < e_id:
  *                 low = midpoint + 1             # <<<<<<<<<<<<<<
@@ -17708,7 +17703,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __pyx_L11:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":397
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":397
  *             if val < e_id:
  *                 low = midpoint + 1
  *         return None             # <<<<<<<<<<<<<<
@@ -17761,7 +17756,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":400
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":400
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -17798,7 +17793,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -17838,7 +17833,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":405
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":405
  * 
  *         with open(filename, "w") as f:
  *             N = len(self.e_index)             # <<<<<<<<<<<<<<
@@ -17854,7 +17849,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
           __pyx_v_N = __pyx_t_4;
           __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":406
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":406
  *         with open(filename, "w") as f:
  *             N = len(self.e_index)
  *             f_id = 0             # <<<<<<<<<<<<<<
@@ -17864,7 +17859,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
           __Pyx_INCREF(__pyx_int_0);
           __pyx_v_f_id = __pyx_int_0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":407
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":407
  *             N = len(self.e_index)
  *             f_id = 0
  *             for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -17879,7 +17874,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
             __pyx_v_i = __pyx_t_4;
             __pyx_t_4 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":408
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":408
  *             f_id = 0
  *             for i from 0 <= i < N:
  *                 while self.f_index.arr[f_id+1] == i:             # <<<<<<<<<<<<<<
@@ -17899,7 +17894,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               if (!__pyx_t_11) break;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":409
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":409
  *             for i from 0 <= i < N:
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1             # <<<<<<<<<<<<<<
@@ -17913,7 +17908,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
               __pyx_t_1 = 0;
             }
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":410
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":410
  *                 while self.f_index.arr[f_id+1] == i:
  *                     f_id = f_id + 1
  *                 e_id = self.e_index.arr[i]             # <<<<<<<<<<<<<<
@@ -17927,7 +17922,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
             __pyx_v_e_id = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":411
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":411
  *                     f_id = f_id + 1
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]             # <<<<<<<<<<<<<<
@@ -17941,7 +17936,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
             __pyx_v_score1 = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":412
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":412
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]             # <<<<<<<<<<<<<<
@@ -17954,7 +17949,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
             __pyx_v_score2 = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":413
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":413
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]
  *                 f.write("%s %s %.6f %.6f\n" % (self.id2fword[f_id], self.id2eword[e_id], score1, score2))             # <<<<<<<<<<<<<<
@@ -17995,7 +17990,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
             __pyx_t_10 = __Pyx_PyInt_AsLong(__pyx_v_i); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":407
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":407
  *             N = len(self.e_index)
  *             f_id = 0
  *             for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -18018,7 +18013,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
         __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
         __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -18120,7 +18115,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":21
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":21
  * cdef int LOWER_MASK[32]
  * 
  * cdef void _init_lower_mask():             # <<<<<<<<<<<<<<
@@ -18136,7 +18131,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   unsigned int __pyx_t_2;
   __Pyx_RefNannySetupContext("_init_lower_mask", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":23
  * cdef void _init_lower_mask():
  *     cdef unsigned i
  *     cdef int mask = 0             # <<<<<<<<<<<<<<
@@ -18145,7 +18140,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
  */
   __pyx_v_mask = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":24
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":24
  *     cdef unsigned i
  *     cdef int mask = 0
  *     for i in range(MIN_BOTTOM_SIZE):             # <<<<<<<<<<<<<<
@@ -18156,7 +18151,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":25
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":25
  *     cdef int mask = 0
  *     for i in range(MIN_BOTTOM_SIZE):
  *         mask = (mask << 1) + 1             # <<<<<<<<<<<<<<
@@ -18165,7 +18160,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
  */
     __pyx_v_mask = ((__pyx_v_mask << 1) + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":26
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":26
  *     for i in range(MIN_BOTTOM_SIZE):
  *         mask = (mask << 1) + 1
  *         LOWER_MASK[i] = mask             # <<<<<<<<<<<<<<
@@ -18178,7 +18173,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":37
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":37
  * 
  * 
  * cdef _BitSet* new_BitSet():             # <<<<<<<<<<<<<<
@@ -18192,7 +18187,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("new_BitSet", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":40
  *     cdef _BitSet* b
  * 
  *     b = <_BitSet*> malloc(sizeof(_BitSet))             # <<<<<<<<<<<<<<
@@ -18201,7 +18196,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b = ((struct __pyx_t_3_sa__BitSet *)malloc((sizeof(struct __pyx_t_3_sa__BitSet))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":41
  * 
  *     b = <_BitSet*> malloc(sizeof(_BitSet))
  *     b.bitset = 0             # <<<<<<<<<<<<<<
@@ -18210,7 +18205,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->bitset = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":42
  *     b = <_BitSet*> malloc(sizeof(_BitSet))
  *     b.bitset = 0
  *     b.min_val = -1             # <<<<<<<<<<<<<<
@@ -18219,7 +18214,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->min_val = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":43
  *     b.bitset = 0
  *     b.min_val = -1
  *     b.max_val = -1             # <<<<<<<<<<<<<<
@@ -18228,7 +18223,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->max_val = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":44
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":44
  *     b.min_val = -1
  *     b.max_val = -1
  *     b.size = 0             # <<<<<<<<<<<<<<
@@ -18237,7 +18232,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->size = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":45
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":45
  *     b.max_val = -1
  *     b.size = 0
  *     return b             # <<<<<<<<<<<<<<
@@ -18253,7 +18248,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":48
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":48
  * 
  * 
  * cdef int bitset_findsucc(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -18274,7 +18269,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("bitset_findsucc", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":52
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":52
  *     cdef int low, high, mid
  * 
  *     if b.max_val == -1 or i >= b.max_val:             # <<<<<<<<<<<<<<
@@ -18290,7 +18285,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":53
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":53
  * 
  *     if b.max_val == -1 or i >= b.max_val:
  *         return -1             # <<<<<<<<<<<<<<
@@ -18303,7 +18298,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":54
  *     if b.max_val == -1 or i >= b.max_val:
  *         return -1
  *     if i < b.min_val:             # <<<<<<<<<<<<<<
@@ -18313,7 +18308,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   __pyx_t_3 = (__pyx_v_i < __pyx_v_b->min_val);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":55
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":55
  *         return -1
  *     if i < b.min_val:
  *         return b.min_val             # <<<<<<<<<<<<<<
@@ -18326,7 +18321,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":57
  *         return b.min_val
  * 
  *     bitset = b.bitset & ~LOWER_MASK[i]             # <<<<<<<<<<<<<<
@@ -18335,7 +18330,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_bitset = (__pyx_v_b->bitset & (~(__pyx_v_3_sa_LOWER_MASK[__pyx_v_i])));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":58
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":58
  * 
  *     bitset = b.bitset & ~LOWER_MASK[i]
  *     low = i+1             # <<<<<<<<<<<<<<
@@ -18344,7 +18339,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_low = (__pyx_v_i + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":59
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":59
  *     bitset = b.bitset & ~LOWER_MASK[i]
  *     low = i+1
  *     high = b.max_val+1             # <<<<<<<<<<<<<<
@@ -18353,7 +18348,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_high = (__pyx_v_b->max_val + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":60
  *     low = i+1
  *     high = b.max_val+1
  *     while low < high-1:             # <<<<<<<<<<<<<<
@@ -18364,7 +18359,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_t_3 = (__pyx_v_low < (__pyx_v_high - 1));
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":61
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":61
  *     high = b.max_val+1
  *     while low < high-1:
  *         mid = (high + low)/2             # <<<<<<<<<<<<<<
@@ -18373,7 +18368,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
     __pyx_v_mid = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":62
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":62
  *     while low < high-1:
  *         mid = (high + low)/2
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])             # <<<<<<<<<<<<<<
@@ -18382,7 +18377,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
     __pyx_v_mask = (~((__pyx_v_3_sa_LOWER_MASK[(__pyx_v_high - 1)]) ^ (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_mid - 1)])));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":63
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":63
  *         mid = (high + low)/2
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])
  *         if bitset & mask == 0:             # <<<<<<<<<<<<<<
@@ -18392,7 +18387,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_t_3 = ((__pyx_v_bitset & __pyx_v_mask) == 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":64
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":64
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])
  *         if bitset & mask == 0:
  *             low = mid             # <<<<<<<<<<<<<<
@@ -18404,7 +18399,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":66
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":66
  *             low = mid
  *         else:
  *             bitset = bitset & mask             # <<<<<<<<<<<<<<
@@ -18413,7 +18408,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
       __pyx_v_bitset = (__pyx_v_bitset & __pyx_v_mask);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":67
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":67
  *         else:
  *             bitset = bitset & mask
  *             high = mid             # <<<<<<<<<<<<<<
@@ -18425,7 +18420,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":68
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":68
  *             bitset = bitset & mask
  *             high = mid
  *     return low             # <<<<<<<<<<<<<<
@@ -18441,7 +18436,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":71
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":71
  * 
  * 
  * cdef int bitset_insert(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -18456,7 +18451,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("bitset_insert", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":74
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":74
  *     cdef int val
  * 
  *     val = 1 << i             # <<<<<<<<<<<<<<
@@ -18465,7 +18460,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
   __pyx_v_val = (1 << __pyx_v_i);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":75
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":75
  * 
  *     val = 1 << i
  *     if b.bitset & val == 0:             # <<<<<<<<<<<<<<
@@ -18475,7 +18470,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   __pyx_t_1 = ((__pyx_v_b->bitset & __pyx_v_val) == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":76
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":76
  *     val = 1 << i
  *     if b.bitset & val == 0:
  *         b.bitset = b.bitset | val             # <<<<<<<<<<<<<<
@@ -18484,7 +18479,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
     __pyx_v_b->bitset = (__pyx_v_b->bitset | __pyx_v_val);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":77
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":77
  *     if b.bitset & val == 0:
  *         b.bitset = b.bitset | val
  *         if b.size == 0:             # <<<<<<<<<<<<<<
@@ -18494,7 +18489,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     __pyx_t_1 = (__pyx_v_b->size == 0);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":78
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":78
  *         b.bitset = b.bitset | val
  *         if b.size == 0:
  *             b.min_val = i             # <<<<<<<<<<<<<<
@@ -18503,7 +18498,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
       __pyx_v_b->min_val = __pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":79
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":79
  *         if b.size == 0:
  *             b.min_val = i
  *             b.max_val = i             # <<<<<<<<<<<<<<
@@ -18515,7 +18510,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":81
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":81
  *             b.max_val = i
  *         else:
  *             if i < b.min_val:             # <<<<<<<<<<<<<<
@@ -18525,7 +18520,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       __pyx_t_1 = (__pyx_v_i < __pyx_v_b->min_val);
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":82
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":82
  *         else:
  *             if i < b.min_val:
  *                 b.min_val = i             # <<<<<<<<<<<<<<
@@ -18537,7 +18532,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       }
       __pyx_L5:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":83
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":83
  *             if i < b.min_val:
  *                 b.min_val = i
  *             if i > b.max_val:             # <<<<<<<<<<<<<<
@@ -18547,7 +18542,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       __pyx_t_1 = (__pyx_v_i > __pyx_v_b->max_val);
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":84
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":84
  *                 b.min_val = i
  *             if i > b.max_val:
  *                 b.max_val = i             # <<<<<<<<<<<<<<
@@ -18561,7 +18556,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":85
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":85
  *             if i > b.max_val:
  *                 b.max_val = i
  *         b.size = b.size + 1             # <<<<<<<<<<<<<<
@@ -18570,7 +18565,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
  */
     __pyx_v_b->size = (__pyx_v_b->size + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":86
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":86
  *                 b.max_val = i
  *         b.size = b.size + 1
  *         return 1             # <<<<<<<<<<<<<<
@@ -18583,7 +18578,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":87
  *         b.size = b.size + 1
  *         return 1
  *     return 0             # <<<<<<<<<<<<<<
@@ -18599,7 +18594,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":90
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":90
  * 
  * 
  * cdef int bitset_contains(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -18614,7 +18609,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("bitset_contains", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":93
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":93
  *     cdef int val
  * 
  *     val = 1 << i             # <<<<<<<<<<<<<<
@@ -18623,7 +18618,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
  */
   __pyx_v_val = (1 << __pyx_v_i);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":94
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":94
  * 
  *     val = 1 << i
  *     if b.bitset & val == 0:             # <<<<<<<<<<<<<<
@@ -18633,7 +18628,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   __pyx_t_1 = ((__pyx_v_b->bitset & __pyx_v_val) == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":95
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":95
  *     val = 1 << i
  *     if b.bitset & val == 0:
  *         return 0             # <<<<<<<<<<<<<<
@@ -18646,7 +18641,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":97
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":97
  *         return 0
  *     else:
  *         return 1             # <<<<<<<<<<<<<<
@@ -18675,7 +18670,7 @@ static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":104
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":104
  *     cdef int next_val
  * 
  *     def __next__(self):             # <<<<<<<<<<<<<<
@@ -18694,7 +18689,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__next__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":107
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":107
  *         cdef int ret_val
  * 
  *         if self.next_val == -1:             # <<<<<<<<<<<<<<
@@ -18704,7 +18699,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
   __pyx_t_1 = (__pyx_v_self->next_val == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":108
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":108
  * 
  *         if self.next_val == -1:
  *             raise StopIteration()             # <<<<<<<<<<<<<<
@@ -18720,7 +18715,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":109
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":109
  *         if self.next_val == -1:
  *             raise StopIteration()
  *         ret_val = self.next_val             # <<<<<<<<<<<<<<
@@ -18729,7 +18724,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
  */
   __pyx_v_ret_val = __pyx_v_self->next_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":110
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":110
  *             raise StopIteration()
  *         ret_val = self.next_val
  *         self.next_val = bitset_findsucc(self.b, ret_val)             # <<<<<<<<<<<<<<
@@ -18738,7 +18733,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
  */
   __pyx_v_self->next_val = __pyx_f_3_sa_bitset_findsucc(__pyx_v_self->b, __pyx_v_ret_val);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":111
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":111
  *         ret_val = self.next_val
  *         self.next_val = bitset_findsucc(self.b, ret_val)
  *         return ret_val             # <<<<<<<<<<<<<<
@@ -18778,7 +18773,7 @@ static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":122
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":122
  *     cdef _BitSet* b
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -18791,7 +18786,7 @@ static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":123
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":123
  * 
  *     def __cinit__(self):
  *         self.b = new_BitSet()             # <<<<<<<<<<<<<<
@@ -18814,7 +18809,7 @@ static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":125
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":125
  *         self.b = new_BitSet()
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -18826,7 +18821,7 @@ static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__p
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":126
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":126
  * 
  *     def __dealloc__(self):
  *         free(self.b)             # <<<<<<<<<<<<<<
@@ -18849,7 +18844,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":128
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":128
  *         free(self.b)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -18867,7 +18862,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__iter__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":130
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":130
  *     def __iter__(self):
  *         cdef BitSetIterator it
  *         it = BitSetIterator()             # <<<<<<<<<<<<<<
@@ -18879,7 +18874,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
   __pyx_v_it = ((struct __pyx_obj_3_sa_BitSetIterator *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":131
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":131
  *         cdef BitSetIterator it
  *         it = BitSetIterator()
  *         it.b = self.b             # <<<<<<<<<<<<<<
@@ -18888,7 +18883,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
  */
   __pyx_v_it->b = __pyx_v_self->b;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":132
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":132
  *         it = BitSetIterator()
  *         it.b = self.b
  *         it.next_val = self.b.min_val             # <<<<<<<<<<<<<<
@@ -18897,7 +18892,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
  */
   __pyx_v_it->next_val = __pyx_v_self->b->min_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":133
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":133
  *         it.b = self.b
  *         it.next_val = self.b.min_val
  *         return it             # <<<<<<<<<<<<<<
@@ -18933,7 +18928,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":135
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":135
  *         return it
  * 
  *     def insert(self, i):             # <<<<<<<<<<<<<<
@@ -18951,7 +18946,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":136
  * 
  *     def insert(self, i):
  *         return bitset_insert(self.b, i)             # <<<<<<<<<<<<<<
@@ -18989,7 +18984,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":138
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":138
  *         return bitset_insert(self.b, i)
  * 
  *     def findsucc(self, i):             # <<<<<<<<<<<<<<
@@ -19007,7 +19002,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("findsucc", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":139
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":139
  * 
  *     def findsucc(self, i):
  *         return bitset_findsucc(self.b, i)             # <<<<<<<<<<<<<<
@@ -19045,7 +19040,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":141
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":141
  *         return bitset_findsucc(self.b, i)
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -19064,7 +19059,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":142
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":142
  * 
  *     def __str__(self):
  *         return dec2bin(self.b.bitset)+"  ("+str(self.b.size)+","+str(self.b.min_val)+","+str(self.b.max_val)+")"             # <<<<<<<<<<<<<<
@@ -19157,7 +19152,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUS
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":144
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":144
  *         return dec2bin(self.b.bitset)+"  ("+str(self.b.size)+","+str(self.b.min_val)+","+str(self.b.max_val)+")"
  * 
  *     def min(self):             # <<<<<<<<<<<<<<
@@ -19174,7 +19169,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("min", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":145
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":145
  * 
  *     def min(self):
  *         return self.b.min_val             # <<<<<<<<<<<<<<
@@ -19211,7 +19206,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUS
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":147
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":147
  *         return self.b.min_val
  * 
  *     def max(self):             # <<<<<<<<<<<<<<
@@ -19228,7 +19223,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("max", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":148
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":148
  * 
  *     def max(self):
  *         return self.b.max_val             # <<<<<<<<<<<<<<
@@ -19265,7 +19260,7 @@ static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":150
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":150
  *         return self.b.max_val
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -19278,7 +19273,7 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":151
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":151
  * 
  *     def __len__(self):
  *         return self.b.size             # <<<<<<<<<<<<<<
@@ -19305,7 +19300,7 @@ static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":153
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":153
  *         return self.b.size
  * 
  *     def __contains__(self, i):             # <<<<<<<<<<<<<<
@@ -19324,7 +19319,7 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__contains__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":154
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":154
  * 
  *     def __contains__(self, i):
  *         return bool(bitset_contains(self.b, i))             # <<<<<<<<<<<<<<
@@ -19350,7 +19345,7 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":157
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":157
  * 
  * 
  * cdef str dec2bin(long i):             # <<<<<<<<<<<<<<
@@ -19372,7 +19367,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("dec2bin", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":158
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":158
  * 
  * cdef str dec2bin(long i):
  *     cdef str result = ""             # <<<<<<<<<<<<<<
@@ -19382,7 +19377,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_result = __pyx_kp_s_45;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":160
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":160
  *     cdef str result = ""
  *     cdef unsigned d
  *     for d in range(MIN_BOTTOM_SIZE):             # <<<<<<<<<<<<<<
@@ -19393,7 +19388,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_d = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":161
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":161
  *     cdef unsigned d
  *     for d in range(MIN_BOTTOM_SIZE):
  *         if i & LOWER_MASK[0] == 0:             # <<<<<<<<<<<<<<
@@ -19403,7 +19398,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     __pyx_t_3 = ((__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[0])) == 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":162
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":162
  *     for d in range(MIN_BOTTOM_SIZE):
  *         if i & LOWER_MASK[0] == 0:
  *             result = "0"+result             # <<<<<<<<<<<<<<
@@ -19419,7 +19414,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":164
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":164
  *             result = "0"+result
  *         else:
  *             result = "1"+result             # <<<<<<<<<<<<<<
@@ -19434,7 +19429,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":165
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":165
  *         else:
  *             result = "1"+result
  *         i = i >> 1             # <<<<<<<<<<<<<<
@@ -19444,7 +19439,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     __pyx_v_i = (__pyx_v_i >> 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":166
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":166
  *             result = "1"+result
  *         i = i >> 1
  *     return result             # <<<<<<<<<<<<<<
@@ -19469,7 +19464,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":177
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":177
  *     void** bottom
  * 
  * cdef _VEB* new_VEB(int n):             # <<<<<<<<<<<<<<
@@ -19490,7 +19485,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("new_VEB", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":181
  *     cdef int num_bits, num_top_bits, i
  * 
  *     veb = <_VEB*> malloc(sizeof(_VEB))             # <<<<<<<<<<<<<<
@@ -19499,7 +19494,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb = ((struct __pyx_t_3_sa__VEB *)malloc((sizeof(struct __pyx_t_3_sa__VEB))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":183
  *     veb = <_VEB*> malloc(sizeof(_VEB))
  * 
  *     num_bits = int(ceil(log(n) / log(2)))             # <<<<<<<<<<<<<<
@@ -19514,7 +19509,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_v_num_bits = ((int)ceil((__pyx_t_1 / __pyx_t_2)));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":184
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":184
  * 
  *     num_bits = int(ceil(log(n) / log(2)))
  *     veb.num_bottom_bits = num_bits/2             # <<<<<<<<<<<<<<
@@ -19523,7 +19518,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->num_bottom_bits = __Pyx_div_long(__pyx_v_num_bits, 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":185
  *     num_bits = int(ceil(log(n) / log(2)))
  *     veb.num_bottom_bits = num_bits/2
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -19533,7 +19528,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   __pyx_t_3 = (__pyx_v_veb->num_bottom_bits < __pyx_v_3_sa_MIN_BOTTOM_BITS);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":186
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":186
  *     veb.num_bottom_bits = num_bits/2
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:
  *         veb.num_bottom_bits = MIN_BOTTOM_BITS             # <<<<<<<<<<<<<<
@@ -19545,7 +19540,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":187
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":187
  *     if veb.num_bottom_bits < MIN_BOTTOM_BITS:
  *         veb.num_bottom_bits = MIN_BOTTOM_BITS
  *     veb.top_universe_size = (n >> veb.num_bottom_bits) + 1             # <<<<<<<<<<<<<<
@@ -19554,7 +19549,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->top_universe_size = ((__pyx_v_n >> __pyx_v_veb->num_bottom_bits) + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":189
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":189
  *     veb.top_universe_size = (n >> veb.num_bottom_bits) + 1
  * 
  *     veb.bottom = <void**> malloc(veb.top_universe_size * sizeof(void*))             # <<<<<<<<<<<<<<
@@ -19563,7 +19558,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->bottom = ((void **)malloc((__pyx_v_veb->top_universe_size * (sizeof(void *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":190
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":190
  * 
  *     veb.bottom = <void**> malloc(veb.top_universe_size * sizeof(void*))
  *     memset(veb.bottom, 0, veb.top_universe_size * sizeof(void*))             # <<<<<<<<<<<<<<
@@ -19572,7 +19567,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   memset(__pyx_v_veb->bottom, 0, (__pyx_v_veb->top_universe_size * (sizeof(void *))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":192
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":192
  *     memset(veb.bottom, 0, veb.top_universe_size * sizeof(void*))
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -19582,7 +19577,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":193
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":193
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         veb.top = new_VEB(veb.top_universe_size)             # <<<<<<<<<<<<<<
@@ -19594,7 +19589,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":195
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":195
  *         veb.top = new_VEB(veb.top_universe_size)
  *     else:
  *         veb.top = new_BitSet()             # <<<<<<<<<<<<<<
@@ -19605,7 +19600,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":197
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":197
  *         veb.top = new_BitSet()
  * 
  *     veb.max_val = -1             # <<<<<<<<<<<<<<
@@ -19614,7 +19609,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->max_val = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":198
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":198
  * 
  *     veb.max_val = -1
  *     veb.min_val = -1             # <<<<<<<<<<<<<<
@@ -19623,7 +19618,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->min_val = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":199
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":199
  *     veb.max_val = -1
  *     veb.min_val = -1
  *     veb.size = 0             # <<<<<<<<<<<<<<
@@ -19632,7 +19627,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->size = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":200
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":200
  *     veb.min_val = -1
  *     veb.size = 0
  *     return veb             # <<<<<<<<<<<<<<
@@ -19652,7 +19647,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":203
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":203
  * 
  * 
  * cdef int VEB_insert(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -19673,7 +19668,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("VEB_insert", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":208
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":208
  *     cdef int a, b, tmp
  * 
  *     if veb.size == 0:             # <<<<<<<<<<<<<<
@@ -19683,7 +19678,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   __pyx_t_1 = (__pyx_v_veb->size == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":209
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":209
  * 
  *     if veb.size == 0:
  *         veb.min_val = i             # <<<<<<<<<<<<<<
@@ -19692,7 +19687,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_veb->min_val = __pyx_v_i;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":210
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":210
  *     if veb.size == 0:
  *         veb.min_val = i
  *         veb.max_val = i             # <<<<<<<<<<<<<<
@@ -19703,7 +19698,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":211
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":211
  *         veb.min_val = i
  *         veb.max_val = i
  *     elif i == veb.min_val or i == veb.max_val:             # <<<<<<<<<<<<<<
@@ -19719,7 +19714,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":212
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":212
  *         veb.max_val = i
  *     elif i == veb.min_val or i == veb.max_val:
  *         return 0             # <<<<<<<<<<<<<<
@@ -19732,7 +19727,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":214
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":214
  *         return 0
  *     else:
  *         if i < veb.min_val:             # <<<<<<<<<<<<<<
@@ -19742,7 +19737,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_i < __pyx_v_veb->min_val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":215
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":215
  *     else:
  *         if i < veb.min_val:
  *             tmp = i             # <<<<<<<<<<<<<<
@@ -19751,7 +19746,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_tmp = __pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":216
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":216
  *         if i < veb.min_val:
  *             tmp = i
  *             i = veb.min_val             # <<<<<<<<<<<<<<
@@ -19760,7 +19755,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_i = __pyx_v_veb->min_val;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":217
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":217
  *             tmp = i
  *             i = veb.min_val
  *             veb.min_val = tmp             # <<<<<<<<<<<<<<
@@ -19772,7 +19767,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":218
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":218
  *             i = veb.min_val
  *             veb.min_val = tmp
  *         a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -19781,7 +19776,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":219
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":219
  *             veb.min_val = tmp
  *         a = i >> veb.num_bottom_bits
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -19790,7 +19785,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
     __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":220
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":220
  *         a = i >> veb.num_bottom_bits
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *         if veb.bottom[a] == NULL:             # <<<<<<<<<<<<<<
@@ -19800,7 +19795,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = ((__pyx_v_veb->bottom[__pyx_v_a]) == NULL);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":221
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":221
  *         b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *         if veb.bottom[a] == NULL:
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -19810,7 +19805,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":222
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":222
  *         if veb.bottom[a] == NULL:
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *                 subv = <_VEB*> veb.top             # <<<<<<<<<<<<<<
@@ -19819,7 +19814,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
         __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)__pyx_v_veb->top);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":223
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":223
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *                 subv = <_VEB*> veb.top
  *                 VEB_insert(subv, a)             # <<<<<<<<<<<<<<
@@ -19831,7 +19826,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":225
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":225
  *                 VEB_insert(subv, a)
  *             else:
  *                 subb = <_BitSet*> veb.top             # <<<<<<<<<<<<<<
@@ -19840,7 +19835,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
         __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)__pyx_v_veb->top);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":226
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":226
  *             else:
  *                 subb = <_BitSet*> veb.top
  *                 bitset_insert(subb, a)             # <<<<<<<<<<<<<<
@@ -19851,7 +19846,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       __pyx_L6:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":227
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":227
  *                 subb = <_BitSet*> veb.top
  *                 bitset_insert(subb, a)
  *             if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -19861,7 +19856,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":228
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":228
  *                 bitset_insert(subb, a)
  *             if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *                 veb.bottom[a] = new_VEB(1 << veb.num_bottom_bits)             # <<<<<<<<<<<<<<
@@ -19873,7 +19868,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":230
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":230
  *                 veb.bottom[a] = new_VEB(1 << veb.num_bottom_bits)
  *             else:
  *                 veb.bottom[a] = new_BitSet()             # <<<<<<<<<<<<<<
@@ -19887,7 +19882,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":231
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":231
  *             else:
  *                 veb.bottom[a] = new_BitSet()
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -19897,7 +19892,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":232
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":232
  *                 veb.bottom[a] = new_BitSet()
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -19906,7 +19901,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":233
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":233
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             if VEB_insert(subv, b) == 0:             # <<<<<<<<<<<<<<
@@ -19916,7 +19911,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_f_3_sa_VEB_insert(__pyx_v_subv, __pyx_v_b) == 0);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":234
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":234
  *             subv = <_VEB*> veb.bottom[a]
  *             if VEB_insert(subv, b) == 0:
  *                 return 0             # <<<<<<<<<<<<<<
@@ -19932,7 +19927,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":236
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":236
  *                 return 0
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -19941,7 +19936,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":237
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":237
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             if bitset_insert(subb, b) == 0:             # <<<<<<<<<<<<<<
@@ -19951,7 +19946,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       __pyx_t_3 = (__pyx_f_3_sa_bitset_insert(__pyx_v_subb, __pyx_v_b) == 0);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":238
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":238
  *             subb = <_BitSet*> veb.bottom[a]
  *             if bitset_insert(subb, b) == 0:
  *                 return 0             # <<<<<<<<<<<<<<
@@ -19966,7 +19961,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":240
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":240
  *                 return 0
  * 
  *         if i > veb.max_val:             # <<<<<<<<<<<<<<
@@ -19976,7 +19971,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     __pyx_t_3 = (__pyx_v_i > __pyx_v_veb->max_val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":241
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":241
  * 
  *         if i > veb.max_val:
  *             veb.max_val = i             # <<<<<<<<<<<<<<
@@ -19990,7 +19985,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":242
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":242
  *         if i > veb.max_val:
  *             veb.max_val = i
  *     veb.size = veb.size + 1             # <<<<<<<<<<<<<<
@@ -19999,7 +19994,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
  */
   __pyx_v_veb->size = (__pyx_v_veb->size + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":243
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":243
  *             veb.max_val = i
  *     veb.size = veb.size + 1
  *     return 1             # <<<<<<<<<<<<<<
@@ -20015,7 +20010,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":246
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":246
  * 
  * 
  * cdef del_VEB(_VEB* veb):             # <<<<<<<<<<<<<<
@@ -20034,7 +20029,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("del_VEB", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":249
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":249
  *     cdef int i
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -20044,7 +20039,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":250
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":250
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         i = (<_VEB*> veb.top).min_val             # <<<<<<<<<<<<<<
@@ -20056,7 +20051,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":252
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":252
  *         i = (<_VEB*> veb.top).min_val
  *     else:
  *         i = (<_BitSet*> veb.top).min_val             # <<<<<<<<<<<<<<
@@ -20067,7 +20062,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":254
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":254
  *         i = (<_BitSet*> veb.top).min_val
  * 
  *     while i != -1:             # <<<<<<<<<<<<<<
@@ -20078,7 +20073,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_i != -1);
     if (!__pyx_t_1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":255
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":255
  * 
  *     while i != -1:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -20088,7 +20083,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":256
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":256
  *     while i != -1:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             del_VEB(<_VEB*> veb.bottom[i])             # <<<<<<<<<<<<<<
@@ -20102,7 +20097,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":258
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":258
  *             del_VEB(<_VEB*> veb.bottom[i])
  *         else:
  *             free(<_BitSet*> veb.bottom[i])             # <<<<<<<<<<<<<<
@@ -20113,7 +20108,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     __pyx_L6:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":260
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":260
  *             free(<_BitSet*> veb.bottom[i])
  * 
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -20123,7 +20118,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":261
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":261
  * 
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             i = VEB_findsucc(<_VEB*> veb.top, i)             # <<<<<<<<<<<<<<
@@ -20135,7 +20130,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":263
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":263
  *             i = VEB_findsucc(<_VEB*> veb.top, i)
  *         else:
  *             i = bitset_findsucc(<_BitSet*> veb.top, i)             # <<<<<<<<<<<<<<
@@ -20147,7 +20142,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":265
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":265
  *             i = bitset_findsucc(<_BitSet*> veb.top, i)
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -20157,7 +20152,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   __pyx_t_1 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":266
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":266
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         del_VEB(<_VEB*> veb.top)             # <<<<<<<<<<<<<<
@@ -20171,7 +20166,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":268
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":268
  *         del_VEB(<_VEB*> veb.top)
  *     else:
  *         free(<_BitSet*> veb.top)             # <<<<<<<<<<<<<<
@@ -20182,7 +20177,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   __pyx_L8:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":269
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":269
  *     else:
  *         free(<_BitSet*> veb.top)
  *     free(veb.bottom)             # <<<<<<<<<<<<<<
@@ -20191,7 +20186,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
  */
   free(__pyx_v_veb->bottom);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":270
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":270
  *         free(<_BitSet*> veb.top)
  *     free(veb.bottom)
  *     free(veb)             # <<<<<<<<<<<<<<
@@ -20212,7 +20207,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":273
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":273
  * 
  * 
  * cdef int VEB_findsucc(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -20235,7 +20230,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("VEB_findsucc", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":278
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":278
  *     cdef int a, b, j, c, found
  * 
  *     if veb.max_val == -1 or i>=veb.max_val:             # <<<<<<<<<<<<<<
@@ -20251,7 +20246,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":279
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":279
  * 
  *     if veb.max_val == -1 or i>=veb.max_val:
  *         return -1             # <<<<<<<<<<<<<<
@@ -20264,7 +20259,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":280
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":280
  *     if veb.max_val == -1 or i>=veb.max_val:
  *         return -1
  *     if i < veb.min_val:             # <<<<<<<<<<<<<<
@@ -20274,7 +20269,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = (__pyx_v_i < __pyx_v_veb->min_val);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":281
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":281
  *         return -1
  *     if i < veb.min_val:
  *         return veb.min_val             # <<<<<<<<<<<<<<
@@ -20287,7 +20282,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":283
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":283
  *         return veb.min_val
  * 
  *     a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -20296,7 +20291,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":284
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":284
  * 
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -20305,7 +20300,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":285
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":285
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     found = 0             # <<<<<<<<<<<<<<
@@ -20314,7 +20309,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_found = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":286
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":286
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     found = 0
  *     if veb.bottom[a] != NULL:             # <<<<<<<<<<<<<<
@@ -20324,7 +20319,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = ((__pyx_v_veb->bottom[__pyx_v_a]) != NULL);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":287
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":287
  *     found = 0
  *     if veb.bottom[a] != NULL:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -20334,7 +20329,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":288
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":288
  *     if veb.bottom[a] != NULL:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -20343,7 +20338,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":289
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":289
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             if subv.max_val > b:             # <<<<<<<<<<<<<<
@@ -20353,7 +20348,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
       __pyx_t_3 = (__pyx_v_subv->max_val > __pyx_v_b);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":290
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":290
  *             subv = <_VEB*> veb.bottom[a]
  *             if subv.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + VEB_findsucc(subv, b)             # <<<<<<<<<<<<<<
@@ -20362,7 +20357,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
         __pyx_v_j = ((__pyx_v_a << __pyx_v_veb->num_bottom_bits) + __pyx_f_3_sa_VEB_findsucc(__pyx_v_subv, __pyx_v_b));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":291
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":291
  *             if subv.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + VEB_findsucc(subv, b)
  *                 found = 1             # <<<<<<<<<<<<<<
@@ -20377,7 +20372,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":293
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":293
  *                 found = 1
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -20386,7 +20381,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":294
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":294
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             if subb.max_val > b:             # <<<<<<<<<<<<<<
@@ -20396,7 +20391,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
       __pyx_t_3 = (__pyx_v_subb->max_val > __pyx_v_b);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":295
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":295
  *             subb = <_BitSet*> veb.bottom[a]
  *             if subb.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)             # <<<<<<<<<<<<<<
@@ -20405,7 +20400,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
         __pyx_v_j = ((__pyx_v_a << __pyx_v_veb->num_bottom_bits) + __pyx_f_3_sa_bitset_findsucc(__pyx_v_subb, __pyx_v_b));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":296
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":296
  *             if subb.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)
  *                 found = 1             # <<<<<<<<<<<<<<
@@ -20422,7 +20417,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":297
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":297
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)
  *                 found = 1
  *     if found==0:             # <<<<<<<<<<<<<<
@@ -20432,7 +20427,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_3 = (__pyx_v_found == 0);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":298
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":298
  *                 found = 1
  *     if found==0:
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -20442,7 +20437,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->top_universe_size > __pyx_v_3_sa_MIN_BOTTOM_SIZE);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":299
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":299
  *     if found==0:
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             subv = <_VEB*> veb.top             # <<<<<<<<<<<<<<
@@ -20451,7 +20446,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)__pyx_v_veb->top);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":300
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":300
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             subv = <_VEB*> veb.top
  *             c = VEB_findsucc(subv, a)             # <<<<<<<<<<<<<<
@@ -20463,7 +20458,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":302
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":302
  *             c = VEB_findsucc(subv, a)
  *         else:
  *             subb = <_BitSet*> veb.top             # <<<<<<<<<<<<<<
@@ -20472,7 +20467,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)__pyx_v_veb->top);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":303
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":303
  *         else:
  *             subb = <_BitSet*> veb.top
  *             c = bitset_findsucc(subb, a)             # <<<<<<<<<<<<<<
@@ -20483,7 +20478,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     __pyx_L10:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":304
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":304
  *             subb = <_BitSet*> veb.top
  *             c = bitset_findsucc(subb, a)
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -20493,7 +20488,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_3 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":305
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":305
  *             c = bitset_findsucc(subb, a)
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[c]             # <<<<<<<<<<<<<<
@@ -20502,7 +20497,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_c]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":306
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":306
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subv.min_val             # <<<<<<<<<<<<<<
@@ -20514,7 +20509,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":308
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":308
  *             j = (c << veb.num_bottom_bits) + subv.min_val
  *         else:
  *             subb = <_BitSet*> veb.bottom[c]             # <<<<<<<<<<<<<<
@@ -20523,7 +20518,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_c]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":309
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":309
  *         else:
  *             subb = <_BitSet*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subb.min_val             # <<<<<<<<<<<<<<
@@ -20537,7 +20532,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L9:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":310
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":310
  *             subb = <_BitSet*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subb.min_val
  *     return j             # <<<<<<<<<<<<<<
@@ -20553,7 +20548,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":313
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":313
  * 
  * 
  * cdef int VEB_contains(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -20574,7 +20569,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   int __pyx_t_4;
   __Pyx_RefNannySetupContext("VEB_contains", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":318
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":318
  *     cdef int a, b
  * 
  *     if veb.size == 0 or i < veb.min_val or i > veb.max_val:             # <<<<<<<<<<<<<<
@@ -20596,7 +20591,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":319
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":319
  * 
  *     if veb.size == 0 or i < veb.min_val or i > veb.max_val:
  *         return 0             # <<<<<<<<<<<<<<
@@ -20609,7 +20604,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":321
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":321
  *         return 0
  * 
  *     if veb.min_val == i:             # <<<<<<<<<<<<<<
@@ -20619,7 +20614,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_2 = (__pyx_v_veb->min_val == __pyx_v_i);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":322
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":322
  * 
  *     if veb.min_val == i:
  *         return 1             # <<<<<<<<<<<<<<
@@ -20632,7 +20627,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":324
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":324
  *         return 1
  *     else:
  *         if veb.size == 1:             # <<<<<<<<<<<<<<
@@ -20642,7 +20637,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_2 = (__pyx_v_veb->size == 1);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":325
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":325
  *     else:
  *         if veb.size == 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -20657,7 +20652,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":327
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":327
  *             return 0
  * 
  *     a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -20666,7 +20661,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_a = (__pyx_v_i >> __pyx_v_veb->num_bottom_bits);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":328
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":328
  * 
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -20675,7 +20670,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_b = (__pyx_v_i & (__pyx_v_3_sa_LOWER_MASK[(__pyx_v_veb->num_bottom_bits - 1)]));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":329
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":329
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     if veb.bottom[a] == NULL:             # <<<<<<<<<<<<<<
@@ -20685,7 +20680,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   __pyx_t_2 = ((__pyx_v_veb->bottom[__pyx_v_a]) == NULL);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":330
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":330
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     if veb.bottom[a] == NULL:
  *         return 0             # <<<<<<<<<<<<<<
@@ -20698,7 +20693,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":332
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":332
  *         return 0
  *     else:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -20708,7 +20703,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     __pyx_t_2 = (__pyx_v_veb->num_bottom_bits > __pyx_v_3_sa_MIN_BOTTOM_BITS);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":333
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":333
  *     else:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -20717,7 +20712,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subv = ((struct __pyx_t_3_sa__VEB *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":334
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":334
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]
  *             return VEB_contains(subv, b)             # <<<<<<<<<<<<<<
@@ -20730,7 +20725,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":336
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":336
  *             return VEB_contains(subv, b)
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -20739,7 +20734,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
       __pyx_v_subb = ((struct __pyx_t_3_sa__BitSet *)(__pyx_v_veb->bottom[__pyx_v_a]));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":337
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":337
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             return bitset_contains(subb, b)             # <<<<<<<<<<<<<<
@@ -20770,7 +20765,7 @@ static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":344
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":344
  *     cdef int next_val
  * 
  *     def __next__(self):             # <<<<<<<<<<<<<<
@@ -20789,7 +20784,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__next__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":347
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":347
  *         cdef int ret_val
  * 
  *         if self.next_val == -1:             # <<<<<<<<<<<<<<
@@ -20799,7 +20794,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
   __pyx_t_1 = (__pyx_v_self->next_val == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":348
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":348
  * 
  *         if self.next_val == -1:
  *             raise StopIteration()             # <<<<<<<<<<<<<<
@@ -20815,7 +20810,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":349
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":349
  *         if self.next_val == -1:
  *             raise StopIteration()
  *         ret_val = self.next_val             # <<<<<<<<<<<<<<
@@ -20824,7 +20819,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
  */
   __pyx_v_ret_val = __pyx_v_self->next_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":350
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":350
  *             raise StopIteration()
  *         ret_val = self.next_val
  *         self.next_val = VEB_findsucc(self.v, ret_val)             # <<<<<<<<<<<<<<
@@ -20833,7 +20828,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
  */
   __pyx_v_self->next_val = __pyx_f_3_sa_VEB_findsucc(__pyx_v_self->v, __pyx_v_ret_val);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":351
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":351
  *         ret_val = self.next_val
  *         self.next_val = VEB_findsucc(self.v, ret_val)
  *         return ret_val             # <<<<<<<<<<<<<<
@@ -20906,7 +20901,7 @@ static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":360
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":360
  *     cdef int _first(self)
  * 
  *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
@@ -20919,7 +20914,7 @@ static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":361
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":361
  * 
  *     def __cinit__(self, int size):
  *         self.veb = new_VEB(size)             # <<<<<<<<<<<<<<
@@ -20942,7 +20937,7 @@ static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":363
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":363
  *         self.veb = new_VEB(size)
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -20958,7 +20953,7 @@ static void __pyx_pf_3_sa_3VEB_2__dealloc__(struct __pyx_obj_3_sa_VEB *__pyx_v_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":364
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":364
  * 
  *     def __dealloc__(self):
  *         del_VEB(self.veb)             # <<<<<<<<<<<<<<
@@ -20988,7 +20983,7 @@ static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":366
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":366
  *         del_VEB(self.veb)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -21006,7 +21001,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__iter__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":368
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":368
  *     def __iter__(self):
  *         cdef VEBIterator it
  *         it = VEBIterator()             # <<<<<<<<<<<<<<
@@ -21018,7 +21013,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
   __pyx_v_it = ((struct __pyx_obj_3_sa_VEBIterator *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":369
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":369
  *         cdef VEBIterator it
  *         it = VEBIterator()
  *         it.v = self.veb             # <<<<<<<<<<<<<<
@@ -21027,7 +21022,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
  */
   __pyx_v_it->v = __pyx_v_self->veb;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":370
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":370
  *         it = VEBIterator()
  *         it.v = self.veb
  *         it.next_val = self.veb.min_val             # <<<<<<<<<<<<<<
@@ -21036,7 +21031,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_4__iter__(struct __pyx_obj_3_sa_VEB *__pyx_v
  */
   __pyx_v_it->next_val = __pyx_v_self->veb->min_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":371
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":371
  *         it.v = self.veb
  *         it.next_val = self.veb.min_val
  *         return it             # <<<<<<<<<<<<<<
@@ -21072,7 +21067,7 @@ static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":373
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":373
  *         return it
  * 
  *     def insert(self, i):             # <<<<<<<<<<<<<<
@@ -21090,7 +21085,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":374
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":374
  * 
  *     def insert(self, i):
  *         return VEB_insert(self.veb, i)             # <<<<<<<<<<<<<<
@@ -21117,7 +21112,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":376
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":376
  *         return VEB_insert(self.veb, i)
  * 
  *     cdef int _insert(self, int i):             # <<<<<<<<<<<<<<
@@ -21130,7 +21125,7 @@ static int __pyx_f_3_sa_3VEB__insert(struct __pyx_obj_3_sa_VEB *__pyx_v_self, in
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_insert", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":377
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":377
  * 
  *     cdef int _insert(self, int i):
  *         return VEB_insert(self.veb, i)             # <<<<<<<<<<<<<<
@@ -21157,7 +21152,7 @@ static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":379
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":379
  *         return VEB_insert(self.veb, i)
  * 
  *     def findsucc(self, i):             # <<<<<<<<<<<<<<
@@ -21175,7 +21170,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("findsucc", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":380
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":380
  * 
  *     def findsucc(self, i):
  *         return VEB_findsucc(self.veb, i)             # <<<<<<<<<<<<<<
@@ -21202,7 +21197,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":382
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":382
  *         return VEB_findsucc(self.veb, i)
  * 
  *     cdef int _first(self):             # <<<<<<<<<<<<<<
@@ -21215,7 +21210,7 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_first", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":383
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":383
  * 
  *     cdef int _first(self):
  *         return self.veb.min_val             # <<<<<<<<<<<<<<
@@ -21231,7 +21226,7 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":385
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":385
  *         return self.veb.min_val
  * 
  *     cdef int _findsucc(self, int i):             # <<<<<<<<<<<<<<
@@ -21244,7 +21239,7 @@ static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_findsucc", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":386
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":386
  * 
  *     cdef int _findsucc(self, int i):
  *         return VEB_findsucc(self.veb, i)             # <<<<<<<<<<<<<<
@@ -21271,7 +21266,7 @@ static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":388
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":388
  *         return VEB_findsucc(self.veb, i)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -21284,7 +21279,7 @@ static Py_ssize_t __pyx_pf_3_sa_3VEB_10__len__(struct __pyx_obj_3_sa_VEB *__pyx_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":389
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":389
  * 
  *     def __len__(self):
  *         return self.veb.size             # <<<<<<<<<<<<<<
@@ -21311,7 +21306,7 @@ static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":391
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":391
  *         return self.veb.size
  * 
  *     def __contains__(self, i):             # <<<<<<<<<<<<<<
@@ -21327,7 +21322,7 @@ static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__contains__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":392
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":392
  * 
  *     def __contains__(self, i):
  *         return VEB_contains(self.veb, i)             # <<<<<<<<<<<<<<
@@ -21398,7 +21393,7 @@ static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":9
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":9
  *     cdef IntList lcp
  * 
  *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
@@ -21427,7 +21422,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":13
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
  * 
  *         logger.info("Constructing LCP array")             # <<<<<<<<<<<<<<
@@ -21444,7 +21439,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":14
  * 
  *         logger.info("Constructing LCP array")
  *         self.sa = sa             # <<<<<<<<<<<<<<
@@ -21457,7 +21452,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
   __pyx_v_self->sa = __pyx_v_sa;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":15
  *         logger.info("Constructing LCP array")
  *         self.sa = sa
  *         n = self.sa.sa.len             # <<<<<<<<<<<<<<
@@ -21466,7 +21461,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  */
   __pyx_v_n = __pyx_v_self->sa->sa->len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":16
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":16
  *         self.sa = sa
  *         n = self.sa.sa.len
  *         self.lcp = IntList(initial_len=n)             # <<<<<<<<<<<<<<
@@ -21488,7 +21483,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __pyx_v_self->lcp = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":18
  *         self.lcp = IntList(initial_len=n)
  * 
  *         rank = IntList(initial_len=n)             # <<<<<<<<<<<<<<
@@ -21507,7 +21502,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __pyx_v_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":19
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":19
  * 
  *         rank = IntList(initial_len=n)
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -21517,7 +21512,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __pyx_t_3 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":20
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":20
  *         rank = IntList(initial_len=n)
  *         for i from 0 <= i < n:
  *             rank.arr[sa.sa.arr[i]] = i             # <<<<<<<<<<<<<<
@@ -21527,7 +21522,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     (__pyx_v_rank->arr[(__pyx_v_sa->sa->arr[__pyx_v_i])]) = __pyx_v_i;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":22
  *             rank.arr[sa.sa.arr[i]] = i
  * 
  *         h = 0             # <<<<<<<<<<<<<<
@@ -21536,7 +21531,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  */
   __pyx_v_h = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":23
  * 
  *         h = 0
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -21546,7 +21541,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
   __pyx_t_3 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":24
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":24
  *         h = 0
  *         for i from 0 <= i < n:
  *             k = rank.arr[i]             # <<<<<<<<<<<<<<
@@ -21555,7 +21550,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  */
     __pyx_v_k = (__pyx_v_rank->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":25
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":25
  *         for i from 0 <= i < n:
  *             k = rank.arr[i]
  *             if k == 0:             # <<<<<<<<<<<<<<
@@ -21565,7 +21560,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     __pyx_t_4 = (__pyx_v_k == 0);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":26
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":26
  *             k = rank.arr[i]
  *             if k == 0:
  *                 self.lcp.arr[k] = -1             # <<<<<<<<<<<<<<
@@ -21577,7 +21572,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":28
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":28
  *                 self.lcp.arr[k] = -1
  *             else:
  *                 j = sa.sa.arr[k-1]             # <<<<<<<<<<<<<<
@@ -21586,7 +21581,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  */
       __pyx_v_j = (__pyx_v_sa->sa->arr[(__pyx_v_k - 1)]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":29
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":29
  *             else:
  *                 j = sa.sa.arr[k-1]
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:             # <<<<<<<<<<<<<<
@@ -21609,7 +21604,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
         }
         if (!__pyx_t_5) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":30
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":30
  *                 j = sa.sa.arr[k-1]
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:
  *                     h = h+1             # <<<<<<<<<<<<<<
@@ -21619,7 +21614,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
         __pyx_v_h = (__pyx_v_h + 1);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":31
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":31
  *                 while i+h < n and j+h < n and sa.darray.data.arr[i+h] == sa.darray.data.arr[j+h]:
  *                     h = h+1
  *                 self.lcp.arr[k] = h             # <<<<<<<<<<<<<<
@@ -21630,7 +21625,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     }
     __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":32
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":32
  *                     h = h+1
  *                 self.lcp.arr[k] = h
  *             if h > 0:             # <<<<<<<<<<<<<<
@@ -21640,7 +21635,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     __pyx_t_5 = (__pyx_v_h > 0);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":33
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":33
  *                 self.lcp.arr[k] = h
  *             if h > 0:
  *                 h = h-1             # <<<<<<<<<<<<<<
@@ -21653,7 +21648,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     __pyx_L10:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":34
  *             if h > 0:
  *                 h = h-1
  *         logger.info("LCP array completed")             # <<<<<<<<<<<<<<
@@ -21706,7 +21701,7 @@ static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":36
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
  * 
  *     def compute_stats(self, int max_n):             # <<<<<<<<<<<<<<
@@ -21777,7 +21772,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[9]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":48
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":48
  *         cdef VEB veb
  * 
  *         N = self.sa.sa.len             # <<<<<<<<<<<<<<
@@ -21786,7 +21781,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
   __pyx_cur_scope->__pyx_v_N = __pyx_cur_scope->__pyx_v_self->sa->sa->len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":50
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":50
  *         N = self.sa.sa.len
  * 
  *         ngram_starts = []             # <<<<<<<<<<<<<<
@@ -21799,7 +21794,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_cur_scope->__pyx_v_ngram_starts = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":51
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":51
  * 
  *         ngram_starts = []
  *         for n from 0 <= n < max_n:             # <<<<<<<<<<<<<<
@@ -21809,7 +21804,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_t_2 = __pyx_cur_scope->__pyx_v_max_n;
   for (__pyx_cur_scope->__pyx_v_n = 0; __pyx_cur_scope->__pyx_v_n < __pyx_t_2; __pyx_cur_scope->__pyx_v_n++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":52
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":52
  *         ngram_starts = []
  *         for n from 0 <= n < max_n:
  *             ngram_starts.append(IntList(initial_len=N))             # <<<<<<<<<<<<<<
@@ -21829,7 +21824,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":54
  *             ngram_starts.append(IntList(initial_len=N))
  * 
  *         run_start = IntList(initial_len=max_n)             # <<<<<<<<<<<<<<
@@ -21849,7 +21844,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_cur_scope->__pyx_v_run_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":55
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":55
  * 
  *         run_start = IntList(initial_len=max_n)
  *         veb = VEB(N)             # <<<<<<<<<<<<<<
@@ -21870,7 +21865,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_cur_scope->__pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":57
  *         veb = VEB(N)
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -21880,7 +21875,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_t_2 = __pyx_cur_scope->__pyx_v_N;
   for (__pyx_cur_scope->__pyx_v_i = 0; __pyx_cur_scope->__pyx_v_i < __pyx_t_2; __pyx_cur_scope->__pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":58
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":58
  * 
  *         for i from 0 <= i < N:
  *             h = self.lcp.arr[i]             # <<<<<<<<<<<<<<
@@ -21889,7 +21884,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
     __pyx_cur_scope->__pyx_v_h = (__pyx_cur_scope->__pyx_v_self->lcp->arr[__pyx_cur_scope->__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":59
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":59
  *         for i from 0 <= i < N:
  *             h = self.lcp.arr[i]
  *             if h < 0:             # <<<<<<<<<<<<<<
@@ -21899,7 +21894,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     __pyx_t_5 = (__pyx_cur_scope->__pyx_v_h < 0);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":60
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":60
  *             h = self.lcp.arr[i]
  *             if h < 0:
  *                 h = 0             # <<<<<<<<<<<<<<
@@ -21911,7 +21906,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     }
     __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":61
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":61
  *             if h < 0:
  *                 h = 0
  *             for n from h <= n < max_n:             # <<<<<<<<<<<<<<
@@ -21921,7 +21916,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     __pyx_t_6 = __pyx_cur_scope->__pyx_v_max_n;
     for (__pyx_cur_scope->__pyx_v_n = __pyx_cur_scope->__pyx_v_h; __pyx_cur_scope->__pyx_v_n < __pyx_t_6; __pyx_cur_scope->__pyx_v_n++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":62
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":62
  *                 h = 0
  *             for n from h <= n < max_n:
  *                 rs = run_start.arr[n]             # <<<<<<<<<<<<<<
@@ -21930,7 +21925,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
       __pyx_cur_scope->__pyx_v_rs = (__pyx_cur_scope->__pyx_v_run_start->arr[__pyx_cur_scope->__pyx_v_n]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":63
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":63
  *             for n from h <= n < max_n:
  *                 rs = run_start.arr[n]
  *                 run_start.arr[n] = i             # <<<<<<<<<<<<<<
@@ -21939,7 +21934,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
       (__pyx_cur_scope->__pyx_v_run_start->arr[__pyx_cur_scope->__pyx_v_n]) = __pyx_cur_scope->__pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":64
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":64
  *                 rs = run_start.arr[n]
  *                 run_start.arr[n] = i
  *                 freq = i - rs             # <<<<<<<<<<<<<<
@@ -21948,7 +21943,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
       __pyx_cur_scope->__pyx_v_freq = (__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_rs);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":65
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":65
  *                 run_start.arr[n] = i
  *                 freq = i - rs
  *                 if freq > 1000: # arbitrary, but see note below             # <<<<<<<<<<<<<<
@@ -21958,7 +21953,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
       __pyx_t_5 = (__pyx_cur_scope->__pyx_v_freq > 1000);
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":66
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":66
  *                 freq = i - rs
  *                 if freq > 1000: # arbitrary, but see note below
  *                     veb._insert(freq)             # <<<<<<<<<<<<<<
@@ -21967,7 +21962,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_cur_scope->__pyx_v_veb->__pyx_vtab)->_insert(__pyx_cur_scope->__pyx_v_veb, __pyx_cur_scope->__pyx_v_freq);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":67
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":67
  *                 if freq > 1000: # arbitrary, but see note below
  *                     veb._insert(freq)
  *                     ngram_start = ngram_starts[n]             # <<<<<<<<<<<<<<
@@ -21983,7 +21978,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
         __pyx_cur_scope->__pyx_v_ngram_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
         __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":68
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":68
  *                     veb._insert(freq)
  *                     ngram_start = ngram_starts[n]
  *                     while ngram_start.arr[freq] > 0:             # <<<<<<<<<<<<<<
@@ -21994,7 +21989,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_t_5 = ((__pyx_cur_scope->__pyx_v_ngram_start->arr[__pyx_cur_scope->__pyx_v_freq]) > 0);
           if (!__pyx_t_5) break;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":69
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":69
  *                     ngram_start = ngram_starts[n]
  *                     while ngram_start.arr[freq] > 0:
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram             # <<<<<<<<<<<<<<
@@ -22004,7 +21999,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_cur_scope->__pyx_v_freq = (__pyx_cur_scope->__pyx_v_freq + 1);
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":70
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":70
  *                     while ngram_start.arr[freq] > 0:
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram
  *                     ngram_start.arr[freq] = rs             # <<<<<<<<<<<<<<
@@ -22018,7 +22013,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":71
  *                         freq = freq + 1 # cheating a bit, should be ok for sparse histogram
  *                     ngram_start.arr[freq] = rs
  *         i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -22027,7 +22022,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
   __pyx_cur_scope->__pyx_v_i = __pyx_cur_scope->__pyx_v_veb->veb->min_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":72
  *                     ngram_start.arr[freq] = rs
  *         i = veb.veb.min_val
  *         while i != -1:             # <<<<<<<<<<<<<<
@@ -22038,7 +22033,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     __pyx_t_5 = (__pyx_cur_scope->__pyx_v_i != -1);
     if (!__pyx_t_5) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":73
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":73
  *         i = veb.veb.min_val
  *         while i != -1:
  *             ii = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -22047,7 +22042,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
     __pyx_cur_scope->__pyx_v_ii = ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_cur_scope->__pyx_v_veb->__pyx_vtab)->_findsucc(__pyx_cur_scope->__pyx_v_veb, __pyx_cur_scope->__pyx_v_i);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":74
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":74
  *         while i != -1:
  *             ii = veb._findsucc(i)
  *             for n from 0 <= n < max_n:             # <<<<<<<<<<<<<<
@@ -22057,7 +22052,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     __pyx_t_2 = __pyx_cur_scope->__pyx_v_max_n;
     for (__pyx_cur_scope->__pyx_v_n = 0; __pyx_cur_scope->__pyx_v_n < __pyx_t_2; __pyx_cur_scope->__pyx_v_n++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":75
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":75
  *             ii = veb._findsucc(i)
  *             for n from 0 <= n < max_n:
  *                 ngram_start = ngram_starts[n]             # <<<<<<<<<<<<<<
@@ -22073,7 +22068,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
       __pyx_cur_scope->__pyx_v_ngram_start = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
       __pyx_t_1 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":76
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":76
  *             for n from 0 <= n < max_n:
  *                 ngram_start = ngram_starts[n]
  *                 iii = i             # <<<<<<<<<<<<<<
@@ -22082,7 +22077,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
       __pyx_cur_scope->__pyx_v_iii = __pyx_cur_scope->__pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":77
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":77
  *                 ngram_start = ngram_starts[n]
  *                 iii = i
  *                 rs = ngram_start.arr[iii]             # <<<<<<<<<<<<<<
@@ -22091,7 +22086,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
       __pyx_cur_scope->__pyx_v_rs = (__pyx_cur_scope->__pyx_v_ngram_start->arr[__pyx_cur_scope->__pyx_v_iii]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":78
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":78
  *                 iii = i
  *                 rs = ngram_start.arr[iii]
  *                 while (ii==-1 or iii < ii) and rs != 0:             # <<<<<<<<<<<<<<
@@ -22114,7 +22109,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
         }
         if (!__pyx_t_7) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":79
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":79
  *                 rs = ngram_start.arr[iii]
  *                 while (ii==-1 or iii < ii) and rs != 0:
  *                     j = self.sa.sa.arr[rs]             # <<<<<<<<<<<<<<
@@ -22123,7 +22118,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_self->sa->sa->arr[__pyx_cur_scope->__pyx_v_rs]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":80
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":80
  *                 while (ii==-1 or iii < ii) and rs != 0:
  *                     j = self.sa.sa.arr[rs]
  *                     valid = 1             # <<<<<<<<<<<<<<
@@ -22132,7 +22127,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         __pyx_cur_scope->__pyx_v_valid = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":81
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":81
  *                     j = self.sa.sa.arr[rs]
  *                     valid = 1
  *                     for k from 0 <= k < n+1:             # <<<<<<<<<<<<<<
@@ -22142,7 +22137,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
         __pyx_t_9 = (__pyx_cur_scope->__pyx_v_n + 1);
         for (__pyx_cur_scope->__pyx_v_k = 0; __pyx_cur_scope->__pyx_v_k < __pyx_t_9; __pyx_cur_scope->__pyx_v_k++) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":82
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":82
  *                     valid = 1
  *                     for k from 0 <= k < n+1:
  *                         if self.sa.darray.data.arr[j+k] < 2:             # <<<<<<<<<<<<<<
@@ -22152,7 +22147,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_t_7 = ((__pyx_cur_scope->__pyx_v_self->sa->darray->data->arr[(__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_k)]) < 2);
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":83
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":83
  *                     for k from 0 <= k < n+1:
  *                         if self.sa.darray.data.arr[j+k] < 2:
  *                             valid = 0             # <<<<<<<<<<<<<<
@@ -22165,7 +22160,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_L22:;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":84
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":84
  *                         if self.sa.darray.data.arr[j+k] < 2:
  *                             valid = 0
  *                     if valid:             # <<<<<<<<<<<<<<
@@ -22174,7 +22169,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         if (__pyx_cur_scope->__pyx_v_valid) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":85
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":85
  *                             valid = 0
  *                     if valid:
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])             # <<<<<<<<<<<<<<
@@ -22200,7 +22195,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_cur_scope->__pyx_v_ngram = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":86
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":86
  *                     if valid:
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])
  *                         yield i, n+1, ngram             # <<<<<<<<<<<<<<
@@ -22237,7 +22232,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
         }
         __pyx_L23:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":87
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":87
  *                         ngram = tuple([self.sa.darray.data.arr[j+k] for k in range(n+1)])
  *                         yield i, n+1, ngram
  *                     iii = iii + 1             # <<<<<<<<<<<<<<
@@ -22246,7 +22241,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         __pyx_cur_scope->__pyx_v_iii = (__pyx_cur_scope->__pyx_v_iii + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":88
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":88
  *                         yield i, n+1, ngram
  *                     iii = iii + 1
  *                     rs = ngram_start.arr[iii]             # <<<<<<<<<<<<<<
@@ -22256,7 +22251,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
       }
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":89
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":89
  *                     iii = iii + 1
  *                     rs = ngram_start.arr[iii]
  *             i = ii             # <<<<<<<<<<<<<<
@@ -22292,7 +22287,7 @@ static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":12
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":12
  *     cdef dict id2sym
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -22309,7 +22304,7 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":13
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":13
  * 
  *     def __cinit__(self):
  *         self.terminals = StringMap()             # <<<<<<<<<<<<<<
@@ -22324,7 +22319,7 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_v_self->terminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":14
  *     def __cinit__(self):
  *         self.terminals = StringMap()
  *         self.nonterminals = StringMap()             # <<<<<<<<<<<<<<
@@ -22339,7 +22334,7 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_v_self->nonterminals = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":15
  *         self.terminals = StringMap()
  *         self.nonterminals = StringMap()
  *         self.id2sym = {}             # <<<<<<<<<<<<<<
@@ -22354,7 +22349,7 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_v_self->id2sym = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":16
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":16
  *         self.nonterminals = StringMap()
  *         self.id2sym = {}
  *         self.first_nonterminal = -1             # <<<<<<<<<<<<<<
@@ -22383,7 +22378,7 @@ static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":18
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":18
  *         self.first_nonterminal = -1
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -22398,7 +22393,7 @@ static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":21
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":21
  *         pass
  * 
  *     cdef int isvar(self, int sym):             # <<<<<<<<<<<<<<
@@ -22411,7 +22406,7 @@ static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alph
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("isvar", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":22
  * 
  *     cdef int isvar(self, int sym):
  *         return sym < 0             # <<<<<<<<<<<<<<
@@ -22427,7 +22422,7 @@ static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alph
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":24
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":24
  *         return sym < 0
  * 
  *     cdef int isword(self, int sym):             # <<<<<<<<<<<<<<
@@ -22440,7 +22435,7 @@ static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alp
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("isword", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":25
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":25
  * 
  *     cdef int isword(self, int sym):
  *         return sym >= 0             # <<<<<<<<<<<<<<
@@ -22456,7 +22451,7 @@ static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alp
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":27
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":27
  *         return sym >= 0
  * 
  *     cdef int getindex(self, int sym):             # <<<<<<<<<<<<<<
@@ -22469,7 +22464,7 @@ static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("getindex", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":28
  * 
  *     cdef int getindex(self, int sym):
  *         return -sym & INDEX_MASK             # <<<<<<<<<<<<<<
@@ -22485,7 +22480,7 @@ static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":30
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":30
  *         return -sym & INDEX_MASK
  * 
  *     cdef int setindex(self, int sym, int ind):             # <<<<<<<<<<<<<<
@@ -22498,7 +22493,7 @@ static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("setindex", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":31
  * 
  *     cdef int setindex(self, int sym, int ind):
  *         return -(-sym & ~INDEX_MASK | ind)             # <<<<<<<<<<<<<<
@@ -22514,7 +22509,7 @@ static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":33
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":33
  *         return -(-sym & ~INDEX_MASK | ind)
  * 
  *     cdef int clearindex(self, int sym):             # <<<<<<<<<<<<<<
@@ -22527,7 +22522,7 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("clearindex", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":34
  * 
  *     cdef int clearindex(self, int sym):
  *         return -(-sym& ~INDEX_MASK)             # <<<<<<<<<<<<<<
@@ -22543,7 +22538,7 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":36
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":36
  *         return -(-sym& ~INDEX_MASK)
  * 
  *     cdef int match(self, int sym1, int sym2):             # <<<<<<<<<<<<<<
@@ -22556,7 +22551,7 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("match", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":37
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":37
  * 
  *     cdef int match(self, int sym1, int sym2):
  *         return self.clearindex(sym1) == self.clearindex(sym2);             # <<<<<<<<<<<<<<
@@ -22572,7 +22567,7 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":39
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":39
  *         return self.clearindex(sym1) == self.clearindex(sym2);
  * 
  *     cdef char* tocat(self, int sym):             # <<<<<<<<<<<<<<
@@ -22585,7 +22580,7 @@ static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("tocat", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":40
  * 
  *     cdef char* tocat(self, int sym):
  *         return self.nonterminals.word((-sym >> INDEX_SHIFT)-1)             # <<<<<<<<<<<<<<
@@ -22601,7 +22596,7 @@ static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":42
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":42
  *         return self.nonterminals.word((-sym >> INDEX_SHIFT)-1)
  * 
  *     cdef int fromcat(self, char *s):             # <<<<<<<<<<<<<<
@@ -22616,7 +22611,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("fromcat", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":44
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":44
  *     cdef int fromcat(self, char *s):
  *         cdef int i
  *         i = self.nonterminals.index(s)             # <<<<<<<<<<<<<<
@@ -22625,7 +22620,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
  */
   __pyx_v_i = ((struct __pyx_vtabstruct_3_sa_StringMap *)__pyx_v_self->nonterminals->__pyx_vtab)->index(__pyx_v_self->nonterminals, __pyx_v_s);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":45
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":45
  *         cdef int i
  *         i = self.nonterminals.index(s)
  *         if self.first_nonterminal == -1:             # <<<<<<<<<<<<<<
@@ -22635,7 +22630,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   __pyx_t_1 = (__pyx_v_self->first_nonterminal == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":46
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":46
  *         i = self.nonterminals.index(s)
  *         if self.first_nonterminal == -1:
  *             self.first_nonterminal = i             # <<<<<<<<<<<<<<
@@ -22647,7 +22642,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":47
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":47
  *         if self.first_nonterminal == -1:
  *             self.first_nonterminal = i
  *         if i > self.last_nonterminal:             # <<<<<<<<<<<<<<
@@ -22657,7 +22652,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   __pyx_t_1 = (__pyx_v_i > __pyx_v_self->last_nonterminal);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":48
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":48
  *             self.first_nonterminal = i
  *         if i > self.last_nonterminal:
  *             self.last_nonterminal = i             # <<<<<<<<<<<<<<
@@ -22669,7 +22664,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":49
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":49
  *         if i > self.last_nonterminal:
  *             self.last_nonterminal = i
  *         return -(i+1 << INDEX_SHIFT)             # <<<<<<<<<<<<<<
@@ -22685,7 +22680,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":51
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":51
  *         return -(i+1 << INDEX_SHIFT)
  * 
  *     cdef char* tostring(self, int sym):             # <<<<<<<<<<<<<<
@@ -22708,7 +22703,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("tostring", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":53
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":53
  *     cdef char* tostring(self, int sym):
  *         cdef int ind
  *         if self.isvar(sym):             # <<<<<<<<<<<<<<
@@ -22718,7 +22713,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_self->__pyx_vtab)->isvar(__pyx_v_self, __pyx_v_sym);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":54
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":54
  *         cdef int ind
  *         if self.isvar(sym):
  *             if sym in self.id2sym:             # <<<<<<<<<<<<<<
@@ -22735,7 +22730,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":55
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":55
  *         if self.isvar(sym):
  *             if sym in self.id2sym:
  *                 return self.id2sym[sym]             # <<<<<<<<<<<<<<
@@ -22756,7 +22751,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":56
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":56
  *             if sym in self.id2sym:
  *                 return self.id2sym[sym]
  *             ind = self.getindex(sym)             # <<<<<<<<<<<<<<
@@ -22765,7 +22760,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_ind = ((struct __pyx_vtabstruct_3_sa_Alphabet *)__pyx_v_self->__pyx_vtab)->getindex(__pyx_v_self, __pyx_v_sym);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":57
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":57
  *                 return self.id2sym[sym]
  *             ind = self.getindex(sym)
  *             if ind > 0:             # <<<<<<<<<<<<<<
@@ -22775,7 +22770,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_3 = (__pyx_v_ind > 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":58
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":58
  *             ind = self.getindex(sym)
  *             if ind > 0:
  *                 self.id2sym[sym] = "[%s,%d]" % (self.tocat(sym), ind)             # <<<<<<<<<<<<<<
@@ -22807,7 +22802,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":60
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":60
  *                 self.id2sym[sym] = "[%s,%d]" % (self.tocat(sym), ind)
  *             else:
  *                 self.id2sym[sym] = "[%s]" % self.tocat(sym)             # <<<<<<<<<<<<<<
@@ -22828,7 +22823,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":61
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":61
  *             else:
  *                 self.id2sym[sym] = "[%s]" % self.tocat(sym)
  *             return self.id2sym[sym]             # <<<<<<<<<<<<<<
@@ -22849,7 +22844,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":63
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":63
  *             return self.id2sym[sym]
  *         else:
  *             return self.terminals.word(sym)             # <<<<<<<<<<<<<<
@@ -22874,7 +22869,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":65
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":65
  *             return self.terminals.word(sym)
  * 
  *     cdef int fromstring(self, char *s, bint terminal):             # <<<<<<<<<<<<<<
@@ -22902,7 +22897,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("fromstring", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":69
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":69
  *         cdef char *comma
  *         cdef int n
  *         n = strlen(s)             # <<<<<<<<<<<<<<
@@ -22911,7 +22906,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
   __pyx_v_n = strlen(__pyx_v_s);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":71
  *         n = strlen(s)
  *         cdef char *sep
  *         sep = strstr(s,"_SEP_")             # <<<<<<<<<<<<<<
@@ -22920,7 +22915,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
   __pyx_v_sep = strstr(__pyx_v_s, __pyx_k___SEP_);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":72
  *         cdef char *sep
  *         sep = strstr(s,"_SEP_")
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:             # <<<<<<<<<<<<<<
@@ -22948,7 +22943,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":73
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":73
  *         sep = strstr(s,"_SEP_")
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:
  *             if terminal:             # <<<<<<<<<<<<<<
@@ -22957,7 +22952,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     if (__pyx_v_terminal) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":74
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":74
  *         if n >= 3 and s[0] == c'[' and s[n-1] == c']' and sep == NULL:
  *             if terminal:
  *                 s1 = "\\"+s             # <<<<<<<<<<<<<<
@@ -22972,7 +22967,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
       __pyx_v_s1 = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":75
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":75
  *             if terminal:
  *                 s1 = "\\"+s
  *                 return self.terminals.index(s1)             # <<<<<<<<<<<<<<
@@ -22986,7 +22981,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":76
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":76
  *                 s1 = "\\"+s
  *                 return self.terminals.index(s1)
  *             s[n-1] = c'\0'             # <<<<<<<<<<<<<<
@@ -22995,7 +22990,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     (__pyx_v_s[(__pyx_v_n - 1)]) = '\x00';
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":77
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":77
  *                 return self.terminals.index(s1)
  *             s[n-1] = c'\0'
  *             s = s + 1             # <<<<<<<<<<<<<<
@@ -23004,7 +22999,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_s = (__pyx_v_s + 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":78
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":78
  *             s[n-1] = c'\0'
  *             s = s + 1
  *             comma = strrchr(s, c',')             # <<<<<<<<<<<<<<
@@ -23013,7 +23008,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_comma = strrchr(__pyx_v_s, ',');
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":79
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":79
  *             s = s + 1
  *             comma = strrchr(s, c',')
  *             if comma != NULL:             # <<<<<<<<<<<<<<
@@ -23023,7 +23018,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     __pyx_t_2 = (__pyx_v_comma != NULL);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":80
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":80
  *             comma = strrchr(s, c',')
  *             if comma != NULL:
  *                 comma[0] = c'\0'             # <<<<<<<<<<<<<<
@@ -23032,7 +23027,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
       (__pyx_v_comma[0]) = '\x00';
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":81
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":81
  *             if comma != NULL:
  *                 comma[0] = c'\0'
  *                 return self.setindex(self.fromcat(s), strtol(comma+1, NULL, 10))             # <<<<<<<<<<<<<<
@@ -23045,7 +23040,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":83
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":83
  *                 return self.setindex(self.fromcat(s), strtol(comma+1, NULL, 10))
  *             else:
  *                 return self.fromcat(s)             # <<<<<<<<<<<<<<
@@ -23060,7 +23055,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":85
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":85
  *                 return self.fromcat(s)
  *         else:
  *             return self.terminals.index(s)             # <<<<<<<<<<<<<<
@@ -23096,7 +23091,7 @@ static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":8
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":8
  * 
  * cdef class Alphabet:
  *     cdef readonly StringMap terminals, nonterminals             # <<<<<<<<<<<<<<
@@ -23147,7 +23142,7 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":89
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":89
  * cdef Alphabet ALPHABET = Alphabet()
  * 
  * cdef char* sym_tostring(int sym):             # <<<<<<<<<<<<<<
@@ -23160,7 +23155,7 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_tostring", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":90
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":90
  * 
  * cdef char* sym_tostring(int sym):
  *     return ALPHABET.tostring(sym)             # <<<<<<<<<<<<<<
@@ -23176,7 +23171,7 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":92
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":92
  *     return ALPHABET.tostring(sym)
  * 
  * cdef char* sym_tocat(int sym):             # <<<<<<<<<<<<<<
@@ -23189,7 +23184,7 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_tocat", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":93
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":93
  * 
  * cdef char* sym_tocat(int sym):
  *     return ALPHABET.tocat(sym)             # <<<<<<<<<<<<<<
@@ -23205,7 +23200,7 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":95
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":95
  *     return ALPHABET.tocat(sym)
  * 
  * cdef int sym_isvar(int sym):             # <<<<<<<<<<<<<<
@@ -23218,7 +23213,7 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_isvar", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":96
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":96
  * 
  * cdef int sym_isvar(int sym):
  *     return ALPHABET.isvar(sym)             # <<<<<<<<<<<<<<
@@ -23234,7 +23229,7 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":98
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":98
  *     return ALPHABET.isvar(sym)
  * 
  * cdef int sym_getindex(int sym):             # <<<<<<<<<<<<<<
@@ -23247,7 +23242,7 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_getindex", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":99
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":99
  * 
  * cdef int sym_getindex(int sym):
  *     return ALPHABET.getindex(sym)             # <<<<<<<<<<<<<<
@@ -23263,7 +23258,7 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":101
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":101
  *     return ALPHABET.getindex(sym)
  * 
  * cdef int sym_setindex(int sym, int id):             # <<<<<<<<<<<<<<
@@ -23276,7 +23271,7 @@ static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_setindex", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":102
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":102
  * 
  * cdef int sym_setindex(int sym, int id):
  *     return ALPHABET.setindex(sym, id)             # <<<<<<<<<<<<<<
@@ -23292,7 +23287,7 @@ static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":104
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":104
  *     return ALPHABET.setindex(sym, id)
  * 
  * cdef int sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
@@ -23305,7 +23300,7 @@ static int __pyx_f_3_sa_sym_fromstring(char *__pyx_v_string, int __pyx_v_termina
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_fromstring", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":105
  * 
  * cdef int sym_fromstring(char* string, bint terminal):
  *     return ALPHABET.fromstring(string, terminal)             # <<<<<<<<<<<<<<
@@ -23334,7 +23329,7 @@ static PyObject *__pyx_pw_3_sa_3make_lattice(PyObject *__pyx_self, PyObject *__p
 }
 static PyObject *__pyx_gb_3_sa_12make_lattice_2generator7(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":108
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":108
  * 
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
@@ -23476,7 +23471,7 @@ static PyObject *__pyx_gb_3_sa_12make_lattice_2generator7(__pyx_GeneratorObject
 }
 static PyObject *__pyx_gb_3_sa_12make_lattice_5generator8(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":109
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":109
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)
  *     return tuple(((word, None, 1), ) for word in word_ids)             # <<<<<<<<<<<<<<
@@ -23631,7 +23626,7 @@ static PyObject *__pyx_gb_3_sa_12make_lattice_5generator8(__pyx_GeneratorObject
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":107
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":107
  *     return ALPHABET.fromstring(string, terminal)
  * 
  * def make_lattice(words):             # <<<<<<<<<<<<<<
@@ -23659,7 +23654,7 @@ static PyObject *__pyx_pf_3_sa_2make_lattice(CYTHON_UNUSED PyObject *__pyx_self,
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_words);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_words);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":108
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":108
  * 
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
@@ -23672,7 +23667,7 @@ static PyObject *__pyx_pf_3_sa_2make_lattice(CYTHON_UNUSED PyObject *__pyx_self,
   __pyx_cur_scope->__pyx_v_word_ids = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":109
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":109
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)
  *     return tuple(((word, None, 1), ) for word in word_ids)             # <<<<<<<<<<<<<<
@@ -23721,7 +23716,7 @@ static PyObject *__pyx_pw_3_sa_5decode_lattice(PyObject *__pyx_self, PyObject *_
 }
 static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":112
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":112
  * 
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
@@ -23795,7 +23790,7 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":113
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":113
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc
  *             for arc in node for node in lattice)             # <<<<<<<<<<<<<<
@@ -23813,7 +23808,7 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
   }
   for (;;) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":112
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":112
  * 
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
@@ -23916,7 +23911,7 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
     __pyx_cur_scope->__pyx_v_dist = __pyx_t_7;
     __pyx_t_7 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":113
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":113
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc
  *             for arc in node for node in lattice)             # <<<<<<<<<<<<<<
@@ -24004,7 +23999,7 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
         __pyx_cur_scope->__pyx_v_node = __pyx_t_6;
         __pyx_t_6 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":112
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":112
  * 
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
@@ -24085,7 +24080,7 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":111
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":111
  *     return tuple(((word, None, 1), ) for word in word_ids)
  * 
  * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
@@ -24113,7 +24108,7 @@ static PyObject *__pyx_pf_3_sa_4decode_lattice(CYTHON_UNUSED PyObject *__pyx_sel
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_lattice);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_lattice);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":112
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":112
  * 
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
@@ -24162,7 +24157,7 @@ static PyObject *__pyx_pw_3_sa_7decode_sentence(PyObject *__pyx_self, PyObject *
 }
 static PyObject *__pyx_gb_3_sa_15decode_sentence_2generator10(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":116
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":116
  * 
  * def decode_sentence(lattice):
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)             # <<<<<<<<<<<<<<
@@ -24420,7 +24415,7 @@ static PyObject *__pyx_gb_3_sa_15decode_sentence_2generator10(__pyx_GeneratorObj
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":115
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":115
  *             for arc in node for node in lattice)
  * 
  * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
@@ -24447,7 +24442,7 @@ static PyObject *__pyx_pf_3_sa_6decode_sentence(CYTHON_UNUSED PyObject *__pyx_se
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_lattice);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_lattice);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":116
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":116
  * 
  * def decode_sentence(lattice):
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)             # <<<<<<<<<<<<<<
@@ -24528,7 +24523,7 @@ static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":6
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":6
  * cdef class Phrase:
  * 
  *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
@@ -24552,7 +24547,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":8
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":8
  *     def __cinit__(self, words):
  *         cdef int i, j, n, n_vars
  *         n_vars = 0             # <<<<<<<<<<<<<<
@@ -24561,7 +24556,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_n_vars = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":9
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":9
  *         cdef int i, j, n, n_vars
  *         n_vars = 0
  *         n = len(words)             # <<<<<<<<<<<<<<
@@ -24571,7 +24566,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __pyx_t_1 = PyObject_Length(__pyx_v_words); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_n = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":10
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":10
  *         n_vars = 0
  *         n = len(words)
  *         self.syms = <int *>malloc(n*sizeof(int))             # <<<<<<<<<<<<<<
@@ -24580,7 +24575,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_self->syms = ((int *)malloc((__pyx_v_n * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":11
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":11
  *         n = len(words)
  *         self.syms = <int *>malloc(n*sizeof(int))
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -24590,7 +24585,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __pyx_t_2 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":12
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":12
  *         self.syms = <int *>malloc(n*sizeof(int))
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]             # <<<<<<<<<<<<<<
@@ -24603,7 +24598,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     (__pyx_v_self->syms[__pyx_v_i]) = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":13
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":13
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
@@ -24613,7 +24608,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":14
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":14
  *             self.syms[i] = words[i]
  *             if sym_isvar(self.syms[i]):
  *                 n_vars += 1             # <<<<<<<<<<<<<<
@@ -24626,7 +24621,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __pyx_L5:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":15
  *             if sym_isvar(self.syms[i]):
  *                 n_vars += 1
  *         self.n = n             # <<<<<<<<<<<<<<
@@ -24635,7 +24630,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_self->n = __pyx_v_n;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":16
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":16
  *                 n_vars += 1
  *         self.n = n
  *         self.n_vars = n_vars             # <<<<<<<<<<<<<<
@@ -24644,7 +24639,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_self->n_vars = __pyx_v_n_vars;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":17
  *         self.n = n
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))             # <<<<<<<<<<<<<<
@@ -24653,7 +24648,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_self->varpos = ((int *)malloc((__pyx_v_n_vars * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":18
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0             # <<<<<<<<<<<<<<
@@ -24662,7 +24657,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_j = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":19
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":19
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -24672,7 +24667,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __pyx_t_2 = __pyx_v_n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":20
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":20
  *         j = 0
  *         for i from 0 <= i < n:
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
@@ -24682,7 +24677,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":21
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":21
  *         for i from 0 <= i < n:
  *             if sym_isvar(self.syms[i]):
  *                 self.varpos[j] = i             # <<<<<<<<<<<<<<
@@ -24691,7 +24686,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
       (__pyx_v_self->varpos[__pyx_v_j]) = __pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":22
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":22
  *             if sym_isvar(self.syms[i]):
  *                 self.varpos[j] = i
  *                 j = j + 1             # <<<<<<<<<<<<<<
@@ -24724,7 +24719,7 @@ static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":24
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":24
  *                 j = j + 1
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -24736,7 +24731,7 @@ static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__p
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":25
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":25
  * 
  *     def __dealloc__(self):
  *         free(self.syms)             # <<<<<<<<<<<<<<
@@ -24745,7 +24740,7 @@ static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__p
  */
   free(__pyx_v_self->syms);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":26
  *     def __dealloc__(self):
  *         free(self.syms)
  *         free(self.varpos)             # <<<<<<<<<<<<<<
@@ -24768,7 +24763,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":28
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":28
  *         free(self.varpos)
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -24792,7 +24787,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":29
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":29
  * 
  *     def __str__(self):
  *         strs = []             # <<<<<<<<<<<<<<
@@ -24804,7 +24799,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":31
  *         strs = []
  *         cdef int i, s
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
@@ -24814,7 +24809,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
   __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":32
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":32
  *         cdef int i, s
  *         for i from 0 <= i < self.n:
  *             s = self.syms[i]             # <<<<<<<<<<<<<<
@@ -24823,7 +24818,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
  */
     __pyx_v_s = (__pyx_v_self->syms[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":33
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":33
  *         for i from 0 <= i < self.n:
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))             # <<<<<<<<<<<<<<
@@ -24836,7 +24831,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":34
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))
  *         return ' '.join(strs)             # <<<<<<<<<<<<<<
@@ -24886,7 +24881,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":36
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":36
  *         return ' '.join(strs)
  * 
  *     def handle(self):             # <<<<<<<<<<<<<<
@@ -24910,7 +24905,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("handle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":39
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":39
  *         """return a hashable representation that normalizes the ordering
  *         of the nonterminal indices"""
  *         norm = []             # <<<<<<<<<<<<<<
@@ -24922,7 +24917,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":41
  *         norm = []
  *         cdef int i, j, s
  *         i = 1             # <<<<<<<<<<<<<<
@@ -24931,7 +24926,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  */
   __pyx_v_i = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":42
  *         cdef int i, j, s
  *         i = 1
  *         j = 0             # <<<<<<<<<<<<<<
@@ -24940,7 +24935,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  */
   __pyx_v_j = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":43
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":43
  *         i = 1
  *         j = 0
  *         for j from 0 <= j < self.n:             # <<<<<<<<<<<<<<
@@ -24950,7 +24945,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
   __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":44
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":44
  *         j = 0
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]             # <<<<<<<<<<<<<<
@@ -24959,7 +24954,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  */
     __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":45
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":45
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]
  *             if sym_isvar(s):             # <<<<<<<<<<<<<<
@@ -24969,7 +24964,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
     __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_v_s);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":46
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":46
  *             s = self.syms[j]
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)             # <<<<<<<<<<<<<<
@@ -24978,7 +24973,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  */
       __pyx_v_s = __pyx_f_3_sa_sym_setindex(__pyx_v_s, __pyx_v_i);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":47
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":47
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  *                 i = i + 1             # <<<<<<<<<<<<<<
@@ -24990,7 +24985,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":48
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":48
  *                 s = sym_setindex(s,i)
  *                 i = i + 1
  *             norm.append(s)             # <<<<<<<<<<<<<<
@@ -25003,7 +24998,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":49
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":49
  *                 i = i + 1
  *             norm.append(s)
  *         return tuple(norm)             # <<<<<<<<<<<<<<
@@ -25041,7 +25036,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":51
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":51
  *         return tuple(norm)
  * 
  *     def strhandle(self):             # <<<<<<<<<<<<<<
@@ -25068,7 +25063,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("strhandle", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":52
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":52
  * 
  *     def strhandle(self):
  *         strs = []             # <<<<<<<<<<<<<<
@@ -25080,7 +25075,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   __pyx_v_strs = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":53
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":53
  *     def strhandle(self):
  *         strs = []
  *         norm = []             # <<<<<<<<<<<<<<
@@ -25092,7 +25087,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   __pyx_v_norm = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":55
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":55
  *         norm = []
  *         cdef int i, j, s
  *         i = 1             # <<<<<<<<<<<<<<
@@ -25101,7 +25096,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  */
   __pyx_v_i = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":56
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":56
  *         cdef int i, j, s
  *         i = 1
  *         j = 0             # <<<<<<<<<<<<<<
@@ -25110,7 +25105,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  */
   __pyx_v_j = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":57
  *         i = 1
  *         j = 0
  *         for j from 0 <= j < self.n:             # <<<<<<<<<<<<<<
@@ -25120,7 +25115,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   __pyx_t_2 = __pyx_v_self->n;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":58
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":58
  *         j = 0
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]             # <<<<<<<<<<<<<<
@@ -25129,7 +25124,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  */
     __pyx_v_s = (__pyx_v_self->syms[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":59
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":59
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]
  *             if sym_isvar(s):             # <<<<<<<<<<<<<<
@@ -25139,7 +25134,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
     __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_v_s);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":60
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":60
  *             s = self.syms[j]
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)             # <<<<<<<<<<<<<<
@@ -25148,7 +25143,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  */
       __pyx_v_s = __pyx_f_3_sa_sym_setindex(__pyx_v_s, __pyx_v_i);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":61
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":61
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  *                 i = i + 1             # <<<<<<<<<<<<<<
@@ -25160,7 +25155,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":62
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":62
  *                 s = sym_setindex(s,i)
  *                 i = i + 1
  *             norm.append(sym_tostring(s))             # <<<<<<<<<<<<<<
@@ -25173,7 +25168,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":63
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":63
  *                 i = i + 1
  *             norm.append(sym_tostring(s))
  *         return ' '.join(norm)             # <<<<<<<<<<<<<<
@@ -25223,7 +25218,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":65
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":65
  *         return ' '.join(norm)
  * 
  *     def arity(self):             # <<<<<<<<<<<<<<
@@ -25240,7 +25235,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("arity", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":66
  * 
  *     def arity(self):
  *         return self.n_vars             # <<<<<<<<<<<<<<
@@ -25277,7 +25272,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":68
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":68
  *         return self.n_vars
  * 
  *     def getvarpos(self, i):             # <<<<<<<<<<<<<<
@@ -25297,7 +25292,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("getvarpos", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":69
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":69
  * 
  *     def getvarpos(self, i):
  *         if 0 <= i < self.n_vars:             # <<<<<<<<<<<<<<
@@ -25316,7 +25311,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":70
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":70
  *     def getvarpos(self, i):
  *         if 0 <= i < self.n_vars:
  *             return self.varpos[i]             # <<<<<<<<<<<<<<
@@ -25334,7 +25329,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":72
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":72
  *             return self.varpos[i]
  *         else:
  *             raise IndexError             # <<<<<<<<<<<<<<
@@ -25370,7 +25365,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":74
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":74
  *             raise IndexError
  * 
  *     def getvar(self, i):             # <<<<<<<<<<<<<<
@@ -25390,7 +25385,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("getvar", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":75
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":75
  * 
  *     def getvar(self, i):
  *         if 0 <= i < self.n_vars:             # <<<<<<<<<<<<<<
@@ -25409,7 +25404,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":76
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":76
  *     def getvar(self, i):
  *         if 0 <= i < self.n_vars:
  *             return self.syms[self.varpos[i]]             # <<<<<<<<<<<<<<
@@ -25427,7 +25422,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":78
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":78
  *             return self.syms[self.varpos[i]]
  *         else:
  *             raise IndexError             # <<<<<<<<<<<<<<
@@ -25452,7 +25447,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":80
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":80
  *             raise IndexError
  * 
  *     cdef int chunkpos(self, int k):             # <<<<<<<<<<<<<<
@@ -25466,7 +25461,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("chunkpos", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":81
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":81
  * 
  *     cdef int chunkpos(self, int k):
  *         if k == 0:             # <<<<<<<<<<<<<<
@@ -25476,7 +25471,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":82
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":82
  *     cdef int chunkpos(self, int k):
  *         if k == 0:
  *             return 0             # <<<<<<<<<<<<<<
@@ -25489,7 +25484,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":84
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":84
  *             return 0
  *         else:
  *             return self.varpos[k-1]+1             # <<<<<<<<<<<<<<
@@ -25507,7 +25502,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":86
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":86
  *             return self.varpos[k-1]+1
  * 
  *     cdef int chunklen(self, int k):             # <<<<<<<<<<<<<<
@@ -25521,7 +25516,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("chunklen", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":87
  * 
  *     cdef int chunklen(self, int k):
  *         if self.n_vars == 0:             # <<<<<<<<<<<<<<
@@ -25531,7 +25526,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_self->n_vars == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":88
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":88
  *     cdef int chunklen(self, int k):
  *         if self.n_vars == 0:
  *             return self.n             # <<<<<<<<<<<<<<
@@ -25543,7 +25538,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":89
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":89
  *         if self.n_vars == 0:
  *             return self.n
  *         elif k == 0:             # <<<<<<<<<<<<<<
@@ -25553,7 +25548,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":90
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":90
  *             return self.n
  *         elif k == 0:
  *             return self.varpos[0]             # <<<<<<<<<<<<<<
@@ -25565,7 +25560,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":91
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":91
  *         elif k == 0:
  *             return self.varpos[0]
  *         elif k == self.n_vars:             # <<<<<<<<<<<<<<
@@ -25575,7 +25570,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   __pyx_t_1 = (__pyx_v_k == __pyx_v_self->n_vars);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":92
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":92
  *             return self.varpos[0]
  *         elif k == self.n_vars:
  *             return self.n-self.varpos[k-1]-1             # <<<<<<<<<<<<<<
@@ -25588,7 +25583,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":94
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":94
  *             return self.n-self.varpos[k-1]-1
  *         else:
  *             return self.varpos[k]-self.varpos[k-1]-1             # <<<<<<<<<<<<<<
@@ -25617,7 +25612,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":96
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":96
  *             return self.varpos[k]-self.varpos[k-1]-1
  * 
  *     def clen(self, k):             # <<<<<<<<<<<<<<
@@ -25635,7 +25630,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("clen", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":97
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":97
  * 
  *     def clen(self, k):
  *          return self.chunklen(k)             # <<<<<<<<<<<<<<
@@ -25673,7 +25668,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":99
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":99
  *          return self.chunklen(k)
  * 
  *     def getchunk(self, ci):             # <<<<<<<<<<<<<<
@@ -25696,7 +25691,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("getchunk", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":101
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":101
  *     def getchunk(self, ci):
  *         cdef int start, stop
  *         start = self.chunkpos(ci)             # <<<<<<<<<<<<<<
@@ -25706,7 +25701,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_start = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunkpos(__pyx_v_self, __pyx_t_1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":102
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":102
  *         cdef int start, stop
  *         start = self.chunkpos(ci)
  *         stop = start+self.chunklen(ci)             # <<<<<<<<<<<<<<
@@ -25716,7 +25711,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_ci); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_stop = (__pyx_v_start + ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_v_self->__pyx_vtab)->chunklen(__pyx_v_self, __pyx_t_1));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":103
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":103
  *         start = self.chunkpos(ci)
  *         stop = start+self.chunklen(ci)
  *         chunk = []             # <<<<<<<<<<<<<<
@@ -25728,7 +25723,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   __pyx_v_chunk = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":104
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":104
  *         stop = start+self.chunklen(ci)
  *         chunk = []
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -25738,7 +25733,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   __pyx_t_1 = __pyx_v_stop;
   for (__pyx_v_i = __pyx_v_start; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":105
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":105
  *         chunk = []
  *         for i from start <= i < stop:
  *             chunk.append(self.syms[i])             # <<<<<<<<<<<<<<
@@ -25751,7 +25746,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":106
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":106
  *         for i from start <= i < stop:
  *             chunk.append(self.syms[i])
  *         return chunk             # <<<<<<<<<<<<<<
@@ -25789,7 +25784,7 @@ static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__p
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":108
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":108
  *         return chunk
  * 
  *     def __cmp__(self, other):             # <<<<<<<<<<<<<<
@@ -25812,7 +25807,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cmp__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":111
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":111
  *         cdef Phrase otherp
  *         cdef int i
  *         otherp = other             # <<<<<<<<<<<<<<
@@ -25823,7 +25818,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __Pyx_INCREF(__pyx_v_other);
   __pyx_v_otherp = ((struct __pyx_obj_3_sa_Phrase *)__pyx_v_other);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":112
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":112
  *         cdef int i
  *         otherp = other
  *         for i from 0 <= i < min(self.n, otherp.n):             # <<<<<<<<<<<<<<
@@ -25840,7 +25835,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __pyx_t_1 = __pyx_t_3;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":113
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":113
  *         otherp = other
  *         for i from 0 <= i < min(self.n, otherp.n):
  *             if self.syms[i] < otherp.syms[i]:             # <<<<<<<<<<<<<<
@@ -25850,7 +25845,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) < (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":114
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":114
  *         for i from 0 <= i < min(self.n, otherp.n):
  *             if self.syms[i] < otherp.syms[i]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -25862,7 +25857,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
       goto __pyx_L5;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":115
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":115
  *             if self.syms[i] < otherp.syms[i]:
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:             # <<<<<<<<<<<<<<
@@ -25872,7 +25867,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __pyx_t_4 = ((__pyx_v_self->syms[__pyx_v_i]) > (__pyx_v_otherp->syms[__pyx_v_i]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":116
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":116
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -25886,7 +25881,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __pyx_L5:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":117
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":117
  *             elif self.syms[i] > otherp.syms[i]:
  *                 return 1
  *         if self.n < otherp.n:             # <<<<<<<<<<<<<<
@@ -25896,7 +25891,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __pyx_t_4 = (__pyx_v_self->n < __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":118
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":118
  *                 return 1
  *         if self.n < otherp.n:
  *             return -1             # <<<<<<<<<<<<<<
@@ -25908,7 +25903,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     goto __pyx_L6;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":119
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":119
  *         if self.n < otherp.n:
  *             return -1
  *         elif self.n > otherp.n:             # <<<<<<<<<<<<<<
@@ -25918,7 +25913,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   __pyx_t_4 = (__pyx_v_self->n > __pyx_v_otherp->n);
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":120
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":120
  *             return -1
  *         elif self.n > otherp.n:
  *             return 1             # <<<<<<<<<<<<<<
@@ -25931,7 +25926,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":122
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":122
  *             return 1
  *         else:
  *             return 0             # <<<<<<<<<<<<<<
@@ -25966,7 +25961,7 @@ static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":124
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":124
  *             return 0
  * 
  *     def __hash__(self):             # <<<<<<<<<<<<<<
@@ -25983,7 +25978,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("__hash__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":127
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":127
  *         cdef int i
  *         cdef unsigned h
  *         h = 0             # <<<<<<<<<<<<<<
@@ -25992,7 +25987,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
  */
   __pyx_v_h = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":128
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":128
  *         cdef unsigned h
  *         h = 0
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
@@ -26002,7 +25997,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
   __pyx_t_1 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":129
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":129
  *         h = 0
  *         for i from 0 <= i < self.n:
  *             if self.syms[i] > 0:             # <<<<<<<<<<<<<<
@@ -26012,7 +26007,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
     __pyx_t_2 = ((__pyx_v_self->syms[__pyx_v_i]) > 0);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":130
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":130
  *         for i from 0 <= i < self.n:
  *             if self.syms[i] > 0:
  *                 h = (h << 1) + self.syms[i]             # <<<<<<<<<<<<<<
@@ -26024,7 +26019,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":132
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":132
  *                 h = (h << 1) + self.syms[i]
  *             else:
  *                 h = (h << 1) + -self.syms[i]             # <<<<<<<<<<<<<<
@@ -26036,7 +26031,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
     __pyx_L5:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":133
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":133
  *             else:
  *                 h = (h << 1) + -self.syms[i]
  *         return h             # <<<<<<<<<<<<<<
@@ -26064,7 +26059,7 @@ static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":135
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":135
  *         return h
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -26077,7 +26072,7 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":136
  * 
  *     def __len__(self):
  *         return self.n             # <<<<<<<<<<<<<<
@@ -26104,7 +26099,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":138
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":138
  *         return self.n
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -26122,7 +26117,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phras
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":139
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":139
  * 
  *     def __getitem__(self, i):
  *         return self.syms[i]             # <<<<<<<<<<<<<<
@@ -26161,7 +26156,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":141
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -26223,7 +26218,7 @@ static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":143
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":143
  *     def __iter__(self):
  *         cdef int i
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
@@ -26233,7 +26228,7 @@ static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx
   __pyx_t_1 = __pyx_cur_scope->__pyx_v_self->n;
   for (__pyx_cur_scope->__pyx_v_i = 0; __pyx_cur_scope->__pyx_v_i < __pyx_t_1; __pyx_cur_scope->__pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":144
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":144
  *         cdef int i
  *         for i from 0 <= i < self.n:
  *             yield self.syms[i]             # <<<<<<<<<<<<<<
@@ -26323,7 +26318,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":146
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":146
  *             yield self.syms[i]
  * 
  *     def subst(self, start, children):             # <<<<<<<<<<<<<<
@@ -26346,7 +26341,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
   __Pyx_RefNannySetupContext("subst", 0);
   __Pyx_INCREF(__pyx_v_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":148
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":148
  *     def subst(self, start, children):
  *         cdef int i
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
@@ -26356,7 +26351,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
   __pyx_t_1 = __pyx_v_self->n;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":149
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":149
  *         cdef int i
  *         for i from 0 <= i < self.n:
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
@@ -26366,7 +26361,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
     __pyx_t_2 = __pyx_f_3_sa_sym_isvar((__pyx_v_self->syms[__pyx_v_i]));
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":150
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":150
  *         for i from 0 <= i < self.n:
  *             if sym_isvar(self.syms[i]):
  *                 start = start + children[sym_getindex(self.syms[i])-1]             # <<<<<<<<<<<<<<
@@ -26386,7 +26381,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":152
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":152
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  *             else:
  *                 start = start + (self.syms[i],)             # <<<<<<<<<<<<<<
@@ -26410,7 +26405,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
     __pyx_L5:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":153
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":153
  *             else:
  *                 start = start + (self.syms[i],)
  *         return start             # <<<<<<<<<<<<<<
@@ -26447,7 +26442,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":156
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":156
  * 
  *     property words:
  *         def __get__(self):             # <<<<<<<<<<<<<<
@@ -26471,7 +26466,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":157
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":157
  *     property words:
  *         def __get__(self):
  *             return [sym_tostring(w) for w in self if not sym_isvar(w)]             # <<<<<<<<<<<<<<
@@ -26566,7 +26561,7 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lhs,&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__scores,&__pyx_n_s__word_alignments,0};
     PyObject* values[5] = {0,0,0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":161
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":161
  * cdef class Rule:
  * 
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
@@ -26663,7 +26658,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":162
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":162
  * 
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)             # <<<<<<<<<<<<<<
@@ -26692,7 +26687,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":163
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":163
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
  *         self.lhs = lhs             # <<<<<<<<<<<<<<
@@ -26701,7 +26696,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
  */
   __pyx_v_self->lhs = __pyx_v_lhs;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":164
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":164
  *         if not sym_isvar(lhs): raise Exception('Invalid LHS symbol: %d' % lhs)
  *         self.lhs = lhs
  *         self.f = f             # <<<<<<<<<<<<<<
@@ -26714,7 +26709,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
   __Pyx_DECREF(((PyObject *)__pyx_v_self->f));
   __pyx_v_self->f = __pyx_v_f;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":165
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":165
  *         self.lhs = lhs
  *         self.f = f
  *         self.e = e             # <<<<<<<<<<<<<<
@@ -26727,7 +26722,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
   __Pyx_DECREF(((PyObject *)__pyx_v_self->e));
   __pyx_v_self->e = __pyx_v_e;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":166
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":166
  *         self.f = f
  *         self.e = e
  *         self.word_alignments = word_alignments             # <<<<<<<<<<<<<<
@@ -26740,7 +26735,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
   __Pyx_DECREF(__pyx_v_self->word_alignments);
   __pyx_v_self->word_alignments = __pyx_v_word_alignments;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":167
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":167
  *         self.e = e
  *         self.word_alignments = word_alignments
  *         self.scores = scores             # <<<<<<<<<<<<<<
@@ -26777,7 +26772,7 @@ static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":169
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":169
  *         self.scores = scores
  * 
  *     def __hash__(self):             # <<<<<<<<<<<<<<
@@ -26796,7 +26791,7 @@ static Py_hash_t __pyx_pf_3_sa_4Rule_2__hash__(struct __pyx_obj_3_sa_Rule *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__hash__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":170
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":170
  * 
  *     def __hash__(self):
  *         return hash((self.lhs, self.f, self.e))             # <<<<<<<<<<<<<<
@@ -26852,7 +26847,7 @@ static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":172
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":172
  *         return hash((self.lhs, self.f, self.e))
  * 
  *     def __cmp__(self, Rule other):             # <<<<<<<<<<<<<<
@@ -26873,7 +26868,7 @@ static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cmp__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":173
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":173
  * 
  *     def __cmp__(self, Rule other):
  *         return cmp((self.lhs, self.f, self.e, self.word_alignments),             # <<<<<<<<<<<<<<
@@ -26897,7 +26892,7 @@ static int __pyx_pf_3_sa_4Rule_4__cmp__(struct __pyx_obj_3_sa_Rule *__pyx_v_self
   __Pyx_GIVEREF(__pyx_v_self->word_alignments);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":174
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":174
  *     def __cmp__(self, Rule other):
  *         return cmp((self.lhs, self.f, self.e, self.word_alignments),
  *                 (other.lhs, other.f, other.e, self.word_alignments))             # <<<<<<<<<<<<<<
@@ -26966,7 +26961,7 @@ static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":176
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":176
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
  *     def fmerge(self, Phrase f):             # <<<<<<<<<<<<<<
@@ -26984,7 +26979,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("fmerge", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":177
  * 
  *     def fmerge(self, Phrase f):
  *         if self.f == f:             # <<<<<<<<<<<<<<
@@ -26996,7 +26991,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":178
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":178
  *     def fmerge(self, Phrase f):
  *         if self.f == f:
  *             self.f = f             # <<<<<<<<<<<<<<
@@ -27035,7 +27030,7 @@ static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":180
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":180
  *             self.f = f
  * 
  *     def arity(self):             # <<<<<<<<<<<<<<
@@ -27053,7 +27048,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_8arity(struct __pyx_obj_3_sa_Rule *__pyx_v_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("arity", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":181
  * 
  *     def arity(self):
  *         return self.f.arity()             # <<<<<<<<<<<<<<
@@ -27095,7 +27090,7 @@ static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self) {
 }
 static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator11(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
@@ -27240,7 +27235,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator11(__pyx_GeneratorObject
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":183
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":183
  *         return self.f.arity()
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -27274,7 +27269,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":185
  *     def __str__(self):
  *         cdef unsigned i
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]             # <<<<<<<<<<<<<<
@@ -27324,7 +27319,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   __pyx_v_fields = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":186
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":186
  *         cdef unsigned i
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:             # <<<<<<<<<<<<<<
@@ -27334,7 +27329,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   __pyx_t_6 = (__pyx_cur_scope->__pyx_v_self->word_alignments != Py_None);
   if (__pyx_t_6) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":187
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":187
  *         fields = [sym_tostring(self.lhs), str(self.f), str(self.e), str(self.scores)]
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))             # <<<<<<<<<<<<<<
@@ -27360,7 +27355,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":188
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":188
  *         if self.word_alignments is not None:
  *             fields.append(' '.join('%d-%d' % a for a in self.alignments()))
  *         return ' ||| '.join(fields)             # <<<<<<<<<<<<<<
@@ -27413,7 +27408,7 @@ static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":190
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
  * 
  *     def alignments(self):             # <<<<<<<<<<<<<<
@@ -27479,7 +27474,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":191
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":191
  * 
  *     def alignments(self):
  *         for point in self.word_alignments:             # <<<<<<<<<<<<<<
@@ -27525,7 +27520,7 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
     __pyx_cur_scope->__pyx_v_point = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rule.pxi":192
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rule.pxi":192
  *     def alignments(self):
  *         for point in self.word_alignments:
  *             yield point/65536, point%65536             # <<<<<<<<<<<<<<
@@ -27640,7 +27635,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":21
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":21
  *     int arr_len
  * 
  * cdef _Trie_Node* new_trie_node():             # <<<<<<<<<<<<<<
@@ -27654,7 +27649,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("new_trie_node", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":23
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":23
  * cdef _Trie_Node* new_trie_node():
  *     cdef _Trie_Node* node
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))             # <<<<<<<<<<<<<<
@@ -27663,7 +27658,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node = ((struct __pyx_t_3_sa__Trie_Node *)malloc((sizeof(struct __pyx_t_3_sa__Trie_Node))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":24
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":24
  *     cdef _Trie_Node* node
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))
  *     node.root = NULL             # <<<<<<<<<<<<<<
@@ -27672,7 +27667,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->root = NULL;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":25
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":25
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))
  *     node.root = NULL
  *     node.arr_len = 0             # <<<<<<<<<<<<<<
@@ -27681,7 +27676,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->arr_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":26
  *     node.root = NULL
  *     node.arr_len = 0
  *     node.arr = <int*> malloc(sizeof(0*sizeof(int)))             # <<<<<<<<<<<<<<
@@ -27690,7 +27685,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->arr = ((int *)malloc((sizeof((0 * (sizeof(int)))))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":27
  *     node.arr_len = 0
  *     node.arr = <int*> malloc(sizeof(0*sizeof(int)))
  *     return node             # <<<<<<<<<<<<<<
@@ -27706,7 +27701,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":29
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":29
  *     return node
  * 
  * cdef _Trie_Edge* new_trie_edge(int val):             # <<<<<<<<<<<<<<
@@ -27720,7 +27715,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("new_trie_edge", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":31
  * cdef _Trie_Edge* new_trie_edge(int val):
  *     cdef _Trie_Edge* edge
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))             # <<<<<<<<<<<<<<
@@ -27729,7 +27724,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge = ((struct __pyx_t_3_sa__Trie_Edge *)malloc((sizeof(struct __pyx_t_3_sa__Trie_Edge))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":32
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":32
  *     cdef _Trie_Edge* edge
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))
  *     edge.node = new_trie_node()             # <<<<<<<<<<<<<<
@@ -27738,7 +27733,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->node = __pyx_f_3_sa_new_trie_node();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":33
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))
  *     edge.node = new_trie_node()
  *     edge.bigger = NULL             # <<<<<<<<<<<<<<
@@ -27747,7 +27742,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->bigger = NULL;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":34
  *     edge.node = new_trie_node()
  *     edge.bigger = NULL
  *     edge.smaller = NULL             # <<<<<<<<<<<<<<
@@ -27756,7 +27751,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->smaller = NULL;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":35
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":35
  *     edge.bigger = NULL
  *     edge.smaller = NULL
  *     edge.val = val             # <<<<<<<<<<<<<<
@@ -27765,7 +27760,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
  */
   __pyx_v_edge->val = __pyx_v_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":36
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":36
  *     edge.smaller = NULL
  *     edge.val = val
  *     return edge             # <<<<<<<<<<<<<<
@@ -27781,7 +27776,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":38
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":38
  *     return edge
  * 
  * cdef free_trie_node(_Trie_Node* node):             # <<<<<<<<<<<<<<
@@ -27799,7 +27794,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("free_trie_node", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":39
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":39
  * 
  * cdef free_trie_node(_Trie_Node* node):
  *     if node != NULL:             # <<<<<<<<<<<<<<
@@ -27809,7 +27804,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   __pyx_t_1 = (__pyx_v_node != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":40
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":40
  * cdef free_trie_node(_Trie_Node* node):
  *     if node != NULL:
  *         free_trie_edge(node.root)             # <<<<<<<<<<<<<<
@@ -27820,7 +27815,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":41
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":41
  *     if node != NULL:
  *         free_trie_edge(node.root)
  *         free(node.arr)             # <<<<<<<<<<<<<<
@@ -27844,7 +27839,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":43
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":43
  *         free(node.arr)
  * 
  * cdef free_trie_edge(_Trie_Edge* edge):             # <<<<<<<<<<<<<<
@@ -27862,7 +27857,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("free_trie_edge", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":44
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":44
  * 
  * cdef free_trie_edge(_Trie_Edge* edge):
  *     if edge != NULL:             # <<<<<<<<<<<<<<
@@ -27872,7 +27867,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   __pyx_t_1 = (__pyx_v_edge != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":45
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":45
  * cdef free_trie_edge(_Trie_Edge* edge):
  *     if edge != NULL:
  *         free_trie_node(edge.node)             # <<<<<<<<<<<<<<
@@ -27883,7 +27878,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":46
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":46
  *     if edge != NULL:
  *         free_trie_node(edge.node)
  *         free_trie_edge(edge.bigger)             # <<<<<<<<<<<<<<
@@ -27894,7 +27889,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":47
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":47
  *         free_trie_node(edge.node)
  *         free_trie_edge(edge.bigger)
  *         free_trie_edge(edge.smaller)             # <<<<<<<<<<<<<<
@@ -27920,7 +27915,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":49
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":49
  *         free_trie_edge(edge.smaller)
  * 
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -27937,7 +27932,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("trie_find", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":51
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":51
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):
  *     cdef _Trie_Edge* cur
  *     cur = node.root             # <<<<<<<<<<<<<<
@@ -27946,7 +27941,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
  */
   __pyx_v_cur = __pyx_v_node->root;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":52
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":52
  *     cdef _Trie_Edge* cur
  *     cur = node.root
  *     while cur != NULL and cur.val != val:             # <<<<<<<<<<<<<<
@@ -27963,7 +27958,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":53
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":53
  *     cur = node.root
  *     while cur != NULL and cur.val != val:
  *         if val > cur.val:             # <<<<<<<<<<<<<<
@@ -27973,7 +27968,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_t_3 = (__pyx_v_val > __pyx_v_cur->val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":54
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":54
  *     while cur != NULL and cur.val != val:
  *         if val > cur.val:
  *             cur = cur.bigger             # <<<<<<<<<<<<<<
@@ -27984,7 +27979,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
       goto __pyx_L5;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":55
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":55
  *         if val > cur.val:
  *             cur = cur.bigger
  *         elif val < cur.val:             # <<<<<<<<<<<<<<
@@ -27994,7 +27989,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_t_3 = (__pyx_v_val < __pyx_v_cur->val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":56
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":56
  *             cur = cur.bigger
  *         elif val < cur.val:
  *             cur = cur.smaller             # <<<<<<<<<<<<<<
@@ -28007,7 +28002,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_L5:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":57
  *         elif val < cur.val:
  *             cur = cur.smaller
  *     if cur == NULL:             # <<<<<<<<<<<<<<
@@ -28017,7 +28012,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   __pyx_t_3 = (__pyx_v_cur == NULL);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":58
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":58
  *             cur = cur.smaller
  *     if cur == NULL:
  *         return NULL             # <<<<<<<<<<<<<<
@@ -28030,7 +28025,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":60
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":60
  *         return NULL
  *     else:
  *         return cur.node             # <<<<<<<<<<<<<<
@@ -28048,7 +28043,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":62
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":62
  *         return cur.node
  * 
  * cdef trie_node_data_append(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -28062,7 +28057,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("trie_node_data_append", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":64
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":64
  * cdef trie_node_data_append(_Trie_Node* node, int val):
  *     cdef int new_len
  *     new_len = node.arr_len + 1             # <<<<<<<<<<<<<<
@@ -28071,7 +28066,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_new_len = (__pyx_v_node->arr_len + 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":65
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":65
  *     cdef int new_len
  *     new_len = node.arr_len + 1
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -28080,7 +28075,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_node->arr = ((int *)realloc(__pyx_v_node->arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":66
  *     new_len = node.arr_len + 1
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     node.arr[node.arr_len] = val             # <<<<<<<<<<<<<<
@@ -28089,7 +28084,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
  */
   (__pyx_v_node->arr[__pyx_v_node->arr_len]) = __pyx_v_val;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":67
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":67
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     node.arr[node.arr_len] = val
  *     node.arr_len = new_len             # <<<<<<<<<<<<<<
@@ -28104,7 +28099,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":69
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":69
  *     node.arr_len = new_len
  * 
  * cdef trie_node_data_extend(_Trie_Node* node, int* vals, int num_vals):             # <<<<<<<<<<<<<<
@@ -28118,7 +28113,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("trie_node_data_extend", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":71
  * cdef trie_node_data_extend(_Trie_Node* node, int* vals, int num_vals):
  *     cdef int new_len
  *     new_len = node.arr_len + num_vals             # <<<<<<<<<<<<<<
@@ -28127,7 +28122,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_new_len = (__pyx_v_node->arr_len + __pyx_v_num_vals);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":72
  *     cdef int new_len
  *     new_len = node.arr_len + num_vals
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -28136,7 +28131,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   __pyx_v_node->arr = ((int *)realloc(__pyx_v_node->arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":73
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":73
  *     new_len = node.arr_len + num_vals
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     memcpy(node.arr + node.arr_len, vals, num_vals*sizeof(int))             # <<<<<<<<<<<<<<
@@ -28145,7 +28140,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
  */
   memcpy((__pyx_v_node->arr + __pyx_v_node->arr_len), __pyx_v_vals, (__pyx_v_num_vals * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":74
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":74
  *     node.arr = <int*> realloc(node.arr, new_len*sizeof(int))
  *     memcpy(node.arr + node.arr_len, vals, num_vals*sizeof(int))
  *     node.arr_len = new_len             # <<<<<<<<<<<<<<
@@ -28160,7 +28155,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":77
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":77
  * 
  * 
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -28177,7 +28172,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("trie_insert", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":79
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":79
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):
  *     cdef _Trie_Edge** cur
  *     cur = &node.root             # <<<<<<<<<<<<<<
@@ -28186,7 +28181,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
  */
   __pyx_v_cur = (&__pyx_v_node->root);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":80
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":80
  *     cdef _Trie_Edge** cur
  *     cur = &node.root
  *     while cur[0] != NULL and cur[0].val != val:             # <<<<<<<<<<<<<<
@@ -28203,7 +28198,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":81
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":81
  *     cur = &node.root
  *     while cur[0] != NULL and cur[0].val != val:
  *         if val > cur[0].val:             # <<<<<<<<<<<<<<
@@ -28213,7 +28208,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_t_3 = (__pyx_v_val > (__pyx_v_cur[0])->val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":82
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":82
  *     while cur[0] != NULL and cur[0].val != val:
  *         if val > cur[0].val:
  *             cur = &cur[0].bigger             # <<<<<<<<<<<<<<
@@ -28224,7 +28219,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
       goto __pyx_L5;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":83
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":83
  *         if val > cur[0].val:
  *             cur = &cur[0].bigger
  *         elif val < cur[0].val:             # <<<<<<<<<<<<<<
@@ -28234,7 +28229,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_t_3 = (__pyx_v_val < (__pyx_v_cur[0])->val);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":84
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":84
  *             cur = &cur[0].bigger
  *         elif val < cur[0].val:
  *             cur = &cur[0].smaller             # <<<<<<<<<<<<<<
@@ -28247,7 +28242,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_L5:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":85
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":85
  *         elif val < cur[0].val:
  *             cur = &cur[0].smaller
  *     if cur[0] == NULL:             # <<<<<<<<<<<<<<
@@ -28257,7 +28252,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   __pyx_t_3 = ((__pyx_v_cur[0]) == NULL);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":86
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":86
  *             cur = &cur[0].smaller
  *     if cur[0] == NULL:
  *         cur[0] = new_trie_edge(val)             # <<<<<<<<<<<<<<
@@ -28269,7 +28264,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":87
  *     if cur[0] == NULL:
  *         cur[0] = new_trie_edge(val)
  *     return cur[0].node             # <<<<<<<<<<<<<<
@@ -28285,7 +28280,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":89
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":89
  *     return cur[0].node
  * 
  * cdef trie_node_to_map(_Trie_Node* node, result, prefix, int include_zeros):             # <<<<<<<<<<<<<<
@@ -28305,7 +28300,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("trie_node_to_map", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":92
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":92
  *     cdef IntList arr
  * 
  *     if include_zeros or node.arr_len > 0:             # <<<<<<<<<<<<<<
@@ -28320,7 +28315,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   }
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":93
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":93
  * 
  *     if include_zeros or node.arr_len > 0:
  *         arr = IntList()             # <<<<<<<<<<<<<<
@@ -28332,7 +28327,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":94
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":94
  *     if include_zeros or node.arr_len > 0:
  *         arr = IntList()
  *         free(arr.arr)             # <<<<<<<<<<<<<<
@@ -28341,7 +28336,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     free(__pyx_v_arr->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":95
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":95
  *         arr = IntList()
  *         free(arr.arr)
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -28350,7 +28345,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->arr = ((int *)malloc((__pyx_v_node->arr_len * (sizeof(int)))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":96
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":96
  *         free(arr.arr)
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -28359,7 +28354,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     memcpy(__pyx_v_arr->arr, __pyx_v_node->arr, (__pyx_v_node->arr_len * (sizeof(int))));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":97
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":97
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))
  *         arr.len = node.arr_len             # <<<<<<<<<<<<<<
@@ -28368,7 +28363,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->len = __pyx_v_node->arr_len;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":98
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":98
  *         memcpy(arr.arr, node.arr, node.arr_len * sizeof(int))
  *         arr.len = node.arr_len
  *         arr.size = node.arr_len             # <<<<<<<<<<<<<<
@@ -28377,7 +28372,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     __pyx_v_arr->size = __pyx_v_node->arr_len;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":99
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":99
  *         arr.len = node.arr_len
  *         arr.size = node.arr_len
  *         result[prefix] = arr             # <<<<<<<<<<<<<<
@@ -28389,7 +28384,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":100
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":100
  *         arr.size = node.arr_len
  *         result[prefix] = arr
  *     trie_edge_to_map(node.root, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -28413,7 +28408,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":102
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":102
  *     trie_edge_to_map(node.root, result, prefix, include_zeros)
  * 
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):             # <<<<<<<<<<<<<<
@@ -28433,7 +28428,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   __Pyx_RefNannySetupContext("trie_edge_to_map", 0);
   __Pyx_INCREF(__pyx_v_prefix);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":103
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":103
  * 
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):
  *     if edge != NULL:             # <<<<<<<<<<<<<<
@@ -28443,7 +28438,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
   __pyx_t_1 = (__pyx_v_edge != NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":104
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":104
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):
  *     if edge != NULL:
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -28454,7 +28449,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":105
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":105
  *     if edge != NULL:
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -28465,7 +28460,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":106
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":106
  *         trie_edge_to_map(edge.smaller, result, prefix, include_zeros)
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)
  *         prefix = prefix + (edge.val,)             # <<<<<<<<<<<<<<
@@ -28486,7 +28481,7 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
     __pyx_v_prefix = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":107
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":107
  *         trie_edge_to_map(edge.bigger, result, prefix, include_zeros)
  *         prefix = prefix + (edge.val,)
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)             # <<<<<<<<<<<<<<
@@ -28561,7 +28556,7 @@ static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":114
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":114
  *     cdef int V
  * 
  *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
@@ -28574,7 +28569,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":115
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":115
  * 
  *     def __cinit__(self, int alphabet_size):
  *         self.V = alphabet_size             # <<<<<<<<<<<<<<
@@ -28583,7 +28578,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx
  */
   __pyx_v_self->V = __pyx_v_alphabet_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":116
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":116
  *     def __cinit__(self, int alphabet_size):
  *         self.V = alphabet_size
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))             # <<<<<<<<<<<<<<
@@ -28592,7 +28587,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx
  */
   __pyx_v_self->root = ((struct __pyx_t_3_sa__Trie_Node **)malloc((__pyx_v_self->V * (sizeof(struct __pyx_t_3_sa__Trie_Node *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":117
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":117
  *         self.V = alphabet_size
  *         self.root = <_Trie_Node**> malloc(self.V * sizeof(_Trie_Node*))
  *         memset(self.root, 0, self.V * sizeof(_Trie_Node*))             # <<<<<<<<<<<<<<
@@ -28615,7 +28610,7 @@ static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":120
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":120
  * 
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -28634,7 +28629,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":122
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":122
  *     def __dealloc__(self):
  *         cdef int i
  *         for i from 0 <= i < self.V:             # <<<<<<<<<<<<<<
@@ -28644,7 +28639,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
   __pyx_t_1 = __pyx_v_self->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":123
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":123
  *         cdef int i
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:             # <<<<<<<<<<<<<<
@@ -28654,7 +28649,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
     __pyx_t_2 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":124
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":124
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])             # <<<<<<<<<<<<<<
@@ -28669,7 +28664,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
     __pyx_L5:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":125
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":125
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])
  *         free(self.root)             # <<<<<<<<<<<<<<
@@ -28697,7 +28692,7 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":128
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":128
  * 
  * 
  *     def insert(self, pattern):             # <<<<<<<<<<<<<<
@@ -28720,7 +28715,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":131
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":131
  *         cdef int* p
  *         cdef int i, l
  *         l = len(pattern)             # <<<<<<<<<<<<<<
@@ -28730,7 +28725,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   __pyx_t_1 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_l = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":132
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":132
  *         cdef int i, l
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))             # <<<<<<<<<<<<<<
@@ -28739,7 +28734,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
  */
   __pyx_v_p = ((int *)malloc((__pyx_v_l * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":133
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":133
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:             # <<<<<<<<<<<<<<
@@ -28749,7 +28744,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   __pyx_t_2 = __pyx_v_l;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":134
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":134
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]             # <<<<<<<<<<<<<<
@@ -28763,7 +28758,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
     (__pyx_v_p[__pyx_v_i]) = __pyx_t_4;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":135
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":135
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]
  *         self._insert(p,l)             # <<<<<<<<<<<<<<
@@ -28772,7 +28767,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
  */
   ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_insert(__pyx_v_self, __pyx_v_p, __pyx_v_l);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":136
  *             p[i] = pattern[i]
  *         self._insert(p,l)
  *         free(p)             # <<<<<<<<<<<<<<
@@ -28793,7 +28788,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":139
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":139
  * 
  * 
  *     cdef _Trie_Node* _insert(self, int* pattern, int pattern_len):             # <<<<<<<<<<<<<<
@@ -28810,7 +28805,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("_insert", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":142
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":142
  *         cdef int i
  *         cdef _Trie_Node* node
  *         if self.root[pattern[0]] == NULL:             # <<<<<<<<<<<<<<
@@ -28820,7 +28815,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __pyx_t_1 = ((__pyx_v_self->root[(__pyx_v_pattern[0])]) == NULL);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":143
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":143
  *         cdef _Trie_Node* node
  *         if self.root[pattern[0]] == NULL:
  *             self.root[pattern[0]] = new_trie_node()             # <<<<<<<<<<<<<<
@@ -28832,7 +28827,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":144
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":144
  *         if self.root[pattern[0]] == NULL:
  *             self.root[pattern[0]] = new_trie_node()
  *         node = self.root[pattern[0]]             # <<<<<<<<<<<<<<
@@ -28841,7 +28836,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
  */
   __pyx_v_node = (__pyx_v_self->root[(__pyx_v_pattern[0])]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":145
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":145
  *             self.root[pattern[0]] = new_trie_node()
  *         node = self.root[pattern[0]]
  *         for i from 1 <= i < pattern_len:             # <<<<<<<<<<<<<<
@@ -28851,7 +28846,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   __pyx_t_2 = __pyx_v_pattern_len;
   for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":146
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":146
  *         node = self.root[pattern[0]]
  *         for i from 1 <= i < pattern_len:
  *             node = trie_insert(node, pattern[i])             # <<<<<<<<<<<<<<
@@ -28861,7 +28856,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_pattern[__pyx_v_i]));
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":147
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":147
  *         for i from 1 <= i < pattern_len:
  *             node = trie_insert(node, pattern[i])
  *         return node             # <<<<<<<<<<<<<<
@@ -28888,7 +28883,7 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":149
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":149
  *         return node
  * 
  *     def contains(self, pattern):             # <<<<<<<<<<<<<<
@@ -28913,7 +28908,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("contains", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":153
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":153
  *         cdef int i, l
  *         cdef _Trie_Node* node
  *         l = len(pattern)             # <<<<<<<<<<<<<<
@@ -28923,7 +28918,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   __pyx_t_1 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_l = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":154
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":154
  *         cdef _Trie_Node* node
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))             # <<<<<<<<<<<<<<
@@ -28932,7 +28927,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
  */
   __pyx_v_p = ((int *)malloc((__pyx_v_l * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":155
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":155
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:             # <<<<<<<<<<<<<<
@@ -28942,7 +28937,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   __pyx_t_2 = __pyx_v_l;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":156
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":156
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]             # <<<<<<<<<<<<<<
@@ -28956,7 +28951,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
     (__pyx_v_p[__pyx_v_i]) = __pyx_t_4;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":157
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":157
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]
  *         node = self._contains(p,l)             # <<<<<<<<<<<<<<
@@ -28965,7 +28960,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
  */
   __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_self->__pyx_vtab)->_contains(__pyx_v_self, __pyx_v_p, __pyx_v_l);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":158
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":158
  *             p[i] = pattern[i]
  *         node = self._contains(p,l)
  *         free(p)             # <<<<<<<<<<<<<<
@@ -28974,7 +28969,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
  */
   free(__pyx_v_p);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":159
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":159
  *         node = self._contains(p,l)
  *         free(p)
  *         if node == NULL:             # <<<<<<<<<<<<<<
@@ -28984,7 +28979,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   __pyx_t_5 = (__pyx_v_node == NULL);
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":160
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":160
  *         free(p)
  *         if node == NULL:
  *             return False             # <<<<<<<<<<<<<<
@@ -29001,7 +28996,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":162
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":162
  *             return False
  *         else:
  *             return True             # <<<<<<<<<<<<<<
@@ -29029,7 +29024,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":164
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":164
  *             return True
  * 
  *     cdef _Trie_Node* _contains(self, int* pattern, int pattern_len):             # <<<<<<<<<<<<<<
@@ -29047,7 +29042,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("_contains", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":167
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":167
  *         cdef int i
  *         cdef _Trie_Node* node
  *         node = self.root[pattern[0]]             # <<<<<<<<<<<<<<
@@ -29056,7 +29051,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
   __pyx_v_node = (__pyx_v_self->root[(__pyx_v_pattern[0])]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":168
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":168
  *         cdef _Trie_Node* node
  *         node = self.root[pattern[0]]
  *         i = 1             # <<<<<<<<<<<<<<
@@ -29065,7 +29060,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
   __pyx_v_i = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":169
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":169
  *         node = self.root[pattern[0]]
  *         i = 1
  *         while node != NULL and i < pattern_len:             # <<<<<<<<<<<<<<
@@ -29082,7 +29077,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":170
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":170
  *         i = 1
  *         while node != NULL and i < pattern_len:
  *             node = trie_find(node, pattern[i])             # <<<<<<<<<<<<<<
@@ -29091,7 +29086,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
     __pyx_v_node = __pyx_f_3_sa_trie_find(__pyx_v_node, (__pyx_v_pattern[__pyx_v_i]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":171
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":171
  *         while node != NULL and i < pattern_len:
  *             node = trie_find(node, pattern[i])
  *             i = i+1             # <<<<<<<<<<<<<<
@@ -29101,7 +29096,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
     __pyx_v_i = (__pyx_v_i + 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":172
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":172
  *             node = trie_find(node, pattern[i])
  *             i = i+1
  *         return node             # <<<<<<<<<<<<<<
@@ -29128,7 +29123,7 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":174
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":174
  *         return node
  * 
  *     def toMap(self, flag):             # <<<<<<<<<<<<<<
@@ -29151,7 +29146,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("toMap", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":177
  *         cdef int i, include_zeros
  * 
  *         if flag:             # <<<<<<<<<<<<<<
@@ -29161,7 +29156,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_flag); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":178
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":178
  * 
  *         if flag:
  *             include_zeros=1             # <<<<<<<<<<<<<<
@@ -29173,7 +29168,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":180
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":180
  *             include_zeros=1
  *         else:
  *             include_zeros=0             # <<<<<<<<<<<<<<
@@ -29184,7 +29179,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":181
  *         else:
  *             include_zeros=0
  *         result = {}             # <<<<<<<<<<<<<<
@@ -29196,7 +29191,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   __pyx_v_result = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":182
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":182
  *             include_zeros=0
  *         result = {}
  *         for i from 0 <= i < self.V:             # <<<<<<<<<<<<<<
@@ -29206,7 +29201,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   __pyx_t_3 = __pyx_v_self->V;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":183
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":183
  *         result = {}
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:             # <<<<<<<<<<<<<<
@@ -29216,7 +29211,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
     __pyx_t_1 = ((__pyx_v_self->root[__pyx_v_i]) != NULL);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":184
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":184
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)             # <<<<<<<<<<<<<<
@@ -29239,7 +29234,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
     __pyx_L6:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":185
  *             if self.root[i] != NULL:
  *                 trie_node_to_map(self.root[i], result, (i,), include_zeros)
  *         return result             # <<<<<<<<<<<<<<
@@ -29284,7 +29279,7 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__from_stats,&__pyx_n_s__from_binary,&__pyx_n_s__precompute_rank,&__pyx_n_s_70,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,0};
     PyObject* values[9] = {0,0,0,0,0,0,0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":200
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":200
  *     cdef write_map(self, m, FILE* f)
  * 
  *     def __cinit__(self, fsarray=None, from_stats=None, from_binary=None,             # <<<<<<<<<<<<<<
@@ -29418,7 +29413,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":204
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":204
  *             max_length=5, max_nonterminals=2,
  *             train_max_initial_size=10, train_min_gap_size=2):
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
@@ -29428,7 +29423,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->precompute_rank = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":205
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":205
  *             train_max_initial_size=10, train_min_gap_size=2):
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
@@ -29438,7 +29433,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_precompute_secondary_rank); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->precompute_secondary_rank = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":206
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":206
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
@@ -29448,7 +29443,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_length); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->max_length = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":207
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":207
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
@@ -29458,7 +29453,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_max_nonterminals); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->max_nonterminals = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":208
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":208
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
@@ -29468,7 +29463,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_max_initial_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->train_max_initial_size = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":209
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":209
  *         self.max_nonterminals = max_nonterminals
  *         self.train_max_initial_size = train_max_initial_size
  *         self.train_min_gap_size = train_min_gap_size             # <<<<<<<<<<<<<<
@@ -29478,7 +29473,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_train_min_gap_size); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->train_min_gap_size = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":210
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":210
  *         self.train_max_initial_size = train_max_initial_size
  *         self.train_min_gap_size = train_min_gap_size
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -29488,7 +29483,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":211
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":211
  *         self.train_min_gap_size = train_min_gap_size
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
@@ -29510,7 +29505,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":212
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":212
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_stats:             # <<<<<<<<<<<<<<
@@ -29520,7 +29515,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_stats); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":213
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":213
  *             self.read_binary(from_binary)
  *         elif from_stats:
  *             self.precompute(from_stats, fsarray)             # <<<<<<<<<<<<<<
@@ -29580,7 +29575,7 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":216
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":216
  * 
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -29598,7 +29593,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":218
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":218
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -29607,7 +29602,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":219
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":219
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29616,7 +29611,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  */
   fread((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":220
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":220
  *         f = fopen(filename, "r")
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29625,7 +29620,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  */
   fread((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":221
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":221
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29634,7 +29629,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  */
   fread((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":222
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":222
  *         fread(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29643,7 +29638,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  */
   fread((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":223
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":223
  *         fread(&(self.max_length), sizeof(int), 1, f)
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29652,7 +29647,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  */
   fread((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":224
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":224
  *         fread(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29661,7 +29656,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  */
   fread((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":225
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":225
  *         fread(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)             # <<<<<<<<<<<<<<
@@ -29676,7 +29671,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
   __pyx_v_self->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":226
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":226
  *         fread(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)             # <<<<<<<<<<<<<<
@@ -29691,7 +29686,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
   __pyx_v_self->precomputed_collocations = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":227
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":227
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -29733,7 +29728,7 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":230
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":230
  * 
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -29752,7 +29747,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":232
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":232
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -29761,7 +29756,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":233
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":233
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29770,7 +29765,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  */
   fwrite((&__pyx_v_self->precompute_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":234
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":234
  *         f = fopen(filename, "w")
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29779,7 +29774,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  */
   fwrite((&__pyx_v_self->precompute_secondary_rank), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":235
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":235
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29788,7 +29783,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  */
   fwrite((&__pyx_v_self->max_length), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":236
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":236
  *         fwrite(&(self.precompute_secondary_rank), sizeof(int), 1, f)
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29797,7 +29792,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  */
   fwrite((&__pyx_v_self->max_nonterminals), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":237
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":237
  *         fwrite(&(self.max_length), sizeof(int), 1, f)
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29806,7 +29801,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  */
   fwrite((&__pyx_v_self->train_max_initial_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":238
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":238
  *         fwrite(&(self.max_nonterminals), sizeof(int), 1, f)
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29815,7 +29810,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  */
   fwrite((&__pyx_v_self->train_min_gap_size), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":239
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":239
  *         fwrite(&(self.train_max_initial_size), sizeof(int), 1, f)
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)             # <<<<<<<<<<<<<<
@@ -29829,7 +29824,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":240
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":240
  *         fwrite(&(self.train_min_gap_size), sizeof(int), 1, f)
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)             # <<<<<<<<<<<<<<
@@ -29843,7 +29838,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":241
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":241
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -29865,7 +29860,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":244
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":244
  * 
  * 
  *     cdef write_map(self, m, FILE* f):             # <<<<<<<<<<<<<<
@@ -29896,7 +29891,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_map", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":248
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":248
  *         cdef IntList arr
  * 
  *         N = len(m)             # <<<<<<<<<<<<<<
@@ -29906,7 +29901,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
   __pyx_t_1 = PyObject_Length(__pyx_v_m); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":249
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":249
  * 
  *         N = len(m)
  *         fwrite(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29915,7 +29910,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  */
   fwrite((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":250
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":250
  *         N = len(m)
  *         fwrite(&(N), sizeof(int), 1, f)
  *         for pattern, val in m.iteritems():             # <<<<<<<<<<<<<<
@@ -29945,7 +29940,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
     __pyx_v_val = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":251
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":251
  *         fwrite(&(N), sizeof(int), 1, f)
  *         for pattern, val in m.iteritems():
  *             N = len(pattern)             # <<<<<<<<<<<<<<
@@ -29955,7 +29950,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
     __pyx_t_8 = PyObject_Length(__pyx_v_pattern); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_N = __pyx_t_8;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":252
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":252
  *         for pattern, val in m.iteritems():
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -29964,7 +29959,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  */
     fwrite((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":253
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":253
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -30009,7 +30004,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
       __pyx_v_word_id = __pyx_t_5;
       __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":254
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":254
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:
  *                 i = word_id             # <<<<<<<<<<<<<<
@@ -30019,7 +30014,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
       __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_v_word_id); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_v_i = __pyx_t_7;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":255
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":255
  *             for word_id in pattern:
  *                 i = word_id
  *                 fwrite(&(i), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -30030,7 +30025,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
     }
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":256
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":256
  *                 i = word_id
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val             # <<<<<<<<<<<<<<
@@ -30042,7 +30037,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
     __Pyx_XDECREF(((PyObject *)__pyx_v_arr));
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_val);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":257
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":257
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val
  *             arr.write_handle(f)             # <<<<<<<<<<<<<<
@@ -30071,7 +30066,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":260
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":260
  * 
  * 
  *     cdef read_map(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -30099,7 +30094,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_map", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":264
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":264
  *         cdef IntList arr
  * 
  *         m = {}             # <<<<<<<<<<<<<<
@@ -30111,7 +30106,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   __pyx_v_m = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":265
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":265
  * 
  *         m = {}
  *         fread(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -30120,7 +30115,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
  */
   fread((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":266
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":266
  *         m = {}
  *         fread(&(N), sizeof(int), 1, f)
  *         for j from 0 <= j < N:             # <<<<<<<<<<<<<<
@@ -30130,7 +30125,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   __pyx_t_2 = __pyx_v_N;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_2; __pyx_v_j++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":267
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":267
  *         fread(&(N), sizeof(int), 1, f)
  *         for j from 0 <= j < N:
  *             fread(&(i), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -30139,7 +30134,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
  */
     fread((&__pyx_v_i), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":268
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":268
  *         for j from 0 <= j < N:
  *             fread(&(i), sizeof(int), 1, f)
  *             key = ()             # <<<<<<<<<<<<<<
@@ -30150,7 +30145,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
     __Pyx_XDECREF(((PyObject *)__pyx_v_key));
     __pyx_v_key = __pyx_empty_tuple;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":269
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":269
  *             fread(&(i), sizeof(int), 1, f)
  *             key = ()
  *             for k from 0 <= k < i:             # <<<<<<<<<<<<<<
@@ -30160,7 +30155,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
     __pyx_t_3 = __pyx_v_i;
     for (__pyx_v_k = 0; __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":270
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":270
  *             key = ()
  *             for k from 0 <= k < i:
  *                 fread(&(word_id), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -30169,7 +30164,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
  */
       fread((&__pyx_v_word_id), (sizeof(int)), 1, __pyx_v_f);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":271
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":271
  *             for k from 0 <= k < i:
  *                 fread(&(word_id), sizeof(int), 1, f)
  *                 key = key + (word_id,)             # <<<<<<<<<<<<<<
@@ -30191,7 +30186,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
       __pyx_t_1 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":272
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":272
  *                 fread(&(word_id), sizeof(int), 1, f)
  *                 key = key + (word_id,)
  *             arr = IntList()             # <<<<<<<<<<<<<<
@@ -30204,7 +30199,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
     __pyx_v_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":273
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":273
  *                 key = key + (word_id,)
  *             arr = IntList()
  *             arr.read_handle(f)             # <<<<<<<<<<<<<<
@@ -30213,7 +30208,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_arr->__pyx_vtab)->read_handle(__pyx_v_arr, __pyx_v_f);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":274
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":274
  *             arr = IntList()
  *             arr.read_handle(f)
  *             m[key] = arr             # <<<<<<<<<<<<<<
@@ -30223,7 +30218,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
     if (PyDict_SetItem(((PyObject *)__pyx_v_m), ((PyObject *)__pyx_v_key), ((PyObject *)__pyx_v_arr)) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":275
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":275
  *             arr.read_handle(f)
  *             m[key] = arr
  *         return m             # <<<<<<<<<<<<<<
@@ -30312,7 +30307,7 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":278
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":278
  * 
  * 
  *     def precompute(self, stats, SuffixArray sarray):             # <<<<<<<<<<<<<<
@@ -30397,7 +30392,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("precompute", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":280
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":280
  *     def precompute(self, stats, SuffixArray sarray):
  *         cdef int i, l, N, max_pattern_len, i1, l1, i2, l2, i3, l3, ptr1, ptr2, ptr3, is_super, sent_count, max_rank
  *         cdef DataArray darray = sarray.darray             # <<<<<<<<<<<<<<
@@ -30407,7 +30402,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(((PyObject *)__pyx_v_sarray->darray));
   __pyx_v_darray = __pyx_v_sarray->darray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":285
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":285
  *         cdef _Trie_Node* node
  * 
  *         data = darray.data             # <<<<<<<<<<<<<<
@@ -30417,7 +30412,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(((PyObject *)__pyx_v_darray->data));
   __pyx_v_data = __pyx_v_darray->data;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":287
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":287
  *         data = darray.data
  * 
  *         frequent_patterns = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -30441,7 +30436,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_frequent_patterns = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":288
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":288
  * 
  *         frequent_patterns = TrieMap(len(darray.id2word))
  *         super_frequent_patterns = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -30465,7 +30460,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_super_frequent_patterns = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":289
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":289
  *         frequent_patterns = TrieMap(len(darray.id2word))
  *         super_frequent_patterns = TrieMap(len(darray.id2word))
  *         collocations = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -30489,7 +30484,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_collocations = ((struct __pyx_obj_3_sa_TrieMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":291
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":291
  *         collocations = TrieMap(len(darray.id2word))
  * 
  *         I_set = set()             # <<<<<<<<<<<<<<
@@ -30501,7 +30496,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_I_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":292
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":292
  * 
  *         I_set = set()
  *         J_set = set()             # <<<<<<<<<<<<<<
@@ -30513,7 +30508,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_J_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":293
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":293
  *         I_set = set()
  *         J_set = set()
  *         J2_set = set()             # <<<<<<<<<<<<<<
@@ -30525,7 +30520,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_J2_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":294
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":294
  *         J_set = set()
  *         J2_set = set()
  *         IJ_set = set()             # <<<<<<<<<<<<<<
@@ -30537,7 +30532,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_IJ_set = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":295
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":295
  *         J2_set = set()
  *         IJ_set = set()
  *         pattern_rank = {}             # <<<<<<<<<<<<<<
@@ -30549,7 +30544,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_pattern_rank = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":297
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":297
  *         pattern_rank = {}
  * 
  *         logger.info("Precomputing frequent intersections")             # <<<<<<<<<<<<<<
@@ -30566,7 +30561,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":298
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":298
  * 
  *         logger.info("Precomputing frequent intersections")
  *         cdef float start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -30575,7 +30570,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":300
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":300
  *         cdef float start_time = monitor_cpu()
  * 
  *         max_pattern_len = 0             # <<<<<<<<<<<<<<
@@ -30584,7 +30579,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_max_pattern_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":301
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":301
  * 
  *         max_pattern_len = 0
  *         for rank, (_, _, phrase) in enumerate(stats):             # <<<<<<<<<<<<<<
@@ -30700,7 +30695,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_1 = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":302
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":302
  *         max_pattern_len = 0
  *         for rank, (_, _, phrase) in enumerate(stats):
  *             if rank >= self.precompute_rank:             # <<<<<<<<<<<<<<
@@ -30715,7 +30710,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
     if (__pyx_t_11) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":303
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":303
  *         for rank, (_, _, phrase) in enumerate(stats):
  *             if rank >= self.precompute_rank:
  *                 break             # <<<<<<<<<<<<<<
@@ -30727,7 +30722,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":304
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":304
  *             if rank >= self.precompute_rank:
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))             # <<<<<<<<<<<<<<
@@ -30743,7 +30738,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     __pyx_v_max_pattern_len = __pyx_t_14;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":305
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":305
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)             # <<<<<<<<<<<<<<
@@ -30763,7 +30758,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":306
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":306
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)
  *             I_set.add(phrase)             # <<<<<<<<<<<<<<
@@ -30772,7 +30767,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     __pyx_t_15 = PySet_Add(__pyx_v_I_set, __pyx_v_phrase); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":307
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":307
  *             frequent_patterns.insert(phrase)
  *             I_set.add(phrase)
  *             pattern_rank[phrase] = rank             # <<<<<<<<<<<<<<
@@ -30781,7 +30776,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     if (PyDict_SetItem(((PyObject *)__pyx_v_pattern_rank), __pyx_v_phrase, __pyx_v_rank) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":308
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":308
  *             I_set.add(phrase)
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:             # <<<<<<<<<<<<<<
@@ -30796,7 +30791,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_11) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":309
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":309
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:
  *                 super_frequent_patterns.insert(phrase)             # <<<<<<<<<<<<<<
@@ -30816,7 +30811,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":310
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":310
  *             if rank < self.precompute_secondary_rank:
  *                 super_frequent_patterns.insert(phrase)
  *                 J_set.add(phrase)             # <<<<<<<<<<<<<<
@@ -30832,7 +30827,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":312
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":312
  *                 J_set.add(phrase)
  * 
  *         queue = IntList(increment=1000)             # <<<<<<<<<<<<<<
@@ -30848,7 +30843,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_queue = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":314
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":314
  *         queue = IntList(increment=1000)
  * 
  *         logger.info("    Computing inverted indexes...")             # <<<<<<<<<<<<<<
@@ -30865,7 +30860,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":315
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":315
  * 
  *         logger.info("    Computing inverted indexes...")
  *         N = len(data)             # <<<<<<<<<<<<<<
@@ -30875,7 +30870,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_data)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":316
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":316
  *         logger.info("    Computing inverted indexes...")
  *         N = len(data)
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -30885,7 +30880,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_13 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":317
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":317
  *         N = len(data)
  *         for i from 0 <= i < N:
  *             sa_word_id = data.arr[i]             # <<<<<<<<<<<<<<
@@ -30894,7 +30889,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     __pyx_v_sa_word_id = (__pyx_v_data->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":318
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":318
  *         for i from 0 <= i < N:
  *             sa_word_id = data.arr[i]
  *             if sa_word_id == 1:             # <<<<<<<<<<<<<<
@@ -30904,7 +30899,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_11 = (__pyx_v_sa_word_id == 1);
     if (__pyx_t_11) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":319
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":319
  *             sa_word_id = data.arr[i]
  *             if sa_word_id == 1:
  *                 queue._append(-1)             # <<<<<<<<<<<<<<
@@ -30916,7 +30911,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":321
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":321
  *                 queue._append(-1)
  *             else:
  *                 for l from 1 <= l <= max_pattern_len:             # <<<<<<<<<<<<<<
@@ -30926,7 +30921,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_16 = __pyx_v_max_pattern_len;
       for (__pyx_v_l = 1; __pyx_v_l <= __pyx_t_16; __pyx_v_l++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":322
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":322
  *             else:
  *                 for l from 1 <= l <= max_pattern_len:
  *                     node = frequent_patterns._contains(data.arr+i, l)             # <<<<<<<<<<<<<<
@@ -30935,7 +30930,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i), __pyx_v_l);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":323
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":323
  *                 for l from 1 <= l <= max_pattern_len:
  *                     node = frequent_patterns._contains(data.arr+i, l)
  *                     if node == NULL:             # <<<<<<<<<<<<<<
@@ -30945,7 +30940,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_t_11 = (__pyx_v_node == NULL);
         if (__pyx_t_11) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":324
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":324
  *                     node = frequent_patterns._contains(data.arr+i, l)
  *                     if node == NULL:
  *                         break             # <<<<<<<<<<<<<<
@@ -30957,7 +30952,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         __pyx_L14:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":325
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":325
  *                     if node == NULL:
  *                         break
  *                     queue._append(i)             # <<<<<<<<<<<<<<
@@ -30966,7 +30961,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, __pyx_v_i);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":326
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":326
  *                         break
  *                     queue._append(i)
  *                     queue._append(l)             # <<<<<<<<<<<<<<
@@ -30975,7 +30970,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_queue->__pyx_vtab)->_append(__pyx_v_queue, __pyx_v_l);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":327
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":327
  *                     queue._append(i)
  *                     queue._append(l)
  *                     trie_node_data_append(node, i)             # <<<<<<<<<<<<<<
@@ -30991,7 +30986,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_L11:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":329
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":329
  *                     trie_node_data_append(node, i)
  * 
  *         logger.info("    Computing collocations...")             # <<<<<<<<<<<<<<
@@ -31008,7 +31003,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":330
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":330
  * 
  *         logger.info("    Computing collocations...")
  *         N = len(queue)             # <<<<<<<<<<<<<<
@@ -31018,7 +31013,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_2 = PyObject_Length(((PyObject *)__pyx_v_queue)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":331
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":331
  *         logger.info("    Computing collocations...")
  *         N = len(queue)
  *         ptr1 = 0             # <<<<<<<<<<<<<<
@@ -31027,7 +31022,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_ptr1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":332
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":332
  *         N = len(queue)
  *         ptr1 = 0
  *         sent_count = 0             # <<<<<<<<<<<<<<
@@ -31036,7 +31031,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_sent_count = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":333
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":333
  *         ptr1 = 0
  *         sent_count = 0
  *         while ptr1 < N:    # main loop             # <<<<<<<<<<<<<<
@@ -31047,7 +31042,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_11 = (__pyx_v_ptr1 < __pyx_v_N);
     if (!__pyx_t_11) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":334
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":334
  *         sent_count = 0
  *         while ptr1 < N:    # main loop
  *             i1 = queue.arr[ptr1]             # <<<<<<<<<<<<<<
@@ -31056,7 +31051,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     __pyx_v_i1 = (__pyx_v_queue->arr[__pyx_v_ptr1]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":335
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":335
  *         while ptr1 < N:    # main loop
  *             i1 = queue.arr[ptr1]
  *             if i1 > -1:             # <<<<<<<<<<<<<<
@@ -31066,7 +31061,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_11 = (__pyx_v_i1 > -1);
     if (__pyx_t_11) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":336
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":336
  *             i1 = queue.arr[ptr1]
  *             if i1 > -1:
  *                 l1 = queue.arr[ptr1+1]             # <<<<<<<<<<<<<<
@@ -31075,7 +31070,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_l1 = (__pyx_v_queue->arr[(__pyx_v_ptr1 + 1)]);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":337
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":337
  *             if i1 > -1:
  *                 l1 = queue.arr[ptr1+1]
  *                 ptr2 = ptr1 + 2             # <<<<<<<<<<<<<<
@@ -31084,7 +31079,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_ptr2 = (__pyx_v_ptr1 + 2);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":338
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":338
  *                 l1 = queue.arr[ptr1+1]
  *                 ptr2 = ptr1 + 2
  *                 while ptr2 < N:             # <<<<<<<<<<<<<<
@@ -31095,7 +31090,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_t_11 = (__pyx_v_ptr2 < __pyx_v_N);
         if (!__pyx_t_11) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":339
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":339
  *                 ptr2 = ptr1 + 2
  *                 while ptr2 < N:
  *                     i2 = queue.arr[ptr2]             # <<<<<<<<<<<<<<
@@ -31104,7 +31099,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_v_i2 = (__pyx_v_queue->arr[__pyx_v_ptr2]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":340
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":340
  *                 while ptr2 < N:
  *                     i2 = queue.arr[ptr2]
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -31120,7 +31115,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         if (__pyx_t_18) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":341
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":341
  *                     i2 = queue.arr[ptr2]
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
  *                         break             # <<<<<<<<<<<<<<
@@ -31132,7 +31127,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         __pyx_L20:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":342
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":342
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
  *                         break
  *                     l2 = queue.arr[ptr2+1]             # <<<<<<<<<<<<<<
@@ -31141,7 +31136,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_v_l2 = (__pyx_v_queue->arr[(__pyx_v_ptr2 + 1)]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":343
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":343
  *                         break
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -31151,7 +31146,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_t_18 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= __pyx_v_self->train_min_gap_size);
         if (__pyx_t_18) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":344
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":344
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  *                             i2 + l2 - i1 <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
@@ -31161,7 +31156,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __pyx_t_11 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
           if (__pyx_t_11) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":345
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":345
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):             # <<<<<<<<<<<<<<
@@ -31179,7 +31174,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         if (__pyx_t_11) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":346
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":346
  *                             i2 + l2 - i1 <= self.train_max_initial_size and
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)             # <<<<<<<<<<<<<<
@@ -31188,7 +31183,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
           __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_collocations->__pyx_vtab)->_insert(__pyx_v_collocations, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":347
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":347
  *                             l1+l2+1 <= self.max_length):
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -31197,7 +31192,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
           __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":348
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":348
  *                         node = collocations._insert(data.arr+i1, l1)
  *                         node = trie_insert(node, -1)
  *                         for i from i2 <= i < i2+l2:             # <<<<<<<<<<<<<<
@@ -31207,7 +31202,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __pyx_t_13 = (__pyx_v_i2 + __pyx_v_l2);
           for (__pyx_v_i = __pyx_v_i2; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":349
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":349
  *                         node = trie_insert(node, -1)
  *                         for i from i2 <= i < i2+l2:
  *                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -31217,7 +31212,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
             __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":350
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":350
  *                         for i from i2 <= i < i2+l2:
  *                             node = trie_insert(node, data.arr[i])
  *                         trie_node_data_append(node, i1)             # <<<<<<<<<<<<<<
@@ -31228,7 +31223,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":351
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":351
  *                             node = trie_insert(node, data.arr[i])
  *                         trie_node_data_append(node, i1)
  *                         trie_node_data_append(node, i2)             # <<<<<<<<<<<<<<
@@ -31239,7 +31234,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":352
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":352
  *                         trie_node_data_append(node, i1)
  *                         trie_node_data_append(node, i2)
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:             # <<<<<<<<<<<<<<
@@ -31249,7 +31244,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __pyx_t_11 = (((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_super_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_super_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i2), __pyx_v_l2) != NULL);
           if (__pyx_t_11) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":353
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":353
  *                         trie_node_data_append(node, i2)
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:
  *                             if super_frequent_patterns._contains(data.arr+i1, l1) != NULL:             # <<<<<<<<<<<<<<
@@ -31259,7 +31254,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
             __pyx_t_11 = (((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_super_frequent_patterns->__pyx_vtab)->_contains(__pyx_v_super_frequent_patterns, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1) != NULL);
             if (__pyx_t_11) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":354
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":354
  *                         if super_frequent_patterns._contains(data.arr+i2, l2) != NULL:
  *                             if super_frequent_patterns._contains(data.arr+i1, l1) != NULL:
  *                                 is_super = 1             # <<<<<<<<<<<<<<
@@ -31271,7 +31266,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
             }
             /*else*/ {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":356
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":356
  *                                 is_super = 1
  *                             else:
  *                                 is_super = 0             # <<<<<<<<<<<<<<
@@ -31282,7 +31277,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
             }
             __pyx_L25:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":357
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":357
  *                             else:
  *                                 is_super = 0
  *                             ptr3 = ptr2 + 2             # <<<<<<<<<<<<<<
@@ -31291,7 +31286,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
             __pyx_v_ptr3 = (__pyx_v_ptr2 + 2);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":358
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":358
  *                                 is_super = 0
  *                             ptr3 = ptr2 + 2
  *                             while ptr3 < N:             # <<<<<<<<<<<<<<
@@ -31302,7 +31297,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               __pyx_t_11 = (__pyx_v_ptr3 < __pyx_v_N);
               if (!__pyx_t_11) break;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":359
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":359
  *                             ptr3 = ptr2 + 2
  *                             while ptr3 < N:
  *                                 i3 = queue.arr[ptr3]             # <<<<<<<<<<<<<<
@@ -31311,7 +31306,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_v_i3 = (__pyx_v_queue->arr[__pyx_v_ptr3]);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":360
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":360
  *                             while ptr3 < N:
  *                                 i3 = queue.arr[ptr3]
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -31327,7 +31322,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               }
               if (__pyx_t_19) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":361
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":361
  *                                 i3 = queue.arr[ptr3]
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
  *                                     break             # <<<<<<<<<<<<<<
@@ -31339,7 +31334,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               }
               __pyx_L28:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":362
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":362
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
  *                                     break
  *                                 l3 = queue.arr[ptr3+1]             # <<<<<<<<<<<<<<
@@ -31348,7 +31343,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_v_l3 = (__pyx_v_queue->arr[(__pyx_v_ptr3 + 1)]);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":363
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":363
  *                                     break
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -31358,7 +31353,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               __pyx_t_19 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= __pyx_v_self->train_min_gap_size);
               if (__pyx_t_19) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":364
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":364
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
@@ -31368,7 +31363,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                 __pyx_t_11 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
                 if (__pyx_t_11) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":365
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":365
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):             # <<<<<<<<<<<<<<
@@ -31386,7 +31381,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               }
               if (__pyx_t_11) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":366
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":366
  *                                         i3 + l3 - i1 <= self.train_max_initial_size and
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:             # <<<<<<<<<<<<<<
@@ -31401,7 +31396,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                 }
                 if (__pyx_t_19) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":367
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":367
  *                                         l1+l2+l3+2 <= self.max_length):
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)             # <<<<<<<<<<<<<<
@@ -31410,7 +31405,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
                   __pyx_v_node = ((struct __pyx_vtabstruct_3_sa_TrieMap *)__pyx_v_collocations->__pyx_vtab)->_insert(__pyx_v_collocations, (__pyx_v_data->arr + __pyx_v_i1), __pyx_v_l1);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":368
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":368
  *                                     if is_super or super_frequent_patterns._contains(data.arr+i3, l3) != NULL:
  *                                         node = collocations._insert(data.arr+i1, l1)
  *                                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -31419,7 +31414,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
                   __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":369
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":369
  *                                         node = collocations._insert(data.arr+i1, l1)
  *                                         node = trie_insert(node, -1)
  *                                         for i from i2 <= i < i2+l2:             # <<<<<<<<<<<<<<
@@ -31429,7 +31424,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __pyx_t_13 = (__pyx_v_i2 + __pyx_v_l2);
                   for (__pyx_v_i = __pyx_v_i2; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":370
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":370
  *                                         node = trie_insert(node, -1)
  *                                         for i from i2 <= i < i2+l2:
  *                                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -31439,7 +31434,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
                   }
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":371
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":371
  *                                         for i from i2 <= i < i2+l2:
  *                                             node = trie_insert(node, data.arr[i])
  *                                         node = trie_insert(node, -1)             # <<<<<<<<<<<<<<
@@ -31448,7 +31443,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
                   __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, -1);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":372
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":372
  *                                             node = trie_insert(node, data.arr[i])
  *                                         node = trie_insert(node, -1)
  *                                         for i from i3 <= i < i3+l3:             # <<<<<<<<<<<<<<
@@ -31458,7 +31453,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __pyx_t_13 = (__pyx_v_i3 + __pyx_v_l3);
                   for (__pyx_v_i = __pyx_v_i3; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":373
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":373
  *                                         node = trie_insert(node, -1)
  *                                         for i from i3 <= i < i3+l3:
  *                                             node = trie_insert(node, data.arr[i])             # <<<<<<<<<<<<<<
@@ -31468,7 +31463,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                     __pyx_v_node = __pyx_f_3_sa_trie_insert(__pyx_v_node, (__pyx_v_data->arr[__pyx_v_i]));
                   }
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":374
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":374
  *                                         for i from i3 <= i < i3+l3:
  *                                             node = trie_insert(node, data.arr[i])
  *                                         trie_node_data_append(node, i1)             # <<<<<<<<<<<<<<
@@ -31479,7 +31474,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":375
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":375
  *                                             node = trie_insert(node, data.arr[i])
  *                                         trie_node_data_append(node, i1)
  *                                         trie_node_data_append(node, i2)             # <<<<<<<<<<<<<<
@@ -31490,7 +31485,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __Pyx_GOTREF(__pyx_t_3);
                   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":376
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":376
  *                                         trie_node_data_append(node, i1)
  *                                         trie_node_data_append(node, i2)
  *                                         trie_node_data_append(node, i3)             # <<<<<<<<<<<<<<
@@ -31507,7 +31502,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               }
               __pyx_L29:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":377
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":377
  *                                         trie_node_data_append(node, i2)
  *                                         trie_node_data_append(node, i3)
  *                                 ptr3 = ptr3 + 2             # <<<<<<<<<<<<<<
@@ -31524,7 +31519,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         __pyx_L21:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":378
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":378
  *                                         trie_node_data_append(node, i3)
  *                                 ptr3 = ptr3 + 2
  *                     ptr2 = ptr2 + 2             # <<<<<<<<<<<<<<
@@ -31535,7 +31530,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       }
       __pyx_L19_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":379
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":379
  *                                 ptr3 = ptr3 + 2
  *                     ptr2 = ptr2 + 2
  *                 ptr1 = ptr1 + 2             # <<<<<<<<<<<<<<
@@ -31547,7 +31542,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":381
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":381
  *                 ptr1 = ptr1 + 2
  *             else:
  *                 sent_count = sent_count + 1             # <<<<<<<<<<<<<<
@@ -31556,7 +31551,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_sent_count = (__pyx_v_sent_count + 1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":382
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":382
  *             else:
  *                 sent_count = sent_count + 1
  *                 if sent_count % 10000 == 0:             # <<<<<<<<<<<<<<
@@ -31566,7 +31561,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_19 = (__Pyx_mod_long(__pyx_v_sent_count, 10000) == 0);
       if (__pyx_t_19) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":383
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":383
  *                 sent_count = sent_count + 1
  *                 if sent_count % 10000 == 0:
  *                     logger.debug("        %d sentences", sent_count)             # <<<<<<<<<<<<<<
@@ -31597,7 +31592,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       }
       __pyx_L35:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":384
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":384
  *                 if sent_count % 10000 == 0:
  *                     logger.debug("        %d sentences", sent_count)
  *                 ptr1 = ptr1 + 1             # <<<<<<<<<<<<<<
@@ -31609,7 +31604,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_L17:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":386
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":386
  *                 ptr1 = ptr1 + 1
  * 
  *         self.precomputed_collocations = collocations.toMap(False)             # <<<<<<<<<<<<<<
@@ -31635,7 +31630,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_self->precomputed_collocations = __pyx_t_8;
   __pyx_t_8 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":387
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":387
  * 
  *         self.precomputed_collocations = collocations.toMap(False)
  *         self.precomputed_index = frequent_patterns.toMap(True)             # <<<<<<<<<<<<<<
@@ -31661,7 +31656,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_self->precomputed_index = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":389
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":389
  *         self.precomputed_index = frequent_patterns.toMap(True)
  * 
  *         x = 0             # <<<<<<<<<<<<<<
@@ -31671,7 +31666,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_x = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":390
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":390
  * 
  *         x = 0
  *         for pattern1 in J_set:             # <<<<<<<<<<<<<<
@@ -31697,7 +31692,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":391
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":391
  *         x = 0
  *         for pattern1 in J_set:
  *             for pattern2 in J_set:             # <<<<<<<<<<<<<<
@@ -31723,7 +31718,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_pattern2 = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":392
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":392
  *         for pattern1 in J_set:
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:             # <<<<<<<<<<<<<<
@@ -31735,7 +31730,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) < __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":393
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":393
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -31751,7 +31746,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_combined_pattern = __pyx_t_7;
         __pyx_t_7 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":394
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":394
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     J2_set.add(combined_pattern)             # <<<<<<<<<<<<<<
@@ -31767,7 +31762,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":396
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":396
  *                     J2_set.add(combined_pattern)
  * 
  *         for pattern1 in I_set:             # <<<<<<<<<<<<<<
@@ -31793,7 +31788,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":397
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":397
  * 
  *         for pattern1 in I_set:
  *             for pattern2 in I_set:             # <<<<<<<<<<<<<<
@@ -31819,7 +31814,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_pattern2 = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":398
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":398
  *         for pattern1 in I_set:
  *             for pattern2 in I_set:
  *                 x = x+1             # <<<<<<<<<<<<<<
@@ -31832,7 +31827,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_x = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":399
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":399
  *             for pattern2 in I_set:
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:             # <<<<<<<<<<<<<<
@@ -31844,7 +31839,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_19 = (((__pyx_t_14 + __pyx_t_2) + 1) <= __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":400
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":400
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -31860,7 +31855,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_combined_pattern = __pyx_t_8;
         __pyx_t_8 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":401
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":401
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
@@ -31876,7 +31871,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":403
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":403
  *                     IJ_set.add(combined_pattern)
  * 
  *         for pattern1 in I_set:             # <<<<<<<<<<<<<<
@@ -31902,7 +31897,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_pattern1 = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":404
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":404
  * 
  *         for pattern1 in I_set:
  *             for pattern2 in J2_set:             # <<<<<<<<<<<<<<
@@ -31928,7 +31923,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_pattern2 = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":405
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":405
  *         for pattern1 in I_set:
  *             for pattern2 in J2_set:
  *                 x = x+2             # <<<<<<<<<<<<<<
@@ -31941,7 +31936,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_x = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":406
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":406
  *             for pattern2 in J2_set:
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:             # <<<<<<<<<<<<<<
@@ -31953,7 +31948,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_19 = (((__pyx_t_2 + __pyx_t_14) + 1) <= __pyx_v_self->max_length);
       if (__pyx_t_19) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":407
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":407
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -31969,7 +31964,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_combined_pattern = __pyx_t_7;
         __pyx_t_7 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":408
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":408
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
@@ -31978,7 +31973,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_t_15 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":409
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":409
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1             # <<<<<<<<<<<<<<
@@ -31994,7 +31989,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_combined_pattern = __pyx_t_8;
         __pyx_t_8 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":410
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":410
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
@@ -32010,7 +32005,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":412
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":412
  *                     IJ_set.add(combined_pattern)
  * 
  *         N = len(pattern_rank)             # <<<<<<<<<<<<<<
@@ -32020,7 +32015,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_14 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_N = __pyx_t_14;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":413
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":413
  * 
  *         N = len(pattern_rank)
  *         cost_by_rank = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -32039,7 +32034,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_cost_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":414
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":414
  *         N = len(pattern_rank)
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -32058,7 +32053,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_count_by_rank = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":415
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":415
  *         cost_by_rank = IntList(initial_len=N)
  *         count_by_rank = IntList(initial_len=N)
  *         for pattern, arr in self.precomputed_collocations.iteritems():             # <<<<<<<<<<<<<<
@@ -32088,7 +32083,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_arr = __pyx_t_8;
     __pyx_t_8 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":416
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":416
  *         count_by_rank = IntList(initial_len=N)
  *         for pattern, arr in self.precomputed_collocations.iteritems():
  *             if pattern not in IJ_set:             # <<<<<<<<<<<<<<
@@ -32098,7 +32093,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, ((PyObject *)__pyx_v_IJ_set), Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":417
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":417
  *         for pattern, arr in self.precomputed_collocations.iteritems():
  *             if pattern not in IJ_set:
  *                 s = ""             # <<<<<<<<<<<<<<
@@ -32109,7 +32104,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_XDECREF(__pyx_v_s);
       __pyx_v_s = ((PyObject *)__pyx_kp_s_45);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":418
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":418
  *             if pattern not in IJ_set:
  *                 s = ""
  *                 for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -32154,7 +32149,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_word_id = __pyx_t_3;
         __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":419
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":419
  *                 s = ""
  *                 for word_id in pattern:
  *                     if word_id == -1:             # <<<<<<<<<<<<<<
@@ -32166,7 +32161,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_19) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":420
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":420
  *                 for word_id in pattern:
  *                     if word_id == -1:
  *                         s = s + "X "             # <<<<<<<<<<<<<<
@@ -32182,7 +32177,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":422
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":422
  *                         s = s + "X "
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "             # <<<<<<<<<<<<<<
@@ -32205,7 +32200,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       }
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":423
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":423
  *                     else:
  *                         s = s + darray.id2word[word_id] + " "
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)             # <<<<<<<<<<<<<<
@@ -32234,7 +32229,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":425
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":425
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)
  *             else:
  *                 chunk = ()             # <<<<<<<<<<<<<<
@@ -32245,7 +32240,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_XDECREF(((PyObject *)__pyx_v_chunk));
       __pyx_v_chunk = __pyx_empty_tuple;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":426
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":426
  *             else:
  *                 chunk = ()
  *                 max_rank = 0             # <<<<<<<<<<<<<<
@@ -32254,7 +32249,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_max_rank = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":427
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":427
  *                 chunk = ()
  *                 max_rank = 0
  *                 arity = 0             # <<<<<<<<<<<<<<
@@ -32265,7 +32260,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_XDECREF(__pyx_v_arity);
       __pyx_v_arity = __pyx_int_0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":428
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":428
  *                 max_rank = 0
  *                 arity = 0
  *                 for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -32310,7 +32305,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_word_id = __pyx_t_8;
         __pyx_t_8 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":429
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":429
  *                 arity = 0
  *                 for word_id in pattern:
  *                     if word_id == -1:             # <<<<<<<<<<<<<<
@@ -32322,7 +32317,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
         if (__pyx_t_19) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":430
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":430
  *                 for word_id in pattern:
  *                     if word_id == -1:
  *                         max_rank = max(max_rank, pattern_rank[chunk])             # <<<<<<<<<<<<<<
@@ -32352,7 +32347,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __pyx_v_max_rank = __pyx_t_16;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":431
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":431
  *                     if word_id == -1:
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1             # <<<<<<<<<<<<<<
@@ -32365,7 +32360,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __pyx_v_arity = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":432
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":432
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1
  *                         chunk = ()             # <<<<<<<<<<<<<<
@@ -32379,7 +32374,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":434
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":434
  *                         chunk = ()
  *                     else:
  *                         chunk = chunk + (word_id,)             # <<<<<<<<<<<<<<
@@ -32402,7 +32397,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       }
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":435
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":435
  *                     else:
  *                         chunk = chunk + (word_id,)
  *                 max_rank = max(max_rank, pattern_rank[chunk])             # <<<<<<<<<<<<<<
@@ -32432,7 +32427,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __pyx_v_max_rank = __pyx_t_16;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":436
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":436
  *                         chunk = chunk + (word_id,)
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))             # <<<<<<<<<<<<<<
@@ -32442,7 +32437,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_12 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       (__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) = ((__pyx_v_cost_by_rank->arr[__pyx_v_max_rank]) + (4 * __pyx_t_12));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":437
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":437
  *                 max_rank = max(max_rank, pattern_rank[chunk])
  *                 cost_by_rank.arr[max_rank] = cost_by_rank.arr[max_rank] + (4*len(arr))
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))             # <<<<<<<<<<<<<<
@@ -32472,7 +32467,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":439
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":439
  *                 count_by_rank.arr[max_rank] = count_by_rank.arr[max_rank] + (len(arr)/(arity+1))
  * 
  *         cumul_cost = 0             # <<<<<<<<<<<<<<
@@ -32482,7 +32477,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_cumul_cost = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":440
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":440
  * 
  *         cumul_cost = 0
  *         cumul_count = 0             # <<<<<<<<<<<<<<
@@ -32492,7 +32487,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_cumul_count = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":441
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":441
  *         cumul_cost = 0
  *         cumul_count = 0
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -32502,7 +32497,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_13 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":442
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":442
  *         cumul_count = 0
  *         for i from 0 <= i < N:
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]             # <<<<<<<<<<<<<<
@@ -32518,7 +32513,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_cumul_cost = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":443
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":443
  *         for i from 0 <= i < N:
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]
  *             cumul_count = cumul_count + count_by_rank.arr[i]             # <<<<<<<<<<<<<<
@@ -32534,7 +32529,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_cumul_count = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":444
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":444
  *             cumul_cost = cumul_cost + cost_by_rank.arr[i]
  *             cumul_count = cumul_count + count_by_rank.arr[i]
  *             logger.debug("RANK %d\tCOUNT, COST: %d    %d\tCUMUL: %d, %d", i, count_by_rank.arr[i], cost_by_rank.arr[i], cumul_count, cumul_cost)             # <<<<<<<<<<<<<<
@@ -32579,7 +32574,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":446
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":446
  *             logger.debug("RANK %d\tCOUNT, COST: %d    %d\tCUMUL: %d, %d", i, count_by_rank.arr[i], cost_by_rank.arr[i], cumul_count, cumul_cost)
  * 
  *         num_found_patterns = len(self.precomputed_collocations)             # <<<<<<<<<<<<<<
@@ -32595,7 +32590,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_num_found_patterns = __pyx_t_8;
   __pyx_t_8 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":447
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":447
  * 
  *         num_found_patterns = len(self.precomputed_collocations)
  *         for pattern in IJ_set:             # <<<<<<<<<<<<<<
@@ -32621,7 +32616,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_pattern = __pyx_t_7;
     __pyx_t_7 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":448
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":448
  *         num_found_patterns = len(self.precomputed_collocations)
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:             # <<<<<<<<<<<<<<
@@ -32631,7 +32626,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_19 = (__Pyx_PySequence_Contains(__pyx_v_pattern, __pyx_v_self->precomputed_collocations, Py_NE)); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_19) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":449
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":449
  *         for pattern in IJ_set:
  *             if pattern not in self.precomputed_collocations:
  *                 self.precomputed_collocations[pattern] = IntList()             # <<<<<<<<<<<<<<
@@ -32648,7 +32643,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   }
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":451
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":451
  *                 self.precomputed_collocations[pattern] = IntList()
  * 
  *         cdef float stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -32657,7 +32652,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_stop_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":452
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":452
  * 
  *         cdef float stop_time = monitor_cpu()
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)             # <<<<<<<<<<<<<<
@@ -32695,7 +32690,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":453
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":453
  *         cdef float stop_time = monitor_cpu()
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))             # <<<<<<<<<<<<<<
@@ -32726,7 +32721,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":454
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":454
  *         logger.info("Precomputed collocations for %d patterns out of %d possible (upper bound %d)", num_found_patterns, len(self.precomputed_collocations), x)
  *         logger.info("Precomputed inverted index for %d patterns ", len(self.precomputed_index))
  *         logger.info("Precomputation took %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
@@ -32812,7 +32807,7 @@ static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObje
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,0};
     PyObject* values[3] = {0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":11
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":11
  *     cdef IntList ha
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
@@ -32891,7 +32886,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":12
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":12
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):
  *         self.darray = DataArray()             # <<<<<<<<<<<<<<
@@ -32906,7 +32901,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":13
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":13
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):
  *         self.darray = DataArray()
  *         self.sa = IntList()             # <<<<<<<<<<<<<<
@@ -32921,7 +32916,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":14
  *         self.darray = DataArray()
  *         self.sa = IntList()
  *         self.ha = IntList()             # <<<<<<<<<<<<<<
@@ -32936,7 +32931,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":15
  *         self.sa = IntList()
  *         self.ha = IntList()
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -32946,7 +32941,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_binary); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":16
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":16
  *         self.ha = IntList()
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
@@ -32968,7 +32963,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":17
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -32978,7 +32973,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_from_text); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":18
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":18
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             self.read_text(from_text, side)             # <<<<<<<<<<<<<<
@@ -33028,7 +33023,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":20
  *             self.read_text(from_text, side)
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -33046,7 +33041,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":21
  * 
  *     def __getitem__(self, i):
  *         return self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -33130,7 +33125,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":23
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":23
  *         return self.sa.arr[i]
  * 
  *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
@@ -33170,7 +33165,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":29
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":29
  *         cdef IntList isa, word_count
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)             # <<<<<<<<<<<<<<
@@ -33194,7 +33189,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_v_self->darray = ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":30
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)             # <<<<<<<<<<<<<<
@@ -33207,7 +33202,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_v_N = __pyx_t_3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":31
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)
  *         V = len(self.darray.id2word)             # <<<<<<<<<<<<<<
@@ -33220,7 +33215,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __pyx_v_V = __pyx_t_3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":33
  *         V = len(self.darray.id2word)
  * 
  *         self.sa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -33242,7 +33237,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_v_self->sa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":34
  * 
  *         self.sa = IntList(initial_len=N)
  *         self.ha = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
@@ -33264,7 +33259,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_v_self->ha = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":36
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":36
  *         self.ha = IntList(initial_len=V+1)
  * 
  *         isa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -33283,7 +33278,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_v_isa = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":37
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":37
  * 
  *         isa = IntList(initial_len=N)
  *         word_count = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
@@ -33302,7 +33297,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_v_word_count = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":40
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":40
  * 
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -33311,7 +33306,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
   __pyx_v_sort_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":41
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":41
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()
  *         cdef float start_time = sort_start_time             # <<<<<<<<<<<<<<
@@ -33320,7 +33315,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
   __pyx_v_start_time = __pyx_v_sort_start_time;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":42
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":42
  *         cdef float sort_start_time = monitor_cpu()
  *         cdef float start_time = sort_start_time
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -33330,7 +33325,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":43
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":43
  *         cdef float start_time = sort_start_time
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
@@ -33339,7 +33334,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":44
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":44
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1             # <<<<<<<<<<<<<<
@@ -33349,7 +33344,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     (__pyx_v_word_count->arr[__pyx_v_a_i]) = ((__pyx_v_word_count->arr[__pyx_v_a_i]) + 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":46
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":46
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  *         n = 0             # <<<<<<<<<<<<<<
@@ -33358,7 +33353,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
   __pyx_v_n = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":47
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":47
  * 
  *         n = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -33368,7 +33363,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_t_5 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":48
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":48
  *         n = 0
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n             # <<<<<<<<<<<<<<
@@ -33377,7 +33372,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     (__pyx_v_self->ha->arr[__pyx_v_i]) = __pyx_v_n;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":49
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":49
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]             # <<<<<<<<<<<<<<
@@ -33386,7 +33381,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_n = (__pyx_v_n + (__pyx_v_word_count->arr[__pyx_v_i]));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":50
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":50
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0             # <<<<<<<<<<<<<<
@@ -33396,7 +33391,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     (__pyx_v_word_count->arr[__pyx_v_i]) = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":52
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":52
  *             word_count.arr[i] = 0
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -33406,7 +33401,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":53
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":53
  * 
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
@@ -33415,7 +33410,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_a_i = (__pyx_v_self->darray->data->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":54
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":54
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i             # <<<<<<<<<<<<<<
@@ -33424,7 +33419,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_a_i]) + (__pyx_v_word_count->arr[__pyx_v_a_i]))]) = __pyx_v_i;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":55
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":55
  *             a_i = self.darray.data.arr[i]
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket             # <<<<<<<<<<<<<<
@@ -33433,7 +33428,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     (__pyx_v_isa->arr[__pyx_v_i]) = ((__pyx_v_self->ha->arr[(__pyx_v_a_i + 1)]) - 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":56
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":56
  *             self.sa.arr[self.ha.arr[a_i] + word_count.arr[a_i]] = i
  *             isa.arr[i] = self.ha.arr[a_i + 1] - 1 # bucket pointer is last index in bucket
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1             # <<<<<<<<<<<<<<
@@ -33443,7 +33438,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     (__pyx_v_word_count->arr[__pyx_v_a_i]) = ((__pyx_v_word_count->arr[__pyx_v_a_i]) + 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":59
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":59
  * 
  *         '''Determine size of initial runs'''
  *         current_run = 0             # <<<<<<<<<<<<<<
@@ -33452,7 +33447,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
   __pyx_v_current_run = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":60
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":60
  *         '''Determine size of initial runs'''
  *         current_run = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -33462,7 +33457,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_t_5 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":61
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":61
  *         current_run = 0
  *         for i from 0 <= i < V+1:
  *             if i < V and self.ha.arr[i+1] - self.ha.arr[i] == 1:             # <<<<<<<<<<<<<<
@@ -33478,7 +33473,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     }
     if (__pyx_t_8) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":62
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":62
  *         for i from 0 <= i < V+1:
  *             if i < V and self.ha.arr[i+1] - self.ha.arr[i] == 1:
  *                 current_run = current_run + 1             # <<<<<<<<<<<<<<
@@ -33490,7 +33485,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":64
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":64
  *                 current_run = current_run + 1
  *             else:
  *                 if current_run > 0:             # <<<<<<<<<<<<<<
@@ -33500,7 +33495,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
       __pyx_t_8 = (__pyx_v_current_run > 0);
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":65
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":65
  *             else:
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run             # <<<<<<<<<<<<<<
@@ -33509,7 +33504,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
         (__pyx_v_self->sa->arr[((__pyx_v_self->ha->arr[__pyx_v_i]) - __pyx_v_current_run)]) = (-__pyx_v_current_run);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":66
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":66
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run
  *                     current_run = 0             # <<<<<<<<<<<<<<
@@ -33524,7 +33519,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __pyx_L11:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":68
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":68
  *                     current_run = 0
  * 
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
@@ -33552,7 +33547,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":71
  * 
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1             # <<<<<<<<<<<<<<
@@ -33561,7 +33556,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
   __pyx_v_h = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":72
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":72
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1
  *         while self.sa.arr[0] != -N:             # <<<<<<<<<<<<<<
@@ -33572,7 +33567,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __pyx_t_8 = ((__pyx_v_self->sa->arr[0]) != (-__pyx_v_N));
     if (!__pyx_t_8) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":73
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":73
  *         h = 1
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -33581,7 +33576,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_sort_start_time = __pyx_f_3_sa_monitor_cpu();
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":74
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":74
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)             # <<<<<<<<<<<<<<
@@ -33609,7 +33604,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":75
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":75
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0             # <<<<<<<<<<<<<<
@@ -33618,7 +33613,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_i = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":76
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":76
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0
  *             skip = 0             # <<<<<<<<<<<<<<
@@ -33627,7 +33622,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_skip = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":77
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":77
  *             i = 0
  *             skip = 0
  *             while i < N:             # <<<<<<<<<<<<<<
@@ -33638,7 +33633,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
       __pyx_t_8 = (__pyx_v_i < __pyx_v_N);
       if (!__pyx_t_8) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":78
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":78
  *             skip = 0
  *             while i < N:
  *                 if self.sa.arr[i] < 0:             # <<<<<<<<<<<<<<
@@ -33648,7 +33643,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
       __pyx_t_8 = ((__pyx_v_self->sa->arr[__pyx_v_i]) < 0);
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":79
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":79
  *             while i < N:
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -33657,7 +33652,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
         __pyx_v_skip = (__pyx_v_skip + (__pyx_v_self->sa->arr[__pyx_v_i]));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":80
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":80
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]
  *                     i = i - self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -33669,7 +33664,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":82
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":82
  *                     i = i - self.sa.arr[i]
  *                 else:
  *                     if skip < 0:             # <<<<<<<<<<<<<<
@@ -33679,7 +33674,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
         __pyx_t_8 = (__pyx_v_skip < 0);
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":83
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":83
  *                 else:
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
@@ -33688,7 +33683,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
           (__pyx_v_self->sa->arr[(__pyx_v_i + __pyx_v_skip)]) = __pyx_v_skip;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":84
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":84
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0             # <<<<<<<<<<<<<<
@@ -33700,7 +33695,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
         }
         __pyx_L18:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":85
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":85
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]             # <<<<<<<<<<<<<<
@@ -33709,7 +33704,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
         __pyx_v_j = (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":86
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":86
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)             # <<<<<<<<<<<<<<
@@ -33744,7 +33739,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
         __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":87
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":87
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1             # <<<<<<<<<<<<<<
@@ -33756,7 +33751,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
       __pyx_L17:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":88
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":88
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  *             if skip < 0:             # <<<<<<<<<<<<<<
@@ -33766,7 +33761,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __pyx_t_8 = (__pyx_v_skip < 0);
     if (__pyx_t_8) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":89
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":89
  *                     i = j+1
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
@@ -33778,7 +33773,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     }
     __pyx_L19:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":90
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":90
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2             # <<<<<<<<<<<<<<
@@ -33787,7 +33782,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_h = (__pyx_v_h * 2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":91
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":91
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2
  *             logger.debug("    Refinement took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
@@ -33816,7 +33811,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":94
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":94
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
@@ -33833,7 +33828,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":95
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":95
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -33843,7 +33838,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":96
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":96
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]             # <<<<<<<<<<<<<<
@@ -33852,7 +33847,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_j = (__pyx_v_isa->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":97
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":97
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i             # <<<<<<<<<<<<<<
@@ -33862,7 +33857,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     (__pyx_v_self->sa->arr[__pyx_v_j]) = __pyx_v_i;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":98
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":98
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))             # <<<<<<<<<<<<<<
@@ -34000,7 +33995,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_7q3sort(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":100
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":100
  *         logger.info("Suffix array construction took %f seconds", (monitor_cpu() - start_time))
  * 
  *     def q3sort(self, int i, int j, int h, IntList isa, pad=""):             # <<<<<<<<<<<<<<
@@ -34030,7 +34025,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("q3sort", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":107
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":107
  *         cdef int k, midpoint, pval, phead, ptail, tmp
  * 
  *         if j-i < -1:             # <<<<<<<<<<<<<<
@@ -34040,7 +34035,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) < -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":108
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":108
  * 
  *         if j-i < -1:
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))             # <<<<<<<<<<<<<<
@@ -34077,7 +34072,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":109
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":109
  *         if j-i < -1:
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))
  *         if j-i == -1:    # recursive base case -- empty interval             # <<<<<<<<<<<<<<
@@ -34087,7 +34082,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":110
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":110
  *             raise Exception("Unexpected condition found in q3sort: sort from %d to %d" % (i,j))
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return             # <<<<<<<<<<<<<<
@@ -34101,7 +34096,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":111
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":111
  *         if j-i == -1:    # recursive base case -- empty interval
  *             return
  *         if (j-i == 0):    # recursive base case -- singleton interval             # <<<<<<<<<<<<<<
@@ -34111,7 +34106,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   __pyx_t_1 = ((__pyx_v_j - __pyx_v_i) == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":112
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":112
  *             return
  *         if (j-i == 0):    # recursive base case -- singleton interval
  *             isa.arr[self.sa.arr[i]] = i             # <<<<<<<<<<<<<<
@@ -34120,7 +34115,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
     (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_i])]) = __pyx_v_i;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":113
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":113
  *         if (j-i == 0):    # recursive base case -- singleton interval
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1             # <<<<<<<<<<<<<<
@@ -34129,7 +34124,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
     (__pyx_v_self->sa->arr[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":114
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":114
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1
  *             return             # <<<<<<<<<<<<<<
@@ -34143,7 +34138,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":123
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":123
  *         # If the method of assigning word_id's is changed, this method
  *         # may need to be reconsidered as well.
  *         midpoint = (i+j)/2             # <<<<<<<<<<<<<<
@@ -34152,7 +34147,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_i + __pyx_v_j), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":124
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":124
  *         # may need to be reconsidered as well.
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]             # <<<<<<<<<<<<<<
@@ -34161,7 +34156,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
   __pyx_v_pval = (__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_h)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":125
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":125
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:             # <<<<<<<<<<<<<<
@@ -34171,7 +34166,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   __pyx_t_1 = (__pyx_v_i != __pyx_v_midpoint);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":126
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":126
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -34180,7 +34175,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
     __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_midpoint]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":127
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":127
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -34189,7 +34184,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
     (__pyx_v_self->sa->arr[__pyx_v_midpoint]) = (__pyx_v_self->sa->arr[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":128
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":128
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp             # <<<<<<<<<<<<<<
@@ -34201,7 +34196,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":129
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":129
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  *         phead = i             # <<<<<<<<<<<<<<
@@ -34210,7 +34205,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
   __pyx_v_phead = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":130
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":130
  *             self.sa.arr[i] = tmp
  *         phead = i
  *         ptail = i             # <<<<<<<<<<<<<<
@@ -34219,7 +34214,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
   __pyx_v_ptail = __pyx_v_i;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":134
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":134
  *         # find the three partitions.    phead marks the first element
  *         # of the middle partition, and ptail marks the last element
  *         for k from i+1 <= k < j+1:             # <<<<<<<<<<<<<<
@@ -34229,7 +34224,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   __pyx_t_5 = (__pyx_v_j + 1);
   for (__pyx_v_k = (__pyx_v_i + 1); __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":135
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":135
  *         # of the middle partition, and ptail marks the last element
  *         for k from i+1 <= k < j+1:
  *             if isa.arr[self.sa.arr[k] + h] < pval:             # <<<<<<<<<<<<<<
@@ -34239,7 +34234,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
     __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) < __pyx_v_pval);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":136
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":136
  *         for k from i+1 <= k < j+1:
  *             if isa.arr[self.sa.arr[k] + h] < pval:
  *                 if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -34249,7 +34244,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
       __pyx_t_1 = (__pyx_v_k > (__pyx_v_ptail + 1));
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":137
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":137
  *             if isa.arr[self.sa.arr[k] + h] < pval:
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
@@ -34258,7 +34253,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
         __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":138
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":138
  *                 if k > ptail+1:
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]             # <<<<<<<<<<<<<<
@@ -34267,7 +34262,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
         (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":139
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":139
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]             # <<<<<<<<<<<<<<
@@ -34276,7 +34271,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
         (__pyx_v_self->sa->arr[__pyx_v_k]) = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":140
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":140
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = self.sa.arr[ptail+1]
  *                     self.sa.arr[ptail+1] = tmp             # <<<<<<<<<<<<<<
@@ -34288,7 +34283,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":142
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":142
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
@@ -34297,7 +34292,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
         __pyx_v_tmp = (__pyx_v_self->sa->arr[__pyx_v_phead]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":143
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":143
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]             # <<<<<<<<<<<<<<
@@ -34306,7 +34301,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
         (__pyx_v_self->sa->arr[__pyx_v_phead]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":144
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":144
  *                     tmp = self.sa.arr[phead]
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp             # <<<<<<<<<<<<<<
@@ -34317,7 +34312,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
       }
       __pyx_L10:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":145
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":145
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1             # <<<<<<<<<<<<<<
@@ -34326,7 +34321,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
       __pyx_v_phead = (__pyx_v_phead + 1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":146
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":146
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  *                 ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -34338,7 +34333,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":148
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":148
  *                 ptail = ptail + 1
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:             # <<<<<<<<<<<<<<
@@ -34348,7 +34343,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
       __pyx_t_1 = ((__pyx_v_isa->arr[((__pyx_v_self->sa->arr[__pyx_v_k]) + __pyx_v_h)]) == __pyx_v_pval);
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":149
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":149
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -34358,7 +34353,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
         __pyx_t_1 = (__pyx_v_k > (__pyx_v_ptail + 1));
         if (__pyx_t_1) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":150
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":150
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]             # <<<<<<<<<<<<<<
@@ -34367,7 +34362,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
           __pyx_v_tmp = (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":151
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":151
  *                     if k > ptail+1:
  *                         tmp = self.sa.arr[ptail+1]
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]             # <<<<<<<<<<<<<<
@@ -34376,7 +34371,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
           (__pyx_v_self->sa->arr[(__pyx_v_ptail + 1)]) = (__pyx_v_self->sa->arr[__pyx_v_k]);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":152
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":152
  *                         tmp = self.sa.arr[ptail+1]
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp             # <<<<<<<<<<<<<<
@@ -34388,7 +34383,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
         }
         __pyx_L12:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":153
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":153
  *                         self.sa.arr[ptail+1] = self.sa.arr[k]
  *                         self.sa.arr[k] = tmp
  *                     ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -34403,7 +34398,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
     __pyx_L9:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":156
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":156
  * 
  *         # recursively sort smaller suffixes
  *         self.q3sort(i, phead-1, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
@@ -34443,7 +34438,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":160
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":160
  *         # update suffixes with pivot value
  *         # corresponds to update_group function in Larsson & Sadakane
  *         for k from phead <= k < ptail+1:             # <<<<<<<<<<<<<<
@@ -34453,7 +34448,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   __pyx_t_5 = (__pyx_v_ptail + 1);
   for (__pyx_v_k = __pyx_v_phead; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":161
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":161
  *         # corresponds to update_group function in Larsson & Sadakane
  *         for k from phead <= k < ptail+1:
  *             isa.arr[self.sa.arr[k]] = ptail             # <<<<<<<<<<<<<<
@@ -34463,7 +34458,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
     (__pyx_v_isa->arr[(__pyx_v_self->sa->arr[__pyx_v_k])]) = __pyx_v_ptail;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":162
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":162
  *         for k from phead <= k < ptail+1:
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:             # <<<<<<<<<<<<<<
@@ -34473,7 +34468,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   __pyx_t_1 = (__pyx_v_phead == __pyx_v_ptail);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":163
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":163
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1             # <<<<<<<<<<<<<<
@@ -34485,7 +34480,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   }
   __pyx_L15:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":166
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":166
  * 
  *         # recursively sort larger suffixes
  *         self.q3sort(ptail+1, j, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
@@ -34563,7 +34558,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_9write_text(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":169
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":169
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -34582,7 +34577,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_8write_text(struct __pyx_obj_3_sa_S
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_text", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":170
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":170
  * 
  *     def write_text(self, char* filename):
  *         self.darray.write_text(filename)             # <<<<<<<<<<<<<<
@@ -34639,7 +34634,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_binary(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":172
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":172
  *         self.darray.write_text(filename)
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -34653,7 +34648,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_binary(struct __pyx_obj_3_sa
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":174
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":174
  *     def read_binary(self, char* filename):
  *         cdef FILE *f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -34662,7 +34657,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_binary(struct __pyx_obj_3_sa
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":175
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":175
  *         cdef FILE *f
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)             # <<<<<<<<<<<<<<
@@ -34671,7 +34666,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_binary(struct __pyx_obj_3_sa
  */
   ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->read_handle(__pyx_v_self->darray, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":176
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":176
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)             # <<<<<<<<<<<<<<
@@ -34680,7 +34675,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_binary(struct __pyx_obj_3_sa
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->read_handle(__pyx_v_self->sa, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":177
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":177
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)             # <<<<<<<<<<<<<<
@@ -34689,7 +34684,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_binary(struct __pyx_obj_3_sa
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->read_handle(__pyx_v_self->ha, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":178
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":178
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -34725,7 +34720,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13write_binary(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":180
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":180
  *         fclose(f)
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -34739,7 +34734,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12write_binary(struct __pyx_obj_3_s
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":182
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":182
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -34748,7 +34743,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12write_binary(struct __pyx_obj_3_s
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":183
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)             # <<<<<<<<<<<<<<
@@ -34757,7 +34752,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12write_binary(struct __pyx_obj_3_s
  */
   ((struct __pyx_vtabstruct_3_sa_DataArray *)__pyx_v_self->darray->__pyx_vtab)->write_handle(__pyx_v_self->darray, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":184
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":184
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)             # <<<<<<<<<<<<<<
@@ -34766,7 +34761,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12write_binary(struct __pyx_obj_3_s
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->sa->__pyx_vtab)->write_handle(__pyx_v_self->sa, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":185
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)             # <<<<<<<<<<<<<<
@@ -34775,7 +34770,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12write_binary(struct __pyx_obj_3_s
  */
   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_self->ha->__pyx_vtab)->write_handle(__pyx_v_self->ha, __pyx_v_f);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":186
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":186
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -34811,7 +34806,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_enhanced(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":188
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":188
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -34843,7 +34838,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":189
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":189
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -34883,7 +34878,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
           __pyx_v_f = __pyx_t_4;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":190
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":190
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             self.darray.write_enhanced_handle(f)             # <<<<<<<<<<<<<<
@@ -34903,7 +34898,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
           __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":191
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":191
  *         with open(filename, "w") as f:
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:             # <<<<<<<<<<<<<<
@@ -34948,7 +34943,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
             __pyx_v_a_i = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":192
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":192
  *             self.darray.write_enhanced_handle(f)
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)             # <<<<<<<<<<<<<<
@@ -34972,7 +34967,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":193
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":193
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -34986,7 +34981,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":194
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":194
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  *             for w_i in self.ha:             # <<<<<<<<<<<<<<
@@ -35031,7 +35026,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
             __pyx_v_w_i = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":195
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":195
  *             f.write("\n")
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)             # <<<<<<<<<<<<<<
@@ -35055,7 +35050,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
           }
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":196
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":196
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -35079,7 +35074,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
         __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":189
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":189
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -35177,7 +35172,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":198
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":198
  *             f.write("\n")
  * 
  *     cdef int __search_high(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -35192,7 +35187,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("__search_high", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":201
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":201
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -35202,7 +35197,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":202
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":202
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -35215,7 +35210,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":203
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":203
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -35224,7 +35219,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":204
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":204
  *             return high
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -35234,7 +35229,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":205
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":205
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__search_high(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
@@ -35247,7 +35242,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":207
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":207
  *             return self.__search_high(word_id, offset, midpoint+1, high)
  *         else:
  *             return self.__search_high(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
@@ -35265,7 +35260,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":209
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":209
  *             return self.__search_high(word_id, offset, low, midpoint)
  * 
  *     cdef int __search_low(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -35280,7 +35275,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("__search_low", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":212
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":212
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -35290,7 +35285,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":213
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":213
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -35303,7 +35298,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":214
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":214
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -35312,7 +35307,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":215
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":215
  *             return high
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -35322,7 +35317,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":216
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":216
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__search_low(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
@@ -35335,7 +35330,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":218
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":218
  *             return self.__search_low(word_id, offset, low, midpoint)
  *         else:
  *             return self.__search_low(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
@@ -35353,7 +35348,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":220
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":220
  *             return self.__search_low(word_id, offset, midpoint+1, high)
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):             # <<<<<<<<<<<<<<
@@ -35372,7 +35367,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get_range", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":221
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":221
  * 
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  *         return (self.__search_low(word_id, offset, low, midpoint),             # <<<<<<<<<<<<<<
@@ -35383,7 +35378,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_SuffixArray *)__pyx_v_self->__pyx_vtab)->__pyx___search_low(__pyx_v_self, __pyx_v_word_id, __pyx_v_offset, __pyx_v_low, __pyx_v_midpoint)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":222
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":222
  *     cdef __get_range(self, int word_id, int offset, int low, int high, int midpoint):
  *         return (self.__search_low(word_id, offset, low, midpoint),
  *                 self.__search_high(word_id, offset, midpoint, high))             # <<<<<<<<<<<<<<
@@ -35418,7 +35413,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":224
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":224
  *                 self.__search_high(word_id, offset, midpoint, high))
  * 
  *     cdef __lookup_helper(self, int word_id, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -35439,7 +35434,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__lookup_helper", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":227
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":227
  *         cdef int midpoint
  * 
  *         if offset == 0:             # <<<<<<<<<<<<<<
@@ -35449,7 +35444,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = (__pyx_v_offset == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":228
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":228
  * 
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])             # <<<<<<<<<<<<<<
@@ -35476,7 +35471,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":229
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":229
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -35486,7 +35481,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = (__pyx_v_low >= __pyx_v_high);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":230
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":230
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])
  *         if low >= high:
  *             return None             # <<<<<<<<<<<<<<
@@ -35501,7 +35496,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":232
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":232
  *             return None
  * 
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -35510,7 +35505,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
  */
   __pyx_v_midpoint = __Pyx_div_long((__pyx_v_high + __pyx_v_low), 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":233
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":233
  * 
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -35520,7 +35515,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) == __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":234
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":234
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__get_range(word_id, offset, low, high, midpoint)             # <<<<<<<<<<<<<<
@@ -35537,7 +35532,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":235
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":235
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:
  *             return self.__get_range(word_id, offset, low, high, midpoint)
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] > word_id:             # <<<<<<<<<<<<<<
@@ -35547,7 +35542,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   __pyx_t_1 = ((__pyx_v_self->darray->data->arr[((__pyx_v_self->sa->arr[__pyx_v_midpoint]) + __pyx_v_offset)]) > __pyx_v_word_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":236
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":236
  *             return self.__get_range(word_id, offset, low, high, midpoint)
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] > word_id:
  *             return self.__lookup_helper(word_id, offset, low, midpoint)             # <<<<<<<<<<<<<<
@@ -35564,7 +35559,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":238
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":238
  *             return self.__lookup_helper(word_id, offset, low, midpoint)
  *         else:
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)             # <<<<<<<<<<<<<<
@@ -35668,7 +35663,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_17lookup(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":240
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":240
  *             return self.__lookup_helper(word_id, offset, midpoint+1, high)
  * 
  *     def lookup(self, word, int offset, int low, int high):             # <<<<<<<<<<<<<<
@@ -35689,7 +35684,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lookup", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":242
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":242
  *     def lookup(self, word, int offset, int low, int high):
  *         cdef int wordid
  *         if low == -1:             # <<<<<<<<<<<<<<
@@ -35699,7 +35694,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__pyx_v_low == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":243
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":243
  *         cdef int wordid
  *         if low == -1:
  *             low = 0             # <<<<<<<<<<<<<<
@@ -35711,7 +35706,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":244
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":244
  *         if low == -1:
  *             low = 0
  *         if high == -1:             # <<<<<<<<<<<<<<
@@ -35721,7 +35716,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__pyx_v_high == -1);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":245
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":245
  *             low = 0
  *         if high == -1:
  *             high = len(self.sa)             # <<<<<<<<<<<<<<
@@ -35737,7 +35732,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":246
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":246
  *         if high == -1:
  *             high = len(self.sa)
  *         if word in self.darray.word2id:             # <<<<<<<<<<<<<<
@@ -35747,7 +35742,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_word, __pyx_v_self->darray->word2id, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":247
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":247
  *             high = len(self.sa)
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]             # <<<<<<<<<<<<<<
@@ -35759,7 +35754,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
     __pyx_v_word_id = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":248
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":248
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]
  *             return self.__lookup_helper(word_id, offset, low, high)             # <<<<<<<<<<<<<<
@@ -35777,7 +35772,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":250
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":250
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  *             return None             # <<<<<<<<<<<<<<
@@ -35816,7 +35811,7 @@ static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":38
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":39
  *     cdef public children
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -35833,14 +35828,14 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":39
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":40
  * 
  *     def __cinit__(self):
  *         self.children = {}             # <<<<<<<<<<<<<<
  * 
  * cdef class ExtendedTrieNode(TrieNode):
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __Pyx_GOTREF(__pyx_v_self->children);
@@ -35870,7 +35865,7 @@ static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":36
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":37
  * 
  * cdef class TrieNode:
  *     cdef public children             # <<<<<<<<<<<<<<
@@ -35959,7 +35954,7 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
     PyObject* values[3] = {0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":46
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":47
  *     cdef public suffix_link
  * 
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
@@ -35998,7 +35993,7 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -36015,7 +36010,7 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.ExtendedTrieNode.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -36031,7 +36026,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":47
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":48
  * 
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase             # <<<<<<<<<<<<<<
@@ -36044,7 +36039,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
   __Pyx_DECREF(__pyx_v_self->phrase);
   __pyx_v_self->phrase = __pyx_v_phrase;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":48
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":49
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location             # <<<<<<<<<<<<<<
@@ -36057,7 +36052,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
   __Pyx_DECREF(__pyx_v_self->phrase_location);
   __pyx_v_self->phrase_location = __pyx_v_phrase_location;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":49
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":50
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location
  *         self.suffix_link = suffix_link             # <<<<<<<<<<<<<<
@@ -36086,7 +36081,7 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":42
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":43
  * 
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase             # <<<<<<<<<<<<<<
@@ -36173,7 +36168,7 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyO
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":43
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":44
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase
  *     cdef public phrase_location             # <<<<<<<<<<<<<<
@@ -36260,7 +36255,7 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":44
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":45
  *     cdef public phrase
  *     cdef public phrase_location
  *     cdef public suffix_link             # <<<<<<<<<<<<<<
@@ -36364,7 +36359,7 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -36377,7 +36372,7 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.TrieTable.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -36388,7 +36383,7 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":56
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":57
  *     cdef public int count
  *     cdef public root
  *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
@@ -36407,7 +36402,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":57
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":58
  *     cdef public root
  *     def __cinit__(self, extended=False):
  *         self.count = 0             # <<<<<<<<<<<<<<
@@ -36416,34 +36411,34 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
  */
   __pyx_v_self->count = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":58
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":59
  *     def __cinit__(self, extended=False):
  *         self.count = 0
  *         self.extended = extended             # <<<<<<<<<<<<<<
  *         if extended:
  *             self.root = ExtendedTrieNode()
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_extended); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_extended); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->extended = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":59
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":60
  *         self.count = 0
  *         self.extended = extended
  *         if extended:             # <<<<<<<<<<<<<<
  *             self.root = ExtendedTrieNode()
  *         else:
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_extended); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_extended); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":60
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":61
  *         self.extended = extended
  *         if extended:
  *             self.root = ExtendedTrieNode()             # <<<<<<<<<<<<<<
  *         else:
  *             self.root = TrieNode()
  */
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __Pyx_GOTREF(__pyx_v_self->root);
@@ -36454,14 +36449,14 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":62
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":63
  *             self.root = ExtendedTrieNode()
  *         else:
  *             self.root = TrieNode()             # <<<<<<<<<<<<<<
  * 
  * # linked list structure for storing matches in BaselineRuleFactory
  */
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieNode)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __Pyx_GOTREF(__pyx_v_self->root);
@@ -36493,7 +36488,7 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":53
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":54
  * 
  * cdef class TrieTable:
  *     cdef public int extended             # <<<<<<<<<<<<<<
@@ -36510,7 +36505,7 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_8extended___get__(struct __pyx_obj_3_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->extended); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -36547,7 +36542,7 @@ static int __pyx_pf_3_sa_9TrieTable_8extended_2__set__(struct __pyx_obj_3_sa_Tri
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->extended = __pyx_t_1;
 
   __pyx_r = 0;
@@ -36571,7 +36566,7 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":54
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":55
  * cdef class TrieTable:
  *     cdef public int extended
  *     cdef public int count             # <<<<<<<<<<<<<<
@@ -36588,7 +36583,7 @@ static PyObject *__pyx_pf_3_sa_9TrieTable_5count___get__(struct __pyx_obj_3_sa_T
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromLong(__pyx_v_self->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -36625,7 +36620,7 @@ static int __pyx_pf_3_sa_9TrieTable_5count_2__set__(struct __pyx_obj_3_sa_TrieTa
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__set__", 0);
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->count = __pyx_t_1;
 
   __pyx_r = 0;
@@ -36649,7 +36644,7 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":55
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":56
  *     cdef public int extended
  *     cdef public int count
  *     cdef public root             # <<<<<<<<<<<<<<
@@ -36725,7 +36720,7 @@ static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTab
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":82
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":83
  * 
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -36738,7 +36733,7 @@ static int __pyx_f_3_sa_14PhraseLocation_contains(CYTHON_UNUSED struct __pyx_obj
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("contains", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":83
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":84
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):
  *         return 1             # <<<<<<<<<<<<<<
@@ -36770,7 +36765,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa_low,&__pyx_n_s__sa_high,&__pyx_n_s__arr_low,&__pyx_n_s__arr_high,&__pyx_n_s__arr,&__pyx_n_s__num_subpatterns,0};
     PyObject* values[6] = {0,0,0,0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":86
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":87
  * 
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):             # <<<<<<<<<<<<<<
@@ -36825,7 +36820,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -36840,35 +36835,35 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
       }
     }
     if (values[0]) {
-      __pyx_v_sa_low = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sa_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_sa_low = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sa_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_sa_low = ((int)-1);
     }
     if (values[1]) {
-      __pyx_v_sa_high = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_sa_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_sa_high = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_sa_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_sa_high = ((int)-1);
     }
     if (values[2]) {
-      __pyx_v_arr_low = __Pyx_PyInt_AsInt(values[2]); if (unlikely((__pyx_v_arr_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_arr_low = __Pyx_PyInt_AsInt(values[2]); if (unlikely((__pyx_v_arr_low == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_arr_low = ((int)-1);
     }
     if (values[3]) {
-      __pyx_v_arr_high = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_arr_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_arr_high = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_arr_high == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_arr_high = ((int)-1);
     }
     __pyx_v_arr = values[4];
     if (values[5]) {
-      __pyx_v_num_subpatterns = __Pyx_PyInt_AsInt(values[5]); if (unlikely((__pyx_v_num_subpatterns == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_num_subpatterns = __Pyx_PyInt_AsInt(values[5]); if (unlikely((__pyx_v_num_subpatterns == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_num_subpatterns = ((int)1);
     }
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.PhraseLocation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -36879,7 +36874,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":85
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":86
  *         return 1
  * 
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
@@ -36895,7 +36890,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":88
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low             # <<<<<<<<<<<<<<
@@ -36904,7 +36899,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->sa_low = __pyx_v_sa_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":89
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high             # <<<<<<<<<<<<<<
@@ -36913,7 +36908,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->sa_high = __pyx_v_sa_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":89
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":90
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low             # <<<<<<<<<<<<<<
@@ -36922,7 +36917,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->arr_low = __pyx_v_arr_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":90
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":91
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high             # <<<<<<<<<<<<<<
@@ -36931,21 +36926,21 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->arr_high = __pyx_v_arr_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":91
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":92
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high
  *         self.arr = arr             # <<<<<<<<<<<<<<
  *         self.num_subpatterns = num_subpatterns
  * 
  */
-  if (!(likely(((__pyx_v_arr) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_arr, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_v_arr) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_arr, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_INCREF(__pyx_v_arr);
   __Pyx_GIVEREF(__pyx_v_arr);
   __Pyx_GOTREF(__pyx_v_self->arr);
   __Pyx_DECREF(((PyObject *)__pyx_v_self->arr));
   __pyx_v_self->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_v_arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":92
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":93
  *         self.arr_high = arr_high
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns             # <<<<<<<<<<<<<<
@@ -36992,11 +36987,11 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fsarray)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -37004,18 +36999,18 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
       values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
       values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
     }
-    __pyx_v_sample_size = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sample_size == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_sample_size = __Pyx_PyInt_AsInt(values[0]); if (unlikely((__pyx_v_sample_size == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_fsarray = ((struct __pyx_obj_3_sa_SuffixArray *)values[1]);
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.Sampler.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_3_sa_7Sampler___cinit__(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), __pyx_v_sample_size, __pyx_v_fsarray);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -37025,7 +37020,7 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":102
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":103
  *     cdef IntList sa
  * 
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
@@ -37045,7 +37040,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":103
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":104
  * 
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size             # <<<<<<<<<<<<<<
@@ -37054,7 +37049,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
  */
   __pyx_v_self->sample_size = __pyx_v_sample_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":104
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":105
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa             # <<<<<<<<<<<<<<
@@ -37067,7 +37062,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   __Pyx_DECREF(((PyObject *)__pyx_v_self->sa));
   __pyx_v_self->sa = __pyx_v_fsarray->sa;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":105
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":106
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa
  *         if sample_size > 0:             # <<<<<<<<<<<<<<
@@ -37077,21 +37072,21 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   __pyx_t_1 = (__pyx_v_sample_size > 0);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":106
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":107
  *         self.sa = fsarray.sa
  *         if sample_size > 0:
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)             # <<<<<<<<<<<<<<
  *         else:
  *             logger.info("Sampling strategy: no sampling")
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyInt_FromLong(__pyx_v_sample_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(__pyx_v_sample_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_100));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_100));
@@ -37099,7 +37094,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
     PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -37108,19 +37103,19 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":108
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":109
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
  * 
  *     def sample(self, PhraseLocation phrase_location):
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_102), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_k_tuple_102), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -37147,7 +37142,7 @@ static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sample (wrapper)", 0);
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_phrase_location), __pyx_ptype_3_sa_PhraseLocation, 1, "phrase_location", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_3_sa_7Sampler_2sample(((struct __pyx_obj_3_sa_Sampler *)__pyx_v_self), ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_v_phrase_location));
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -37157,7 +37152,7 @@ static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":110
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":111
  *             logger.info("Sampling strategy: no sampling")
  * 
  *     def sample(self, PhraseLocation phrase_location):             # <<<<<<<<<<<<<<
@@ -37184,19 +37179,19 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("sample", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":123
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":124
  *         cdef int num_locations, val, j
  * 
  *         sample = IntList()             # <<<<<<<<<<<<<<
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":124
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":125
  * 
  *         sample = IntList()
  *         if phrase_location.arr is None:             # <<<<<<<<<<<<<<
@@ -37206,7 +37201,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   __pyx_t_2 = (((PyObject *)__pyx_v_phrase_location->arr) == Py_None);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":125
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":126
  *         sample = IntList()
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low             # <<<<<<<<<<<<<<
@@ -37215,7 +37210,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
     __pyx_v_num_locations = (__pyx_v_phrase_location->sa_high - __pyx_v_phrase_location->sa_low);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":126
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":127
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
@@ -37231,7 +37226,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":127
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":128
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)             # <<<<<<<<<<<<<<
@@ -37243,7 +37238,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":129
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":130
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
@@ -37252,11 +37247,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
       if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":130
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":131
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low             # <<<<<<<<<<<<<<
@@ -37265,7 +37260,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
       __pyx_v_i = __pyx_v_phrase_location->sa_low;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":131
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":132
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low
  *                 while i < phrase_location.sa_high and sample.len < self.sample_size:             # <<<<<<<<<<<<<<
@@ -37282,7 +37277,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         if (!__pyx_t_3) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":134
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":135
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -37292,7 +37287,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         __pyx_t_3 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":135
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":136
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -37304,7 +37299,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":137
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":138
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -37315,7 +37310,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         __pyx_L7:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":138
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":139
  *                     else:
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])             # <<<<<<<<<<<<<<
@@ -37324,7 +37319,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_append(__pyx_v_sample, (__pyx_v_self->sa->arr[__pyx_v_val]));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":139
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":140
  *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -37339,7 +37334,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":141
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":142
  *                     i = i + stepsize
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns             # <<<<<<<<<<<<<<
@@ -37349,15 +37344,15 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     __pyx_t_5 = (__pyx_v_phrase_location->arr_high - __pyx_v_phrase_location->arr_low);
     if (unlikely(__pyx_v_phrase_location->num_subpatterns == 0)) {
       PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
     else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_phrase_location->num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_5))) {
       PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
     __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, __pyx_v_phrase_location->num_subpatterns);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":142
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":143
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:             # <<<<<<<<<<<<<<
@@ -37373,7 +37368,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":143
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":144
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns
  *             if self.sample_size == -1 or num_locations <= self.sample_size:
  *                 sample = phrase_location.arr             # <<<<<<<<<<<<<<
@@ -37387,7 +37382,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":145
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":146
  *                 sample = phrase_location.arr
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
@@ -37396,11 +37391,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
       if (unlikely(((double)__pyx_v_self->sample_size) == 0)) {
         PyErr_Format(PyExc_ZeroDivisionError, "float division");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":146
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":147
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low             # <<<<<<<<<<<<<<
@@ -37409,7 +37404,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
       __pyx_v_i = __pyx_v_phrase_location->arr_low;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":147
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":148
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low
  *                 while i < num_locations and sample.len < self.sample_size * phrase_location.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -37426,7 +37421,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         if (!__pyx_t_4) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":150
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":151
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
@@ -37436,7 +37431,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         __pyx_t_4 = (fmod(__pyx_v_i, 1.0) > 0.5);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":151
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":152
  *                     effect, according to the python documentation'''
  *                     if fmod(i,1.0) > 0.5:
  *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
@@ -37448,7 +37443,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":153
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":154
  *                         val = int(ceil(i))
  *                     else:
  *                         val = int(floor(i))             # <<<<<<<<<<<<<<
@@ -37459,7 +37454,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         __pyx_L11:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":154
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":155
  *                     else:
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
@@ -37468,7 +37463,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
         __pyx_v_j = (__pyx_v_phrase_location->arr_low + (__pyx_v_val * __pyx_v_phrase_location->num_subpatterns));
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":155
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":156
  *                         val = int(floor(i))
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)             # <<<<<<<<<<<<<<
@@ -37477,7 +37472,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_sample->__pyx_vtab)->_extend_arr(__pyx_v_sample, (__pyx_v_phrase_location->arr->arr + __pyx_v_j), __pyx_v_phrase_location->num_subpatterns);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":156
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":157
  *                     j = phrase_location.arr_low + (val*phrase_location.num_subpatterns)
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
@@ -37491,7 +37486,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":157
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":158
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  *         return sample             # <<<<<<<<<<<<<<
@@ -37516,7 +37511,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":169
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":170
  * 
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):             # <<<<<<<<<<<<<<
@@ -37528,7 +37523,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("assign_matching", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":170
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":171
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr             # <<<<<<<<<<<<<<
@@ -37537,7 +37532,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->arr = __pyx_v_arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":171
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":172
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr
  *     m.start = start             # <<<<<<<<<<<<<<
@@ -37546,7 +37541,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->start = __pyx_v_start;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":172
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":173
  *     m.arr = arr
  *     m.start = start
  *     m.end = start + step             # <<<<<<<<<<<<<<
@@ -37555,7 +37550,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->end = (__pyx_v_start + __pyx_v_step);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":173
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":174
  *     m.start = start
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]             # <<<<<<<<<<<<<<
@@ -37564,7 +37559,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
  */
   __pyx_v_m->sent_id = (__pyx_v_sent_id_arr[(__pyx_v_arr[__pyx_v_start])]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":174
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":175
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]
  *     m.size = step             # <<<<<<<<<<<<<<
@@ -37576,7 +37571,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":177
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":178
  * 
  * 
  * cdef int* append_combined_matching(int* arr, Matching* loc1, Matching* loc2,             # <<<<<<<<<<<<<<
@@ -37593,7 +37588,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("append_combined_matching", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":182
  *     cdef int i, new_len
  * 
  *     new_len = result_len[0] + num_subpatterns             # <<<<<<<<<<<<<<
@@ -37602,7 +37597,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_new_len = ((__pyx_v_result_len[0]) + __pyx_v_num_subpatterns);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":182
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":183
  * 
  *     new_len = result_len[0] + num_subpatterns
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -37611,7 +37606,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":184
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":185
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  * 
  *     for i from 0 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -37621,7 +37616,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_1 = __pyx_v_loc1->size;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":185
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":186
  * 
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]             # <<<<<<<<<<<<<<
@@ -37631,7 +37626,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
     (__pyx_v_arr[((__pyx_v_result_len[0]) + __pyx_v_i)]) = (__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":186
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":187
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:             # <<<<<<<<<<<<<<
@@ -37641,7 +37636,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   __pyx_t_2 = (__pyx_v_num_subpatterns > __pyx_v_loc1->size);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":187
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":188
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]             # <<<<<<<<<<<<<<
@@ -37653,7 +37648,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":188
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":189
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -37662,7 +37657,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
  */
   (__pyx_v_result_len[0]) = __pyx_v_new_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":189
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":190
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -37678,7 +37673,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":192
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":193
  * 
  * 
  * cdef int* extend_arr(int* arr, int* arr_len, int* appendix, int appendix_len):             # <<<<<<<<<<<<<<
@@ -37692,7 +37687,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("extend_arr", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":195
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":196
  *     cdef int new_len
  * 
  *     new_len = arr_len[0] + appendix_len             # <<<<<<<<<<<<<<
@@ -37701,7 +37696,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_appendix_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":196
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":197
  * 
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -37710,7 +37705,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":197
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":198
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -37719,7 +37714,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_appendix, (__pyx_v_appendix_len * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":198
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":199
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -37728,7 +37723,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":199
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":200
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -37744,7 +37739,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":201
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":202
  *     return arr
  * 
  * cdef int median(int low, int high, int step):             # <<<<<<<<<<<<<<
@@ -37761,7 +37756,7 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("median", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":202
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":203
  * 
  * cdef int median(int low, int high, int step):
  *     return low + (((high - low)/step)/2)*step             # <<<<<<<<<<<<<<
@@ -37771,11 +37766,11 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   __pyx_t_1 = (__pyx_v_high - __pyx_v_low);
   if (unlikely(__pyx_v_step == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_step == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_1))) {
     PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_r = (__pyx_v_low + (__Pyx_div_long(__Pyx_div_int(__pyx_t_1, __pyx_v_step), 2) * __pyx_v_step));
   goto __pyx_L0;
@@ -37790,7 +37785,7 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":205
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":206
  * 
  * 
  * cdef void find_comparable_matchings(int low, int high, int* arr, int step, int loc, int* loc_minus, int* loc_plus):             # <<<<<<<<<<<<<<
@@ -37805,7 +37800,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("find_comparable_matchings", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":209
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":210
  *     # in which all matchings have the same first index as the one
  *     # starting at loc
  *     loc_plus[0] = loc + step             # <<<<<<<<<<<<<<
@@ -37814,7 +37809,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_plus[0]) = (__pyx_v_loc + __pyx_v_step);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":210
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":211
  *     # starting at loc
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -37831,7 +37826,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":211
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":212
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step             # <<<<<<<<<<<<<<
@@ -37841,7 +37836,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     (__pyx_v_loc_plus[0]) = ((__pyx_v_loc_plus[0]) + __pyx_v_step);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":212
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":213
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc             # <<<<<<<<<<<<<<
@@ -37850,7 +37845,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
  */
   (__pyx_v_loc_minus[0]) = __pyx_v_loc;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":213
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":214
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -37867,7 +37862,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_2) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":214
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":215
  *     loc_minus[0] = loc
  *     while loc_minus[0]-step >= low and arr[loc_minus[0]-step] == arr[loc]:
  *         loc_minus[0] = loc_minus[0] - step             # <<<<<<<<<<<<<<
@@ -37911,7 +37906,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alignment,&__pyx_n_s__by_slack_factor,&__pyx_n_s__category,&__pyx_n_s__max_chunks,&__pyx_n_s__max_initial_size,&__pyx_n_s__max_length,&__pyx_n_s__max_nonterminals,&__pyx_n_s__max_target_chunks,&__pyx_n_s__max_target_length,&__pyx_n_s__min_gap_size,&__pyx_n_s__precompute_file,&__pyx_n_s_70,&__pyx_n_s__precompute_rank,&__pyx_n_s_103,&__pyx_n_s_104,&__pyx_n_s_71,&__pyx_n_s__train_min_gap_size,&__pyx_n_s__tight_phrases,&__pyx_n_s__use_baeza_yates,&__pyx_n_s__use_collocations,&__pyx_n_s__use_index,0};
     PyObject* values[21] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":274
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":275
  *             char* category="[X]",
  *             # maximum number of contiguous chunks of terminal symbols in RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_chunks=None,             # <<<<<<<<<<<<<<
@@ -37920,7 +37915,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[3] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":282
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":283
  *             unsigned max_nonterminals=2,
  *             # maximum number of contiguous chunks of terminal symbols in target-side RHS of a rule. If None, defaults to max_nonterminals+1
  *             max_target_chunks=None,             # <<<<<<<<<<<<<<
@@ -37929,7 +37924,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[7] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":284
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":285
  *             max_target_chunks=None,
  *             # maximum number of target side symbols (both T and NT) allowed in a rule. If None, defaults to max_initial_size
  *             max_target_length=None,             # <<<<<<<<<<<<<<
@@ -37938,7 +37933,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[8] = ((PyObject *)Py_None);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":288
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":289
  *             unsigned min_gap_size=2,
  *             # filename of file containing precomputed collocations
  *             precompute_file=None,             # <<<<<<<<<<<<<<
@@ -38081,7 +38076,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -38112,10 +38107,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
     }
     __pyx_v_alignment = ((struct __pyx_obj_3_sa_Alignment *)values[0]);
     if (values[1]) {
-      __pyx_v_by_slack_factor = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_by_slack_factor = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_by_slack_factor == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":270
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":271
  *             Alignment alignment,
  *             # parameter for double-binary search; doesn't seem to matter much
  *             float by_slack_factor=1.0,             # <<<<<<<<<<<<<<
@@ -38125,49 +38120,49 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_by_slack_factor = ((float)1.0);
     }
     if (values[2]) {
-      __pyx_v_category = PyBytes_AsString(values[2]); if (unlikely((!__pyx_v_category) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_category = PyBytes_AsString(values[2]); if (unlikely((!__pyx_v_category) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_category = ((char *)__pyx_k_105);
     }
     __pyx_v_max_chunks = values[3];
     if (values[4]) {
-      __pyx_v_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[4]); if (unlikely((__pyx_v_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[4]); if (unlikely((__pyx_v_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_max_initial_size = ((unsigned int)10);
     }
     if (values[5]) {
-      __pyx_v_max_length = __Pyx_PyInt_AsUnsignedInt(values[5]); if (unlikely((__pyx_v_max_length == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_max_length = __Pyx_PyInt_AsUnsignedInt(values[5]); if (unlikely((__pyx_v_max_length == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_max_length = ((unsigned int)5);
     }
     if (values[6]) {
-      __pyx_v_max_nonterminals = __Pyx_PyInt_AsUnsignedInt(values[6]); if (unlikely((__pyx_v_max_nonterminals == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_max_nonterminals = __Pyx_PyInt_AsUnsignedInt(values[6]); if (unlikely((__pyx_v_max_nonterminals == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_max_nonterminals = ((unsigned int)2);
     }
     __pyx_v_max_target_chunks = values[7];
     __pyx_v_max_target_length = values[8];
     if (values[9]) {
-      __pyx_v_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[9]); if (unlikely((__pyx_v_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[9]); if (unlikely((__pyx_v_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_min_gap_size = ((unsigned int)2);
     }
     __pyx_v_precompute_file = values[10];
     if (values[11]) {
-      __pyx_v_precompute_secondary_rank = __Pyx_PyInt_AsUnsignedInt(values[11]); if (unlikely((__pyx_v_precompute_secondary_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_precompute_secondary_rank = __Pyx_PyInt_AsUnsignedInt(values[11]); if (unlikely((__pyx_v_precompute_secondary_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_precompute_secondary_rank = ((unsigned int)20);
     }
     if (values[12]) {
-      __pyx_v_precompute_rank = __Pyx_PyInt_AsUnsignedInt(values[12]); if (unlikely((__pyx_v_precompute_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_precompute_rank = __Pyx_PyInt_AsUnsignedInt(values[12]); if (unlikely((__pyx_v_precompute_rank == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_precompute_rank = ((unsigned int)100);
     }
     if (values[13]) {
-      __pyx_v_require_aligned_terminal = __Pyx_PyObject_IsTrue(values[13]); if (unlikely((__pyx_v_require_aligned_terminal == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_require_aligned_terminal = __Pyx_PyObject_IsTrue(values[13]); if (unlikely((__pyx_v_require_aligned_terminal == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":294
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":295
  *             unsigned precompute_rank=100,
  *             # require extracted rules to have at least one aligned word
  *             bint require_aligned_terminal=True,             # <<<<<<<<<<<<<<
@@ -38177,10 +38172,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_require_aligned_terminal = ((int)1);
     }
     if (values[14]) {
-      __pyx_v_require_aligned_chunks = __Pyx_PyObject_IsTrue(values[14]); if (unlikely((__pyx_v_require_aligned_chunks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_require_aligned_chunks = __Pyx_PyObject_IsTrue(values[14]); if (unlikely((__pyx_v_require_aligned_chunks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":296
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":297
  *             bint require_aligned_terminal=True,
  *             # require each contiguous chunk of extracted rules to have at least one aligned word
  *             bint require_aligned_chunks=False,             # <<<<<<<<<<<<<<
@@ -38190,20 +38185,20 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_require_aligned_chunks = ((int)0);
     }
     if (values[15]) {
-      __pyx_v_train_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[15]); if (unlikely((__pyx_v_train_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_train_max_initial_size = __Pyx_PyInt_AsUnsignedInt(values[15]); if (unlikely((__pyx_v_train_max_initial_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_train_max_initial_size = ((unsigned int)10);
     }
     if (values[16]) {
-      __pyx_v_train_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[16]); if (unlikely((__pyx_v_train_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_train_min_gap_size = __Pyx_PyInt_AsUnsignedInt(values[16]); if (unlikely((__pyx_v_train_min_gap_size == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
       __pyx_v_train_min_gap_size = ((unsigned int)2);
     }
     if (values[17]) {
-      __pyx_v_tight_phrases = __Pyx_PyObject_IsTrue(values[17]); if (unlikely((__pyx_v_tight_phrases == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_tight_phrases = __Pyx_PyObject_IsTrue(values[17]); if (unlikely((__pyx_v_tight_phrases == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":302
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":303
  *             unsigned train_min_gap_size=2,
  *             # True if phrases should be tight, False otherwise (False == slower but better results)
  *             bint tight_phrases=False,             # <<<<<<<<<<<<<<
@@ -38213,10 +38208,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_tight_phrases = ((int)0);
     }
     if (values[18]) {
-      __pyx_v_use_baeza_yates = __Pyx_PyObject_IsTrue(values[18]); if (unlikely((__pyx_v_use_baeza_yates == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_use_baeza_yates = __Pyx_PyObject_IsTrue(values[18]); if (unlikely((__pyx_v_use_baeza_yates == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":304
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":305
  *             bint tight_phrases=False,
  *             # True to require use of double-binary alg, false otherwise
  *             bint use_baeza_yates=True,             # <<<<<<<<<<<<<<
@@ -38226,10 +38221,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_use_baeza_yates = ((int)1);
     }
     if (values[19]) {
-      __pyx_v_use_collocations = __Pyx_PyObject_IsTrue(values[19]); if (unlikely((__pyx_v_use_collocations == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_use_collocations = __Pyx_PyObject_IsTrue(values[19]); if (unlikely((__pyx_v_use_collocations == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":306
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":307
  *             bint use_baeza_yates=True,
  *             # True to enable used of precomputed collocations
  *             bint use_collocations=True,             # <<<<<<<<<<<<<<
@@ -38239,10 +38234,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_use_collocations = ((int)1);
     }
     if (values[20]) {
-      __pyx_v_use_index = __Pyx_PyObject_IsTrue(values[20]); if (unlikely((__pyx_v_use_index == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_v_use_index = __Pyx_PyObject_IsTrue(values[20]); if (unlikely((__pyx_v_use_index == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":308
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":309
  *             bint use_collocations=True,
  *             # True to enable use of precomputed inverted indices
  *             bint use_index=True):             # <<<<<<<<<<<<<<
@@ -38254,13 +38249,13 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 1, 21, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 1, 21, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_alignment), __pyx_ptype_3_sa_Alignment, 1, "alignment", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_alignment), __pyx_ptype_3_sa_Alignment, 1, "alignment", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_alignment, __pyx_v_by_slack_factor, __pyx_v_category, __pyx_v_max_chunks, __pyx_v_max_initial_size, __pyx_v_max_length, __pyx_v_max_nonterminals, __pyx_v_max_target_chunks, __pyx_v_max_target_length, __pyx_v_min_gap_size, __pyx_v_precompute_file, __pyx_v_precompute_secondary_rank, __pyx_v_precompute_rank, __pyx_v_require_aligned_terminal, __pyx_v_require_aligned_chunks, __pyx_v_train_max_initial_size, __pyx_v_train_min_gap_size, __pyx_v_tight_phrases, __pyx_v_use_baeza_yates, __pyx_v_use_collocations, __pyx_v_use_index);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -38270,7 +38265,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":266
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":267
  *     cdef IntList findexes1
  * 
  *     def __cinit__(self,             # <<<<<<<<<<<<<<
@@ -38290,21 +38285,21 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":314
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":315
  *         respectively.    This is because Chiang's model does not require
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache             # <<<<<<<<<<<<<<
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieTable)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_TrieTable)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
@@ -38313,20 +38308,20 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->rules = ((struct __pyx_obj_3_sa_TrieTable *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":315
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":316
  *         them to be the same, therefore we don't either.'''
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
@@ -38335,7 +38330,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->rules->root = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":316
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":317
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:             # <<<<<<<<<<<<<<
@@ -38345,23 +38340,23 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (((PyObject *)__pyx_v_alignment) == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":317
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":318
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
  *         self.alignment = alignment
  * 
  */
-    __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_107), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_107), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":318
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":319
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")
  *         self.alignment = alignment             # <<<<<<<<<<<<<<
@@ -38374,7 +38369,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_DECREF(((PyObject *)__pyx_v_self->alignment));
   __pyx_v_self->alignment = __pyx_v_alignment;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":322
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":323
  *         # grammar parameters and settings
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
@@ -38383,7 +38378,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->max_length = __pyx_v_max_length;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":323
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":324
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
@@ -38392,7 +38387,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->max_nonterminals = __pyx_v_max_nonterminals;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":324
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":325
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size             # <<<<<<<<<<<<<<
@@ -38401,7 +38396,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->max_initial_size = __pyx_v_max_initial_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":325
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":326
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
@@ -38410,7 +38405,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->train_max_initial_size = __pyx_v_train_max_initial_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":326
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":327
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size             # <<<<<<<<<<<<<<
@@ -38419,7 +38414,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->min_gap_size = __pyx_v_min_gap_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":327
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":328
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size             # <<<<<<<<<<<<<<
@@ -38428,7 +38423,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->train_min_gap_size = __pyx_v_train_min_gap_size;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":328
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":329
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)             # <<<<<<<<<<<<<<
@@ -38437,7 +38432,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->category = __pyx_f_3_sa_sym_fromstring(__pyx_v_category, 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":330
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":331
  *         self.category = sym_fromstring(category, False)
  * 
  *         if max_chunks is None:             # <<<<<<<<<<<<<<
@@ -38447,7 +38442,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (__pyx_v_max_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":331
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":332
  * 
  *         if max_chunks is None:
  *             self.max_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
@@ -38459,19 +38454,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":333
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":334
  *             self.max_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_chunks = max_chunks             # <<<<<<<<<<<<<<
  * 
  *         if max_target_chunks is None:
  */
-    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_chunks); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_self->max_chunks = __pyx_t_4;
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":335
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":336
  *             self.max_chunks = max_chunks
  * 
  *         if max_target_chunks is None:             # <<<<<<<<<<<<<<
@@ -38481,7 +38476,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (__pyx_v_max_target_chunks == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":336
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":337
  * 
  *         if max_target_chunks is None:
  *             self.max_target_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
@@ -38493,19 +38488,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":338
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":339
  *             self.max_target_chunks = self.max_nonterminals + 1
  *         else:
  *             self.max_target_chunks = max_target_chunks             # <<<<<<<<<<<<<<
  * 
  *         if max_target_length is None:
  */
-    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_target_chunks); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_self->max_target_chunks = __pyx_t_4;
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":340
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":341
  *             self.max_target_chunks = max_target_chunks
  * 
  *         if max_target_length is None:             # <<<<<<<<<<<<<<
@@ -38515,7 +38510,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_t_3 = (__pyx_v_max_target_length == Py_None);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":341
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":342
  * 
  *         if max_target_length is None:
  *             self.max_target_length = max_initial_size             # <<<<<<<<<<<<<<
@@ -38527,26 +38522,26 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":343
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":344
  *             self.max_target_length = max_initial_size
  *         else:
  *             self.max_target_length = max_target_length             # <<<<<<<<<<<<<<
  * 
  *         # algorithmic parameters and settings
  */
-    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_v_max_target_length); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_self->max_target_length = __pyx_t_4;
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":346
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":347
  * 
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}             # <<<<<<<<<<<<<<
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __Pyx_GOTREF(__pyx_v_self->precomputed_collocations);
@@ -38554,14 +38549,14 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->precomputed_collocations = ((PyObject *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":347
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":348
  *         # algorithmic parameters and settings
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}             # <<<<<<<<<<<<<<
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __Pyx_GOTREF(__pyx_v_self->precomputed_index);
@@ -38569,7 +38564,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->precomputed_index = ((PyObject *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":348
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":349
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}
  *         self.use_index = use_index             # <<<<<<<<<<<<<<
@@ -38578,7 +38573,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->use_index = __pyx_v_use_index;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":349
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":350
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations             # <<<<<<<<<<<<<<
@@ -38587,14 +38582,14 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->use_collocations = __pyx_v_use_collocations;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":350
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":351
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}             # <<<<<<<<<<<<<<
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __Pyx_GOTREF(__pyx_v_self->max_rank);
@@ -38602,7 +38597,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->max_rank = ((PyObject *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":351
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":352
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file             # <<<<<<<<<<<<<<
@@ -38615,7 +38610,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_DECREF(__pyx_v_self->precompute_file);
   __pyx_v_self->precompute_file = __pyx_v_precompute_file;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":352
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":353
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
@@ -38624,7 +38619,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->precompute_rank = __pyx_v_precompute_rank;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":353
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":354
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
@@ -38633,7 +38628,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":354
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":355
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates             # <<<<<<<<<<<<<<
@@ -38642,7 +38637,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->use_baeza_yates = __pyx_v_use_baeza_yates;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":355
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":356
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor             # <<<<<<<<<<<<<<
@@ -38651,7 +38646,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->by_slack_factor = __pyx_v_by_slack_factor;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":356
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":357
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:             # <<<<<<<<<<<<<<
@@ -38660,7 +38655,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_tight_phrases) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":357
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":358
  *         self.by_slack_factor = by_slack_factor
  *         if tight_phrases:
  *             self.tight_phrases = 1             # <<<<<<<<<<<<<<
@@ -38672,7 +38667,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":359
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":360
  *             self.tight_phrases = 1
  *         else:
  *             self.tight_phrases = 0             # <<<<<<<<<<<<<<
@@ -38683,7 +38678,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":361
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":362
  *             self.tight_phrases = 0
  * 
  *         if require_aligned_chunks:             # <<<<<<<<<<<<<<
@@ -38692,7 +38687,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_require_aligned_chunks) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":363
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":364
  *         if require_aligned_chunks:
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1             # <<<<<<<<<<<<<<
@@ -38701,7 +38696,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
     __pyx_v_self->require_aligned_chunks = 1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":364
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":365
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
@@ -38712,7 +38707,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
     goto __pyx_L8;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":365
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":366
  *             self.require_aligned_chunks = 1
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -38721,7 +38716,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_require_aligned_terminal) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":366
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":367
  *             self.require_aligned_terminal = 1
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -38730,7 +38725,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
     __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":367
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":368
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 1             # <<<<<<<<<<<<<<
@@ -38742,7 +38737,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":369
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":370
  *             self.require_aligned_terminal = 1
  *         else:
  *             self.require_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -38751,7 +38746,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
     __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":370
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":371
  *         else:
  *             self.require_aligned_chunks = 0
  *             self.require_aligned_terminal = 0             # <<<<<<<<<<<<<<
@@ -38762,7 +38757,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   __pyx_L8:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":374
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":375
  * 
  *         # diagnostics
  *         self.prev_norm_prefix = ()             # <<<<<<<<<<<<<<
@@ -38775,17 +38770,17 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __Pyx_DECREF(__pyx_v_self->prev_norm_prefix);
   __pyx_v_self->prev_norm_prefix = ((PyObject *)__pyx_empty_tuple);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":376
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":377
  *         self.prev_norm_prefix = ()
  * 
  *         self.findexes = IntList(initial_len=10)             # <<<<<<<<<<<<<<
  *         self.findexes1 = IntList(initial_len=10)
  * 
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_1);
@@ -38794,17 +38789,17 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->findexes = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":377
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":378
  * 
  *         self.findexes = IntList(initial_len=10)
  *         self.findexes1 = IntList(initial_len=10)             # <<<<<<<<<<<<<<
  * 
  *     def configure(self, SuffixArray fsarray, DataArray edarray,
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_int_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_GIVEREF(__pyx_t_2);
@@ -38858,21 +38853,21 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__edarray)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sampler)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
         if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__scorer)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "configure") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -38889,16 +38884,16 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.configure", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_edarray), __pyx_ptype_3_sa_DataArray, 1, "edarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sampler), __pyx_ptype_3_sa_Sampler, 1, "sampler", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_scorer), __pyx_ptype_3_sa_Scorer, 1, "scorer", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fsarray), __pyx_ptype_3_sa_SuffixArray, 1, "fsarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_edarray), __pyx_ptype_3_sa_DataArray, 1, "edarray", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sampler), __pyx_ptype_3_sa_Sampler, 1, "sampler", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_scorer), __pyx_ptype_3_sa_Scorer, 1, "scorer", 0))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(((struct __pyx_obj_3_sa_HieroCachingRuleFactory *)__pyx_v_self), __pyx_v_fsarray, __pyx_v_edarray, __pyx_v_sampler, __pyx_v_scorer);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -38908,7 +38903,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":379
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":380
  *         self.findexes1 = IntList(initial_len=10)
  * 
  *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
@@ -38926,7 +38921,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("configure", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":384
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":385
  *         Here we also use it to precompute the most expensive intersections
  *         in the corpus quickly.'''
  *         self.fsa = fsarray             # <<<<<<<<<<<<<<
@@ -38939,7 +38934,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   __Pyx_DECREF(((PyObject *)__pyx_v_self->fsa));
   __pyx_v_self->fsa = __pyx_v_fsarray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":385
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":386
  *         in the corpus quickly.'''
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray             # <<<<<<<<<<<<<<
@@ -38952,7 +38947,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   __Pyx_DECREF(((PyObject *)__pyx_v_self->fda));
   __pyx_v_self->fda = __pyx_v_fsarray->darray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":386
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":387
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray
  *         self.eda = edarray             # <<<<<<<<<<<<<<
@@ -38965,7 +38960,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   __Pyx_DECREF(((PyObject *)__pyx_v_self->eda));
   __pyx_v_self->eda = __pyx_v_edarray;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":387
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":388
  *         self.fda = fsarray.darray
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)             # <<<<<<<<<<<<<<
@@ -38974,17 +38969,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __pyx_t_1 = ((PyObject *)__pyx_v_self->fda);
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_2);
   __Pyx_GOTREF(__pyx_v_self->fid2symid);
   __Pyx_DECREF(((PyObject *)__pyx_v_self->fid2symid));
   __pyx_v_self->fid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":388
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":389
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)             # <<<<<<<<<<<<<<
@@ -38993,31 +38988,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
  */
   __pyx_t_2 = ((PyObject *)__pyx_v_self->eda);
   __Pyx_INCREF(__pyx_t_2);
-  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->set_idmap(__pyx_v_self, ((struct __pyx_obj_3_sa_DataArray *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GIVEREF(__pyx_t_1);
   __Pyx_GOTREF(__pyx_v_self->eid2symid);
   __Pyx_DECREF(((PyObject *)__pyx_v_self->eid2symid));
   __pyx_v_self->eid2symid = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":389
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":390
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()             # <<<<<<<<<<<<<<
  *         self.sampler = sampler
  *         self.scorer = scorer
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__precompute); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":390
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":391
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  *         self.sampler = sampler             # <<<<<<<<<<<<<<
@@ -39030,7 +39025,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   __Pyx_DECREF(((PyObject *)__pyx_v_self->sampler));
   __pyx_v_self->sampler = __pyx_v_sampler;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":391
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":392
  *         self.precompute()
  *         self.sampler = sampler
  *         self.scorer = scorer             # <<<<<<<<<<<<<<
@@ -39056,7 +39051,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":393
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":394
  *         self.scorer = scorer
  * 
  *     cdef set_idmap(self, DataArray darray):             # <<<<<<<<<<<<<<
@@ -39081,7 +39076,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("set_idmap", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":397
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":398
  *         cdef IntList idmap
  * 
  *         N = len(darray.id2word)             # <<<<<<<<<<<<<<
@@ -39090,30 +39085,30 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
  */
   __pyx_t_1 = __pyx_v_darray->id2word;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_N = __pyx_t_2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":398
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":399
  * 
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)             # <<<<<<<<<<<<<<
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __pyx_t_3 = PyInt_FromLong(__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromLong(__pyx_v_N); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_idmap = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":399
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":400
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:             # <<<<<<<<<<<<<<
@@ -39123,20 +39118,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   __pyx_t_4 = __pyx_v_N;
   for (__pyx_v_word_id = 0; __pyx_v_word_id < __pyx_t_4; __pyx_v_word_id++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":400
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":401
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             idmap.arr[word_id] = new_word_id
  *         return idmap
  */
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_darray->id2word, __pyx_v_word_id, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_darray->id2word, __pyx_v_word_id, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyBytes_AsString(__pyx_t_3); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyBytes_AsString(__pyx_t_3); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_v_new_word_id = __pyx_f_3_sa_sym_fromstring(__pyx_t_5, 1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":401
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":402
  *         for word_id from 0 <= word_id < N:
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id             # <<<<<<<<<<<<<<
@@ -39146,7 +39141,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
     (__pyx_v_idmap->arr[__pyx_v_word_id]) = __pyx_v_new_word_id;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":402
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":403
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id
  *         return idmap             # <<<<<<<<<<<<<<
@@ -39183,7 +39178,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":405
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":406
  * 
  * 
  *     def pattern2phrase(self, pattern):             # <<<<<<<<<<<<<<
@@ -39211,7 +39206,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("pattern2phrase", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":407
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":408
  *     def pattern2phrase(self, pattern):
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()             # <<<<<<<<<<<<<<
@@ -39221,7 +39216,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":408
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":409
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -39231,7 +39226,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":409
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":410
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -39242,7 +39237,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
     __pyx_t_1 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -39250,23 +39245,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -39276,74 +39271,74 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":410
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":411
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":411
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":412
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  */
-      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_v_arity);
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":412
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":413
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_v_new_id = __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6);
       goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":414
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":415
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             result = result + (new_id,)
  *         return Phrase(result)
  */
-      __pyx_t_4 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyBytes_AsString(__pyx_t_4); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyBytes_AsString(__pyx_t_4); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_v_new_id = __pyx_f_3_sa_sym_fromstring(__pyx_t_7, 1);
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":415
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":416
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
  *         return Phrase(result)
  * 
  */
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_new_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_new_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_result));
@@ -39352,7 +39347,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":416
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":417
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         return Phrase(result)             # <<<<<<<<<<<<<<
@@ -39360,12 +39355,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
  *     def pattern2phrase_plus(self, pattern):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_r = __pyx_t_4;
@@ -39400,7 +39395,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(Py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":418
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":419
  *         return Phrase(result)
  * 
  *     def pattern2phrase_plus(self, pattern):             # <<<<<<<<<<<<<<
@@ -39430,19 +39425,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("pattern2phrase_plus", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":421
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":422
  *         # returns a list containing both the pattern, and pattern
  *         # suffixed/prefixed with the NT category.
  *         patterns = []             # <<<<<<<<<<<<<<
  *         result = ()
  *         arity = 0
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_patterns = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":422
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":423
  *         # suffixed/prefixed with the NT category.
  *         patterns = []
  *         result = ()             # <<<<<<<<<<<<<<
@@ -39452,7 +39447,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":423
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":424
  *         patterns = []
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -39462,7 +39457,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":424
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":425
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -39473,7 +39468,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
     __pyx_t_1 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -39481,23 +39476,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -39507,74 +39502,74 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":425
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":426
  *         arity = 0
  *         for word_id in pattern:
  *             if word_id == -1:             # <<<<<<<<<<<<<<
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":426
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":427
  *         for word_id in pattern:
  *             if word_id == -1:
  *                 arity = arity + 1             # <<<<<<<<<<<<<<
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  */
-      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_v_arity);
       __pyx_v_arity = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":427
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":428
  *             if word_id == -1:
  *                 arity = arity + 1
  *                 new_id = sym_setindex(self.category, arity)             # <<<<<<<<<<<<<<
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  */
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_arity); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_v_new_id = __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_t_6);
       goto __pyx_L5;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":429
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":430
  *                 new_id = sym_setindex(self.category, arity)
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)             # <<<<<<<<<<<<<<
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))
  */
-      __pyx_t_4 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetItem(__pyx_v_self->fda->id2word, __pyx_v_word_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_7 = PyBytes_AsString(__pyx_t_4); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyBytes_AsString(__pyx_t_4); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_v_new_id = __pyx_f_3_sa_sym_fromstring(__pyx_t_7, 1);
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":430
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":431
  *             else:
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  */
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_new_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_new_id); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_result));
@@ -39583,81 +39578,81 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":431
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":432
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  */
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":432
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":433
  *             result = result + (new_id,)
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))             # <<<<<<<<<<<<<<
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns
  */
-  __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   __pyx_t_4 = 0;
-  __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_v_result), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
   __pyx_t_4 = 0;
-  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":433
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":434
  *         patterns.append(Phrase(result))
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))             # <<<<<<<<<<<<<<
  *         return patterns
  * 
  */
-  __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, 1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
   __Pyx_GIVEREF(__pyx_t_4);
   __pyx_t_4 = 0;
-  __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_t_1), ((PyObject *)__pyx_v_result)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_Add(((PyObject *)__pyx_t_1), ((PyObject *)__pyx_v_result)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_4));
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
   __pyx_t_4 = 0;
-  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = PyList_Append(__pyx_v_patterns, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":434
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":435
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns             # <<<<<<<<<<<<<<
@@ -39698,7 +39693,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":436
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":437
  *         return patterns
  * 
  *     def precompute(self):             # <<<<<<<<<<<<<<
@@ -39732,7 +39727,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("precompute", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":439
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":440
  *         cdef Precomputation pre
  * 
  *         if self.precompute_file is not None:             # <<<<<<<<<<<<<<
@@ -39742,31 +39737,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   __pyx_t_1 = (__pyx_v_self->precompute_file != Py_None);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":440
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":441
  * 
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  *             pre = Precomputation(from_binary=self.precompute_file)
  */
-    __pyx_t_2 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_start_time = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":441
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":442
  *         if self.precompute_file is not None:
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)             # <<<<<<<<<<<<<<
  *             pre = Precomputation(from_binary=self.precompute_file)
  *             # check parameters of precomputation -- some are critical and some are not
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_108));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_108));
@@ -39774,29 +39769,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __Pyx_INCREF(__pyx_v_self->precompute_file);
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->precompute_file);
     __Pyx_GIVEREF(__pyx_v_self->precompute_file);
-    __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":442
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":443
  *             start_time = monitor_cpu()
  *             logger.info("Reading precomputed data from file %s... ", self.precompute_file)
  *             pre = Precomputation(from_binary=self.precompute_file)             # <<<<<<<<<<<<<<
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:
  */
-    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 443; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), __pyx_v_self->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__from_binary), __pyx_v_self->precompute_file) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 443; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 443; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_v_pre = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_t_2);
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":444
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":445
  *             pre = Precomputation(from_binary=self.precompute_file)
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:             # <<<<<<<<<<<<<<
@@ -39806,23 +39801,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_t_1 = (__pyx_v_pre->max_nonterminals != __pyx_v_self->max_nonterminals);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":445
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":446
  *             # check parameters of precomputation -- some are critical and some are not
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)             # <<<<<<<<<<<<<<
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  */
-      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__warn); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__warn); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_109));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_s_109));
@@ -39833,7 +39828,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -39842,7 +39837,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     }
     __pyx_L4:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":446
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":447
  *             if pre.max_nonterminals != self.max_nonterminals:
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:             # <<<<<<<<<<<<<<
@@ -39852,23 +39847,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_t_1 = (__pyx_v_pre->max_length != __pyx_v_self->max_length);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":447
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":448
  *                 logger.warn("Precomputation done with max nonterminals %d, decoder uses %d", pre.max_nonterminals, self.max_nonterminals)
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)             # <<<<<<<<<<<<<<
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  */
-      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyInt_FromLong(__pyx_v_self->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_v_self->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_110));
@@ -39879,7 +39874,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_4);
       __pyx_t_3 = 0;
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -39888,7 +39883,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":448
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":449
  *             if pre.max_length != self.max_length:
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -39898,18 +39893,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_t_1 = (__pyx_v_pre->train_max_initial_size != __pyx_v_self->train_max_initial_size);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":449
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":450
  *                 logger.warn("Precomputation done with max terminals %d, decoder uses %d", pre.max_length, self.max_length)
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))             # <<<<<<<<<<<<<<
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  */
-      __pyx_t_4 = PyInt_FromLong(__pyx_v_pre->train_max_initial_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_v_pre->train_max_initial_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
@@ -39917,25 +39912,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_4 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_111), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_111), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_2));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __Pyx_Raise(__pyx_t_2, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 450; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L6;
     }
     __pyx_L6:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":450
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":451
  *             if pre.train_max_initial_size != self.train_max_initial_size:
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:             # <<<<<<<<<<<<<<
@@ -39945,18 +39940,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __pyx_t_1 = (__pyx_v_pre->train_min_gap_size != __pyx_v_self->train_min_gap_size);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":451
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":452
  *                 raise Exception("Precomputation done with max initial size %d, decoder uses %d" % (pre.train_max_initial_size, self.train_max_initial_size))
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))             # <<<<<<<<<<<<<<
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  */
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyInt_FromLong(__pyx_v_self->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(__pyx_v_self->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -39964,25 +39959,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_2 = 0;
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_112), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_112), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_5));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_Raise(__pyx_t_5, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L7;
     }
     __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":452
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":453
  *             if pre.train_min_gap_size != self.train_min_gap_size:
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:             # <<<<<<<<<<<<<<
@@ -39991,25 +39986,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
     if (__pyx_v_self->use_index) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":453
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":454
  *                 raise Exception("Precomputation done with min gap size %d, decoder uses %d" % (pre.train_min_gap_size, self.train_min_gap_size))
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))             # <<<<<<<<<<<<<<
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)
  */
-      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_5 = __pyx_v_pre->precomputed_index;
       __Pyx_INCREF(__pyx_t_5);
-      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_113));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_113));
@@ -40017,13 +40012,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":454
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":455
  *             if self.use_index:
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():             # <<<<<<<<<<<<<<
@@ -40033,9 +40028,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __pyx_t_6 = 0;
       if (unlikely(__pyx_v_pre->precomputed_index == Py_None)) {
         PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_index, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_index, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_XDECREF(__pyx_t_5);
       __pyx_t_5 = __pyx_t_2;
@@ -40043,7 +40038,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       while (1) {
         __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_7, &__pyx_t_6, &__pyx_t_2, &__pyx_t_4, NULL, __pyx_t_8);
         if (unlikely(__pyx_t_9 == 0)) break;
-        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_XDECREF(__pyx_v_pattern);
@@ -40053,21 +40048,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
         __pyx_v_arr = __pyx_t_4;
         __pyx_t_4 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":455
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":456
  *                 logger.info("Converting %d hash keys on precomputed inverted index... ", len(pre.precomputed_index))
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)             # <<<<<<<<<<<<<<
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  */
-        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(__pyx_v_pattern);
         PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
-        __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -40075,7 +40070,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
         __pyx_v_phrases = __pyx_t_3;
         __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":456
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":457
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:             # <<<<<<<<<<<<<<
@@ -40086,7 +40081,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
           __pyx_t_3 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_3); __pyx_t_10 = 0;
           __pyx_t_11 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __pyx_t_11 = Py_TYPE(__pyx_t_3)->tp_iternext;
         }
@@ -40094,23 +40089,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
           if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_3)) {
             if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_3)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_3)) {
             if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else {
             __pyx_t_2 = __pyx_t_11(__pyx_t_3);
             if (unlikely(!__pyx_t_2)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
@@ -40120,14 +40115,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
           __pyx_v_phrase = __pyx_t_2;
           __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":457
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":458
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr             # <<<<<<<<<<<<<<
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  */
-          if (PyObject_SetItem(__pyx_v_self->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 457; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyObject_SetItem(__pyx_v_self->precomputed_index, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       }
@@ -40136,7 +40131,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     }
     __pyx_L8:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":458
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":459
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:             # <<<<<<<<<<<<<<
@@ -40145,25 +40140,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
     if (__pyx_v_self->use_collocations) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":459
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":460
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))             # <<<<<<<<<<<<<<
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)
  */
-      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_5 = __pyx_v_pre->precomputed_collocations;
       __Pyx_INCREF(__pyx_t_5);
-      __pyx_t_7 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_114));
       PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_114));
@@ -40171,13 +40166,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":460
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":461
  *             if self.use_collocations:
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():             # <<<<<<<<<<<<<<
@@ -40187,9 +40182,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __pyx_t_7 = 0;
       if (unlikely(__pyx_v_pre->precomputed_collocations == Py_None)) {
         PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
-      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_6), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_6), (&__pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_XDECREF(__pyx_t_5);
       __pyx_t_5 = __pyx_t_2;
@@ -40197,7 +40192,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       while (1) {
         __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_6, &__pyx_t_7, &__pyx_t_2, &__pyx_t_3, NULL, __pyx_t_8);
         if (unlikely(__pyx_t_9 == 0)) break;
-        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_XDECREF(__pyx_v_pattern);
@@ -40207,21 +40202,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
         __pyx_v_arr = __pyx_t_3;
         __pyx_t_3 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":461
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":462
  *                 logger.info("Converting %d hash keys on precomputed collocations... ", len(pre.precomputed_collocations))
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)             # <<<<<<<<<<<<<<
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  */
-        __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(__pyx_v_pattern);
         PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_pattern);
         __Pyx_GIVEREF(__pyx_v_pattern);
-        __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -40229,47 +40224,47 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
         __pyx_v_phrase = __pyx_t_4;
         __pyx_t_4 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":462
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":463
  *                 for pattern, arr in pre.precomputed_collocations.iteritems():
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr             # <<<<<<<<<<<<<<
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)
  */
-        if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase, __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":463
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":464
  *                     phrase = self.pattern2phrase(pattern)
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)
  * 
  */
-    __pyx_t_5 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 463; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_v_stop_time = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":464
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":465
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
     PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_115));
@@ -40277,7 +40272,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -40319,7 +40314,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collo
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":467
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":468
  * 
  * 
  *     def get_precomputed_collocation(self, phrase):             # <<<<<<<<<<<<<<
@@ -40341,29 +40336,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_precomputed_collocation", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":468
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":469
  * 
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:             # <<<<<<<<<<<<<<
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_phrase, __pyx_v_self->precomputed_collocations, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_phrase, __pyx_v_self->precomputed_collocations, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":469
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":470
  *     def get_precomputed_collocation(self, phrase):
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]             # <<<<<<<<<<<<<<
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_collocations, __pyx_v_phrase); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_arr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":470
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":471
  *         if phrase in self.precomputed_collocations:
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)             # <<<<<<<<<<<<<<
@@ -40371,26 +40366,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
  * 
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr), __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_3 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr), __pyx_v_arr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_GetAttr(__pyx_v_phrase, __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_v_phrase, __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Add(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Add(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_r = __pyx_t_4;
@@ -40400,7 +40395,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":471
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":472
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None             # <<<<<<<<<<<<<<
@@ -40427,7 +40422,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":474
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":475
  * 
  * 
  *     cdef int* baeza_yates_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -40473,7 +40468,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("baeza_yates_helper", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":487
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":488
  *         cdef Matching loc1, loc2
  * 
  *         result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -40482,7 +40477,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":489
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":490
  *         result = <int*> malloc(0*sizeof(int*))
  * 
  *         d_first = 0             # <<<<<<<<<<<<<<
@@ -40491,7 +40486,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_d_first = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":490
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":491
  * 
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:             # <<<<<<<<<<<<<<
@@ -40501,7 +40496,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_1 = ((__pyx_v_high1 - __pyx_v_low1) > (__pyx_v_high2 - __pyx_v_low2));
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":491
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":492
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:
  *             d_first = 1             # <<<<<<<<<<<<<<
@@ -40513,7 +40508,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":495
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":496
  *         # First, check to see if we are at any of the recursive base cases
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:             # <<<<<<<<<<<<<<
@@ -40529,7 +40524,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":496
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":497
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:
  *             return result             # <<<<<<<<<<<<<<
@@ -40542,7 +40537,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":499
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":500
  * 
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40551,7 +40546,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, (__pyx_v_high1 - __pyx_v_step1), __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":500
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":501
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40560,7 +40555,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_low2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":501
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":502
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:             # <<<<<<<<<<<<<<
@@ -40570,7 +40565,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == -1);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":502
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":503
  *         assign_matching(&loc2, arr2, low2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == -1:
  *             return result             # <<<<<<<<<<<<<<
@@ -40583,7 +40578,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":504
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":505
  *             return result
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40592,7 +40587,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_low1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":505
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":506
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40601,7 +40596,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_high2 - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":506
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":507
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -40611,7 +40606,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":507
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":508
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)
  *         if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *             return result             # <<<<<<<<<<<<<<
@@ -40624,7 +40619,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":511
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":512
  *         # Case 3: query set and data set do not meet size mismatch constraints;
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1             # <<<<<<<<<<<<<<
@@ -40634,15 +40629,15 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_4 = (__pyx_v_high1 - __pyx_v_low1);
   if (unlikely(__pyx_v_step1 == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_step1 == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_4))) {
     PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_v_qsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":512
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":513
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2             # <<<<<<<<<<<<<<
@@ -40652,15 +40647,15 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_4 = (__pyx_v_high2 - __pyx_v_low2);
   if (unlikely(__pyx_v_step2 == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   else if (sizeof(int) == sizeof(long) && unlikely(__pyx_v_step2 == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_t_4))) {
     PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_v_dsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":513
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":514
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -40669,7 +40664,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":514
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":515
  *         dsetsize = (high2-low2) / step2
  *         if d_first:
  *             tmp = qsetsize             # <<<<<<<<<<<<<<
@@ -40678,7 +40673,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_qsetsize;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":515
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":516
  *         if d_first:
  *             tmp = qsetsize
  *             qsetsize = dsetsize             # <<<<<<<<<<<<<<
@@ -40687,7 +40682,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_qsetsize = __pyx_v_dsetsize;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":516
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":517
  *             tmp = qsetsize
  *             qsetsize = dsetsize
  *             dsetsize = tmp             # <<<<<<<<<<<<<<
@@ -40699,7 +40694,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L7:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":518
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":519
  *             dsetsize = tmp
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:             # <<<<<<<<<<<<<<
@@ -40710,12 +40705,12 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_6 = log(2.0);
   if (unlikely(__pyx_t_6 == 0)) {
     PyErr_Format(PyExc_ZeroDivisionError, "float division");
-    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_t_3 = ((__pyx_t_5 / __pyx_t_6) > __pyx_v_dsetsize);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":519
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":520
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)             # <<<<<<<<<<<<<<
@@ -40724,7 +40719,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     free(__pyx_v_result);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":520
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":521
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)
  *             return self.merge_helper(low1, high1, arr1, step1, low2, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -40737,7 +40732,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L8:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":524
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":525
  *         # binary search.    There are two flavors, depending on
  *         # whether the queryset or dataset is first
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -40746,7 +40741,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":525
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":526
  *         # whether the queryset or dataset is first
  *         if d_first:
  *             med2 = median(low2, high2, step2)             # <<<<<<<<<<<<<<
@@ -40755,7 +40750,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_low2, __pyx_v_high2, __pyx_v_step2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":526
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":527
  *         if d_first:
  *             med2 = median(low2, high2, step2)
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40764,7 +40759,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":528
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":529
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  * 
  *             search_low = low1             # <<<<<<<<<<<<<<
@@ -40773,7 +40768,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":529
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":530
  * 
  *             search_low = low1
  *             search_high = high1             # <<<<<<<<<<<<<<
@@ -40782,7 +40777,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":530
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":531
  *             search_low = low1
  *             search_high = high1
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -40793,7 +40788,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":531
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":532
  *             search_high = high1
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)             # <<<<<<<<<<<<<<
@@ -40802,7 +40797,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step1);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":532
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":533
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -40811,7 +40806,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":533
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":534
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -40820,7 +40815,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":536
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":537
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -40829,7 +40824,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":534
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":535
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -40838,7 +40833,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":535
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":536
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_low = med1_plus             # <<<<<<<<<<<<<<
@@ -40848,7 +40843,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_low = __pyx_v_med1_plus;
         break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":536
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":537
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -40857,7 +40852,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":537
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":538
  *                     search_low = med1_plus
  *                 elif comparison == 1:
  *                     search_high = med1_minus             # <<<<<<<<<<<<<<
@@ -40868,7 +40863,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":539
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":540
  *                     search_high = med1_minus
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -40884,7 +40879,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":541
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":542
  *                     break
  *         else:
  *             med1 = median(low1, high1, step1)             # <<<<<<<<<<<<<<
@@ -40893,7 +40888,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1 = __pyx_f_3_sa_median(__pyx_v_low1, __pyx_v_high1, __pyx_v_step1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":542
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":543
  *         else:
  *             med1 = median(low1, high1, step1)
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -40902,7 +40897,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_f_3_sa_find_comparable_matchings(__pyx_v_low1, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med1, (&__pyx_v_med1_minus), (&__pyx_v_med1_plus));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":544
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":545
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  * 
  *             search_low = low2             # <<<<<<<<<<<<<<
@@ -40911,7 +40906,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":545
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":546
  * 
  *             search_low = low2
  *             search_high = high2             # <<<<<<<<<<<<<<
@@ -40920,7 +40915,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":546
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":547
  *             search_low = low2
  *             search_high = high2
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -40931,7 +40926,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_search_low < __pyx_v_search_high);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":547
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":548
  *             search_high = high2
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)             # <<<<<<<<<<<<<<
@@ -40940,7 +40935,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2 = __pyx_f_3_sa_median(__pyx_v_search_low, __pyx_v_search_high, __pyx_v_step2);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":548
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":549
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -40949,7 +40944,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_med2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":549
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":550
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -40958,7 +40953,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings_set(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":552
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":553
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -40967,7 +40962,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":550
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":551
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -40976,7 +40971,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":551
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":552
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_high = med2             # <<<<<<<<<<<<<<
@@ -40986,7 +40981,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_high = __pyx_v_med2;
         break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":552
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":553
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -40995,7 +40990,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":553
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":554
  *                     search_high = med2
  *                 elif comparison == 1:
  *                     search_low = med2 + step2             # <<<<<<<<<<<<<<
@@ -41006,7 +41001,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":555
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":556
  *                     search_low = med2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -41021,7 +41016,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L9:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":557
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":558
  *                     break
  * 
  *         med_result_len = 0             # <<<<<<<<<<<<<<
@@ -41030,7 +41025,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":558
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":559
  * 
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -41039,7 +41034,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":559
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":560
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))
  *         if search_high > search_low:             # <<<<<<<<<<<<<<
@@ -41049,7 +41044,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   __pyx_t_3 = (__pyx_v_search_high > __pyx_v_search_low);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":565
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":566
  *             # want to store the bindings for all of those elements.    We can
  *             # subsequently throw all of them away.
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -41058,7 +41053,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":566
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":567
  *             # subsequently throw all of them away.
  *             med2_minus = med2
  *             med2_plus = med2 + step2             # <<<<<<<<<<<<<<
@@ -41067,7 +41062,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = (__pyx_v_med2 + __pyx_v_step2);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":567
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":568
  *             med2_minus = med2
  *             med2_plus = med2 + step2
  *             i1 = med1_minus             # <<<<<<<<<<<<<<
@@ -41076,7 +41071,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_i1 = __pyx_v_med1_minus;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":568
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":569
  *             med2_plus = med2 + step2
  *             i1 = med1_minus
  *             while i1 < med1_plus:             # <<<<<<<<<<<<<<
@@ -41087,7 +41082,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i1 < __pyx_v_med1_plus);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":569
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":570
  *             i1 = med1_minus
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41096,7 +41091,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":570
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":571
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:             # <<<<<<<<<<<<<<
@@ -41107,7 +41102,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = ((__pyx_v_med2_minus - __pyx_v_step2) >= __pyx_v_low2);
         if (!__pyx_t_3) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":571
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":572
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41116,7 +41111,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, (__pyx_v_med2_minus - __pyx_v_step2), __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":572
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":573
  *                 while med2_minus-step2 >= low2:
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:             # <<<<<<<<<<<<<<
@@ -41126,7 +41121,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) < 1);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":573
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":574
  *                     assign_matching(&loc2, arr2, med2_minus-step2, step2, self.fda.sent_id.arr)
  *                     if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) < 1:
  *                         med2_minus = med2_minus - step2             # <<<<<<<<<<<<<<
@@ -41138,7 +41133,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":575
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":576
  *                         med2_minus = med2_minus - step2
  *                     else:
  *                         break             # <<<<<<<<<<<<<<
@@ -41151,7 +41146,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L18_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":576
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":577
  *                     else:
  *                         break
  *                 i2 = med2_minus             # <<<<<<<<<<<<<<
@@ -41160,7 +41155,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_i2 = __pyx_v_med2_minus;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":577
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":578
  *                         break
  *                 i2 = med2_minus
  *                 while i2 < high2:             # <<<<<<<<<<<<<<
@@ -41171,7 +41166,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
         if (!__pyx_t_3) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":578
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":579
  *                 i2 = med2_minus
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41180,7 +41175,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":579
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":580
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -41189,7 +41184,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":580
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":581
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -41199,7 +41194,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == 0);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":582
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":583
  *                     if comparison == 0:
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)             # <<<<<<<<<<<<<<
@@ -41211,7 +41206,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L22:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":583
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":584
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -41221,7 +41216,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_t_3 = (__pyx_v_comparison == -1);
         if (__pyx_t_3) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":584
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":585
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -41233,7 +41228,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L23:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":585
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":586
  *                     if comparison == -1:
  *                         break
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -41244,7 +41239,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L21_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":586
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":587
  *                         break
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:             # <<<<<<<<<<<<<<
@@ -41254,7 +41249,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_i2 > __pyx_v_med2_plus);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":587
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":588
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:
  *                     med2_plus = i2             # <<<<<<<<<<<<<<
@@ -41266,7 +41261,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L24:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":588
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":589
  *                 if i2 > med2_plus:
  *                     med2_plus = i2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -41276,7 +41271,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_v_i1 = (__pyx_v_i1 + __pyx_v_step1);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":590
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":591
  *                 i1 = i1 + step1
  * 
  *             tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -41285,7 +41280,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_med1_minus;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":591
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":592
  * 
  *             tmp = med1_minus
  *             med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -41294,7 +41289,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":592
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":593
  *             tmp = med1_minus
  *             med1_minus = med1_plus
  *             med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -41306,7 +41301,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":595
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":596
  *         else:
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -41315,7 +41310,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":596
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":597
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2
  *             med2_plus = med2             # <<<<<<<<<<<<<<
@@ -41324,7 +41319,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = __pyx_v_med2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":597
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":598
  *             med2_minus = med2
  *             med2_plus = med2
  *             if d_first:             # <<<<<<<<<<<<<<
@@ -41333,7 +41328,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     if (__pyx_v_d_first) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":598
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":599
  *             med2_plus = med2
  *             if d_first:
  *                 med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -41342,7 +41337,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":599
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":600
  *             if d_first:
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -41352,7 +41347,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == -1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":600
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":601
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:
  *                     med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -41364,7 +41359,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L26:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":601
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":602
  *                 if comparison == -1:
  *                     med1_minus = med1_plus
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -41374,7 +41369,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":602
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":603
  *                     med1_minus = med1_plus
  *                 if comparison == 1:
  *                     med1_plus = med1_minus             # <<<<<<<<<<<<<<
@@ -41389,7 +41384,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":604
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":605
  *                     med1_plus = med1_minus
  *             else:
  *                 tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -41398,7 +41393,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_tmp = __pyx_v_med1_minus;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":605
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":606
  *             else:
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -41407,7 +41402,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":606
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":607
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -41416,7 +41411,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_plus = __pyx_v_tmp;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":607
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":608
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -41426,7 +41421,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_t_3 = (__pyx_v_comparison == 1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":608
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":609
  *                 med1_plus = tmp
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -41435,7 +41430,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         __pyx_v_med2_minus = (__pyx_v_med2_minus + __pyx_v_step2);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":609
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":610
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2
  *                     med2_plus = med2_plus + step2             # <<<<<<<<<<<<<<
@@ -41451,7 +41446,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L14:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":611
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":612
  *                     med2_plus = med2_plus + step2
  * 
  *         low_result_len = 0             # <<<<<<<<<<<<<<
@@ -41460,7 +41455,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":612
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":613
  * 
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)             # <<<<<<<<<<<<<<
@@ -41469,7 +41464,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_low1, __pyx_v_med1_plus, __pyx_v_arr1, __pyx_v_step1, __pyx_v_low2, __pyx_v_med2_plus, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_low_result_len));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":613
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":614
  *         low_result_len = 0
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0             # <<<<<<<<<<<<<<
@@ -41478,7 +41473,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":614
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":615
  *         low_result = self.baeza_yates_helper(low1, med1_plus, arr1, step1, low2, med2_plus, arr2, step2, offset_by_one, len_last, num_subpatterns, &low_result_len)
  *         high_result_len = 0
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)             # <<<<<<<<<<<<<<
@@ -41487,7 +41482,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->baeza_yates_helper(__pyx_v_self, __pyx_v_med1_minus, __pyx_v_high1, __pyx_v_arr1, __pyx_v_step1, __pyx_v_med2_minus, __pyx_v_high2, __pyx_v_arr2, __pyx_v_step2, __pyx_v_offset_by_one, __pyx_v_len_last, __pyx_v_num_subpatterns, (&__pyx_v_high_result_len));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":616
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":617
  *         high_result = self.baeza_yates_helper(med1_minus, high1, arr1, step1, med2_minus, high2, arr2, step2, offset_by_one, len_last, num_subpatterns, &high_result_len)
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)             # <<<<<<<<<<<<<<
@@ -41496,7 +41491,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_low_result, __pyx_v_low_result_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":617
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":618
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)             # <<<<<<<<<<<<<<
@@ -41505,7 +41500,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_med_result, __pyx_v_med_result_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":618
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":619
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)             # <<<<<<<<<<<<<<
@@ -41514,7 +41509,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = __pyx_f_3_sa_extend_arr(__pyx_v_result, __pyx_v_result_len, __pyx_v_high_result, __pyx_v_high_result_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":619
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":620
  *         result = extend_arr(result, result_len, med_result, med_result_len)
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)             # <<<<<<<<<<<<<<
@@ -41523,7 +41518,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_low_result);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":620
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":621
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)
  *         free(med_result)             # <<<<<<<<<<<<<<
@@ -41532,7 +41527,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_med_result);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":621
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":622
  *         free(low_result)
  *         free(med_result)
  *         free(high_result)             # <<<<<<<<<<<<<<
@@ -41541,7 +41536,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_high_result);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":623
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":624
  *         free(high_result)
  * 
  *         return result             # <<<<<<<<<<<<<<
@@ -41561,7 +41556,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":627
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":628
  * 
  * 
  *     cdef long compare_matchings_set(self, int i1_minus, int i1_plus, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -41580,7 +41575,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("compare_matchings_set", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":638
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":639
  *         cdef Matching* loc1
  * 
  *         loc1 = &l1_stack             # <<<<<<<<<<<<<<
@@ -41589,7 +41584,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_loc1 = (&__pyx_v_l1_stack);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":640
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":641
  *         loc1 = &l1_stack
  * 
  *         i1 = i1_minus             # <<<<<<<<<<<<<<
@@ -41598,7 +41593,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_i1 = __pyx_v_i1_minus;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":641
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":642
  * 
  *         i1 = i1_minus
  *         while i1 < i1_plus:             # <<<<<<<<<<<<<<
@@ -41609,7 +41604,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 < __pyx_v_i1_plus);
     if (!__pyx_t_1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":642
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":643
  *         i1 = i1_minus
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41618,7 +41613,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_f_3_sa_assign_matching(__pyx_v_loc1, __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":643
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":644
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -41627,7 +41622,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
     __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, __pyx_v_loc1, __pyx_v_loc2, __pyx_v_offset_by_one, __pyx_v_len_last);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":644
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":645
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:             # <<<<<<<<<<<<<<
@@ -41637,7 +41632,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_comparison == 0);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":645
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":646
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:
  *                 prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -41646,7 +41641,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
       __pyx_v_prev_comparison = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":646
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":647
  *             if comparison == 0:
  *                 prev_comparison = 0
  *                 break             # <<<<<<<<<<<<<<
@@ -41657,7 +41652,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       goto __pyx_L5;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":647
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":648
  *                 prev_comparison = 0
  *                 break
  *             elif i1 == i1_minus:             # <<<<<<<<<<<<<<
@@ -41667,7 +41662,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_i1 == __pyx_v_i1_minus);
     if (__pyx_t_1) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":648
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":649
  *                 break
  *             elif i1 == i1_minus:
  *                 prev_comparison = comparison             # <<<<<<<<<<<<<<
@@ -41679,7 +41674,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":650
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":651
  *                 prev_comparison = comparison
  *             else:
  *                 if comparison != prev_comparison:             # <<<<<<<<<<<<<<
@@ -41689,7 +41684,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       __pyx_t_1 = (__pyx_v_comparison != __pyx_v_prev_comparison);
       if (__pyx_t_1) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":651
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":652
  *             else:
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -41698,7 +41693,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
         __pyx_v_prev_comparison = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":652
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":653
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -41712,7 +41707,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":653
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":654
  *                     prev_comparison = 0
  *                     break
  *             i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -41723,7 +41718,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   }
   __pyx_L4_break:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":654
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":655
  *                     break
  *             i1 = i1 + step1
  *         return prev_comparison             # <<<<<<<<<<<<<<
@@ -41739,7 +41734,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":657
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":658
  * 
  * 
  *     cdef long compare_matchings(self, Matching* loc1, Matching* loc2, int offset_by_one, int len_last):             # <<<<<<<<<<<<<<
@@ -41757,7 +41752,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   int __pyx_t_4;
   __Pyx_RefNannySetupContext("compare_matchings", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":660
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":661
  *         cdef int i
  * 
  *         if loc1.sent_id > loc2.sent_id:             # <<<<<<<<<<<<<<
@@ -41767,7 +41762,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc1->sent_id > __pyx_v_loc2->sent_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":661
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":662
  * 
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1             # <<<<<<<<<<<<<<
@@ -41780,7 +41775,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":662
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":663
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:             # <<<<<<<<<<<<<<
@@ -41790,7 +41785,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_1 = (__pyx_v_loc2->sent_id > __pyx_v_loc1->sent_id);
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":663
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":664
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:
  *             return -1             # <<<<<<<<<<<<<<
@@ -41803,7 +41798,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":665
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":666
  *             return -1
  * 
  *         if loc1.size == 1 and loc2.size == 1:             # <<<<<<<<<<<<<<
@@ -41819,7 +41814,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":666
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":667
  * 
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:             # <<<<<<<<<<<<<<
@@ -41829,7 +41824,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc2->arr[__pyx_v_loc2->start]) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) <= __pyx_v_self->train_min_gap_size);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":667
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":668
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -41844,7 +41839,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     goto __pyx_L5;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":669
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":670
  *                 return 1
  * 
  *         elif offset_by_one:             # <<<<<<<<<<<<<<
@@ -41853,7 +41848,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
  */
   if (__pyx_v_offset_by_one) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":670
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":671
  * 
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -41863,7 +41858,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":671
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":672
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -41873,7 +41868,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":672
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":673
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -41886,7 +41881,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L9:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":673
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":674
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -41896,7 +41891,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[((__pyx_v_loc2->start + __pyx_v_i) - 1)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":674
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":675
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -41913,7 +41908,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":677
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":678
  * 
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -41923,7 +41918,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) > (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":678
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":679
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -41936,7 +41931,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L11:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":679
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":680
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -41946,7 +41941,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_3 = (((__pyx_v_loc1->arr[__pyx_v_loc1->start]) + 1) < (__pyx_v_loc2->arr[__pyx_v_loc2->start]));
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":680
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":681
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -41959,7 +41954,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L12:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":682
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":683
  *                 return -1
  * 
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -41969,7 +41964,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     __pyx_t_4 = __pyx_v_loc1->size;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":683
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":684
  * 
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -41979,7 +41974,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) > (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":684
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":685
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -41992,7 +41987,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L15:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":685
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":686
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -42002,7 +41997,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       __pyx_t_3 = ((__pyx_v_loc1->arr[(__pyx_v_loc1->start + __pyx_v_i)]) < (__pyx_v_loc2->arr[(__pyx_v_loc2->start + __pyx_v_i)]));
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":686
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":687
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -42018,7 +42013,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":688
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":689
  *                     return -1
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -42028,7 +42023,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   __pyx_t_3 = ((((__pyx_v_loc2->arr[(__pyx_v_loc2->end - 1)]) + __pyx_v_len_last) - (__pyx_v_loc1->arr[__pyx_v_loc1->start])) > __pyx_v_self->train_max_initial_size);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":689
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":690
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1             # <<<<<<<<<<<<<<
@@ -42041,7 +42036,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L17:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":690
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":691
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1
  *         return 0             # <<<<<<<<<<<<<<
@@ -42057,7 +42052,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":693
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":694
  * 
  * 
  *     cdef int* merge_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -42081,7 +42076,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("merge_helper", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":701
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":702
  *         cdef Matching loc1, loc2
  * 
  *         result_len[0] = 0             # <<<<<<<<<<<<<<
@@ -42090,7 +42085,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   (__pyx_v_result_len[0]) = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":702
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":703
  * 
  *         result_len[0] = 0
  *         result = <int*> malloc(0*sizeof(int))             # <<<<<<<<<<<<<<
@@ -42099,7 +42094,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":704
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":705
  *         result = <int*> malloc(0*sizeof(int))
  * 
  *         i1 = low1             # <<<<<<<<<<<<<<
@@ -42108,7 +42103,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i1 = __pyx_v_low1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":705
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":706
  * 
  *         i1 = low1
  *         i2 = low2             # <<<<<<<<<<<<<<
@@ -42117,7 +42112,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i2 = __pyx_v_low2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":706
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":707
  *         i1 = low1
  *         i2 = low2
  *         while i1 < high1 and i2 < high2:             # <<<<<<<<<<<<<<
@@ -42134,7 +42129,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     if (!__pyx_t_3) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":709
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":710
  * 
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42143,7 +42138,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":710
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":711
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:             # <<<<<<<<<<<<<<
@@ -42154,7 +42149,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (__pyx_v_i2 < __pyx_v_high2);
       if (!__pyx_t_3) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":711
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":712
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42163,7 +42158,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_i2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":712
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":713
  *             while i2 < high2:
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:             # <<<<<<<<<<<<<<
@@ -42173,7 +42168,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       __pyx_t_3 = (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last) == 1);
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":713
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":714
  *                 assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)
  *                 if self.compare_matchings(&loc1, &loc2, offset_by_one, len_last) == 1:
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -42185,7 +42180,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":715
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":716
  *                     i2 = i2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -42198,7 +42193,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     __pyx_L6_break:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":718
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":719
  * 
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1             # <<<<<<<<<<<<<<
@@ -42207,7 +42202,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_v_j1 = __pyx_v_i1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":719
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":720
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:             # <<<<<<<<<<<<<<
@@ -42224,7 +42219,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       if (!__pyx_t_2) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":720
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":721
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42233,7 +42228,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_f_3_sa_assign_matching((&__pyx_v_loc1), __pyx_v_arr1, __pyx_v_i1, __pyx_v_step1, __pyx_v_self->fda->sent_id->arr);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":721
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":722
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2             # <<<<<<<<<<<<<<
@@ -42242,7 +42237,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_v_j2 = __pyx_v_i2;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":722
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":723
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2
  *                 while j2 < high2:             # <<<<<<<<<<<<<<
@@ -42253,7 +42248,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_j2 < __pyx_v_high2);
         if (!__pyx_t_2) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":723
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":724
  *                 j2 = i2
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42262,7 +42257,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_f_3_sa_assign_matching((&__pyx_v_loc2), __pyx_v_arr2, __pyx_v_j2, __pyx_v_step2, __pyx_v_self->fda->sent_id->arr);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":724
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":725
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)             # <<<<<<<<<<<<<<
@@ -42271,7 +42266,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
         __pyx_v_comparison = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->compare_matchings(__pyx_v_self, (&__pyx_v_loc1), (&__pyx_v_loc2), __pyx_v_offset_by_one, __pyx_v_len_last);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":725
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":726
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:             # <<<<<<<<<<<<<<
@@ -42281,7 +42276,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == 0);
         if (__pyx_t_2) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":726
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":727
  *                     comparison = self.compare_matchings(&loc1, &loc2, offset_by_one, len_last)
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)             # <<<<<<<<<<<<<<
@@ -42293,7 +42288,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L12:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":727
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":728
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)
  *                     if comparison == 1:             # <<<<<<<<<<<<<<
@@ -42306,7 +42301,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L13:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":729
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":730
  *                     if comparison == 1:
  *                         pass
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -42316,7 +42311,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         __pyx_t_2 = (__pyx_v_comparison == -1);
         if (__pyx_t_2) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":730
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":731
  *                         pass
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -42328,7 +42323,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":732
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":733
  *                         break
  *                     else:
  *                         j2 = j2 + step2             # <<<<<<<<<<<<<<
@@ -42341,7 +42336,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       __pyx_L11_break:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":733
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":734
  *                     else:
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -42352,7 +42347,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":734
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":735
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1
  *         return result             # <<<<<<<<<<<<<<
@@ -42368,7 +42363,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":737
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":738
  * 
  * 
  *     cdef void sort_phrase_loc(self, IntList arr, PhraseLocation loc, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -42390,26 +42385,26 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("sort_phrase_loc", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":742
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":743
  *         cdef IntList result
  * 
  *         if phrase in self.precomputed_index:             # <<<<<<<<<<<<<<
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  */
-  __pyx_t_1 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_phrase), __pyx_v_self->precomputed_index, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_phrase), __pyx_v_self->precomputed_index, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":743
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":744
  * 
  *         if phrase in self.precomputed_index:
  *             loc.arr = self.precomputed_index[phrase]             # <<<<<<<<<<<<<<
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->precomputed_index, ((PyObject *)__pyx_v_phrase)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 743; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GIVEREF(__pyx_t_2);
     __Pyx_GOTREF(__pyx_v_loc->arr);
     __Pyx_DECREF(((PyObject *)__pyx_v_loc->arr));
@@ -42419,20 +42414,20 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":745
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":746
  *             loc.arr = self.precomputed_index[phrase]
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)             # <<<<<<<<<<<<<<
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:
  */
-    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_loc->sa_high - __pyx_v_loc->sa_low)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_loc->sa_high - __pyx_v_loc->sa_low)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_GIVEREF(__pyx_t_3);
@@ -42441,27 +42436,27 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_v_loc->arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":746
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":747
  *         else:
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)             # <<<<<<<<<<<<<<
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])
  */
-    __pyx_t_3 = PyInt_FromLong(__pyx_v_arr->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong(__pyx_v_arr->len); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 747; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 747; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_VEB)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_VEB)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 747; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_v_veb = ((struct __pyx_obj_3_sa_VEB *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":747
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":748
  *             loc.arr = IntList(initial_len=loc.sa_high-loc.sa_low)
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:             # <<<<<<<<<<<<<<
@@ -42471,7 +42466,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = __pyx_v_loc->sa_high;
     for (__pyx_v_i = __pyx_v_loc->sa_low; __pyx_v_i < __pyx_t_4; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":748
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":749
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])             # <<<<<<<<<<<<<<
@@ -42481,7 +42476,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
       ((struct __pyx_vtabstruct_3_sa_VEB *)__pyx_v_veb->__pyx_vtab)->_insert(__pyx_v_veb, (__pyx_v_arr->arr[__pyx_v_i]));
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":749
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":750
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -42490,7 +42485,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
     __pyx_v_i = __pyx_v_veb->veb->min_val;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":750
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":751
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:             # <<<<<<<<<<<<<<
@@ -42500,7 +42495,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
     __pyx_t_4 = (__pyx_v_loc->sa_high - __pyx_v_loc->sa_low);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":751
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":752
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i             # <<<<<<<<<<<<<<
@@ -42509,7 +42504,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
       (__pyx_v_loc->arr->arr[__pyx_v_j]) = __pyx_v_i;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":752
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":753
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -42521,7 +42516,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":753
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":754
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0             # <<<<<<<<<<<<<<
@@ -42530,7 +42525,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
   __pyx_v_loc->arr_low = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":754
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":755
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0
  *         loc.arr_high = loc.arr.len             # <<<<<<<<<<<<<<
@@ -42549,7 +42544,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":757
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":758
  * 
  * 
  *     cdef intersect_helper(self, Phrase prefix, Phrase suffix,             # <<<<<<<<<<<<<<
@@ -42586,7 +42581,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("intersect_helper", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":764
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":765
  *         cdef int* result_ptr
  * 
  *         result_len = 0             # <<<<<<<<<<<<<<
@@ -42595,21 +42590,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_result_len = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":766
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":767
  *         result_len = 0
  * 
  *         if sym_isvar(suffix[0]):             # <<<<<<<<<<<<<<
  *             offset_by_one = 1
  *         else:
  */
-  __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_suffix), 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_suffix), 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_3 = __pyx_f_3_sa_sym_isvar(__pyx_t_2);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":767
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":768
  * 
  *         if sym_isvar(suffix[0]):
  *             offset_by_one = 1             # <<<<<<<<<<<<<<
@@ -42621,7 +42616,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":769
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":770
  *             offset_by_one = 1
  *         else:
  *             offset_by_one = 0             # <<<<<<<<<<<<<<
@@ -42632,34 +42627,34 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":771
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":772
  *             offset_by_one = 0
  * 
  *         len_last = len(suffix.getchunk(suffix.arity()))             # <<<<<<<<<<<<<<
  * 
  *         if prefix_loc.arr is None:
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__getchunk); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__getchunk); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_suffix), __pyx_n_s__arity); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
   __Pyx_GIVEREF(__pyx_t_5);
   __pyx_t_5 = 0;
-  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-  __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_len_last = __pyx_t_6;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":773
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":774
  *         len_last = len(suffix.getchunk(suffix.arity()))
  * 
  *         if prefix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -42669,7 +42664,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_prefix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":774
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":775
  * 
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)             # <<<<<<<<<<<<<<
@@ -42684,7 +42679,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":775
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":776
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr             # <<<<<<<<<<<<<<
@@ -42694,7 +42689,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_prefix_loc->arr));
   __pyx_v_arr1 = __pyx_v_prefix_loc->arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":776
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":777
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -42703,7 +42698,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low1 = __pyx_v_prefix_loc->arr_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":777
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":778
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -42712,7 +42707,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high1 = __pyx_v_prefix_loc->arr_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":778
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":779
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high
  *         step1 = prefix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -42721,7 +42716,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step1 = __pyx_v_prefix_loc->num_subpatterns;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":780
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":781
  *         step1 = prefix_loc.num_subpatterns
  * 
  *         if suffix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -42731,7 +42726,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (((PyObject *)__pyx_v_suffix_loc->arr) == Py_None);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":781
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":782
  * 
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)             # <<<<<<<<<<<<<<
@@ -42746,7 +42741,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L5:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":782
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":783
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr             # <<<<<<<<<<<<<<
@@ -42756,7 +42751,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __Pyx_INCREF(((PyObject *)__pyx_v_suffix_loc->arr));
   __pyx_v_arr2 = __pyx_v_suffix_loc->arr;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":783
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":784
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -42765,7 +42760,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low2 = __pyx_v_suffix_loc->arr_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":784
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":785
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -42774,7 +42769,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high2 = __pyx_v_suffix_loc->arr_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":785
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":786
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high
  *         step2 = suffix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -42783,26 +42778,26 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step2 = __pyx_v_suffix_loc->num_subpatterns;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":787
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":788
  *         step2 = suffix_loc.num_subpatterns
  * 
  *         num_subpatterns = prefix.arity()+1             # <<<<<<<<<<<<<<
  * 
  *         if algorithm == MERGE:
  */
-  __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_prefix), __pyx_n_s__arity); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_prefix), __pyx_n_s__arity); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_t_5); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_num_subpatterns = __pyx_t_3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":789
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":790
  *         num_subpatterns = prefix.arity()+1
  * 
  *         if algorithm == MERGE:             # <<<<<<<<<<<<<<
@@ -42812,7 +42807,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_algorithm == __pyx_v_3_sa_MERGE);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":792
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":793
  *             result_ptr = self.merge_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -42824,7 +42819,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":796
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":797
  *             result_ptr = self.baeza_yates_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -42835,7 +42830,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":798
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":799
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)
  * 
  *         if result_len == 0:             # <<<<<<<<<<<<<<
@@ -42845,7 +42840,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_result_len == 0);
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":799
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":800
  * 
  *         if result_len == 0:
  *             free(result_ptr)             # <<<<<<<<<<<<<<
@@ -42854,7 +42849,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result_ptr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":800
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":801
  *         if result_len == 0:
  *             free(result_ptr)
  *             return None             # <<<<<<<<<<<<<<
@@ -42869,19 +42864,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":802
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":803
  *             return None
  *         else:
  *             result = IntList()             # <<<<<<<<<<<<<<
  *             free(result.arr)
  *             result.arr = result_ptr
  */
-    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_v_result = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_5);
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":803
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":804
  *         else:
  *             result = IntList()
  *             free(result.arr)             # <<<<<<<<<<<<<<
@@ -42890,7 +42885,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result->arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":804
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":805
  *             result = IntList()
  *             free(result.arr)
  *             result.arr = result_ptr             # <<<<<<<<<<<<<<
@@ -42899,7 +42894,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->arr = __pyx_v_result_ptr;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":805
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":806
  *             free(result.arr)
  *             result.arr = result_ptr
  *             result.len = result_len             # <<<<<<<<<<<<<<
@@ -42908,7 +42903,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->len = __pyx_v_result_len;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":806
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":807
  *             result.arr = result_ptr
  *             result.len = result_len
  *             result.size = result_len             # <<<<<<<<<<<<<<
@@ -42917,7 +42912,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->size = __pyx_v_result_len;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":807
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":808
  *             result.len = result_len
  *             result.size = result_len
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)             # <<<<<<<<<<<<<<
@@ -42925,19 +42920,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  *     cdef loc2str(self, PhraseLocation loc):
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_result_len); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_low), __pyx_int_0) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_result_len); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr_high), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr), ((PyObject *)__pyx_v_result)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__arr), ((PyObject *)__pyx_v_result)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__num_subpatterns), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 807; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __pyx_r = __pyx_t_4;
@@ -42963,7 +42958,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":809
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":810
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)
  * 
  *     cdef loc2str(self, PhraseLocation loc):             # <<<<<<<<<<<<<<
@@ -42986,7 +42981,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("loc2str", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":811
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":812
  *     cdef loc2str(self, PhraseLocation loc):
  *         cdef int i, j
  *         result = "{"             # <<<<<<<<<<<<<<
@@ -42996,7 +42991,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_116));
   __pyx_v_result = ((PyObject *)__pyx_kp_s_116);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":812
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":813
  *         cdef int i, j
  *         result = "{"
  *         i = 0             # <<<<<<<<<<<<<<
@@ -43005,7 +43000,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":813
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":814
  *         result = "{"
  *         i = 0
  *         while i < loc.arr_high:             # <<<<<<<<<<<<<<
@@ -43016,20 +43011,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_t_1 = (__pyx_v_i < __pyx_v_loc->arr_high);
     if (!__pyx_t_1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":814
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":815
  *         i = 0
  *         while i < loc.arr_high:
  *             result = result + "("             # <<<<<<<<<<<<<<
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  */
-    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_117)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_117)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_v_result);
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":815
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":816
  *         while i < loc.arr_high:
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -43039,19 +43034,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_t_3 = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
     for (__pyx_v_j = __pyx_v_i; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":816
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":817
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])             # <<<<<<<<<<<<<<
  *             result = result + ")"
  *             i = i + loc.num_subpatterns
  */
-      __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_loc->arr), __pyx_v_j, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_loc->arr), __pyx_v_j, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_21), __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_v_result);
@@ -43059,20 +43054,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
       __pyx_t_2 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":817
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":818
  *             for j from i <= j < i + loc.num_subpatterns:
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"             # <<<<<<<<<<<<<<
  *             i = i + loc.num_subpatterns
  *         result = result + "}"
  */
-    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_59)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_59)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_v_result);
     __pyx_v_result = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":818
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":819
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"
  *             i = i + loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -43082,20 +43077,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_v_i = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":819
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":820
  *             result = result + ")"
  *             i = i + loc.num_subpatterns
  *         result = result + "}"             # <<<<<<<<<<<<<<
  *         return result
  * 
  */
-  __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_118)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Add(__pyx_v_result, ((PyObject *)__pyx_kp_s_118)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_v_result);
   __pyx_v_result = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":820
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":821
  *             i = i + loc.num_subpatterns
  *         result = result + "}"
  *         return result             # <<<<<<<<<<<<<<
@@ -43121,7 +43116,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":822
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":823
  *         return result
  * 
  *     cdef PhraseLocation intersect(self, prefix_node, suffix_node, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -43147,81 +43142,81 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("intersect", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":826
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":827
  *         cdef PhraseLocation prefix_loc, suffix_loc, result
  * 
  *         prefix = prefix_node.phrase             # <<<<<<<<<<<<<<
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_prefix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":827
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":828
  * 
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase             # <<<<<<<<<<<<<<
  *         prefix_loc = prefix_node.phrase_location
  *         suffix_loc = suffix_node.phrase_location
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_Phrase))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_suffix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":828
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":829
  *         prefix = prefix_node.phrase
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location             # <<<<<<<<<<<<<<
  *         suffix_loc = suffix_node.phrase_location
  * 
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_prefix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_prefix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":829
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":830
  *         suffix = suffix_node.phrase
  *         prefix_loc = prefix_node.phrase_location
  *         suffix_loc = suffix_node.phrase_location             # <<<<<<<<<<<<<<
  * 
  *         result = self.get_precomputed_collocation(phrase)
  */
-  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(__pyx_v_suffix_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_suffix_loc = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":831
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":832
  *         suffix_loc = suffix_node.phrase_location
  * 
  *         result = self.get_precomputed_collocation(phrase)             # <<<<<<<<<<<<<<
  *         if result is not None:
  *             intersect_method = "precomputed"
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_119); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s_119); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)__pyx_v_phrase));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_phrase));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_phrase));
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":832
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":833
  * 
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:             # <<<<<<<<<<<<<<
@@ -43231,7 +43226,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) != Py_None);
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":833
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":834
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:
  *             intersect_method = "precomputed"             # <<<<<<<<<<<<<<
@@ -43244,7 +43239,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":835
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":836
  *             intersect_method = "precomputed"
  * 
  *         if result is None:             # <<<<<<<<<<<<<<
@@ -43254,7 +43249,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   __pyx_t_4 = (((PyObject *)__pyx_v_result) == Py_None);
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":836
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":837
  * 
  *         if result is None:
  *             if self.use_baeza_yates:             # <<<<<<<<<<<<<<
@@ -43263,21 +43258,21 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
  */
     if (__pyx_v_self->use_baeza_yates) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":837
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":838
  *         if result is None:
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)             # <<<<<<<<<<<<<<
  *                 intersect_method="double binary"
  *             else:
  */
-      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_BAEZA_YATES); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_BAEZA_YATES); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_v_result));
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":838
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":839
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)
  *                 intersect_method="double binary"             # <<<<<<<<<<<<<<
@@ -43291,21 +43286,21 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":840
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":841
  *                 intersect_method="double binary"
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)             # <<<<<<<<<<<<<<
  *                 intersect_method="merge"
  *         return result
  */
-      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_MERGE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->intersect_helper(__pyx_v_self, __pyx_v_prefix, __pyx_v_suffix, __pyx_v_prefix_loc, __pyx_v_suffix_loc, __pyx_v_3_sa_MERGE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_v_result));
       __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":841
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":842
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"             # <<<<<<<<<<<<<<
@@ -43321,7 +43316,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":842
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":843
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"
  *         return result             # <<<<<<<<<<<<<<
@@ -43383,16 +43378,16 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "advance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -43407,7 +43402,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -43418,7 +43413,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":844
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":845
  *         return result
  * 
  *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
@@ -43459,19 +43454,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("advance", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":846
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":847
  *     def advance(self, frontier, res, fwords):
  *         cdef unsigned na
  *         nf = []             # <<<<<<<<<<<<<<
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_nf = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":847
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":848
  *         cdef unsigned na
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:             # <<<<<<<<<<<<<<
@@ -43482,7 +43477,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_t_1 = __pyx_v_frontier; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_3 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_frontier); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_frontier); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -43490,23 +43485,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     if (!__pyx_t_3 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_3 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_3(__pyx_t_1);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -43522,7 +43517,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       if (unlikely(size != 2)) {
         if (size > 2) __Pyx_RaiseTooManyValuesError(2);
         else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
@@ -43535,14 +43530,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_INCREF(__pyx_t_5);
       __Pyx_INCREF(__pyx_t_6);
       #else
-      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     } else
     {
       Py_ssize_t index = -1;
-      __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
@@ -43550,7 +43545,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_GOTREF(__pyx_t_5);
       index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_6);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L6_unpacking_done;
@@ -43558,7 +43553,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       __pyx_t_8 = NULL;
       if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L6_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_toskip);
@@ -43574,7 +43569,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       if (unlikely(size != 3)) {
         if (size > 3) __Pyx_RaiseTooManyValuesError(3);
         else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
@@ -43590,15 +43585,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_INCREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_t_10);
       #else
-      __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_10 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     } else
     {
       Py_ssize_t index = -1;
-      __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_11)->tp_iternext;
@@ -43608,7 +43603,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_GOTREF(__pyx_t_9);
       index = 2; __pyx_t_10 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_10)) goto __pyx_L7_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_10);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_8 = NULL;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
       goto __pyx_L8_unpacking_done;
@@ -43616,7 +43611,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
       __pyx_t_8 = NULL;
       if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L8_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_i);
@@ -43629,45 +43624,45 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_v_pathlen = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":848
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":849
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))
  */
-    __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_i); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_i); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_6 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_XDECREF(__pyx_v_spanlen);
     __pyx_v_spanlen = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":849
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":850
  *         for (toskip, (i, alt, pathlen)) in frontier:
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):             # <<<<<<<<<<<<<<
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  */
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_toskip, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":850
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":851
  *             spanlen = fwords[i][alt][2]
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))             # <<<<<<<<<<<<<<
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  */
-      __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_v_i);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
@@ -43678,7 +43673,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
       __Pyx_INCREF(__pyx_v_pathlen);
       PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_pathlen);
       __Pyx_GIVEREF(__pyx_v_pathlen);
-      __pyx_t_6 = __Pyx_PyObject_Append(__pyx_v_res, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_Append(__pyx_v_res, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
@@ -43686,42 +43681,42 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     }
     __pyx_L9:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":851
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":852
  *             if (toskip == 0):
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen             # <<<<<<<<<<<<<<
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):
  */
-    __pyx_t_6 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_XDECREF(__pyx_v_ni);
     __pyx_v_ni = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":852
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":853
  *                 res.append((i, alt, pathlen))
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):             # <<<<<<<<<<<<<<
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  */
-    __pyx_t_13 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_ni, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
-      __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_6 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_15 = __pyx_t_14;
     } else {
@@ -43729,34 +43724,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     }
     if (__pyx_t_15) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":853
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":854
  *             ni = i + spanlen
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):             # <<<<<<<<<<<<<<
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):
  */
-      __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ni); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ni); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_13 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_13 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_13; __pyx_t_16+=1) {
         __pyx_v_na = __pyx_t_16;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":854
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":855
  *             if (ni < len(fwords) and (pathlen + 1) < self.max_initial_size):
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))             # <<<<<<<<<<<<<<
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)
  */
-        __pyx_t_5 = PyNumber_Subtract(__pyx_v_toskip, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyNumber_Subtract(__pyx_v_toskip, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_na); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyLong_FromUnsignedLong(__pyx_v_na); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
-        __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyNumber_Add(__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_INCREF(__pyx_v_ni);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_ni);
@@ -43767,7 +43762,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
         __Pyx_GIVEREF(__pyx_t_4);
         __pyx_t_6 = 0;
         __pyx_t_4 = 0;
-        __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
@@ -43775,7 +43770,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
         __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
         __pyx_t_5 = 0;
         __pyx_t_10 = 0;
-        __pyx_t_17 = PyList_Append(__pyx_v_nf, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = PyList_Append(__pyx_v_nf, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       }
       goto __pyx_L10;
@@ -43784,18 +43779,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":855
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":856
  *                 for na in range(len(fwords[ni])):
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):             # <<<<<<<<<<<<<<
  *             return self.advance(nf, res, fwords)
  *         else:
  */
-  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_nf)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 856; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_15 = (__pyx_t_2 > 0);
   if (__pyx_t_15) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":856
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":857
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)             # <<<<<<<<<<<<<<
@@ -43803,9 +43798,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
  *             return res
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 856; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__advance); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 856; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_v_nf));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_nf));
@@ -43816,7 +43811,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_v_fwords);
-    __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 856; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -43827,7 +43822,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":858
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":859
  *             return self.advance(nf, res, fwords)
  *         else:
  *             return res             # <<<<<<<<<<<<<<
@@ -43905,36 +43900,36 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__i)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__spanlen)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
         if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__pathlen)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
         if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fwords)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
         if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__next_states)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  6:
         if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__reachable_buffer)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_all_nodes_isteps_away") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 7) {
       goto __pyx_L5_argtuple_error;
@@ -43957,7 +43952,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("get_all_nodes_isteps_away", 1, 7, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_all_nodes_isteps_away", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -43968,7 +43963,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":860
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":861
  *             return res
  * 
  *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
@@ -44006,41 +44001,41 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_all_nodes_isteps_away", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":862
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":863
  *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):
  *         cdef unsigned alt_it
  *         frontier = []             # <<<<<<<<<<<<<<
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_frontier = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":863
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":864
  *         cdef unsigned alt_it
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):             # <<<<<<<<<<<<<<
  *             return frontier
  *         key = tuple([i,spanlen])
  */
-  __pyx_t_1 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_Add(__pyx_v_i, __pyx_v_spanlen); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_skip); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_skip); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = PyObject_Length(__pyx_v_next_states); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Length(__pyx_v_next_states); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":864
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":865
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier             # <<<<<<<<<<<<<<
@@ -44055,14 +44050,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":865
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":866
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier
  *         key = tuple([i,spanlen])             # <<<<<<<<<<<<<<
  *         reachable = []
  *         if (key in reachable_buffer):
  */
-  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_INCREF(__pyx_v_i);
   PyList_SET_ITEM(__pyx_t_4, 0, __pyx_v_i);
@@ -44070,42 +44065,42 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   __Pyx_INCREF(__pyx_v_spanlen);
   PyList_SET_ITEM(__pyx_t_4, 1, __pyx_v_spanlen);
   __Pyx_GIVEREF(__pyx_v_spanlen);
-  __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_t_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PyObject *)PyList_AsTuple(__pyx_t_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
   __pyx_v_key = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":866
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":867
  *             return frontier
  *         key = tuple([i,spanlen])
  *         reachable = []             # <<<<<<<<<<<<<<
  *         if (key in reachable_buffer):
  *             reachable = reachable_buffer[key]
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_reachable = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":867
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":868
  *         key = tuple([i,spanlen])
  *         reachable = []
  *         if (key in reachable_buffer):             # <<<<<<<<<<<<<<
  *             reachable = reachable_buffer[key]
  *         else:
  */
-  __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_key), __pyx_v_reachable_buffer, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 867; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_key), __pyx_v_reachable_buffer, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":868
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":869
  *         reachable = []
  *         if (key in reachable_buffer):
  *             reachable = reachable_buffer[key]             # <<<<<<<<<<<<<<
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)
  */
-    __pyx_t_1 = PyObject_GetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 868; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 869; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_v_reachable);
     __pyx_v_reachable = __pyx_t_1;
@@ -44114,16 +44109,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":870
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":871
  *             reachable = reachable_buffer[key]
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)             # <<<<<<<<<<<<<<
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_fwords);
@@ -44134,7 +44129,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __Pyx_INCREF(__pyx_v_spanlen);
     PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_spanlen);
     __Pyx_GIVEREF(__pyx_v_spanlen);
-    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -44142,18 +44137,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_v_reachable = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":871
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":872
  *         else:
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable             # <<<<<<<<<<<<<<
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:
  */
-    if (PyObject_SetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key), __pyx_v_reachable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_reachable_buffer, ((PyObject *)__pyx_v_key), __pyx_v_reachable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":872
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":873
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:             # <<<<<<<<<<<<<<
@@ -44164,7 +44159,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_t_2 = __pyx_v_reachable; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
     __pyx_t_6 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_reachable); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_reachable); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
@@ -44172,23 +44167,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     if (!__pyx_t_6 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_6 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_4 = __pyx_t_6(__pyx_t_2);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -44198,20 +44193,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_v_nextreachable = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":873
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":874
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:             # <<<<<<<<<<<<<<
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:
  */
-    __pyx_t_4 = PyObject_GetItem(__pyx_v_next_states, __pyx_v_nextreachable); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetItem(__pyx_v_next_states, __pyx_v_nextreachable); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
       __pyx_t_1 = __pyx_t_4; __Pyx_INCREF(__pyx_t_1); __pyx_t_7 = 0;
       __pyx_t_8 = NULL;
     } else {
-      __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
     }
@@ -44220,23 +44215,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_1)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else {
         __pyx_t_4 = __pyx_t_8(__pyx_t_1);
         if (unlikely(!__pyx_t_4)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -44246,16 +44241,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       __pyx_v_next_id = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":874
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":875
  *         for nextreachable in reachable:
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)             # <<<<<<<<<<<<<<
  *                 if jump < skip:
  *                     continue
  */
-      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_fwords);
@@ -44266,7 +44261,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       __Pyx_INCREF(__pyx_v_next_id);
       PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_v_next_id);
       __Pyx_GIVEREF(__pyx_v_next_id);
-      __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
@@ -44274,19 +44269,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       __pyx_v_jump = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":875
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":876
  *             for next_id in next_states[nextreachable]:
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:             # <<<<<<<<<<<<<<
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  */
-      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_RichCompare(__pyx_v_jump, __pyx_v_skip, Py_LT); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":876
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":877
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:
  *                     continue             # <<<<<<<<<<<<<<
@@ -44298,50 +44293,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       }
       __pyx_L9:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":877
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":878
  *                 if jump < skip:
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  */
-      __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_10, __pyx_t_9, Py_LE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":878
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":879
  *                     continue
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):             # <<<<<<<<<<<<<<
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)
  */
-        __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_11 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
         PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4);
         __Pyx_GIVEREF(__pyx_t_4);
         __pyx_t_4 = 0;
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
         if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
           __pyx_t_9 = __pyx_t_4; __Pyx_INCREF(__pyx_t_9); __pyx_t_11 = 0;
           __pyx_t_12 = NULL;
         } else {
-          __pyx_t_11 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_12 = Py_TYPE(__pyx_t_9)->tp_iternext;
         }
@@ -44350,23 +44345,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
           if (!__pyx_t_12 && PyList_CheckExact(__pyx_t_9)) {
             if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_9)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else if (!__pyx_t_12 && PyTuple_CheckExact(__pyx_t_9)) {
             if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else {
             __pyx_t_4 = __pyx_t_12(__pyx_t_9);
             if (unlikely(!__pyx_t_4)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
@@ -44376,40 +44371,40 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
           __pyx_v_alt_id = __pyx_t_4;
           __pyx_t_4 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":879
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":880
  *                 if pathlen+jump <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:
  */
-          __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_next_id); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_10 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt_id); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetItem(__pyx_t_4, __pyx_v_alt_id); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_13 = PyObject_RichCompare(__pyx_t_4, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_13 = PyObject_RichCompare(__pyx_t_4, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
           if (__pyx_t_5) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":880
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":881
  *                     for alt_id in range(len(fwords[next_id])):
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)             # <<<<<<<<<<<<<<
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  */
-            __pyx_t_13 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_13);
-            __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 880; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             __Pyx_INCREF(__pyx_v_next_id);
             PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_next_id);
@@ -44424,26 +44419,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
             __pyx_v_newel = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":881
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":882
  *                         if (fwords[next_id][alt_id][0] != EPSILON):
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:             # <<<<<<<<<<<<<<
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier
  */
-            __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_newel), ((PyObject *)__pyx_v_frontier), Py_NE)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_v_newel), ((PyObject *)__pyx_v_frontier), Py_NE)); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (__pyx_t_5) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":882
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":883
  *                             newel = (next_id,alt_id,pathlen+jump)
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))             # <<<<<<<<<<<<<<
  *         return frontier
  * 
  */
-              __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PyNumber_Add(__pyx_v_pathlen, __pyx_v_jump); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
-              __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyTuple_New(3); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_13);
               __Pyx_INCREF(__pyx_v_next_id);
               PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_v_next_id);
@@ -44454,7 +44449,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
               PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
               __Pyx_GIVEREF(__pyx_t_10);
               __pyx_t_10 = 0;
-              __pyx_t_14 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyList_Append(__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_14 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
               goto __pyx_L14;
             }
@@ -44473,7 +44468,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":883
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":884
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier             # <<<<<<<<<<<<<<
@@ -44540,16 +44535,16 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "reachable") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -44564,7 +44559,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.reachable", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -44575,7 +44570,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":885
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":886
  *         return frontier
  * 
  *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
@@ -44605,35 +44600,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("reachable", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":886
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":887
  * 
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []             # <<<<<<<<<<<<<<
  *         if (ifrom >= len(fwords)):
  *             return ret
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":887
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":888
  *     def reachable(self, fwords, ifrom, dist):
  *         ret = []
  *         if (ifrom >= len(fwords)):             # <<<<<<<<<<<<<<
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):
  */
-  __pyx_t_2 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_v_fwords); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":888
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":889
  *         ret = []
  *         if (ifrom >= len(fwords)):
  *             return ret             # <<<<<<<<<<<<<<
@@ -44648,32 +44643,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":889
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":890
  *         if (ifrom >= len(fwords)):
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
  *             if (fwords[ifrom][alt_id][0] == EPSILON):
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  */
-  __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_2 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
     __pyx_t_1 = __pyx_t_3; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -44682,23 +44677,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
     } else {
       __pyx_t_3 = __pyx_t_5(__pyx_t_1);
       if (unlikely(!__pyx_t_3)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -44708,53 +44703,53 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
     __pyx_v_alt_id = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":890
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":891
  *             return ret
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):             # <<<<<<<<<<<<<<
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  *             else:
  */
-    __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_6 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_6, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":891
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":892
  *         for alt_id in range(len(fwords[ifrom])):
  *             if (fwords[ifrom][alt_id][0] == EPSILON):
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))             # <<<<<<<<<<<<<<
  *             else:
  *                 if (dist==0):
  */
-      __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_ret), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_8 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_8, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_8, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(__pyx_v_fwords);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_fwords);
@@ -44765,16 +44760,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
       PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_dist);
       __Pyx_GIVEREF(__pyx_v_dist);
       __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_8);
       __Pyx_GIVEREF(__pyx_t_8);
       __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -44783,36 +44778,36 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":893
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":894
  *                 ret.extend(self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist))
  *             else:
  *                 if (dist==0):             # <<<<<<<<<<<<<<
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)
  */
-      __pyx_t_8 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":894
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":895
  *             else:
  *                 if (dist==0):
  *                     if (ifrom not in ret):             # <<<<<<<<<<<<<<
  *                         ret.append(ifrom)
  *                 else:
  */
-        __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifrom, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifrom, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":895
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":896
  *                 if (dist==0):
  *                     if (ifrom not in ret):
  *                         ret.append(ifrom)             # <<<<<<<<<<<<<<
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  */
-          __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifrom); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           goto __pyx_L8;
         }
         __pyx_L8:;
@@ -44820,29 +44815,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":897
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":898
  *                         ret.append(ifrom)
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):             # <<<<<<<<<<<<<<
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)
  */
-        __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__reachable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_7 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyObject_GetItem(__pyx_t_3, __pyx_v_alt_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = PyNumber_Subtract(__pyx_v_dist, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyNumber_Subtract(__pyx_v_dist, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
         __Pyx_INCREF(__pyx_v_fwords);
         PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_fwords);
@@ -44853,7 +44848,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
         __Pyx_GIVEREF(__pyx_t_3);
         __pyx_t_7 = 0;
         __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
@@ -44861,7 +44856,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
           __pyx_t_6 = __pyx_t_3; __Pyx_INCREF(__pyx_t_6); __pyx_t_10 = 0;
           __pyx_t_11 = NULL;
         } else {
-          __pyx_t_10 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_6);
           __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext;
         }
@@ -44870,23 +44865,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
           if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_6)) {
             if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_6)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_6)) {
             if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
             #if CYTHON_COMPILING_IN_CPYTHON
-            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #else
-            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             #endif
           } else {
             __pyx_t_3 = __pyx_t_11(__pyx_t_6);
             if (unlikely(!__pyx_t_3)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
@@ -44896,24 +44891,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
           __pyx_v_ifromchild = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":898
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":899
  *                 else:
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):             # <<<<<<<<<<<<<<
  *                             ret.append(ifromchild)
  * 
  */
-          __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifromchild, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_v_ifromchild, ((PyObject *)__pyx_v_ret), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_4) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":899
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":900
  *                     for ifromchild in self.reachable(fwords,ifrom+fwords[ifrom][alt_id][2],dist-1):
  *                         if (ifromchild not in ret):
  *                             ret.append(ifromchild)             # <<<<<<<<<<<<<<
  * 
  *         return ret
  */
-            __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyList_Append(__pyx_v_ret, __pyx_v_ifromchild); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             goto __pyx_L11;
           }
           __pyx_L11:;
@@ -44926,7 +44921,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":901
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":902
  *                             ret.append(ifromchild)
  * 
  *         return ret             # <<<<<<<<<<<<<<
@@ -44987,16 +44982,16 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ifrom)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 904; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ito)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 904; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 904; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -45011,7 +45006,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 904; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.shortest", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -45022,7 +45017,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":903
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":904
  *         return ret
  * 
  *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
@@ -45047,7 +45042,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("shortest", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":905
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":906
  *     def shortest(self, fwords, ifrom, ito):
  *         cdef unsigned alt_id
  *         min = 1000             # <<<<<<<<<<<<<<
@@ -45057,19 +45052,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   __Pyx_INCREF(__pyx_int_1000);
   __pyx_v_min = __pyx_int_1000;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":906
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":907
  *         cdef unsigned alt_id
  *         min = 1000
  *         if (ifrom > ito):             # <<<<<<<<<<<<<<
  *             return min
  *         if (ifrom == ito):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":907
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":908
  *         min = 1000
  *         if (ifrom > ito):
  *             return min             # <<<<<<<<<<<<<<
@@ -45084,19 +45079,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":908
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":909
  *         if (ifrom > ito):
  *             return min
  *         if (ifrom == ito):             # <<<<<<<<<<<<<<
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  */
-  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ifrom, __pyx_v_ito, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":909
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":910
  *             return min
  *         if (ifrom == ito):
  *             return 0             # <<<<<<<<<<<<<<
@@ -45111,41 +45106,41 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   }
   __pyx_L4:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":910
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":911
  *         if (ifrom == ito):
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):             # <<<<<<<<<<<<<<
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  */
-  __pyx_t_1 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_alt_id = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":911
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":912
  *             return 0
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)             # <<<<<<<<<<<<<<
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  */
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__shortest); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Add(__pyx_v_ifrom, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_fwords);
@@ -45156,7 +45151,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_ito);
     __Pyx_GIVEREF(__pyx_v_ito);
     __pyx_t_6 = 0;
-    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -45164,38 +45159,38 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __pyx_v_currmin = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":912
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":913
  *         for alt_id in range(len(fwords[ifrom])):
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):             # <<<<<<<<<<<<<<
  *                 currmin += 1
  *             if (currmin<min):
  */
-    __pyx_t_6 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_v_fwords, __pyx_v_ifrom); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, __pyx_v_alt_id, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":913
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":914
  *             currmin = self.shortest(fwords,ifrom+fwords[ifrom][alt_id][2],ito)
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1             # <<<<<<<<<<<<<<
  *             if (currmin<min):
  *                 min = currmin
  */
-      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_currmin, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_currmin, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 914; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_v_currmin);
       __pyx_v_currmin = __pyx_t_1;
@@ -45204,19 +45199,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     }
     __pyx_L7:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":914
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":915
  *             if (fwords[ifrom][alt_id][0] != EPSILON):
  *                 currmin += 1
  *             if (currmin<min):             # <<<<<<<<<<<<<<
  *                 min = currmin
  *         return min
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 914; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 914; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_currmin, __pyx_v_min, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 915; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":915
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":916
  *                 currmin += 1
  *             if (currmin<min):
  *                 min = currmin             # <<<<<<<<<<<<<<
@@ -45231,7 +45226,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __pyx_L8:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":916
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":917
  *             if (currmin<min):
  *                 min = currmin
  *         return min             # <<<<<<<<<<<<<<
@@ -45290,7 +45285,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__curr_idx)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (kw_args > 0) {
@@ -45299,7 +45294,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_next_states") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -45316,7 +45311,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_next_states", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -45327,7 +45322,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":918
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":919
  *         return min
  * 
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
@@ -45360,26 +45355,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_next_states", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":919
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":920
  * 
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []             # <<<<<<<<<<<<<<
  *         candidate = [[curr_idx,0]]
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":920
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":921
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):
  *         result = []
  *         candidate = [[curr_idx,0]]             # <<<<<<<<<<<<<<
  * 
  *         while len(candidate) > 0:
  */
-  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_v_curr_idx);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_curr_idx);
@@ -45387,7 +45382,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   __Pyx_INCREF(__pyx_int_0);
   PyList_SET_ITEM(__pyx_t_1, 1, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
-  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
@@ -45395,7 +45390,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   __pyx_v_candidate = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":922
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":923
  *         candidate = [[curr_idx,0]]
  * 
  *         while len(candidate) > 0:             # <<<<<<<<<<<<<<
@@ -45403,43 +45398,43 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *             if curr[0] >= len(_columns):
  */
   while (1) {
-    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 922; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyList_GET_SIZE(((PyObject *)__pyx_v_candidate)); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_4 = (__pyx_t_3 > 0);
     if (!__pyx_t_4) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":923
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":924
  * 
  *         while len(candidate) > 0:
  *             curr = candidate.pop()             # <<<<<<<<<<<<<<
  *             if curr[0] >= len(_columns):
  *                 continue
  */
-    __pyx_t_2 = __Pyx_PyObject_Pop(((PyObject *)__pyx_v_candidate)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Pop(((PyObject *)__pyx_v_candidate)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_XDECREF(__pyx_v_curr);
     __pyx_v_curr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":924
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":925
  *         while len(candidate) > 0:
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):             # <<<<<<<<<<<<<<
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  */
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_3 = PyObject_Length(__pyx_v__columns); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Length(__pyx_v__columns); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_2, __pyx_t_1, Py_GE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":925
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":926
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):
  *                 continue             # <<<<<<<<<<<<<<
@@ -45451,30 +45446,30 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":926
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":927
  *             if curr[0] >= len(_columns):
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]
  */
-    __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_t_5, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = (__Pyx_PySequence_Contains(__pyx_t_5, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
-      __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_5, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
         __Pyx_DECREF(__pyx_t_1);
-        __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __pyx_t_7 = __pyx_t_6;
     } else {
@@ -45482,38 +45477,38 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":927
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":928
  *                 continue
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);             # <<<<<<<<<<<<<<
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  */
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_8 = PyList_Append(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyList_Append(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L6;
     }
     __pyx_L6:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":928
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":929
  *             if curr[0] not in result and min_dist <= curr[1] <= self.max_initial_size:
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]             # <<<<<<<<<<<<<<
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_5 = PyObject_GetItem(__pyx_v__columns, __pyx_t_1); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetItem(__pyx_v__columns, __pyx_t_1); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_XDECREF(__pyx_v_curr_col);
     __pyx_v_curr_col = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":929
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":930
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:             # <<<<<<<<<<<<<<
@@ -45524,7 +45519,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_t_5 = __pyx_v_curr_col; __Pyx_INCREF(__pyx_t_5); __pyx_t_3 = 0;
       __pyx_t_9 = NULL;
     } else {
-      __pyx_t_3 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_curr_col); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_curr_col); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_9 = Py_TYPE(__pyx_t_5)->tp_iternext;
     }
@@ -45532,23 +45527,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       if (!__pyx_t_9 && PyList_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_5)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else if (!__pyx_t_9 && PyTuple_CheckExact(__pyx_t_5)) {
         if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
         #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #else
-        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         #endif
       } else {
         __pyx_t_1 = __pyx_t_9(__pyx_t_5);
         if (unlikely(!__pyx_t_1)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -45558,18 +45553,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_v_alt = __pyx_t_1;
       __pyx_t_1 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":930
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":931
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]             # <<<<<<<<<<<<<<
  *                 jump = 1
  *                 if (alt[0] == EPSILON):
  */
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_alt, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_alt, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_10 = PyNumber_Add(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyNumber_Add(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -45577,7 +45572,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_v_next_id = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":931
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":932
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1             # <<<<<<<<<<<<<<
@@ -45588,25 +45583,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __Pyx_XDECREF(__pyx_v_jump);
       __pyx_v_jump = __pyx_int_1;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":932
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":933
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1
  *                 if (alt[0] == EPSILON):             # <<<<<<<<<<<<<<
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  */
-      __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_alt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_alt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_10, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":933
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":934
  *                 jump = 1
  *                 if (alt[0] == EPSILON):
  *                     jump = 0             # <<<<<<<<<<<<<<
@@ -45620,30 +45615,30 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       }
       __pyx_L9:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":934
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":935
  *                 if (alt[0] == EPSILON):
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:             # <<<<<<<<<<<<<<
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);
  */
-      __pyx_t_7 = (__Pyx_PySequence_Contains(__pyx_v_next_id, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = (__Pyx_PySequence_Contains(__pyx_v_next_id, ((PyObject *)__pyx_v_result), Py_NE)); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_7) {
-        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_RichCompare(__pyx_v_min_dist, __pyx_t_2, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
           __Pyx_DECREF(__pyx_t_1);
-          __pyx_t_10 = PyInt_FromLong((__pyx_v_self->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_v_self->max_initial_size + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         }
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __pyx_t_6 = __pyx_t_4;
       } else {
@@ -45651,19 +45646,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       }
       if (__pyx_t_6) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":935
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":936
  *                     jump = 0
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])             # <<<<<<<<<<<<<<
  *         return sorted(result);
  * 
  */
-        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curr, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_jump); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __Pyx_INCREF(__pyx_v_next_id);
         PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_next_id);
@@ -45671,7 +45666,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
         PyList_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
         __Pyx_GIVEREF(__pyx_t_2);
         __pyx_t_2 = 0;
-        __pyx_t_8 = PyList_Append(__pyx_v_candidate, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyList_Append(__pyx_v_candidate, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
         goto __pyx_L10;
       }
@@ -45681,7 +45676,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     __pyx_L3_continue:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":936
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":937
  *                 if next_id not in result and min_dist <= curr[1]+jump <= self.max_initial_size+1:
  *                     candidate.append([next_id,curr[1]+jump])
  *         return sorted(result);             # <<<<<<<<<<<<<<
@@ -45689,12 +45684,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
  *     def input(self, fwords, meta):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_result));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_result));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_result));
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
   __pyx_r = __pyx_t_1;
@@ -45753,11 +45748,11 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx
         case  1:
         if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__meta)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("input", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("input", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "input") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "input") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -45770,7 +45765,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("input", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("input", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -45805,7 +45800,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1098
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1099
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
@@ -45824,14 +45819,14 @@ static PyObject *__pyx_lambda_funcdef_lambda2(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda2", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyList_Type))));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)(&PyList_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyList_Type))));
-  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -45864,16 +45859,16 @@ static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda1", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda1_lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -45907,7 +45902,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda3(PyObjec
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1104
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1105
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
@@ -45925,11 +45920,11 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda3", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -45947,7 +45942,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":938
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":939
  *         return sorted(result);
  * 
  *     def input(self, fwords, meta):             # <<<<<<<<<<<<<<
@@ -45979,7 +45974,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_22input(struct __pyx_ob
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_meta);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_meta);
   {
-    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_cur_scope);
     __Pyx_RefNannyFinishContext();
     return (PyObject *) gen;
@@ -46011,23 +46006,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   int __pyx_t_8;
   PyObject *__pyx_t_9 = NULL;
   PyObject *__pyx_t_10 = NULL;
-  int __pyx_t_11;
-  PyObject *__pyx_t_12 = NULL;
+  PyObject *__pyx_t_11 = NULL;
+  int __pyx_t_12;
   PyObject *__pyx_t_13 = NULL;
   PyObject *__pyx_t_14 = NULL;
   PyObject *__pyx_t_15 = NULL;
   PyObject *__pyx_t_16 = NULL;
-  PyObject *(*__pyx_t_17)(PyObject *);
-  int __pyx_t_18;
+  PyObject *__pyx_t_17 = NULL;
+  PyObject *(*__pyx_t_18)(PyObject *);
   int __pyx_t_19;
-  PyObject *(*__pyx_t_20)(PyObject *);
-  float __pyx_t_21;
-  Py_ssize_t __pyx_t_22;
+  int __pyx_t_20;
+  PyObject *(*__pyx_t_21)(PyObject *);
+  float __pyx_t_22;
   Py_ssize_t __pyx_t_23;
   Py_ssize_t __pyx_t_24;
   Py_ssize_t __pyx_t_25;
-  int __pyx_t_26;
+  Py_ssize_t __pyx_t_26;
   int __pyx_t_27;
+  int __pyx_t_28;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("None", 0);
   switch (__pyx_generator->resume_label) {
@@ -46038,19 +46034,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     return NULL;
   }
   __pyx_L3_first_run:;
-  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":949
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":950
  *         cdef Phrase hiero_phrase
  * 
  *         flen = len(fwords)             # <<<<<<<<<<<<<<
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_cur_scope->__pyx_v_flen = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":950
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":951
  * 
  *         flen = len(fwords)
  *         start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -46059,7 +46055,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_start_time = __pyx_f_3_sa_monitor_cpu();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":951
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":952
  *         flen = len(fwords)
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0             # <<<<<<<<<<<<<<
@@ -46068,20 +46064,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_self->extract_time = 0.0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":952
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":953
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}             # <<<<<<<<<<<<<<
  *         hit = 0
  *         reachable_buffer = {}
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":953
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":954
  *         self.extract_time = 0.0
  *         nodes_isteps_away_buffer = {}
  *         hit = 0             # <<<<<<<<<<<<<<
@@ -46090,33 +46086,33 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_hit = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":954
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":955
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  *         reachable_buffer = {}             # <<<<<<<<<<<<<<
  * 
  *         # Do not cache between sentences
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 955; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_cur_scope->__pyx_v_reachable_buffer = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":957
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":958
  * 
  *         # Do not cache between sentences
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
  * 
  *         frontier = []
  */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 958; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __Pyx_GIVEREF(__pyx_t_3);
@@ -46125,116 +46121,126 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __pyx_cur_scope->__pyx_v_self->rules->root = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":959
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":960
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  * 
  *         frontier = []             # <<<<<<<<<<<<<<
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  */
-  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
   __pyx_cur_scope->__pyx_v_frontier = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":960
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":961
  * 
  *         frontier = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":961
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":962
  *         frontier = []
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
  *                 if fwords[i][alt][0] != EPSILON:
- *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
+ *                     frontier.append((i, i, (i,), alt, 0, self.rules.root, (), False))
  */
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":962
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":963
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
- *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
+ *                     frontier.append((i, i, (i,), alt, 0, self.rules.root, (), False))
  * 
  */
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":963
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":964
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
- *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))             # <<<<<<<<<<<<<<
+ *                     frontier.append((i, i, (i,), alt, 0, self.rules.root, (), False))             # <<<<<<<<<<<<<<
  * 
  *         xroot = None
  */
-        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_9 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_10 = PyTuple_New(7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
+        __Pyx_GIVEREF(__pyx_t_3);
+        __pyx_t_3 = 0;
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_10 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_7);
+        __pyx_t_11 = PyTuple_New(8); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
-        PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_2);
+        PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_2);
         __Pyx_GIVEREF(__pyx_t_2);
-        PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_3);
+        PyTuple_SET_ITEM(__pyx_t_11, 2, ((PyObject *)__pyx_t_9));
+        __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
+        PyTuple_SET_ITEM(__pyx_t_11, 3, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
         __Pyx_INCREF(__pyx_int_0);
-        PyTuple_SET_ITEM(__pyx_t_10, 3, __pyx_int_0);
+        PyTuple_SET_ITEM(__pyx_t_11, 4, __pyx_int_0);
         __Pyx_GIVEREF(__pyx_int_0);
         __Pyx_INCREF(__pyx_cur_scope->__pyx_v_self->rules->root);
-        PyTuple_SET_ITEM(__pyx_t_10, 4, __pyx_cur_scope->__pyx_v_self->rules->root);
+        PyTuple_SET_ITEM(__pyx_t_11, 5, __pyx_cur_scope->__pyx_v_self->rules->root);
         __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
         __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
-        PyTuple_SET_ITEM(__pyx_t_10, 5, ((PyObject *)__pyx_empty_tuple));
+        PyTuple_SET_ITEM(__pyx_t_11, 6, ((PyObject *)__pyx_empty_tuple));
         __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-        PyTuple_SET_ITEM(__pyx_t_10, 6, __pyx_t_9);
-        __Pyx_GIVEREF(__pyx_t_9);
+        PyTuple_SET_ITEM(__pyx_t_11, 7, __pyx_t_10);
+        __Pyx_GIVEREF(__pyx_t_10);
         __pyx_t_7 = 0;
         __pyx_t_2 = 0;
-        __pyx_t_3 = 0;
         __pyx_t_9 = 0;
-        __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_10)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+        __pyx_t_3 = 0;
+        __pyx_t_10 = 0;
+        __pyx_t_12 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_11)); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
         goto __pyx_L8;
       }
       __pyx_L8:;
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":965
- *                     frontier.append((i, i, alt, 0, self.rules.root, (), False))
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":966
+ *                     frontier.append((i, i, (i,), alt, 0, self.rules.root, (), False))
  * 
  *         xroot = None             # <<<<<<<<<<<<<<
  *         x1 = sym_setindex(self.category, 1)
@@ -46244,7 +46250,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_GIVEREF(Py_None);
   __pyx_cur_scope->__pyx_v_xroot = Py_None;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":966
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":967
  * 
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)             # <<<<<<<<<<<<<<
@@ -46253,281 +46259,291 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_x1 = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":967
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":968
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:             # <<<<<<<<<<<<<<
  *             xroot = self.rules.root.children[x1]
  *         else:
  */
-  __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_11);
+  __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_t_10, __pyx_t_9, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_t_11, __pyx_t_10, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
   if (__pyx_t_8) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":968
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":969
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:
  *             xroot = self.rules.root.children[x1]             # <<<<<<<<<<<<<<
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  */
-    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_9);
-    __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
-    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_11 = __Pyx_GetItemInt(__pyx_t_10, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_11);
+    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
     __Pyx_DECREF(__pyx_cur_scope->__pyx_v_xroot);
-    __Pyx_GIVEREF(__pyx_t_10);
-    __pyx_cur_scope->__pyx_v_xroot = __pyx_t_10;
-    __pyx_t_10 = 0;
+    __Pyx_GIVEREF(__pyx_t_11);
+    __pyx_cur_scope->__pyx_v_xroot = __pyx_t_11;
+    __pyx_t_11 = 0;
     goto __pyx_L9;
   }
   /*else*/ {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":970
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":971
  *             xroot = self.rules.root.children[x1]
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
  *             self.rules.root.children[x1] = xroot
  * 
  */
-    __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_9);
-    if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-    __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_9);
-    __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+    __pyx_t_11 = PyDict_New(); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+    if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_10);
+    if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+    __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_10);
+    __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
     __Pyx_DECREF(__pyx_cur_scope->__pyx_v_xroot);
-    __Pyx_GIVEREF(__pyx_t_9);
-    __pyx_cur_scope->__pyx_v_xroot = __pyx_t_9;
-    __pyx_t_9 = 0;
+    __Pyx_GIVEREF(__pyx_t_10);
+    __pyx_cur_scope->__pyx_v_xroot = __pyx_t_10;
+    __pyx_t_10 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":971
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":972
  *         else:
  *             xroot = ExtendedTrieNode(suffix_link=self.rules.root, phrase_location=PhraseLocation())
  *             self.rules.root.children[x1] = xroot             # <<<<<<<<<<<<<<
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  */
-    __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_9);
-    if (__Pyx_SetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_10);
+    if (__Pyx_SetItemInt(__pyx_t_10, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   }
   __pyx_L9:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":973
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":974
  *             self.rules.root.children[x1] = xroot
  * 
  *         for i in range(self.min_gap_size, len(fwords)):             # <<<<<<<<<<<<<<
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_4 = __pyx_cur_scope->__pyx_v_self->min_gap_size; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":974
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":975
  * 
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):             # <<<<<<<<<<<<<<
  *                 if fwords[i][alt][0] != EPSILON:
- *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
+ *                     frontier.append((i-self.min_gap_size, i, (i,), alt, self.min_gap_size, xroot, (x1,), True))
  */
-    __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_9);
-    __pyx_t_5 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_10 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_10);
+    __pyx_t_5 = PyObject_Length(__pyx_t_10); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":975
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":976
  *         for i in range(self.min_gap_size, len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
- *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
+ *                     frontier.append((i-self.min_gap_size, i, (i,), alt, self.min_gap_size, xroot, (x1,), True))
  * 
  */
-      __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_10, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_11 = __Pyx_GetItemInt(__pyx_t_10, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-      __pyx_t_10 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_11, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_9, __pyx_t_10, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __pyx_t_11 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_11);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_t_10, __pyx_t_11, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":976
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":977
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
- *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))             # <<<<<<<<<<<<<<
+ *                     frontier.append((i-self.min_gap_size, i, (i,), alt, self.min_gap_size, xroot, (x1,), True))             # <<<<<<<<<<<<<<
  * 
  *         next_states = []
  */
-        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_10);
+        __Pyx_GIVEREF(__pyx_t_10);
+        __pyx_t_10 = 0;
+        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_10);
+        __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_12);
-        PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7);
+        __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_13);
+        PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         __pyx_t_7 = 0;
-        __pyx_t_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_13);
-        PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_3);
+        __pyx_t_14 = PyTuple_New(8); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_14);
+        PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_3);
         __Pyx_GIVEREF(__pyx_t_3);
-        PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_10);
+        PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_t_11);
+        __Pyx_GIVEREF(__pyx_t_11);
+        PyTuple_SET_ITEM(__pyx_t_14, 2, ((PyObject *)__pyx_t_9));
+        __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
+        PyTuple_SET_ITEM(__pyx_t_14, 3, __pyx_t_10);
         __Pyx_GIVEREF(__pyx_t_10);
-        PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_9);
-        __Pyx_GIVEREF(__pyx_t_9);
-        PyTuple_SET_ITEM(__pyx_t_13, 3, __pyx_t_2);
+        PyTuple_SET_ITEM(__pyx_t_14, 4, __pyx_t_2);
         __Pyx_GIVEREF(__pyx_t_2);
         __Pyx_INCREF(__pyx_cur_scope->__pyx_v_xroot);
-        PyTuple_SET_ITEM(__pyx_t_13, 4, __pyx_cur_scope->__pyx_v_xroot);
+        PyTuple_SET_ITEM(__pyx_t_14, 5, __pyx_cur_scope->__pyx_v_xroot);
         __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xroot);
-        PyTuple_SET_ITEM(__pyx_t_13, 5, ((PyObject *)__pyx_t_12));
-        __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
-        PyTuple_SET_ITEM(__pyx_t_13, 6, __pyx_t_7);
+        PyTuple_SET_ITEM(__pyx_t_14, 6, ((PyObject *)__pyx_t_13));
+        __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
+        PyTuple_SET_ITEM(__pyx_t_14, 7, __pyx_t_7);
         __Pyx_GIVEREF(__pyx_t_7);
         __pyx_t_3 = 0;
-        __pyx_t_10 = 0;
+        __pyx_t_11 = 0;
         __pyx_t_9 = 0;
+        __pyx_t_10 = 0;
         __pyx_t_2 = 0;
-        __pyx_t_12 = 0;
+        __pyx_t_13 = 0;
         __pyx_t_7 = 0;
-        __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+        __pyx_t_12 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_14)); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
         goto __pyx_L14;
       }
       __pyx_L14:;
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":978
- *                     frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":979
+ *                     frontier.append((i-self.min_gap_size, i, (i,), alt, self.min_gap_size, xroot, (x1,), True))
  * 
  *         next_states = []             # <<<<<<<<<<<<<<
  *         for i in range(len(fwords)):
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  */
-  __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 978; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
-  __pyx_cur_scope->__pyx_v_next_states = __pyx_t_13;
-  __pyx_t_13 = 0;
+  __pyx_t_14 = PyList_New(0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_14);
+  __Pyx_GIVEREF(((PyObject *)__pyx_t_14));
+  __pyx_cur_scope->__pyx_v_next_states = __pyx_t_14;
+  __pyx_t_14 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":979
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":980
  * 
  *         next_states = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  * 
  */
-  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":980
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":981
  *         next_states = []
  *         for i in range(len(fwords)):
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))             # <<<<<<<<<<<<<<
  * 
  *         while len(frontier) > 0:
  */
-    __pyx_t_13 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_13);
-    __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_14);
+    __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_12);
-    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_fwords);
     __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_7);
     __Pyx_GIVEREF(__pyx_t_7);
-    PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_12);
-    __Pyx_GIVEREF(__pyx_t_12);
+    PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_13);
+    __Pyx_GIVEREF(__pyx_t_13);
     __pyx_t_7 = 0;
-    __pyx_t_12 = 0;
-    __pyx_t_12 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_12);
-    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+    __pyx_t_13 = 0;
+    __pyx_t_13 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
+    __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_next_states, __pyx_t_12); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+    __pyx_t_12 = PyList_Append(__pyx_cur_scope->__pyx_v_next_states, __pyx_t_13); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":982
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":983
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  * 
  *         while len(frontier) > 0:             # <<<<<<<<<<<<<<
  *             new_frontier = []
- *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
+ *             for k, i, input_match, alt, pathlen, node, prefix, is_shadow_path in frontier:
  */
   while (1) {
-    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_8 = (__pyx_t_1 > 0);
     if (!__pyx_t_8) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":983
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":984
  * 
  *         while len(frontier) > 0:
  *             new_frontier = []             # <<<<<<<<<<<<<<
- *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
+ *             for k, i, input_match, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]
  */
-    __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_12);
+    __pyx_t_13 = PyList_New(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_13);
     __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
-    __Pyx_GIVEREF(((PyObject *)__pyx_t_12));
-    __pyx_cur_scope->__pyx_v_new_frontier = __pyx_t_12;
-    __pyx_t_12 = 0;
+    __Pyx_GIVEREF(((PyObject *)__pyx_t_13));
+    __pyx_cur_scope->__pyx_v_new_frontier = __pyx_t_13;
+    __pyx_t_13 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":984
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":985
  *         while len(frontier) > 0:
  *             new_frontier = []
- *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:             # <<<<<<<<<<<<<<
+ *             for k, i, input_match, alt, pathlen, node, prefix, is_shadow_path in frontier:             # <<<<<<<<<<<<<<
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]
  */
-    __pyx_t_12 = ((PyObject *)__pyx_cur_scope->__pyx_v_frontier); __Pyx_INCREF(__pyx_t_12); __pyx_t_1 = 0;
+    __pyx_t_13 = ((PyObject *)__pyx_cur_scope->__pyx_v_frontier); __Pyx_INCREF(__pyx_t_13); __pyx_t_1 = 0;
     for (;;) {
-      if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_12)) break;
+      if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_13)) break;
       #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_13, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_12, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PySequence_ITEM(__pyx_t_13, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       #endif
       if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
         PyObject* sequence = __pyx_t_2;
@@ -46536,41 +46552,44 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         #else
         Py_ssize_t size = PySequence_Size(sequence);
         #endif
-        if (unlikely(size != 7)) {
-          if (size > 7) __Pyx_RaiseTooManyValuesError(7);
+        if (unlikely(size != 8)) {
+          if (size > 8) __Pyx_RaiseTooManyValuesError(8);
           else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         #if CYTHON_COMPILING_IN_CPYTHON
         if (likely(PyTuple_CheckExact(sequence))) {
-          __pyx_t_13 = PyTuple_GET_ITEM(sequence, 0); 
+          __pyx_t_14 = PyTuple_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
-          __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); 
-          __pyx_t_10 = PyTuple_GET_ITEM(sequence, 3); 
-          __pyx_t_3 = PyTuple_GET_ITEM(sequence, 4); 
-          __pyx_t_14 = PyTuple_GET_ITEM(sequence, 5); 
+          __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
+          __pyx_t_9 = PyTuple_GET_ITEM(sequence, 3); 
+          __pyx_t_11 = PyTuple_GET_ITEM(sequence, 4); 
+          __pyx_t_3 = PyTuple_GET_ITEM(sequence, 5); 
           __pyx_t_15 = PyTuple_GET_ITEM(sequence, 6); 
+          __pyx_t_16 = PyTuple_GET_ITEM(sequence, 7); 
         } else {
-          __pyx_t_13 = PyList_GET_ITEM(sequence, 0); 
+          __pyx_t_14 = PyList_GET_ITEM(sequence, 0); 
           __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
-          __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
-          __pyx_t_10 = PyList_GET_ITEM(sequence, 3); 
-          __pyx_t_3 = PyList_GET_ITEM(sequence, 4); 
-          __pyx_t_14 = PyList_GET_ITEM(sequence, 5); 
+          __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
+          __pyx_t_9 = PyList_GET_ITEM(sequence, 3); 
+          __pyx_t_11 = PyList_GET_ITEM(sequence, 4); 
+          __pyx_t_3 = PyList_GET_ITEM(sequence, 5); 
           __pyx_t_15 = PyList_GET_ITEM(sequence, 6); 
+          __pyx_t_16 = PyList_GET_ITEM(sequence, 7); 
         }
-        __Pyx_INCREF(__pyx_t_13);
+        __Pyx_INCREF(__pyx_t_14);
         __Pyx_INCREF(__pyx_t_7);
-        __Pyx_INCREF(__pyx_t_9);
         __Pyx_INCREF(__pyx_t_10);
+        __Pyx_INCREF(__pyx_t_9);
+        __Pyx_INCREF(__pyx_t_11);
         __Pyx_INCREF(__pyx_t_3);
-        __Pyx_INCREF(__pyx_t_14);
         __Pyx_INCREF(__pyx_t_15);
+        __Pyx_INCREF(__pyx_t_16);
         #else
         Py_ssize_t i;
-        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
-        for (i=0; i < 7; i++) {
-          PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        PyObject** temps[8] = {&__pyx_t_14,&__pyx_t_7,&__pyx_t_10,&__pyx_t_9,&__pyx_t_11,&__pyx_t_3,&__pyx_t_15,&__pyx_t_16};
+        for (i=0; i < 8; i++) {
+          PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           *(temps[i]) = item;
         }
         #endif
@@ -46578,41 +46597,46 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       } else
       {
         Py_ssize_t index = -1;
-        PyObject** temps[7] = {&__pyx_t_13,&__pyx_t_7,&__pyx_t_9,&__pyx_t_10,&__pyx_t_3,&__pyx_t_14,&__pyx_t_15};
-        __pyx_t_16 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_16);
+        PyObject** temps[8] = {&__pyx_t_14,&__pyx_t_7,&__pyx_t_10,&__pyx_t_9,&__pyx_t_11,&__pyx_t_3,&__pyx_t_15,&__pyx_t_16};
+        __pyx_t_17 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_17);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
-        for (index=0; index < 7; index++) {
-          PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L21_unpacking_failed;
+        __pyx_t_18 = Py_TYPE(__pyx_t_17)->tp_iternext;
+        for (index=0; index < 8; index++) {
+          PyObject* item = __pyx_t_18(__pyx_t_17); if (unlikely(!item)) goto __pyx_L21_unpacking_failed;
           __Pyx_GOTREF(item);
           *(temps[index]) = item;
         }
-        if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 7) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_17 = NULL;
-        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+        if (__Pyx_IternextUnpackEndCheck(__pyx_t_18(__pyx_t_17), 8) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_18 = NULL;
+        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
         goto __pyx_L22_unpacking_done;
         __pyx_L21_unpacking_failed:;
-        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-        __pyx_t_17 = NULL;
+        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+        __pyx_t_18 = NULL;
         if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_L22_unpacking_done:;
       }
-      __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_13); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_14); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_19 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __pyx_cur_scope->__pyx_v_k = __pyx_t_4;
       __pyx_cur_scope->__pyx_v_i = __pyx_t_6;
-      __pyx_cur_scope->__pyx_v_alt = __pyx_t_18;
-      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_pathlen);
-      __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_pathlen);
+      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_input_match);
+      __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_input_match);
       __Pyx_GIVEREF(__pyx_t_10);
-      __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_10;
+      __pyx_cur_scope->__pyx_v_input_match = __pyx_t_10;
       __pyx_t_10 = 0;
+      __pyx_cur_scope->__pyx_v_alt = __pyx_t_19;
+      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_pathlen);
+      __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_pathlen);
+      __Pyx_GIVEREF(__pyx_t_11);
+      __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_11;
+      __pyx_t_11 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_node);
       __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_node);
       __Pyx_GIVEREF(__pyx_t_3);
@@ -46620,172 +46644,175 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_t_3 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_prefix);
       __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_prefix);
-      __Pyx_GIVEREF(__pyx_t_14);
-      __pyx_cur_scope->__pyx_v_prefix = __pyx_t_14;
-      __pyx_t_14 = 0;
-      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-      __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
       __Pyx_GIVEREF(__pyx_t_15);
-      __pyx_cur_scope->__pyx_v_is_shadow_path = __pyx_t_15;
+      __pyx_cur_scope->__pyx_v_prefix = __pyx_t_15;
       __pyx_t_15 = 0;
+      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
+      __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
+      __Pyx_GIVEREF(__pyx_t_16);
+      __pyx_cur_scope->__pyx_v_is_shadow_path = __pyx_t_16;
+      __pyx_t_16 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":985
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":986
  *             new_frontier = []
- *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
+ *             for k, i, input_match, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]             # <<<<<<<<<<<<<<
  *                 spanlen = fwords[i][alt][2]
  *                 # TODO get rid of k -- pathlen is replacing it
  */
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 986; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
+      __pyx_t_16 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_16) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 986; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_16);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_15, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_16, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 986; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+      __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_word_id);
       __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_word_id);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_cur_scope->__pyx_v_word_id = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":986
- *             for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":987
+ *             for k, i, input_match, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]
  *                 spanlen = fwords[i][alt][2]             # <<<<<<<<<<<<<<
  *                 # TODO get rid of k -- pathlen is replacing it
  *                 if word_id == EPSILON:
  */
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 986; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 986; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
+      __pyx_t_16 = __Pyx_GetItemInt(__pyx_t_2, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_16) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_16);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_15, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 986; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_16, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+      __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_spanlen);
       __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_spanlen);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":988
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":989
  *                 spanlen = fwords[i][alt][2]
  *                 # TODO get rid of k -- pathlen is replacing it
  *                 if word_id == EPSILON:             # <<<<<<<<<<<<<<
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):
  */
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_15 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_16 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_16); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_16); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":990
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":991
  *                 if word_id == EPSILON:
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):             # <<<<<<<<<<<<<<
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  */
-        __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_2 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_16 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_16);
+        __pyx_t_2 = PyNumber_Add(__pyx_t_16, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_15 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_14 = PyObject_RichCompare(__pyx_t_2, __pyx_t_15, Py_GE); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+        __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_16 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_16);
+        __pyx_t_15 = PyObject_RichCompare(__pyx_t_2, __pyx_t_16, Py_GE); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":991
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":992
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):
  *                         continue             # <<<<<<<<<<<<<<
  *                     for nualt in range(0,len(fwords[i+spanlen])):
- *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
+ *                         frontier.append((k, i+spanlen, input_match, nualt, pathlen, node, prefix, is_shadow_path))
  */
           goto __pyx_L19_continue;
           goto __pyx_L24;
         }
         __pyx_L24:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":992
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":993
  *                     if i+spanlen >= len(fwords):
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
- *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
+ *                         frontier.append((k, i+spanlen, input_match, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue
  */
-        __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_14);
-        __pyx_t_15 = PyNumber_Add(__pyx_t_14, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-        __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_15); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_14);
+        __pyx_t_16 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_16);
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-        __pyx_t_5 = PyObject_Length(__pyx_t_14); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_5; __pyx_t_18+=1) {
-          __pyx_cur_scope->__pyx_v_nualt = __pyx_t_18;
+        __pyx_t_15 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_16); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_15);
+        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+        __pyx_t_5 = PyObject_Length(__pyx_t_15); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+        for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_5; __pyx_t_19+=1) {
+          __pyx_cur_scope->__pyx_v_nualt = __pyx_t_19;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":993
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":994
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):
- *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))             # <<<<<<<<<<<<<<
+ *                         frontier.append((k, i+spanlen, input_match, nualt, pathlen, node, prefix, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     continue
  * 
  */
-          __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_14);
-          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_2 = PyNumber_Add(__pyx_t_15, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_16 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_16);
+          __pyx_t_2 = PyNumber_Add(__pyx_t_16, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_3 = PyTuple_New(7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+          __pyx_t_16 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_16);
+          __pyx_t_3 = PyTuple_New(8); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_14);
-          __Pyx_GIVEREF(__pyx_t_14);
+          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_15);
+          __Pyx_GIVEREF(__pyx_t_15);
           PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_15);
-          __Pyx_GIVEREF(__pyx_t_15);
+          __Pyx_INCREF(__pyx_cur_scope->__pyx_v_input_match);
+          PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_cur_scope->__pyx_v_input_match);
+          __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_input_match);
+          PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_t_16);
+          __Pyx_GIVEREF(__pyx_t_16);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
-          PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_cur_scope->__pyx_v_pathlen);
+          PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_cur_scope->__pyx_v_pathlen);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_node);
-          PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_cur_scope->__pyx_v_node);
+          PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_cur_scope->__pyx_v_node);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_node);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_prefix);
-          PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_cur_scope->__pyx_v_prefix);
+          PyTuple_SET_ITEM(__pyx_t_3, 6, __pyx_cur_scope->__pyx_v_prefix);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_prefix);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          PyTuple_SET_ITEM(__pyx_t_3, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
+          PyTuple_SET_ITEM(__pyx_t_3, 7, __pyx_cur_scope->__pyx_v_is_shadow_path);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          __pyx_t_14 = 0;
-          __pyx_t_2 = 0;
           __pyx_t_15 = 0;
-          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = 0;
+          __pyx_t_16 = 0;
+          __pyx_t_12 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":994
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":995
  *                     for nualt in range(0,len(fwords[i+spanlen])):
- *                         frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
+ *                         frontier.append((k, i+spanlen, input_match, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue             # <<<<<<<<<<<<<<
  * 
  *                 phrase = prefix + (word_id,)
@@ -46795,65 +46822,65 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L23:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":996
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":997
  *                     continue
  * 
  *                 phrase = prefix + (word_id,)             # <<<<<<<<<<<<<<
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()
  */
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_word_id);
       PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_word_id);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_word_id);
-      __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_prefix, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
+      __pyx_t_16 = PyNumber_Add(__pyx_cur_scope->__pyx_v_prefix, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_16);
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_phrase);
       __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_phrase);
-      __Pyx_GIVEREF(__pyx_t_15);
-      __pyx_cur_scope->__pyx_v_phrase = __pyx_t_15;
-      __pyx_t_15 = 0;
+      __Pyx_GIVEREF(__pyx_t_16);
+      __pyx_cur_scope->__pyx_v_phrase = __pyx_t_16;
+      __pyx_t_16 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":997
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":998
  * 
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)             # <<<<<<<<<<<<<<
  *                 arity = hiero_phrase.arity()
  * 
  */
-      __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
+      __pyx_t_16 = PyTuple_New(1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_16);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
-      PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_phrase);
+      PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_cur_scope->__pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
-      __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_16), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_16)); __pyx_t_16 = 0;
       __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase));
       __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase));
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_cur_scope->__pyx_v_hiero_phrase = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":998
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":999
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()             # <<<<<<<<<<<<<<
  * 
  *                 lookup_required = False
  */
-      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase), __pyx_n_s__arity); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase), __pyx_n_s__arity); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_15 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
+      __pyx_t_16 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_16);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_15); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-      __pyx_cur_scope->__pyx_v_arity = __pyx_t_18;
+      __pyx_t_19 = __Pyx_PyInt_AsInt(__pyx_t_16); if (unlikely((__pyx_t_19 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+      __pyx_cur_scope->__pyx_v_arity = __pyx_t_19;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1000
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1001
  *                 arity = hiero_phrase.arity()
  * 
  *                 lookup_required = False             # <<<<<<<<<<<<<<
@@ -46862,36 +46889,36 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       __pyx_cur_scope->__pyx_v_lookup_required = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1001
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1002
  * 
  *                 lookup_required = False
  *                 if word_id in node.children:             # <<<<<<<<<<<<<<
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  */
-      __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_15, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+      __pyx_t_16 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_16);
+      __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_16, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1002
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1003
  *                 lookup_required = False
  *                 if word_id in node.children:
  *                     if node.children[word_id] is None:             # <<<<<<<<<<<<<<
  *                         # Path dead-ends at this node
  *                         continue
  */
-        __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_3 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_16 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_16);
+        __pyx_t_3 = PyObject_GetItem(__pyx_t_16, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         __pyx_t_8 = (__pyx_t_3 == Py_None);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1004
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1005
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  *                         continue             # <<<<<<<<<<<<<<
@@ -46903,43 +46930,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1007
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1008
  *                     else:
  *                         # Path continues at this node
  *                         node = node.children[word_id]             # <<<<<<<<<<<<<<
  *                 else:
  *                     if node.suffix_link is None:
  */
-          __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_15 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
+          __pyx_t_16 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_16) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_16);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_node);
           __Pyx_DECREF(__pyx_cur_scope->__pyx_v_node);
-          __Pyx_GIVEREF(__pyx_t_15);
-          __pyx_cur_scope->__pyx_v_node = __pyx_t_15;
-          __pyx_t_15 = 0;
+          __Pyx_GIVEREF(__pyx_t_16);
+          __pyx_cur_scope->__pyx_v_node = __pyx_t_16;
+          __pyx_t_16 = 0;
         }
         __pyx_L28:;
         goto __pyx_L27;
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1009
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1010
  *                         node = node.children[word_id]
  *                 else:
  *                     if node.suffix_link is None:             # <<<<<<<<<<<<<<
  *                         # Current node is root; lookup required
  *                         lookup_required = True
  */
-        __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_8 = (__pyx_t_15 == Py_None);
-        __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+        __pyx_t_16 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_16);
+        __pyx_t_8 = (__pyx_t_16 == Py_None);
+        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1011
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1012
  *                     if node.suffix_link is None:
  *                         # Current node is root; lookup required
  *                         lookup_required = True             # <<<<<<<<<<<<<<
@@ -46951,54 +46978,54 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1013
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1014
  *                         lookup_required = True
  *                     else:
  *                         if word_id in node.suffix_link.children:             # <<<<<<<<<<<<<<
  *                             if node.suffix_link.children[word_id] is None:
  *                                 # Suffix link reports path is dead end
  */
-          __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_3 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_16 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_16);
+          __pyx_t_3 = PyObject_GetAttr(__pyx_t_16, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+          __pyx_t_8 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1014
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1015
  *                     else:
  *                         if word_id in node.suffix_link.children:
  *                             if node.suffix_link.children[word_id] is None:             # <<<<<<<<<<<<<<
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_15 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
+            __pyx_t_16 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__children); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_16);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetItem(__pyx_t_16, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+            __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
             __pyx_t_8 = (__pyx_t_3 == Py_None);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             if (__pyx_t_8) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1016
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1017
  *                             if node.suffix_link.children[word_id] is None:
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None             # <<<<<<<<<<<<<<
  *                                 continue
  *                             else:
  */
-              __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
-              if (PyObject_SetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyObject_SetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1017
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1018
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None
  *                                 continue             # <<<<<<<<<<<<<<
@@ -47010,7 +47037,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             /*else*/ {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1020
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1021
  *                             else:
  *                                 # Suffix link indicates lookup is reqired
  *                                 lookup_required = True             # <<<<<<<<<<<<<<
@@ -47024,18 +47051,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1023
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1024
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-            __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_122), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_122), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_Raise(__pyx_t_3, 0, 0, 0);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_L30:;
         }
@@ -47043,7 +47070,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L27:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1025
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1026
  *                             raise Exception("Keyword trie error")
  *                 # checking whether lookup_required
  *                 if lookup_required:             # <<<<<<<<<<<<<<
@@ -47052,7 +47079,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       if (__pyx_cur_scope->__pyx_v_lookup_required) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1026
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1027
  *                 # checking whether lookup_required
  *                 if lookup_required:
  *                     new_node = None             # <<<<<<<<<<<<<<
@@ -47065,66 +47092,66 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_GIVEREF(Py_None);
         __pyx_cur_scope->__pyx_v_new_node = Py_None;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1027
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1028
  *                 if lookup_required:
  *                     new_node = None
  *                     if is_shadow_path:             # <<<<<<<<<<<<<<
  *                         # Extending shadow path
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1030
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1031
  *                         # Extending shadow path
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=node.suffix_link.children[word_id],
  *                                 phrase=hiero_phrase)
  */
-          __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-          __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__children); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_16 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_16);
+          __pyx_t_2 = PyObject_GetAttr(__pyx_t_16, __pyx_n_s__children); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __pyx_t_15 = PyObject_GetItem(__pyx_t_2, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
+          __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+          __pyx_t_16 = PyObject_GetItem(__pyx_t_2, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_16) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_16);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_t_16, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1031
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1032
  *                         # on the shadow path we don't do any search, we just use info from suffix link
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],             # <<<<<<<<<<<<<<
  *                                 phrase=hiero_phrase)
  *                     else:
  */
-          __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_15 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
+          __pyx_t_16 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_16);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyObject_GetItem(__pyx_t_15, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_GetItem(__pyx_t_16, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1032
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1033
  *                         new_node = ExtendedTrieNode(phrase_location=node.suffix_link.children[word_id].phrase_location,
  *                                 suffix_link=node.suffix_link.children[word_id],
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
  *                     else:
  *                         if arity > 0:
  */
-          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -47136,7 +47163,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1034
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1035
  *                                 phrase=hiero_phrase)
  *                     else:
  *                         if arity > 0:             # <<<<<<<<<<<<<<
@@ -47146,22 +47173,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity > 0);
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1036
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1037
  *                         if arity > 0:
  *                             # Intersecting because of arity > 0
  *                             phrase_location = self.intersect(node, node.suffix_link.children[word_id], hiero_phrase)             # <<<<<<<<<<<<<<
  *                         else:
  *                             # Suffix array search
  */
-            __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->intersect(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->intersect(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_node, __pyx_t_2, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -47173,69 +47200,69 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1039
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1040
  *                         else:
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location             # <<<<<<<<<<<<<<
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:
  */
-            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
             __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_cur_scope->__pyx_v_phrase_location = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1040
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1041
  *                             # Suffix array search
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)             # <<<<<<<<<<<<<<
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_19 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_19 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-            __pyx_t_2 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_18)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_19)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-            __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __pyx_t_15 = PyInt_FromSsize_t((__pyx_t_5 - 1)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_5 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_16 = PyInt_FromSsize_t((__pyx_t_5 - 1)); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_16);
+            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_low); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_2));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-            PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_15);
+            PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_16);
+            __Pyx_GIVEREF(__pyx_t_16);
+            PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_15);
             __Pyx_GIVEREF(__pyx_t_15);
-            PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_14);
-            __Pyx_GIVEREF(__pyx_t_14);
-            PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_11);
+            __Pyx_GIVEREF(__pyx_t_11);
             __pyx_t_2 = 0;
+            __pyx_t_16 = 0;
             __pyx_t_15 = 0;
-            __pyx_t_14 = 0;
-            __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
+            __pyx_t_11 = 0;
+            __pyx_t_11 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_sa_range);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_sa_range);
-            __Pyx_GIVEREF(__pyx_t_10);
-            __pyx_cur_scope->__pyx_v_sa_range = __pyx_t_10;
-            __pyx_t_10 = 0;
+            __Pyx_GIVEREF(__pyx_t_11);
+            __pyx_cur_scope->__pyx_v_sa_range = __pyx_t_11;
+            __pyx_t_11 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1041
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1042
  *                             phrase_location = node.phrase_location
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:             # <<<<<<<<<<<<<<
@@ -47245,26 +47272,26 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_8 = (__pyx_cur_scope->__pyx_v_sa_range != Py_None);
             if (__pyx_t_8) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1042
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1043
  *                             sa_range = self.fsa.lookup(sym_tostring(phrase[-1]), len(phrase)-1, phrase_location.sa_low, phrase_location.sa_high)
  *                             if sa_range is not None:
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])             # <<<<<<<<<<<<<<
  *                             else:
  *                                 phrase_location = None
  */
-              __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_11 = PyDict_New(); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_low), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__sa_low), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+              __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
               __Pyx_GOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
               __Pyx_DECREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
               __Pyx_GIVEREF(__pyx_t_9);
@@ -47274,7 +47301,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             /*else*/ {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1044
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1045
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  *                             else:
  *                                 phrase_location = None             # <<<<<<<<<<<<<<
@@ -47291,7 +47318,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L34:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1046
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1047
  *                                 phrase_location = None
  * 
  *                         if phrase_location is None:             # <<<<<<<<<<<<<<
@@ -47301,19 +47328,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_8 = (((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location) == Py_None);
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1047
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1048
  * 
  *                         if phrase_location is None:
  *                             node.children[word_id] = None             # <<<<<<<<<<<<<<
  *                             # Search failed
  *                             continue
  */
-            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            if (PyObject_SetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (PyObject_SetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1049
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1050
  *                             node.children[word_id] = None
  *                             # Search failed
  *                             continue             # <<<<<<<<<<<<<<
@@ -47325,7 +47352,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L36:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1051
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1052
  *                             continue
  *                         # Search succeeded
  *                         suffix_link = self.rules.root             # <<<<<<<<<<<<<<
@@ -47338,34 +47365,34 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_self->rules->root);
           __pyx_cur_scope->__pyx_v_suffix_link = __pyx_cur_scope->__pyx_v_self->rules->root;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1052
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1053
  *                         # Search succeeded
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:             # <<<<<<<<<<<<<<
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_8 = (__pyx_t_9 != Py_None);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1053
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1054
  *                         suffix_link = self.rules.root
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]             # <<<<<<<<<<<<<<
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,
  */
-            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
+            __pyx_t_11 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            __pyx_t_9 = PyObject_GetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetItem(__pyx_t_11, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_suffix_link);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_suffix_link);
             __Pyx_GIVEREF(__pyx_t_9);
@@ -47375,58 +47402,58 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L37:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1054
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1055
  *                         if node.suffix_link is not None:
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)
  */
-          __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1055
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1056
  *                             suffix_link = node.suffix_link.children[word_id]
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,             # <<<<<<<<<<<<<<
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node
  */
-          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1056
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1057
  *                         new_node = ExtendedTrieNode(phrase_location=phrase_location,
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)             # <<<<<<<<<<<<<<
  *                     node.children[word_id] = new_node
  *                     node = new_node
  */
-          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
           __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
           __Pyx_DECREF(__pyx_cur_scope->__pyx_v_new_node);
-          __Pyx_GIVEREF(__pyx_t_10);
-          __pyx_cur_scope->__pyx_v_new_node = __pyx_t_10;
-          __pyx_t_10 = 0;
+          __Pyx_GIVEREF(__pyx_t_11);
+          __pyx_cur_scope->__pyx_v_new_node = __pyx_t_11;
+          __pyx_t_11 = 0;
         }
         __pyx_L33:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1057
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1058
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node             # <<<<<<<<<<<<<<
  *                     node = new_node
  * 
  */
-        __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_10);
-        if (PyObject_SetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+        __pyx_t_11 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1058; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        if (PyObject_SetItem(__pyx_t_11, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1058; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1058
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1059
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node
  *                     node = new_node             # <<<<<<<<<<<<<<
@@ -47439,7 +47466,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_new_node);
         __pyx_cur_scope->__pyx_v_node = __pyx_cur_scope->__pyx_v_new_node;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1063
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1064
  *                     This should happen before we get to extraction (so that
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:             # <<<<<<<<<<<<<<
@@ -47449,32 +47476,32 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1064
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1065
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1             # <<<<<<<<<<<<<<
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index
  */
-          __pyx_t_10 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_arity + 1)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_11 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_arity + 1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1065; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xcat_index);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_xcat_index);
-          __Pyx_GIVEREF(__pyx_t_10);
-          __pyx_cur_scope->__pyx_v_xcat_index = __pyx_t_10;
-          __pyx_t_10 = 0;
+          __Pyx_GIVEREF(__pyx_t_11);
+          __pyx_cur_scope->__pyx_v_xcat_index = __pyx_t_11;
+          __pyx_t_11 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1065
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1066
  *                     if arity < self.max_nonterminals:
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)             # <<<<<<<<<<<<<<
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:
  */
-          __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1065; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
+          __pyx_t_19 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_19 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_19);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1066
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1067
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index             # <<<<<<<<<<<<<<
@@ -47487,206 +47514,206 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xcat_index);
           __pyx_cur_scope->__pyx_v_suffix_link_xcat_index = __pyx_cur_scope->__pyx_v_xcat_index;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1067
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1068
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:             # <<<<<<<<<<<<<<
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  */
-          __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1068
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1069
  *                         suffix_link_xcat_index = xcat_index
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1             # <<<<<<<<<<<<<<
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  */
-            __pyx_t_10 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_xcat_index, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
+            __pyx_t_11 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_xcat_index, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index);
-            __Pyx_GIVEREF(__pyx_t_10);
-            __pyx_cur_scope->__pyx_v_suffix_link_xcat_index = __pyx_t_10;
-            __pyx_t_10 = 0;
+            __Pyx_GIVEREF(__pyx_t_11);
+            __pyx_cur_scope->__pyx_v_suffix_link_xcat_index = __pyx_t_11;
+            __pyx_t_11 = 0;
             goto __pyx_L39;
           }
           __pyx_L39:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1069
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1070
  *                         if is_shadow_path:
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)             # <<<<<<<<<<<<<<
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  */
-          __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_18);
+          __pyx_t_19 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_19 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_cur_scope->__pyx_v_suffix_link_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_19);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1070
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1071
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))
  */
-          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyDict_New(); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1071
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1072
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],             # <<<<<<<<<<<<<<
  *                                 phrase= Phrase(phrase + (xcat,)))
  * 
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_3 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_suffix_link_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_suffix_link_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1072
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1073
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))             # <<<<<<<<<<<<<<
  * 
  *                     # sample from range
  */
-          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
-          __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __pyx_t_9 = 0;
-          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__phrase), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1070
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1071
  *                             suffix_link_xcat_index = xcat_index-1
  *                         suffix_link_xcat = sym_setindex(self.category, suffix_link_xcat_index)
  *                         node.children[xcat] = ExtendedTrieNode(phrase_location=node.phrase_location,             # <<<<<<<<<<<<<<
  *                                 suffix_link=node.suffix_link.children[suffix_link_xcat],
  *                                 phrase= Phrase(phrase + (xcat,)))
  */
-          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
-          if (__Pyx_SetItemInt(__pyx_t_10, __pyx_cur_scope->__pyx_v_xcat, __pyx_t_9, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __pyx_t_11 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
+          if (__Pyx_SetItemInt(__pyx_t_11, __pyx_cur_scope->__pyx_v_xcat, __pyx_t_9, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           goto __pyx_L38;
         }
         __pyx_L38:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1075
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1076
  * 
  *                     # sample from range
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = (!__pyx_t_8);
-        if (__pyx_t_19) {
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_20 = (!__pyx_t_8);
+        if (__pyx_t_20) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1076
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1077
  *                     # sample from range
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)             # <<<<<<<<<<<<<<
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  */
-          __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
-          __Pyx_GIVEREF(__pyx_t_10);
-          __pyx_t_10 = 0;
-          __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_11);
+          __Pyx_GIVEREF(__pyx_t_11);
+          __pyx_t_11 = 0;
+          __pyx_t_11 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-          if (!(likely(((__pyx_t_10) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_10, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (!(likely(((__pyx_t_11) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_sample));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_sample));
-          __Pyx_GIVEREF(__pyx_t_10);
-          __pyx_cur_scope->__pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_10);
-          __pyx_t_10 = 0;
+          __Pyx_GIVEREF(__pyx_t_11);
+          __pyx_cur_scope->__pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_11);
+          __pyx_t_11 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1077
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1078
  *                     if not is_shadow_path:
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns             # <<<<<<<<<<<<<<
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:
  */
-          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
-          __pyx_cur_scope->__pyx_v_num_subpatterns = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_10)->num_subpatterns;
-          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+          __pyx_t_11 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_cur_scope->__pyx_v_num_subpatterns = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_11)->num_subpatterns;
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1078
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1079
  *                         sample = self.sampler.sample(node.phrase_location)
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)             # <<<<<<<<<<<<<<
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  */
-          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyDict_New(); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_11));
+          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_11)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_chunklen));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_chunklen));
           __Pyx_GIVEREF(__pyx_t_3);
           __pyx_cur_scope->__pyx_v_chunklen = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1079
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1080
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:             # <<<<<<<<<<<<<<
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []
  */
-          __pyx_t_18 = __pyx_cur_scope->__pyx_v_num_subpatterns;
-          for (__pyx_cur_scope->__pyx_v_j = 0; __pyx_cur_scope->__pyx_v_j < __pyx_t_18; __pyx_cur_scope->__pyx_v_j++) {
+          __pyx_t_19 = __pyx_cur_scope->__pyx_v_num_subpatterns;
+          for (__pyx_cur_scope->__pyx_v_j = 0; __pyx_cur_scope->__pyx_v_j < __pyx_t_19; __pyx_cur_scope->__pyx_v_j++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1080
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1081
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)             # <<<<<<<<<<<<<<
@@ -47696,14 +47723,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             (__pyx_cur_scope->__pyx_v_chunklen->arr[__pyx_cur_scope->__pyx_v_j]) = ((struct __pyx_vtabstruct_3_sa_Phrase *)__pyx_cur_scope->__pyx_v_hiero_phrase->__pyx_vtab)->chunklen(__pyx_cur_scope->__pyx_v_hiero_phrase, __pyx_cur_scope->__pyx_v_j);
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1081
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1082
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []             # <<<<<<<<<<<<<<
  *                         j = 0
  *                         extract_start = monitor_cpu()
  */
-          __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
@@ -47711,7 +47738,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_extracts = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1082
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1083
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []
  *                         j = 0             # <<<<<<<<<<<<<<
@@ -47720,14 +47747,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
           __pyx_cur_scope->__pyx_v_j = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1083
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1084
  *                         extracts = []
  *                         j = 0
  *                         extract_start = monitor_cpu()             # <<<<<<<<<<<<<<
  *                         while j < sample.len:
  *                             extract = []
  */
-          __pyx_t_3 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1083; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract_start);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract_start);
@@ -47735,7 +47762,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_extract_start = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1084
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1085
  *                         j = 0
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:             # <<<<<<<<<<<<<<
@@ -47743,17 +47770,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  * 
  */
           while (1) {
-            __pyx_t_19 = (__pyx_cur_scope->__pyx_v_j < __pyx_cur_scope->__pyx_v_sample->len);
-            if (!__pyx_t_19) break;
+            __pyx_t_20 = (__pyx_cur_scope->__pyx_v_j < __pyx_cur_scope->__pyx_v_sample->len);
+            if (!__pyx_t_20) break;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1085
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1086
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:
  *                             extract = []             # <<<<<<<<<<<<<<
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  */
-            __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1085; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -47761,7 +47788,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_extract = ((PyObject *)__pyx_t_3);
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1087
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1088
  *                             extract = []
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -47770,37 +47797,37 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
             __pyx_f_3_sa_assign_matching((&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_sample->arr, __pyx_cur_scope->__pyx_v_j, __pyx_cur_scope->__pyx_v_num_subpatterns, __pyx_cur_scope->__pyx_v_self->fda->sent_id->arr);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1088
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1089
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])             # <<<<<<<<<<<<<<
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])
  */
-            __pyx_t_3 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = __Pyx_PySequence_GetSlice(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
+            __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_t_3 = 0;
-            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_loc);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_loc);
             __Pyx_GIVEREF(__pyx_t_3);
             __pyx_cur_scope->__pyx_v_loc = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1089
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1090
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)             # <<<<<<<<<<<<<<
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns
  */
-            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->extract(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_cur_scope->__pyx_v_self->__pyx_vtab)->extract(__pyx_cur_scope->__pyx_v_self, __pyx_cur_scope->__pyx_v_hiero_phrase, (&__pyx_cur_scope->__pyx_v_matching), __pyx_cur_scope->__pyx_v_chunklen->arr, __pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -47808,81 +47835,81 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_extract = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1090
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1091
  *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])             # <<<<<<<<<<<<<<
  *                             j = j + num_subpatterns
  * 
  */
-            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_10 = PyList_New(0); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
+            __pyx_t_11 = PyList_New(0); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_extract) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_extract)) {
               __pyx_t_9 = __pyx_cur_scope->__pyx_v_extract; __Pyx_INCREF(__pyx_t_9); __pyx_t_5 = 0;
-              __pyx_t_20 = NULL;
+              __pyx_t_21 = NULL;
             } else {
-              __pyx_t_5 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_extract); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_5 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_extract); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              __pyx_t_20 = Py_TYPE(__pyx_t_9)->tp_iternext;
+              __pyx_t_21 = Py_TYPE(__pyx_t_9)->tp_iternext;
             }
             for (;;) {
-              if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_9)) {
+              if (!__pyx_t_21 && PyList_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_9)) break;
                 #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_14 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_15); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 #else
-                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 #endif
-              } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_9)) {
+              } else if (!__pyx_t_21 && PyTuple_CheckExact(__pyx_t_9)) {
                 if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
                 #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_14); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_15); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 #else
-                __pyx_t_14 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 #endif
               } else {
-                __pyx_t_14 = __pyx_t_20(__pyx_t_9);
-                if (unlikely(!__pyx_t_14)) {
+                __pyx_t_15 = __pyx_t_21(__pyx_t_9);
+                if (unlikely(!__pyx_t_15)) {
                   if (PyErr_Occurred()) {
                     if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   break;
                 }
-                __Pyx_GOTREF(__pyx_t_14);
+                __Pyx_GOTREF(__pyx_t_15);
               }
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
-              __Pyx_GIVEREF(__pyx_t_14);
-              __pyx_cur_scope->__pyx_v_e = __pyx_t_14;
-              __pyx_t_14 = 0;
-              __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
+              __Pyx_GIVEREF(__pyx_t_15);
+              __pyx_cur_scope->__pyx_v_e = __pyx_t_15;
+              __pyx_t_15 = 0;
+              __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
-              PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_cur_scope->__pyx_v_e);
+              PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_e);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loc);
-              PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_cur_scope->__pyx_v_loc);
+              PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_cur_scope->__pyx_v_loc);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loc);
-              if (unlikely(__Pyx_PyList_Append(__pyx_t_10, (PyObject*)__pyx_t_14))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
+              if (unlikely(__Pyx_PyList_Append(__pyx_t_11, (PyObject*)__pyx_t_15))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             }
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_INCREF(((PyObject *)__pyx_t_10));
-            PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_10));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_10));
-            __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
+            __Pyx_INCREF(((PyObject *)__pyx_t_11));
+            PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_11));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_11));
+            __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
+            __pyx_t_11 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1091
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1092
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns             # <<<<<<<<<<<<<<
@@ -47892,7 +47919,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_j = (__pyx_cur_scope->__pyx_v_j + __pyx_cur_scope->__pyx_v_num_subpatterns);
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1093
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1094
  *                             j = j + num_subpatterns
  * 
  *                         num_samples = sample.len/num_subpatterns             # <<<<<<<<<<<<<<
@@ -47901,117 +47928,117 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
           if (unlikely(__pyx_cur_scope->__pyx_v_num_subpatterns == 0)) {
             PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero");
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           else if (sizeof(int) == sizeof(long) && unlikely(__pyx_cur_scope->__pyx_v_num_subpatterns == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_cur_scope->__pyx_v_sample->len))) {
             PyErr_Format(PyExc_OverflowError, "value too large to perform division");
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_cur_scope->__pyx_v_num_samples = __Pyx_div_int(__pyx_cur_scope->__pyx_v_sample->len, __pyx_cur_scope->__pyx_v_num_subpatterns);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1094
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1095
  * 
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()             # <<<<<<<<<<<<<<
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:
  */
-          __pyx_t_10 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          __pyx_t_11 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract_stop);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract_stop);
-          __Pyx_GIVEREF(__pyx_t_10);
-          __pyx_cur_scope->__pyx_v_extract_stop = __pyx_t_10;
-          __pyx_t_10 = 0;
+          __Pyx_GIVEREF(__pyx_t_11);
+          __pyx_cur_scope->__pyx_v_extract_stop = __pyx_t_11;
+          __pyx_t_11 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1095
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1096
  *                         num_samples = sample.len/num_subpatterns
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start             # <<<<<<<<<<<<<<
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  */
-          __pyx_t_10 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_9 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_9 = PyNumber_Add(__pyx_t_11, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyNumber_Subtract(__pyx_t_9, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          __pyx_t_11 = PyNumber_Subtract(__pyx_t_9, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_21 = __pyx_PyFloat_AsFloat(__pyx_t_10); if (unlikely((__pyx_t_21 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_cur_scope->__pyx_v_self->extract_time = __pyx_t_21;
+          __pyx_t_22 = __pyx_PyFloat_AsFloat(__pyx_t_11); if (unlikely((__pyx_t_22 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          __pyx_cur_scope->__pyx_v_self->extract_time = __pyx_t_22;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1096
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1097
  *                         extract_stop = monitor_cpu()
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:             # <<<<<<<<<<<<<<
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  */
-          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_19 = (__pyx_t_5 > 0);
-          if (__pyx_t_19) {
+          __pyx_t_5 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_20 = (__pyx_t_5 > 0);
+          if (__pyx_t_20) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1097
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1098
  *                         self.extract_time = self.extract_time + extract_stop - extract_start
  *                         if len(extracts) > 0:
  *                             fcount = Counter()             # <<<<<<<<<<<<<<
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:
  */
-            __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__Counter); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_11 = __Pyx_GetName(__pyx_m, __pyx_n_s__Counter); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_9 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_fcount);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_fcount);
             __Pyx_GIVEREF(__pyx_t_9);
             __pyx_cur_scope->__pyx_v_fcount = __pyx_t_9;
             __pyx_t_9 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1098
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1099
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count
  */
-            __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_11 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_10);
-            __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_11);
+            __Pyx_GIVEREF(__pyx_t_11);
+            __pyx_t_11 = 0;
+            __pyx_t_11 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_fphrases);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_fphrases);
-            __Pyx_GIVEREF(__pyx_t_10);
-            __pyx_cur_scope->__pyx_v_fphrases = __pyx_t_10;
-            __pyx_t_10 = 0;
+            __Pyx_GIVEREF(__pyx_t_11);
+            __pyx_cur_scope->__pyx_v_fphrases = __pyx_t_11;
+            __pyx_t_11 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1099
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1100
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:             # <<<<<<<<<<<<<<
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  */
-            __pyx_t_10 = ((PyObject *)__pyx_cur_scope->__pyx_v_extracts); __Pyx_INCREF(__pyx_t_10); __pyx_t_5 = 0;
+            __pyx_t_11 = ((PyObject *)__pyx_cur_scope->__pyx_v_extracts); __Pyx_INCREF(__pyx_t_11); __pyx_t_5 = 0;
             for (;;) {
-              if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_10)) break;
+              if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_11)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyList_GET_ITEM(__pyx_t_11, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_3 = PySequence_ITEM(__pyx_t_10, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PySequence_ITEM(__pyx_t_11, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
               if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
                 PyObject* sequence = __pyx_t_3;
@@ -48023,43 +48050,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 if (unlikely(size != 2)) {
                   if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                   else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
                   __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
-                  __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
+                  __pyx_t_15 = PyTuple_GET_ITEM(sequence, 1); 
                 } else {
                   __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
-                  __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
+                  __pyx_t_15 = PyList_GET_ITEM(sequence, 1); 
                 }
                 __Pyx_INCREF(__pyx_t_9);
-                __Pyx_INCREF(__pyx_t_14);
+                __Pyx_INCREF(__pyx_t_15);
                 #else
-                __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 #endif
                 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               } else
               {
                 Py_ssize_t index = -1;
-                __pyx_t_15 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __pyx_t_16 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                __pyx_t_17 = Py_TYPE(__pyx_t_15)->tp_iternext;
-                index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_15); if (unlikely(!__pyx_t_9)) goto __pyx_L50_unpacking_failed;
+                __pyx_t_18 = Py_TYPE(__pyx_t_16)->tp_iternext;
+                index = 0; __pyx_t_9 = __pyx_t_18(__pyx_t_16); if (unlikely(!__pyx_t_9)) goto __pyx_L50_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_9);
-                index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_15); if (unlikely(!__pyx_t_14)) goto __pyx_L50_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_14);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_15), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_17 = NULL;
-                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+                index = 1; __pyx_t_15 = __pyx_t_18(__pyx_t_16); if (unlikely(!__pyx_t_15)) goto __pyx_L50_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_15);
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_18(__pyx_t_16), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_18 = NULL;
+                __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
                 goto __pyx_L51_unpacking_done;
                 __pyx_L50_unpacking_failed:;
-                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                __pyx_t_17 = NULL;
+                __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+                __pyx_t_18 = NULL;
                 if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L51_unpacking_done:;
               }
               if ((likely(PyTuple_CheckExact(__pyx_t_9))) || (PyList_CheckExact(__pyx_t_9))) {
@@ -48072,29 +48099,29 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 if (unlikely(size != 4)) {
                   if (size > 4) __Pyx_RaiseTooManyValuesError(4);
                   else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 #if CYTHON_COMPILING_IN_CPYTHON
                 if (likely(PyTuple_CheckExact(sequence))) {
-                  __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
+                  __pyx_t_16 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
-                  __pyx_t_7 = PyTuple_GET_ITEM(sequence, 2); 
-                  __pyx_t_13 = PyTuple_GET_ITEM(sequence, 3); 
+                  __pyx_t_10 = PyTuple_GET_ITEM(sequence, 2); 
+                  __pyx_t_7 = PyTuple_GET_ITEM(sequence, 3); 
                 } else {
-                  __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
+                  __pyx_t_16 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
-                  __pyx_t_7 = PyList_GET_ITEM(sequence, 2); 
-                  __pyx_t_13 = PyList_GET_ITEM(sequence, 3); 
+                  __pyx_t_10 = PyList_GET_ITEM(sequence, 2); 
+                  __pyx_t_7 = PyList_GET_ITEM(sequence, 3); 
                 }
-                __Pyx_INCREF(__pyx_t_15);
+                __Pyx_INCREF(__pyx_t_16);
                 __Pyx_INCREF(__pyx_t_2);
+                __Pyx_INCREF(__pyx_t_10);
                 __Pyx_INCREF(__pyx_t_7);
-                __Pyx_INCREF(__pyx_t_13);
                 #else
                 Py_ssize_t i;
-                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
+                PyObject** temps[4] = {&__pyx_t_16,&__pyx_t_2,&__pyx_t_10,&__pyx_t_7};
                 for (i=0; i < 4; i++) {
-                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   *(temps[i]) = item;
                 }
                 #endif
@@ -48102,32 +48129,32 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               } else
               {
                 Py_ssize_t index = -1;
-                PyObject** temps[4] = {&__pyx_t_15,&__pyx_t_2,&__pyx_t_7,&__pyx_t_13};
-                __pyx_t_16 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_16);
+                PyObject** temps[4] = {&__pyx_t_16,&__pyx_t_2,&__pyx_t_10,&__pyx_t_7};
+                __pyx_t_14 = PyObject_GetIter(__pyx_t_9); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-                __pyx_t_17 = Py_TYPE(__pyx_t_16)->tp_iternext;
+                __pyx_t_18 = Py_TYPE(__pyx_t_14)->tp_iternext;
                 for (index=0; index < 4; index++) {
-                  PyObject* item = __pyx_t_17(__pyx_t_16); if (unlikely(!item)) goto __pyx_L52_unpacking_failed;
+                  PyObject* item = __pyx_t_18(__pyx_t_14); if (unlikely(!item)) goto __pyx_L52_unpacking_failed;
                   __Pyx_GOTREF(item);
                   *(temps[index]) = item;
                 }
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_16), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_17 = NULL;
-                __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_18(__pyx_t_14), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_18 = NULL;
+                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 goto __pyx_L53_unpacking_done;
                 __pyx_L52_unpacking_failed:;
-                __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-                __pyx_t_17 = NULL;
+                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
+                __pyx_t_18 = NULL;
                 if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __pyx_L53_unpacking_done:;
               }
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_f);
-              __Pyx_GIVEREF(__pyx_t_15);
-              __pyx_cur_scope->__pyx_v_f = __pyx_t_15;
-              __pyx_t_15 = 0;
+              __Pyx_GIVEREF(__pyx_t_16);
+              __pyx_cur_scope->__pyx_v_f = __pyx_t_16;
+              __pyx_t_16 = 0;
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
               __Pyx_GIVEREF(__pyx_t_2);
@@ -48135,21 +48162,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_t_2 = 0;
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
-              __Pyx_GIVEREF(__pyx_t_7);
-              __pyx_cur_scope->__pyx_v_count = __pyx_t_7;
-              __pyx_t_7 = 0;
+              __Pyx_GIVEREF(__pyx_t_10);
+              __pyx_cur_scope->__pyx_v_count = __pyx_t_10;
+              __pyx_t_10 = 0;
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_als);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_als);
-              __Pyx_GIVEREF(__pyx_t_13);
-              __pyx_cur_scope->__pyx_v_als = __pyx_t_13;
-              __pyx_t_13 = 0;
+              __Pyx_GIVEREF(__pyx_t_7);
+              __pyx_cur_scope->__pyx_v_als = __pyx_t_7;
+              __pyx_t_7 = 0;
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_loc);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_loc);
-              __Pyx_GIVEREF(__pyx_t_14);
-              __pyx_cur_scope->__pyx_v_loc = __pyx_t_14;
-              __pyx_t_14 = 0;
+              __Pyx_GIVEREF(__pyx_t_15);
+              __pyx_cur_scope->__pyx_v_loc = __pyx_t_15;
+              __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1100
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1101
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count             # <<<<<<<<<<<<<<
@@ -48158,38 +48185,38 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
               __pyx_t_3 = __pyx_cur_scope->__pyx_v_f;
-              __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_9 = PyNumber_InPlaceAdd(__pyx_t_14, __pyx_cur_scope->__pyx_v_count); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_15);
+              __pyx_t_9 = PyNumber_InPlaceAdd(__pyx_t_15, __pyx_cur_scope->__pyx_v_count); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
-              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-              if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+              if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_3, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1101
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1102
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)             # <<<<<<<<<<<<<<
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  */
-              __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fphrases, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fphrases, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
-              __pyx_t_9 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_e); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_e); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              __pyx_t_3 = PyObject_GetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_als); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PyObject_GetItem(__pyx_t_9, __pyx_cur_scope->__pyx_v_als); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-              __pyx_t_9 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_cur_scope->__pyx_v_loc); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_cur_scope->__pyx_v_loc); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
               __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
             }
-            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1102
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1103
  *                                 fcount[f] += count
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():             # <<<<<<<<<<<<<<
@@ -48199,17 +48226,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_5 = 0;
             if (unlikely(__pyx_cur_scope->__pyx_v_fphrases == Py_None)) {
               PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
-            __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_fphrases, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_22), (&__pyx_t_18)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_fphrases, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_23), (&__pyx_t_19)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_XDECREF(__pyx_t_10);
-            __pyx_t_10 = __pyx_t_9;
+            __Pyx_XDECREF(__pyx_t_11);
+            __pyx_t_11 = __pyx_t_9;
             __pyx_t_9 = 0;
             while (1) {
-              __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_10, __pyx_t_22, &__pyx_t_5, &__pyx_t_9, &__pyx_t_3, NULL, __pyx_t_18);
+              __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_11, __pyx_t_23, &__pyx_t_5, &__pyx_t_9, &__pyx_t_3, NULL, __pyx_t_19);
               if (unlikely(__pyx_t_6 == 0)) break;
-              if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_GOTREF(__pyx_t_3);
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
@@ -48223,29 +48250,29 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_cur_scope->__pyx_v_elist = __pyx_t_3;
               __pyx_t_3 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1103
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1104
  *                                 fphrases[f][e][als].append(loc)
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():             # <<<<<<<<<<<<<<
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
  */
-              __pyx_t_23 = 0;
+              __pyx_t_24 = 0;
               if (unlikely(__pyx_cur_scope->__pyx_v_elist == Py_None)) {
                 PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "iteritems");
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
-              __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_elist, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_24), (&__pyx_t_6)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_elist, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_25), (&__pyx_t_6)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_9);
               __Pyx_XDECREF(__pyx_t_3);
               __pyx_t_3 = __pyx_t_9;
               __pyx_t_9 = 0;
               while (1) {
-                __pyx_t_4 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_24, &__pyx_t_23, &__pyx_t_9, &__pyx_t_14, NULL, __pyx_t_6);
+                __pyx_t_4 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_25, &__pyx_t_24, &__pyx_t_9, &__pyx_t_15, NULL, __pyx_t_6);
                 if (unlikely(__pyx_t_4 == 0)) break;
-                if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_GOTREF(__pyx_t_14);
+                __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
                 __Pyx_GIVEREF(__pyx_t_9);
@@ -48253,39 +48280,39 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_t_9 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alslist);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alslist);
-                __Pyx_GIVEREF(__pyx_t_14);
-                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_14;
-                __pyx_t_14 = 0;
+                __Pyx_GIVEREF(__pyx_t_15);
+                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_15;
+                __pyx_t_15 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1104
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1105
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
  *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
  *                                     count = len(locs)
  */
-                __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                __pyx_t_9 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
-                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
+                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_9);
                 __Pyx_GIVEREF(__pyx_t_9);
                 __pyx_t_9 = 0;
-                __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-                __pyx_t_13 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__key), __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_14), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
+                __pyx_t_7 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_7);
+                if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__key), __pyx_t_7) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+                __pyx_t_7 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_15), ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_7);
+                __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-                if ((likely(PyTuple_CheckExact(__pyx_t_13))) || (PyList_CheckExact(__pyx_t_13))) {
-                  PyObject* sequence = __pyx_t_13;
+                if ((likely(PyTuple_CheckExact(__pyx_t_7))) || (PyList_CheckExact(__pyx_t_7))) {
+                  PyObject* sequence = __pyx_t_7;
                   #if CYTHON_COMPILING_IN_CPYTHON
                   Py_ssize_t size = Py_SIZE(sequence);
                   #else
@@ -48294,43 +48321,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
                     __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
-                    __pyx_t_14 = PyTuple_GET_ITEM(sequence, 1); 
+                    __pyx_t_15 = PyTuple_GET_ITEM(sequence, 1); 
                   } else {
                     __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
-                    __pyx_t_14 = PyList_GET_ITEM(sequence, 1); 
+                    __pyx_t_15 = PyList_GET_ITEM(sequence, 1); 
                   }
                   __Pyx_INCREF(__pyx_t_9);
-                  __Pyx_INCREF(__pyx_t_14);
+                  __Pyx_INCREF(__pyx_t_15);
                   #else
-                  __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_14 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
-                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_7 = PyObject_GetIter(__pyx_t_13); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __Pyx_GOTREF(__pyx_t_7);
-                  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                  __pyx_t_17 = Py_TYPE(__pyx_t_7)->tp_iternext;
-                  index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_9)) goto __pyx_L58_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_9);
-                  index = 1; __pyx_t_14 = __pyx_t_17(__pyx_t_7); if (unlikely(!__pyx_t_14)) goto __pyx_L58_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_14);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+                  __pyx_t_18 = Py_TYPE(__pyx_t_10)->tp_iternext;
+                  index = 0; __pyx_t_9 = __pyx_t_18(__pyx_t_10); if (unlikely(!__pyx_t_9)) goto __pyx_L58_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_9);
+                  index = 1; __pyx_t_15 = __pyx_t_18(__pyx_t_10); if (unlikely(!__pyx_t_15)) goto __pyx_L58_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_15);
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_18(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_18 = NULL;
+                  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L59_unpacking_done;
                   __pyx_L58_unpacking_failed:;
-                  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-                  __pyx_t_17 = NULL;
+                  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+                  __pyx_t_18 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L59_unpacking_done:;
                 }
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alignment);
@@ -48340,62 +48367,62 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_t_9 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_max_locs);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_max_locs);
-                __Pyx_GIVEREF(__pyx_t_14);
-                __pyx_cur_scope->__pyx_v_max_locs = __pyx_t_14;
-                __pyx_t_14 = 0;
+                __Pyx_GIVEREF(__pyx_t_15);
+                __pyx_cur_scope->__pyx_v_max_locs = __pyx_t_15;
+                __pyx_t_15 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1105
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1106
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))             # <<<<<<<<<<<<<<
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  */
-                __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                __pyx_t_14 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__chain); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __pyx_t_13 = PyObject_GetAttr(__pyx_t_14, __pyx_n_s__from_iterable); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
-                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __pyx_t_14 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_9 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_7);
+                __pyx_t_15 = PyObject_GetAttr(__pyx_t_7, __pyx_n_s__chain); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+                __pyx_t_7 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__from_iterable); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_7);
+                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+                __pyx_t_15 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                __pyx_t_9 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
-                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
+                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_9);
                 __Pyx_GIVEREF(__pyx_t_9);
                 __pyx_t_9 = 0;
-                __pyx_t_9 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
-                PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_9);
+                __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
+                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_9);
                 __Pyx_GIVEREF(__pyx_t_9);
                 __pyx_t_9 = 0;
-                __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
-                __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
+                __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_GIVEREF(__pyx_t_9);
                 __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_9);
                 __pyx_t_9 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1106
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1107
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))
  *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
  *                                     count = len(locs)             # <<<<<<<<<<<<<<
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  */
-                __pyx_t_25 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); if (unlikely(__pyx_t_25 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_26 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); if (unlikely(__pyx_t_26 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_26); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
@@ -48403,119 +48430,122 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_count = __pyx_t_9;
                 __pyx_t_9 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1107
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1108
  *                                     locs = tuple(itertools.chain.from_iterable(alslist.itervalues()))
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(             # <<<<<<<<<<<<<<
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda,
+ *                                                (k,i+spanlen), locs, input_match,
  */
-                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_9);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1108
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1109
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,             # <<<<<<<<<<<<<<
- *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda,
- *                                                meta))
+ *                                                (k,i+spanlen), locs, input_match,
+ *                                                fwords, self.fda, self.eda,
  */
-                __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_13 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_13);
+                __pyx_t_15 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_15);
+                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_7);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1109
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1110
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda,             # <<<<<<<<<<<<<<
+ *                                                (k,i+spanlen), locs, input_match,             # <<<<<<<<<<<<<<
+ *                                                fwords, self.fda, self.eda,
  *                                                meta))
- *                                     yield Rule(self.category, f, e, scores, alignment)
  */
-                __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_7);
-                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_10);
+                __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyNumber_Add(__pyx_t_2, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __pyx_t_16 = PyNumber_Add(__pyx_t_2, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-                __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_7);
-                __Pyx_GIVEREF(__pyx_t_7);
-                PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_15);
-                __Pyx_GIVEREF(__pyx_t_15);
-                __pyx_t_7 = 0;
-                __pyx_t_15 = 0;
-
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1110
- *                                                f, e, count, fcount[f], num_samples,
- *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda,
+                PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
+                __Pyx_GIVEREF(__pyx_t_10);
+                PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_16);
+                __Pyx_GIVEREF(__pyx_t_16);
+                __pyx_t_10 = 0;
+                __pyx_t_16 = 0;
+
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1112
+ *                                                (k,i+spanlen), locs, input_match,
+ *                                                fwords, self.fda, self.eda,
  *                                                meta))             # <<<<<<<<<<<<<<
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  */
-                __pyx_t_15 = PyTuple_New(11); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __pyx_t_16 = PyTuple_New(12); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
-                PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_f);
+                PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_cur_scope->__pyx_v_f);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
-                PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_cur_scope->__pyx_v_e);
+                PyTuple_SET_ITEM(__pyx_t_16, 1, __pyx_cur_scope->__pyx_v_e);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_count);
-                PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_cur_scope->__pyx_v_count);
+                PyTuple_SET_ITEM(__pyx_t_16, 2, __pyx_cur_scope->__pyx_v_count);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_count);
-                PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_14);
-                __Pyx_GIVEREF(__pyx_t_14);
-                PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_13);
-                __Pyx_GIVEREF(__pyx_t_13);
-                PyTuple_SET_ITEM(__pyx_t_15, 5, ((PyObject *)__pyx_t_2));
+                PyTuple_SET_ITEM(__pyx_t_16, 3, __pyx_t_15);
+                __Pyx_GIVEREF(__pyx_t_15);
+                PyTuple_SET_ITEM(__pyx_t_16, 4, __pyx_t_7);
+                __Pyx_GIVEREF(__pyx_t_7);
+                PyTuple_SET_ITEM(__pyx_t_16, 5, ((PyObject *)__pyx_t_2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
-                PyTuple_SET_ITEM(__pyx_t_15, 6, ((PyObject *)__pyx_cur_scope->__pyx_v_locs));
+                PyTuple_SET_ITEM(__pyx_t_16, 6, ((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
+                __Pyx_INCREF(__pyx_cur_scope->__pyx_v_input_match);
+                PyTuple_SET_ITEM(__pyx_t_16, 7, __pyx_cur_scope->__pyx_v_input_match);
+                __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_input_match);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
-                PyTuple_SET_ITEM(__pyx_t_15, 7, __pyx_cur_scope->__pyx_v_fwords);
+                PyTuple_SET_ITEM(__pyx_t_16, 8, __pyx_cur_scope->__pyx_v_fwords);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
-                PyTuple_SET_ITEM(__pyx_t_15, 8, ((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
+                PyTuple_SET_ITEM(__pyx_t_16, 9, ((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
                 __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->fda));
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
-                PyTuple_SET_ITEM(__pyx_t_15, 9, ((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
+                PyTuple_SET_ITEM(__pyx_t_16, 10, ((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
                 __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_self->eda));
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_meta);
-                PyTuple_SET_ITEM(__pyx_t_15, 10, __pyx_cur_scope->__pyx_v_meta);
+                PyTuple_SET_ITEM(__pyx_t_16, 11, __pyx_cur_scope->__pyx_v_meta);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_meta);
-                __pyx_t_14 = 0;
-                __pyx_t_13 = 0;
+                __pyx_t_15 = 0;
+                __pyx_t_7 = 0;
                 __pyx_t_2 = 0;
-                __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_16), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __Pyx_DECREF(((PyObject *)__pyx_t_16)); __pyx_t_16 = 0;
+                __pyx_t_16 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_Scorer *)__pyx_cur_scope->__pyx_v_self->scorer->__pyx_vtab)->score(__pyx_cur_scope->__pyx_v_self->scorer, __pyx_t_2)); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
                 __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
-                __Pyx_GIVEREF(__pyx_t_15);
-                __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_15);
-                __pyx_t_15 = 0;
+                __Pyx_GIVEREF(__pyx_t_16);
+                __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_16);
+                __pyx_t_16 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1111
- *                                                (k,i+spanlen), locs, fwords, self.fda, self.eda,
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1113
+ *                                                fwords, self.fda, self.eda,
  *                                                meta))
  *                                     yield Rule(self.category, f, e, scores, alignment)             # <<<<<<<<<<<<<<
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  */
-                __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
-                __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_16 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_16);
+                __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_15);
-                __Pyx_GIVEREF(__pyx_t_15);
+                PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_16);
+                __Pyx_GIVEREF(__pyx_t_16);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                 PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_cur_scope->__pyx_v_f);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f);
@@ -48528,25 +48558,25 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_alignment);
                 PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_alignment);
-                __pyx_t_15 = 0;
-                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_15);
+                __pyx_t_16 = 0;
+                __pyx_t_16 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_16);
                 __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-                __pyx_r = __pyx_t_15;
-                __pyx_t_15 = 0;
+                __pyx_r = __pyx_t_16;
+                __pyx_t_16 = 0;
                 __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
                 __Pyx_XGIVEREF(__pyx_t_3);
                 __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
                 __pyx_cur_scope->__pyx_t_2 = __pyx_t_5;
                 __pyx_cur_scope->__pyx_t_3 = __pyx_t_6;
-                __Pyx_XGIVEREF(__pyx_t_10);
-                __pyx_cur_scope->__pyx_t_4 = __pyx_t_10;
-                __Pyx_XGIVEREF(__pyx_t_12);
-                __pyx_cur_scope->__pyx_t_5 = __pyx_t_12;
-                __pyx_cur_scope->__pyx_t_6 = __pyx_t_18;
-                __pyx_cur_scope->__pyx_t_7 = __pyx_t_22;
-                __pyx_cur_scope->__pyx_t_8 = __pyx_t_23;
-                __pyx_cur_scope->__pyx_t_9 = __pyx_t_24;
+                __Pyx_XGIVEREF(__pyx_t_11);
+                __pyx_cur_scope->__pyx_t_4 = __pyx_t_11;
+                __Pyx_XGIVEREF(__pyx_t_13);
+                __pyx_cur_scope->__pyx_t_5 = __pyx_t_13;
+                __pyx_cur_scope->__pyx_t_6 = __pyx_t_19;
+                __pyx_cur_scope->__pyx_t_7 = __pyx_t_23;
+                __pyx_cur_scope->__pyx_t_8 = __pyx_t_24;
+                __pyx_cur_scope->__pyx_t_9 = __pyx_t_25;
                 __Pyx_XGIVEREF(__pyx_r);
                 __Pyx_RefNannyFinishContext();
                 /* return from generator, yielding value */
@@ -48559,21 +48589,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_XGOTREF(__pyx_t_3);
                 __pyx_t_5 = __pyx_cur_scope->__pyx_t_2;
                 __pyx_t_6 = __pyx_cur_scope->__pyx_t_3;
-                __pyx_t_10 = __pyx_cur_scope->__pyx_t_4;
+                __pyx_t_11 = __pyx_cur_scope->__pyx_t_4;
                 __pyx_cur_scope->__pyx_t_4 = 0;
-                __Pyx_XGOTREF(__pyx_t_10);
-                __pyx_t_12 = __pyx_cur_scope->__pyx_t_5;
+                __Pyx_XGOTREF(__pyx_t_11);
+                __pyx_t_13 = __pyx_cur_scope->__pyx_t_5;
                 __pyx_cur_scope->__pyx_t_5 = 0;
-                __Pyx_XGOTREF(__pyx_t_12);
-                __pyx_t_18 = __pyx_cur_scope->__pyx_t_6;
-                __pyx_t_22 = __pyx_cur_scope->__pyx_t_7;
-                __pyx_t_23 = __pyx_cur_scope->__pyx_t_8;
-                __pyx_t_24 = __pyx_cur_scope->__pyx_t_9;
-                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_XGOTREF(__pyx_t_13);
+                __pyx_t_19 = __pyx_cur_scope->__pyx_t_6;
+                __pyx_t_23 = __pyx_cur_scope->__pyx_t_7;
+                __pyx_t_24 = __pyx_cur_scope->__pyx_t_8;
+                __pyx_t_25 = __pyx_cur_scope->__pyx_t_9;
+                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             }
-            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
             goto __pyx_L47;
           }
           __pyx_L47:;
@@ -48584,135 +48614,138 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L32:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1113
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1115
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:             # <<<<<<<<<<<<<<
  *                     for alt_id in range(len(fwords[i+spanlen])):
- *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
+ *                         new_frontier.append((k, i+spanlen, input_match, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  */
-      __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_19 = (__pyx_t_22 < __pyx_cur_scope->__pyx_v_self->max_length);
-      if (__pyx_t_19) {
-        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_3 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_23 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_23 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_20 = (__pyx_t_23 < __pyx_cur_scope->__pyx_v_self->max_length);
+      if (__pyx_t_20) {
+        __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        __pyx_t_3 = PyNumber_Add(__pyx_t_11, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_22); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_15 = PyObject_RichCompare(__pyx_t_3, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __pyx_t_23 = PyObject_Length(__pyx_cur_scope->__pyx_v_fwords); if (unlikely(__pyx_t_23 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = PyInt_FromSsize_t(__pyx_t_23); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        __pyx_t_16 = PyObject_RichCompare(__pyx_t_3, __pyx_t_11, Py_LT); __Pyx_XGOTREF(__pyx_t_16); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_16); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         if (__pyx_t_8) {
-          __pyx_t_15 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_3 = PyObject_RichCompare(__pyx_t_15, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_16 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_16);
+          __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_3 = PyObject_RichCompare(__pyx_t_16, __pyx_t_11, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          __pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_27 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_27 = __pyx_t_26;
+          __pyx_t_28 = __pyx_t_27;
         } else {
-          __pyx_t_27 = __pyx_t_8;
+          __pyx_t_28 = __pyx_t_8;
         }
-        __pyx_t_8 = __pyx_t_27;
+        __pyx_t_8 = __pyx_t_28;
       } else {
-        __pyx_t_8 = __pyx_t_19;
+        __pyx_t_8 = __pyx_t_20;
       }
       if (__pyx_t_8) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1114
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1116
  * 
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
- *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
+ *                         new_frontier.append((k, i+spanlen, input_match, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  */
-        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_10 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_10);
+        __pyx_t_11 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_11); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_22 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+        __pyx_t_23 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_23 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_22; __pyx_t_18+=1) {
-          __pyx_cur_scope->__pyx_v_alt_id = __pyx_t_18;
+        for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_23; __pyx_t_19+=1) {
+          __pyx_cur_scope->__pyx_v_alt_id = __pyx_t_19;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1115
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1117
  *                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
  *                     for alt_id in range(len(fwords[i+spanlen])):
- *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))             # <<<<<<<<<<<<<<
+ *                         new_frontier.append((k, i+spanlen, input_match, alt_id, pathlen + 1, node, phrase, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  */
-          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_15 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_15);
-          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_16 = PyNumber_Add(__pyx_t_11, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_16);
+          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+          __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
+          __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyTuple_New(7); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyTuple_New(8); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
           __Pyx_GIVEREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_15);
-          __Pyx_GIVEREF(__pyx_t_15);
-          PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_10);
-          __Pyx_GIVEREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_2);
+          PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_16);
+          __Pyx_GIVEREF(__pyx_t_16);
+          __Pyx_INCREF(__pyx_cur_scope->__pyx_v_input_match);
+          PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_cur_scope->__pyx_v_input_match);
+          __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_input_match);
+          PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_11);
+          __Pyx_GIVEREF(__pyx_t_11);
+          PyTuple_SET_ITEM(__pyx_t_9, 4, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_node);
-          PyTuple_SET_ITEM(__pyx_t_9, 4, __pyx_cur_scope->__pyx_v_node);
+          PyTuple_SET_ITEM(__pyx_t_9, 5, __pyx_cur_scope->__pyx_v_node);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_node);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
-          PyTuple_SET_ITEM(__pyx_t_9, 5, __pyx_cur_scope->__pyx_v_phrase);
+          PyTuple_SET_ITEM(__pyx_t_9, 6, __pyx_cur_scope->__pyx_v_phrase);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          PyTuple_SET_ITEM(__pyx_t_9, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
+          PyTuple_SET_ITEM(__pyx_t_9, 7, __pyx_cur_scope->__pyx_v_is_shadow_path);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
           __pyx_t_3 = 0;
-          __pyx_t_15 = 0;
-          __pyx_t_10 = 0;
+          __pyx_t_16 = 0;
+          __pyx_t_11 = 0;
           __pyx_t_2 = 0;
-          __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_9)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_12 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_9)); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1116
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1118
  *                     for alt_id in range(len(fwords[i+spanlen])):
- *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
+ *                         new_frontier.append((k, i+spanlen, input_match, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity             # <<<<<<<<<<<<<<
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1
  */
         __pyx_cur_scope->__pyx_v_num_subpatterns = __pyx_cur_scope->__pyx_v_arity;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1117
- *                         new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1119
+ *                         new_frontier.append((k, i+spanlen, input_match, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:             # <<<<<<<<<<<<<<
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  */
-        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = (!__pyx_t_8);
-        if (__pyx_t_19) {
+        __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_20 = (!__pyx_t_8);
+        if (__pyx_t_20) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1118
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1120
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1             # <<<<<<<<<<<<<<
@@ -48724,30 +48757,30 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         __pyx_L64:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1119
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1121
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:             # <<<<<<<<<<<<<<
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]
  */
-        __pyx_t_22 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_22 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = ((__pyx_t_22 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
-        if (__pyx_t_19) {
+        __pyx_t_23 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_23 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_20 = ((__pyx_t_23 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
+        if (__pyx_t_20) {
           __pyx_t_8 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
           if (__pyx_t_8) {
-            __pyx_t_27 = (__pyx_cur_scope->__pyx_v_num_subpatterns < __pyx_cur_scope->__pyx_v_self->max_chunks);
-            __pyx_t_26 = __pyx_t_27;
+            __pyx_t_28 = (__pyx_cur_scope->__pyx_v_num_subpatterns < __pyx_cur_scope->__pyx_v_self->max_chunks);
+            __pyx_t_27 = __pyx_t_28;
           } else {
-            __pyx_t_26 = __pyx_t_8;
+            __pyx_t_27 = __pyx_t_8;
           }
-          __pyx_t_8 = __pyx_t_26;
+          __pyx_t_8 = __pyx_t_27;
         } else {
-          __pyx_t_8 = __pyx_t_19;
+          __pyx_t_8 = __pyx_t_20;
         }
         if (__pyx_t_8) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1120
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1122
  *                         num_subpatterns = num_subpatterns + 1
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)             # <<<<<<<<<<<<<<
@@ -48756,16 +48789,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
           __pyx_cur_scope->__pyx_v_xcat = __pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, (__pyx_cur_scope->__pyx_v_arity + 1));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1121
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1123
  *                     if len(phrase)+1 < self.max_length and arity < self.max_nonterminals and num_subpatterns < self.max_chunks:
  *                         xcat = sym_setindex(self.category, arity+1)
  *                         xnode = node.children[xcat]             # <<<<<<<<<<<<<<
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  */
-          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_9, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xnode);
@@ -48774,48 +48807,48 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_xnode = __pyx_t_2;
           __pyx_t_2 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1123
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1125
  *                         xnode = node.children[xcat]
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])             # <<<<<<<<<<<<<<
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_10);
-          PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
+          __pyx_t_11 = PyList_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_11);
+          PyList_SET_ITEM(__pyx_t_11, 0, __pyx_t_2);
           __Pyx_GIVEREF(__pyx_t_2);
-          PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_9);
+          PyList_SET_ITEM(__pyx_t_11, 1, __pyx_t_9);
           __Pyx_GIVEREF(__pyx_t_9);
           __Pyx_INCREF(__pyx_int_1);
-          PyList_SET_ITEM(__pyx_t_10, 2, __pyx_int_1);
+          PyList_SET_ITEM(__pyx_t_11, 2, __pyx_int_1);
           __Pyx_GIVEREF(__pyx_int_1);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
-          PyList_SET_ITEM(__pyx_t_10, 3, __pyx_cur_scope->__pyx_v_pathlen);
+          PyList_SET_ITEM(__pyx_t_11, 3, __pyx_cur_scope->__pyx_v_pathlen);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
           __pyx_t_2 = 0;
           __pyx_t_9 = 0;
-          __pyx_t_9 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = ((PyObject *)PyList_AsTuple(__pyx_t_11)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_9));
-          __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_key));
           __Pyx_GIVEREF(((PyObject *)__pyx_t_9));
           __pyx_cur_scope->__pyx_v_key = __pyx_t_9;
           __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1124
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1126
  *                         # I put spanlen=1 below
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []             # <<<<<<<<<<<<<<
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  */
-          __pyx_t_9 = PyList_New(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = PyList_New(0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
@@ -48823,24 +48856,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_9);
           __pyx_t_9 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1125
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1127
  *                         key = tuple([self.min_gap_size, i, 1, pathlen])
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):             # <<<<<<<<<<<<<<
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  */
-          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = (__Pyx_PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_key), ((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1126
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1128
  *                         frontier_nodes = []
  *                         if (key in nodes_isteps_away_buffer):
  *                             frontier_nodes = nodes_isteps_away_buffer[key]             # <<<<<<<<<<<<<<
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  */
-            __pyx_t_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
@@ -48851,106 +48884,106 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1128
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1130
  *                             frontier_nodes = nodes_isteps_away_buffer[key]
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)             # <<<<<<<<<<<<<<
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  */
-            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_123); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_9 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_123); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_15 = PyTuple_New(7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
-            PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_2);
+            __pyx_t_16 = PyTuple_New(7); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_16);
+            PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_11);
+            __Pyx_GIVEREF(__pyx_t_11);
+            PyTuple_SET_ITEM(__pyx_t_16, 1, __pyx_t_2);
             __Pyx_GIVEREF(__pyx_t_2);
             __Pyx_INCREF(__pyx_int_1);
-            PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_int_1);
+            PyTuple_SET_ITEM(__pyx_t_16, 2, __pyx_int_1);
             __Pyx_GIVEREF(__pyx_int_1);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
-            PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_cur_scope->__pyx_v_pathlen);
+            PyTuple_SET_ITEM(__pyx_t_16, 3, __pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
-            PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_cur_scope->__pyx_v_fwords);
+            PyTuple_SET_ITEM(__pyx_t_16, 4, __pyx_cur_scope->__pyx_v_fwords);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fwords);
             __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_next_states));
-            PyTuple_SET_ITEM(__pyx_t_15, 5, ((PyObject *)__pyx_cur_scope->__pyx_v_next_states));
+            PyTuple_SET_ITEM(__pyx_t_16, 5, ((PyObject *)__pyx_cur_scope->__pyx_v_next_states));
             __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_next_states));
             __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
-            PyTuple_SET_ITEM(__pyx_t_15, 6, ((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
+            PyTuple_SET_ITEM(__pyx_t_16, 6, ((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
             __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_reachable_buffer));
-            __pyx_t_10 = 0;
+            __pyx_t_11 = 0;
             __pyx_t_2 = 0;
-            __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_16), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
+            __Pyx_DECREF(((PyObject *)__pyx_t_16)); __pyx_t_16 = 0;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_GIVEREF(__pyx_t_2);
             __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1129
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1131
  *                         else:
  *                             frontier_nodes = self.get_all_nodes_isteps_away(self.min_gap_size, i, 1, pathlen, fwords, next_states, reachable_buffer)
  *                             nodes_isteps_away_buffer[key] = frontier_nodes             # <<<<<<<<<<<<<<
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  */
-            if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (PyDict_SetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key), __pyx_cur_scope->__pyx_v_frontier_nodes) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_L66:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1131
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1133
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:             # <<<<<<<<<<<<<<
- *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
+ *                             new_frontier.append((k, i, input_match + (i,), alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
  *             frontier = new_frontier
  */
           if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_frontier_nodes)) {
-            __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_22 = 0;
-            __pyx_t_20 = NULL;
+            __pyx_t_2 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_2); __pyx_t_23 = 0;
+            __pyx_t_21 = NULL;
           } else {
-            __pyx_t_22 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_23 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_frontier_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_20 = Py_TYPE(__pyx_t_2)->tp_iternext;
+            __pyx_t_21 = Py_TYPE(__pyx_t_2)->tp_iternext;
           }
           for (;;) {
-            if (!__pyx_t_20 && PyList_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_22 >= PyList_GET_SIZE(__pyx_t_2)) break;
+            if (!__pyx_t_21 && PyList_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_23 >= PyList_GET_SIZE(__pyx_t_2)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_16 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_23); __Pyx_INCREF(__pyx_t_16); __pyx_t_23++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_16 = PySequence_ITEM(__pyx_t_2, __pyx_t_23); __pyx_t_23++; if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
-            } else if (!__pyx_t_20 && PyTuple_CheckExact(__pyx_t_2)) {
-              if (__pyx_t_22 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+            } else if (!__pyx_t_21 && PyTuple_CheckExact(__pyx_t_2)) {
+              if (__pyx_t_23 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_22); __Pyx_INCREF(__pyx_t_15); __pyx_t_22++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_16 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_23); __Pyx_INCREF(__pyx_t_16); __pyx_t_23++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_2, __pyx_t_22); __pyx_t_22++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_16 = PySequence_ITEM(__pyx_t_2, __pyx_t_23); __pyx_t_23++; if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else {
-              __pyx_t_15 = __pyx_t_20(__pyx_t_2);
-              if (unlikely(!__pyx_t_15)) {
+              __pyx_t_16 = __pyx_t_21(__pyx_t_2);
+              if (unlikely(!__pyx_t_16)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
-              __Pyx_GOTREF(__pyx_t_15);
+              __Pyx_GOTREF(__pyx_t_16);
             }
-            if ((likely(PyTuple_CheckExact(__pyx_t_15))) || (PyList_CheckExact(__pyx_t_15))) {
-              PyObject* sequence = __pyx_t_15;
+            if ((likely(PyTuple_CheckExact(__pyx_t_16))) || (PyList_CheckExact(__pyx_t_16))) {
+              PyObject* sequence = __pyx_t_16;
               #if CYTHON_COMPILING_IN_CPYTHON
               Py_ssize_t size = Py_SIZE(sequence);
               #else
@@ -48959,56 +48992,56 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               if (unlikely(size != 3)) {
                 if (size > 3) __Pyx_RaiseTooManyValuesError(3);
                 else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
                 __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); 
-                __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
+                __pyx_t_11 = PyTuple_GET_ITEM(sequence, 1); 
                 __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
                 __pyx_t_9 = PyList_GET_ITEM(sequence, 0); 
-                __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
+                __pyx_t_11 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_3 = PyList_GET_ITEM(sequence, 2); 
               }
               __Pyx_INCREF(__pyx_t_9);
-              __Pyx_INCREF(__pyx_t_10);
+              __Pyx_INCREF(__pyx_t_11);
               __Pyx_INCREF(__pyx_t_3);
               #else
-              __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_11 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
-              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+              __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
             } else
             {
               Py_ssize_t index = -1;
-              __pyx_t_13 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_13);
-              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-              __pyx_t_17 = Py_TYPE(__pyx_t_13)->tp_iternext;
-              index = 0; __pyx_t_9 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_9)) goto __pyx_L69_unpacking_failed;
+              __pyx_t_7 = PyObject_GetIter(__pyx_t_16); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_7);
+              __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+              __pyx_t_18 = Py_TYPE(__pyx_t_7)->tp_iternext;
+              index = 0; __pyx_t_9 = __pyx_t_18(__pyx_t_7); if (unlikely(!__pyx_t_9)) goto __pyx_L69_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_9);
-              index = 1; __pyx_t_10 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L69_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_3 = __pyx_t_17(__pyx_t_13); if (unlikely(!__pyx_t_3)) goto __pyx_L69_unpacking_failed;
+              index = 1; __pyx_t_11 = __pyx_t_18(__pyx_t_7); if (unlikely(!__pyx_t_11)) goto __pyx_L69_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_11);
+              index = 2; __pyx_t_3 = __pyx_t_18(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L69_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_3);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_13), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_17 = NULL;
-              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_18(__pyx_t_7), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_18 = NULL;
+              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
               goto __pyx_L70_unpacking_done;
               __pyx_L69_unpacking_failed:;
-              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              __pyx_t_17 = NULL;
+              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+              __pyx_t_18 = NULL;
               if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L70_unpacking_done:;
             }
-            __pyx_t_18 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_18 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_19 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_19 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-            __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __pyx_cur_scope->__pyx_v_i = __pyx_t_18;
+            __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_t_11); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+            __pyx_cur_scope->__pyx_v_i = __pyx_t_19;
             __pyx_cur_scope->__pyx_v_alt = __pyx_t_6;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_pathlen);
@@ -49016,54 +49049,67 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_3;
             __pyx_t_3 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1132
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1134
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
- *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))             # <<<<<<<<<<<<<<
+ *                             new_frontier.append((k, i, input_match + (i,), alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))             # <<<<<<<<<<<<<<
  *             frontier = new_frontier
  * 
  */
-            __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_16 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_16);
+            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_13);
-            PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9);
-            __Pyx_GIVEREF(__pyx_t_9);
-            __pyx_t_9 = 0;
-            __pyx_t_9 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_13)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_11);
+            __Pyx_GIVEREF(__pyx_t_11);
+            __pyx_t_11 = 0;
+            __pyx_t_11 = PyNumber_Add(__pyx_cur_scope->__pyx_v_input_match, ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_11);
+            __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+            __pyx_t_9 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_9);
-            __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
-            __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_13);
-            PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_15);
-            __Pyx_GIVEREF(__pyx_t_15);
-            PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_3);
+            __pyx_t_7 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_7);
+            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_15);
+            PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_7);
+            __Pyx_GIVEREF(__pyx_t_7);
+            __pyx_t_7 = 0;
+            __pyx_t_7 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_7);
+            __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
+            __pyx_t_15 = PyTuple_New(8); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_15);
+            PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_16);
+            __Pyx_GIVEREF(__pyx_t_16);
+            PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_3);
             __Pyx_GIVEREF(__pyx_t_3);
-            PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_10);
-            __Pyx_GIVEREF(__pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_t_11);
+            __Pyx_GIVEREF(__pyx_t_11);
+            PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_9);
+            __Pyx_GIVEREF(__pyx_t_9);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
-            PyTuple_SET_ITEM(__pyx_t_13, 3, __pyx_cur_scope->__pyx_v_pathlen);
+            PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_13, 4, __pyx_cur_scope->__pyx_v_xnode);
+            PyTuple_SET_ITEM(__pyx_t_15, 5, __pyx_cur_scope->__pyx_v_xnode);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_13, 5, __pyx_t_9);
-            __Pyx_GIVEREF(__pyx_t_9);
+            PyTuple_SET_ITEM(__pyx_t_15, 6, __pyx_t_7);
+            __Pyx_GIVEREF(__pyx_t_7);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-            PyTuple_SET_ITEM(__pyx_t_13, 6, __pyx_cur_scope->__pyx_v_is_shadow_path);
+            PyTuple_SET_ITEM(__pyx_t_15, 7, __pyx_cur_scope->__pyx_v_is_shadow_path);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-            __pyx_t_15 = 0;
+            __pyx_t_16 = 0;
             __pyx_t_3 = 0;
-            __pyx_t_10 = 0;
+            __pyx_t_11 = 0;
             __pyx_t_9 = 0;
-            __pyx_t_11 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_13)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+            __pyx_t_7 = 0;
+            __pyx_t_12 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_15)); if (unlikely(__pyx_t_12 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           goto __pyx_L65;
@@ -49074,11 +49120,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_L61:;
       __pyx_L19_continue:;
     }
-    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1133
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1135
  *                         for (i, alt, pathlen) in frontier_nodes:
- *                             new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
+ *                             new_frontier.append((k, i, input_match + (i,), alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
  *             frontier = new_frontier             # <<<<<<<<<<<<<<
  * 
  *         stop_time = monitor_cpu()
@@ -49090,94 +49136,94 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_cur_scope->__pyx_v_frontier = __pyx_cur_scope->__pyx_v_new_frontier;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1135
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1137
  *             frontier = new_frontier
  * 
  *         stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  */
-  __pyx_t_12 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_GIVEREF(__pyx_t_12);
-  __pyx_cur_scope->__pyx_v_stop_time = __pyx_t_12;
-  __pyx_t_12 = 0;
+  __pyx_t_13 = PyFloat_FromDouble(__pyx_f_3_sa_monitor_cpu()); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __Pyx_GIVEREF(__pyx_t_13);
+  __pyx_cur_scope->__pyx_v_stop_time = __pyx_t_13;
+  __pyx_t_13 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1136
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1138
  * 
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))             # <<<<<<<<<<<<<<
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  */
-  __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_13 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __pyx_t_13 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_13);
+  __pyx_t_15 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_13); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_15);
+  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __pyx_t_13 = PyTuple_New(2); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
-  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_12);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_124));
-  PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_124));
+  PyTuple_SET_ITEM(__pyx_t_13, 0, ((PyObject *)__pyx_kp_s_124));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_124));
-  PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_13);
-  __Pyx_GIVEREF(__pyx_t_13);
-  __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
+  PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_15);
+  __Pyx_GIVEREF(__pyx_t_15);
+  __pyx_t_15 = 0;
+  __pyx_t_15 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_13), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_15);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
+  __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1137
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1139
  *         stop_time = monitor_cpu()
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()             # <<<<<<<<<<<<<<
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  * 
  */
-  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_15);
+  __pyx_t_13 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__collect); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
-  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+  __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+  __pyx_t_15 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_15);
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1138
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1140
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_13 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
-  __pyx_t_12 = PyObject_GetAttr(__pyx_t_13, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_12);
-  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-  __pyx_t_13 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_15);
+  __pyx_t_13 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__info); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_13);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
+  __pyx_t_15 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->extract_time); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_15);
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_125));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_13);
-  __Pyx_GIVEREF(__pyx_t_13);
-  __pyx_t_13 = 0;
-  __pyx_t_13 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_13);
-  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_15);
+  __Pyx_GIVEREF(__pyx_t_15);
+  __pyx_t_15 = 0;
+  __pyx_t_15 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_15);
   __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
   PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -49186,11 +49232,12 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_XDECREF(__pyx_t_7);
   __Pyx_XDECREF(__pyx_t_9);
   __Pyx_XDECREF(__pyx_t_10);
-  __Pyx_XDECREF(__pyx_t_12);
+  __Pyx_XDECREF(__pyx_t_11);
   __Pyx_XDECREF(__pyx_t_13);
   __Pyx_XDECREF(__pyx_t_14);
   __Pyx_XDECREF(__pyx_t_15);
   __Pyx_XDECREF(__pyx_t_16);
+  __Pyx_XDECREF(__pyx_t_17);
   __Pyx_AddTraceback("input", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
@@ -49200,7 +49247,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1141
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1143
  * 
  * 
  *     cdef int find_fixpoint(self,             # <<<<<<<<<<<<<<
@@ -49230,7 +49277,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("find_fixpoint", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1156
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1158
  *         cdef int e_low_prev, e_high_prev, f_low_prev, f_high_prev, new_x, new_low_x, new_high_x
  * 
  *         e_low[0] = e_in_low             # <<<<<<<<<<<<<<
@@ -49239,7 +49286,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_low[0]) = __pyx_v_e_in_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1157
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1159
  * 
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high             # <<<<<<<<<<<<<<
@@ -49248,19 +49295,19 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_high[0]) = __pyx_v_e_in_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1158
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1160
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *         if e_low[0] == -1:
  *             # low-priority corner case: if phrase w is unaligned,
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1159
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1161
  *         e_high[0] = e_in_high
  *         self.find_projection(f_low, f_high, f_links_low, f_links_high, e_low, e_high)
  *         if e_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -49270,7 +49317,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_3 = ((__pyx_v_e_low[0]) == -1);
   if (__pyx_t_3) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1165
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1167
  *             # rule X -> X_1 w X_2 / X_1 X_2.    This is probably
  *             # not worth the bother, though.
  *             return 0             # <<<<<<<<<<<<<<
@@ -49282,7 +49329,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L3;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1166
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1168
  *             # not worth the bother, though.
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:             # <<<<<<<<<<<<<<
@@ -49298,7 +49345,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1167
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1169
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:             # <<<<<<<<<<<<<<
@@ -49308,7 +49355,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = ((__pyx_v_e_in_low - (__pyx_v_e_low[0])) < __pyx_v_min_ex_size);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1168
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1170
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size             # <<<<<<<<<<<<<<
@@ -49317,7 +49364,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_low[0]) = (__pyx_v_e_in_low - __pyx_v_min_ex_size);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1169
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1171
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -49327,7 +49374,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_5 = ((__pyx_v_e_low[0]) < 0);
       if (__pyx_t_5) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1170
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1172
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -49346,7 +49393,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1172
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1174
  *                     return 0
  * 
  *         if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -49356,7 +49403,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   __pyx_t_5 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
   if (__pyx_t_5) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1173
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1175
  * 
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0             # <<<<<<<<<<<<<<
@@ -49368,7 +49415,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L6;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1174
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1176
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:             # <<<<<<<<<<<<<<
@@ -49384,7 +49431,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_4) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1175
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1177
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:             # <<<<<<<<<<<<<<
@@ -49394,7 +49441,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (((__pyx_v_e_high[0]) - __pyx_v_e_in_high) < __pyx_v_min_ex_size);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1176
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1178
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size             # <<<<<<<<<<<<<<
@@ -49403,7 +49450,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
       (__pyx_v_e_high[0]) = (__pyx_v_e_in_high + __pyx_v_min_ex_size);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1177
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1179
  *             if e_high[0] - e_in_high < min_ex_size:
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:             # <<<<<<<<<<<<<<
@@ -49413,7 +49460,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_e_high[0]) > __pyx_v_e_sent_len);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1178
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1180
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -49432,7 +49479,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L6:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1180
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1182
  *                     return 0
  * 
  *         f_back_low[0] = -1             # <<<<<<<<<<<<<<
@@ -49441,7 +49488,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_low[0]) = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1181
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1183
  * 
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1             # <<<<<<<<<<<<<<
@@ -49450,7 +49497,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_high[0]) = -1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1182
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1184
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1
  *         f_low_prev = f_low             # <<<<<<<<<<<<<<
@@ -49459,17 +49506,17 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_f_low_prev = __pyx_v_f_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1183
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1185
  *         f_back_high[0] = -1
  *         f_low_prev = f_low
  *         f_high_prev = f_high             # <<<<<<<<<<<<<<
  *         new_x = 0
  *         new_low_x = 0
  */
-  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_f_high_prev = __pyx_t_1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1184
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1186
  *         f_low_prev = f_low
  *         f_high_prev = f_high
  *         new_x = 0             # <<<<<<<<<<<<<<
@@ -49478,7 +49525,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1185
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1187
  *         f_high_prev = f_high
  *         new_x = 0
  *         new_low_x = 0             # <<<<<<<<<<<<<<
@@ -49487,7 +49534,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_low_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1186
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1188
  *         new_x = 0
  *         new_low_x = 0
  *         new_high_x = 0             # <<<<<<<<<<<<<<
@@ -49496,7 +49543,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_high_x = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1188
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1190
  *         new_high_x = 0
  * 
  *         while True:             # <<<<<<<<<<<<<<
@@ -49506,7 +49553,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   while (1) {
     if (!1) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1190
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1192
  *         while True:
  * 
  *             if f_back_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -49516,45 +49563,45 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) == -1);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1191
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1193
  * 
  *             if f_back_low[0] == -1:
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       goto __pyx_L11;
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1193
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1195
  *                 self.find_projection(e_low[0], e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), __pyx_v_e_low_prev, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_e_low[0]), __pyx_v_e_low_prev, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1194
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1196
  *             else:
  *                 self.find_projection(e_low[0], e_low_prev, e_links_low, e_links_high, f_back_low, f_back_high)
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)             # <<<<<<<<<<<<<<
  * 
  *             if f_back_low[0] > f_low:
  */
-      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_e_high_prev, (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_e_high_prev, (__pyx_v_e_high[0]), __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_f_back_low, __pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     }
     __pyx_L11:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1196
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1198
  *                 self.find_projection(e_high_prev, e_high[0], e_links_low, e_links_high, f_back_low, f_back_high)
  * 
  *             if f_back_low[0] > f_low:             # <<<<<<<<<<<<<<
@@ -49564,7 +49611,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = ((__pyx_v_f_back_low[0]) > __pyx_v_f_low);
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1197
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1199
  * 
  *             if f_back_low[0] > f_low:
  *                 f_back_low[0] = f_low             # <<<<<<<<<<<<<<
@@ -49576,35 +49623,35 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L12:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1199
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1201
  *                 f_back_low[0] = f_low
  * 
  *             if f_back_high[0] < f_high:             # <<<<<<<<<<<<<<
  *                 f_back_high[0] = f_high
  * 
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_high, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1200
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1202
  * 
  *             if f_back_high[0] < f_high:
  *                 f_back_high[0] = f_high             # <<<<<<<<<<<<<<
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  */
-      __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_f_high); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       (__pyx_v_f_back_high[0]) = __pyx_t_1;
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1202
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1204
  *                 f_back_high[0] = f_high
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:             # <<<<<<<<<<<<<<
@@ -49620,7 +49667,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1203
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1205
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -49633,7 +49680,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1205
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1207
  *                 return 1
  * 
  *             if allow_low_x == 0 and f_back_low[0] < f_low:             # <<<<<<<<<<<<<<
@@ -49649,7 +49696,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1207
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1209
  *             if allow_low_x == 0 and f_back_low[0] < f_low:
  *                 # FAIL: f phrase is not tight
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49662,7 +49709,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1209
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1211
  *                 return 0
  * 
  *             if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -49672,7 +49719,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_5 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
     if (__pyx_t_5) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1211
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1213
  *             if f_back_high[0] - f_back_low[0] > max_f_len:
  *                 # FAIL: f back projection is too wide
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49685,7 +49732,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1213
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1215
  *                 return 0
  * 
  *             if allow_high_x == 0 and f_back_high[0] > f_high:             # <<<<<<<<<<<<<<
@@ -49694,11 +49741,11 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_t_5 = (__pyx_v_allow_high_x == 0);
     if (__pyx_t_5) {
-      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_t_6, __pyx_v_f_high, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_4 = __pyx_t_3;
     } else {
@@ -49706,7 +49753,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1215
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1217
  *             if allow_high_x == 0 and f_back_high[0] > f_high:
  *                 # FAIL: extension on high side not allowed
  *                 return 0             # <<<<<<<<<<<<<<
@@ -49719,7 +49766,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1217
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1219
  *                 return 0
  * 
  *             if f_low != f_back_low[0]:             # <<<<<<<<<<<<<<
@@ -49729,7 +49776,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_4 = (__pyx_v_f_low != (__pyx_v_f_back_low[0]));
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1218
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1220
  * 
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:             # <<<<<<<<<<<<<<
@@ -49739,7 +49786,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_low_x == 0);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1219
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1221
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -49749,7 +49796,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1221
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1223
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on low side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49762,7 +49809,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1223
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1225
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -49771,7 +49818,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1224
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1226
  *                     else:
  *                         new_x = new_x + 1
  *                         new_low_x = 1             # <<<<<<<<<<<<<<
@@ -49785,7 +49832,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L19:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1225
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1227
  *                         new_x = new_x + 1
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:             # <<<<<<<<<<<<<<
@@ -49795,7 +49842,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = ((__pyx_v_f_low - (__pyx_v_f_back_low[0])) < __pyx_v_min_fx_size);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1226
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1228
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size             # <<<<<<<<<<<<<<
@@ -49804,7 +49851,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
         (__pyx_v_f_back_low[0]) = (__pyx_v_f_low - __pyx_v_min_fx_size);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1227
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1229
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -49814,7 +49861,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1229
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1231
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49827,7 +49874,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L22:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1230
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1232
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0
  *                     if f_back_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -49837,7 +49884,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_low[0]) < 0);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1232
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1234
  *                     if f_back_low[0] < 0:
  *                         # FAIL: extension required on low side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49856,22 +49903,22 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L18:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1234
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1236
  *                         return 0
  * 
  *             if f_high != f_back_high[0]:             # <<<<<<<<<<<<<<
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:
  */
-    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_v_f_high, __pyx_t_2, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1235
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1237
  * 
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:             # <<<<<<<<<<<<<<
@@ -49881,7 +49928,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_new_high_x == 0);
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1236
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1238
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -49891,7 +49938,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (__pyx_v_new_x >= __pyx_v_max_new_x);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1238
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1240
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on high side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49904,7 +49951,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1240
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1242
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -49913,7 +49960,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1241
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1243
  *                     else:
  *                         new_x = new_x + 1
  *                         new_high_x = 1             # <<<<<<<<<<<<<<
@@ -49927,44 +49974,44 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L25:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1242
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1244
  *                         new_x = new_x + 1
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:             # <<<<<<<<<<<<<<
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  */
-      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong((__pyx_v_f_back_high[0])); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_f_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_f_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1243
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1245
  *                         new_high_x = 1
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size             # <<<<<<<<<<<<<<
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  */
-        __pyx_t_7 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_v_min_fx_size); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
-        __pyx_t_6 = PyNumber_Add(__pyx_v_f_high, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyNumber_Add(__pyx_v_f_high, __pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_6);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-        __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
         (__pyx_v_f_back_high[0]) = __pyx_t_1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1244
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1246
  *                 if f_back_high[0] - f_high < min_fx_size:
  *                     f_back_high[0] = f_high + min_fx_size
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
@@ -49974,7 +50021,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = (((__pyx_v_f_back_high[0]) - (__pyx_v_f_back_low[0])) > __pyx_v_max_f_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1246
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1248
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -49987,7 +50034,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L28:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1247
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1249
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0
  *                     if f_back_high[0] > f_sent_len:             # <<<<<<<<<<<<<<
@@ -49997,7 +50044,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         __pyx_t_4 = ((__pyx_v_f_back_high[0]) > __pyx_v_f_sent_len);
         if (__pyx_t_4) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1249
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1251
  *                     if f_back_high[0] > f_sent_len:
  *                         # FAIL: extension required on high side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -50016,7 +50063,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L24:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1251
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1253
  *                         return 0
  * 
  *             e_low_prev = e_low[0]             # <<<<<<<<<<<<<<
@@ -50025,7 +50072,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_low_prev = (__pyx_v_e_low[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1252
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1254
  * 
  *             e_low_prev = e_low[0]
  *             e_high_prev = e_high[0]             # <<<<<<<<<<<<<<
@@ -50034,29 +50081,29 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_high_prev = (__pyx_v_e_high[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1254
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1256
  *             e_high_prev = e_high[0]
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  */
-    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_f_back_low[0]), __pyx_v_f_low_prev, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, (__pyx_v_f_back_low[0]), __pyx_v_f_low_prev, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1255
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1257
  * 
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  */
-    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_high_prev, (__pyx_v_f_back_high[0]), __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_projection(__pyx_v_self, __pyx_v_f_high_prev, (__pyx_v_f_back_high[0]), __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_low, __pyx_v_e_high); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1256
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1258
  *             self.find_projection(f_back_low[0], f_low_prev, f_links_low, f_links_high, e_low, e_high)
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:             # <<<<<<<<<<<<<<
@@ -50072,7 +50119,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1257
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1259
  *             self.find_projection(f_high_prev, f_back_high[0], f_links_low, f_links_high, e_low, e_high)
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -50085,7 +50132,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L30:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1258
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1260
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  *             if allow_arbitrary_x == 0:             # <<<<<<<<<<<<<<
@@ -50095,7 +50142,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (__pyx_v_allow_arbitrary_x == 0);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1260
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1262
  *             if allow_arbitrary_x == 0:
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0             # <<<<<<<<<<<<<<
@@ -50108,7 +50155,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L31:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1261
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1263
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0
  *             if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -50118,7 +50165,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     __pyx_t_3 = (((__pyx_v_e_high[0]) - (__pyx_v_e_low[0])) > __pyx_v_max_e_len);
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1263
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1265
  *             if e_high[0] - e_low[0] > max_e_len:
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0             # <<<<<<<<<<<<<<
@@ -50131,7 +50178,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L32:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1264
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1266
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0
  *             f_low_prev = f_back_low[0]             # <<<<<<<<<<<<<<
@@ -50140,7 +50187,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_f_low_prev = (__pyx_v_f_back_low[0]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1265
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1267
  *                 return 0
  *             f_low_prev = f_back_low[0]
  *             f_high_prev = f_back_high[0]             # <<<<<<<<<<<<<<
@@ -50163,7 +50210,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1268
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1270
  * 
  * 
  *     cdef find_projection(self, int in_low, int in_high, int* in_links_low, int* in_links_high,             # <<<<<<<<<<<<<<
@@ -50181,7 +50228,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   int __pyx_t_4;
   __Pyx_RefNannySetupContext("find_projection", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1271
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1273
  *                         int* out_low, int* out_high):
  *         cdef int i
  *         for i from in_low <= i < in_high:             # <<<<<<<<<<<<<<
@@ -50191,7 +50238,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   __pyx_t_1 = __pyx_v_in_high;
   for (__pyx_v_i = __pyx_v_in_low; __pyx_v_i < __pyx_t_1; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1272
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1274
  *         cdef int i
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:             # <<<<<<<<<<<<<<
@@ -50201,7 +50248,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
     __pyx_t_2 = ((__pyx_v_in_links_low[__pyx_v_i]) != -1);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1273
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1275
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:             # <<<<<<<<<<<<<<
@@ -50217,7 +50264,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1274
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1276
  *             if in_links_low[i] != -1:
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]             # <<<<<<<<<<<<<<
@@ -50229,7 +50276,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       __pyx_L6:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1275
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1277
  *                 if out_low[0] == -1 or in_links_low[i] < out_low[0]:
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:             # <<<<<<<<<<<<<<
@@ -50245,7 +50292,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       if (__pyx_t_3) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1276
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1278
  *                     out_low[0] = in_links_low[i]
  *                 if out_high[0] == -1 or in_links_high[i] > out_high[0]:
  *                     out_high[0] = in_links_high[i]             # <<<<<<<<<<<<<<
@@ -50267,7 +50314,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1279
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1281
  * 
  * 
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):             # <<<<<<<<<<<<<<
@@ -50281,7 +50328,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("int_arr_extend", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1281
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1283
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len             # <<<<<<<<<<<<<<
@@ -50290,7 +50337,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   __pyx_v_new_len = ((__pyx_v_arr_len[0]) + __pyx_v_data_len);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1282
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1284
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50299,7 +50346,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   __pyx_v_arr = ((int *)realloc(__pyx_v_arr, (__pyx_v_new_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1283
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1285
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50308,7 +50355,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   memcpy((__pyx_v_arr + (__pyx_v_arr_len[0])), __pyx_v_data, (__pyx_v_data_len * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1284
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1286
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -50317,7 +50364,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1285
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1287
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len
  *         return arr             # <<<<<<<<<<<<<<
@@ -50333,7 +50380,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1288
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1290
  * 
  * 
  *     cdef extract_phrases(self, int e_low, int e_high, int* e_gap_low, int* e_gap_high, int* e_links_low, int num_gaps,             # <<<<<<<<<<<<<<
@@ -50379,19 +50426,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("extract_phrases", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1296
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1298
  *         cdef result
  * 
  *         result = []             # <<<<<<<<<<<<<<
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1297
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1299
  * 
  *         result = []
  *         len1 = 0             # <<<<<<<<<<<<<<
@@ -50400,7 +50447,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1298
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1300
  *         result = []
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -50409,19 +50456,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = ((int *)malloc(0));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1299
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1301
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)
  *         ephr_arr = IntList()             # <<<<<<<<<<<<<<
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ephr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1301
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1303
  *         ephr_arr = IntList()
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))             # <<<<<<<<<<<<<<
@@ -50430,7 +50477,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gap_order = ((int *)malloc((__pyx_v_num_gaps * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1302
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1304
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:             # <<<<<<<<<<<<<<
@@ -50440,7 +50487,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_num_gaps > 0);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1303
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1305
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0             # <<<<<<<<<<<<<<
@@ -50449,7 +50496,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     (__pyx_v_e_gap_order[0]) = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1304
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1306
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -50459,7 +50506,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_3 = __pyx_v_num_gaps;
     for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1305
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1307
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:             # <<<<<<<<<<<<<<
@@ -50469,7 +50516,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = __pyx_v_i;
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1306
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1308
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -50479,7 +50526,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_2 = ((__pyx_v_e_gap_low[__pyx_v_i]) < (__pyx_v_e_gap_low[__pyx_v_j]));
         if (__pyx_t_2) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1307
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1309
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:             # <<<<<<<<<<<<<<
@@ -50489,7 +50536,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_i;
           for (__pyx_v_k = __pyx_v_j; __pyx_v_k < __pyx_t_5; __pyx_v_k++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1308
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1310
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]             # <<<<<<<<<<<<<<
@@ -50499,7 +50546,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             (__pyx_v_e_gap_order[(__pyx_v_k + 1)]) = (__pyx_v_e_gap_order[__pyx_v_k]);
           }
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1309
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1311
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i             # <<<<<<<<<<<<<<
@@ -50508,7 +50555,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
           (__pyx_v_e_gap_order[__pyx_v_j]) = __pyx_v_i;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1310
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1312
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i
  *                         break             # <<<<<<<<<<<<<<
@@ -50522,7 +50569,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1312
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1314
  *                         break
  *                 else:
  *                     e_gap_order[i] = i             # <<<<<<<<<<<<<<
@@ -50537,7 +50584,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L3:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1314
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1316
  *                     e_gap_order[i] = i
  * 
  *         e_x_low = e_low             # <<<<<<<<<<<<<<
@@ -50546,7 +50593,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_low = __pyx_v_e_low;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1315
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1317
  * 
  *         e_x_low = e_low
  *         e_x_high = e_high             # <<<<<<<<<<<<<<
@@ -50555,7 +50602,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_high = __pyx_v_e_high;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1316
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1318
  *         e_x_low = e_low
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -50565,7 +50612,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
   if (__pyx_t_2) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1317
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1319
  *         e_x_high = e_high
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -50588,7 +50635,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1318
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1320
  *         if self.tight_phrases == 0:
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1             # <<<<<<<<<<<<<<
@@ -50598,7 +50645,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_e_x_low = (__pyx_v_e_x_low - 1);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1319
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1321
  *             while e_x_low > 0 and e_high - e_x_low < self.train_max_initial_size and e_links_low[e_x_low-1] == -1:
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:             # <<<<<<<<<<<<<<
@@ -50621,7 +50668,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_2) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1320
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1322
  *                 e_x_low = e_x_low - 1
  *             while e_x_high < e_sent_len and e_x_high - e_low < self.train_max_initial_size and e_links_low[e_x_high] == -1:
  *                 e_x_high = e_x_high + 1             # <<<<<<<<<<<<<<
@@ -50634,7 +50681,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L11:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1322
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1324
  *                 e_x_high = e_x_high + 1
  * 
  *         for i from e_x_low <= i <= e_low:             # <<<<<<<<<<<<<<
@@ -50644,7 +50691,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_low;
   for (__pyx_v_i = __pyx_v_e_x_low; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1323
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1325
  * 
  *         for i from e_x_low <= i <= e_low:
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)             # <<<<<<<<<<<<<<
@@ -50654,7 +50701,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_e_gaps1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps1, (&__pyx_v_len1), (&__pyx_v_i), 1);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1325
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1327
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)
  * 
  *         for i from 0 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -50664,7 +50711,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_num_gaps;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1326
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1328
  * 
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -50673,7 +50720,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1327
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1329
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)
  *             len2 = 0             # <<<<<<<<<<<<<<
@@ -50682,7 +50729,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_len2 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1329
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1331
  *             len2 = 0
  * 
  *             j = e_gap_order[i]             # <<<<<<<<<<<<<<
@@ -50691,7 +50738,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = (__pyx_v_e_gap_order[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1330
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1332
  * 
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]             # <<<<<<<<<<<<<<
@@ -50700,7 +50747,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_low = (__pyx_v_e_gap_low[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1331
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1333
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]             # <<<<<<<<<<<<<<
@@ -50709,7 +50756,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_x_gap_high = (__pyx_v_e_gap_high[__pyx_v_j]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1332
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1334
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:             # <<<<<<<<<<<<<<
@@ -50719,7 +50766,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_self->tight_phrases == 0);
     if (__pyx_t_2) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1333
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1335
  *             e_x_gap_high = e_gap_high[j]
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -50736,7 +50783,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_7) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1334
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1336
  *             if self.tight_phrases == 0:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1             # <<<<<<<<<<<<<<
@@ -50746,7 +50793,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_v_e_x_gap_low = (__pyx_v_e_x_gap_low - 1);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1335
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1337
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:             # <<<<<<<<<<<<<<
@@ -50763,7 +50810,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_6) break;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1336
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1338
  *                     e_x_gap_low = e_x_gap_low - 1
  *                 while e_x_gap_high < e_x_high and e_links_low[e_x_gap_high] == -1:
  *                     e_x_gap_high = e_x_gap_high + 1             # <<<<<<<<<<<<<<
@@ -50776,7 +50823,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     __pyx_L20:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1338
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1340
  *                     e_x_gap_high = e_x_gap_high + 1
  * 
  *             k = 0             # <<<<<<<<<<<<<<
@@ -50785,7 +50832,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_k = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1339
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1341
  * 
  *             k = 0
  *             step = 1+(i*2)             # <<<<<<<<<<<<<<
@@ -50794,7 +50841,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_step = (1 + (__pyx_v_i * 2));
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1340
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1342
  *             k = 0
  *             step = 1+(i*2)
  *             while k < len1:             # <<<<<<<<<<<<<<
@@ -50805,7 +50852,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_k < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1341
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1343
  *             step = 1+(i*2)
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -50815,7 +50862,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_4 = (__pyx_v_e_gap_low[__pyx_v_j]);
       for (__pyx_v_m = __pyx_v_e_x_gap_low; __pyx_v_m <= __pyx_t_4; __pyx_v_m++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1342
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1344
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:             # <<<<<<<<<<<<<<
@@ -50825,7 +50872,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_t_6 = (__pyx_v_m >= (__pyx_v_e_gaps1[((__pyx_v_k + __pyx_v_step) - 1)]));
         if (__pyx_t_6) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1343
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1345
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:             # <<<<<<<<<<<<<<
@@ -50835,7 +50882,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
           __pyx_t_5 = __pyx_v_e_x_gap_high;
           for (__pyx_v_n = (__pyx_v_e_gap_high[__pyx_v_j]); __pyx_v_n <= __pyx_t_5; __pyx_v_n++) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1344
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1346
  *                     if m >= e_gaps1[k+step-1]:
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length             # <<<<<<<<<<<<<<
@@ -50845,7 +50892,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
             __pyx_t_6 = ((__pyx_v_n - __pyx_v_m) >= 1);
             if (__pyx_t_6) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1345
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1347
  *                         for n from e_gap_high[j] <= n <= e_x_gap_high:
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)             # <<<<<<<<<<<<<<
@@ -50854,7 +50901,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_k), __pyx_v_step);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1346
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1348
  *                             if n-m >= 1:    # extractor.py doesn't restrict target-side gap length
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)             # <<<<<<<<<<<<<<
@@ -50863,7 +50910,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
               __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (&__pyx_v_m), 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1347
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1349
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+k, step)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)             # <<<<<<<<<<<<<<
@@ -50880,7 +50927,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_L29:;
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1348
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1350
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &m, 1)
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step             # <<<<<<<<<<<<<<
@@ -50890,7 +50937,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_k = (__pyx_v_k + __pyx_v_step);
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1349
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1351
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step
  *             free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -50899,7 +50946,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     free(__pyx_v_e_gaps1);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1350
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1352
  *                 k = k + step
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -50908,7 +50955,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1351
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1353
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2
  *             len1 = len2             # <<<<<<<<<<<<<<
@@ -50918,7 +50965,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_len1 = __pyx_v_len2;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1353
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1355
  *             len1 = len2
  * 
  *         step = 1+(num_gaps*2)             # <<<<<<<<<<<<<<
@@ -50927,7 +50974,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = (1 + (__pyx_v_num_gaps * 2));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1354
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1356
  * 
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -50936,7 +50983,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1355
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1357
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0             # <<<<<<<<<<<<<<
@@ -50945,7 +50992,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1356
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1358
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:             # <<<<<<<<<<<<<<
@@ -50955,7 +51002,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_3 = __pyx_v_e_x_high;
   for (__pyx_v_i = __pyx_v_e_high; __pyx_v_i <= __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1357
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1359
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:
  *             j = 0             # <<<<<<<<<<<<<<
@@ -50964,7 +51011,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1358
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1360
  *         for i from e_high <= i <= e_x_high:
  *             j = 0
  *             while j < len1:             # <<<<<<<<<<<<<<
@@ -50975,7 +51022,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_6 = (__pyx_v_j < __pyx_v_len1);
       if (!__pyx_t_6) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1359
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1361
  *             j = 0
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:             # <<<<<<<<<<<<<<
@@ -50991,7 +51038,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1360
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1362
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)             # <<<<<<<<<<<<<<
@@ -51000,7 +51047,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
         __pyx_v_e_gaps2 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->int_arr_extend(__pyx_v_self, __pyx_v_e_gaps2, (&__pyx_v_len2), (__pyx_v_e_gaps1 + __pyx_v_j), __pyx_v_step);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1361
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1363
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)             # <<<<<<<<<<<<<<
@@ -51012,7 +51059,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L37:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1362
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1364
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, e_gaps1+j, step)
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step             # <<<<<<<<<<<<<<
@@ -51023,7 +51070,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1363
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1365
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -51032,7 +51079,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1364
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1366
  *                 j = j + step
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -51041,7 +51088,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1365
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1367
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2
  *         len1 = len2             # <<<<<<<<<<<<<<
@@ -51050,7 +51097,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = __pyx_v_len2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1367
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1369
  *         len1 = len2
  * 
  *         step = (num_gaps+1)*2             # <<<<<<<<<<<<<<
@@ -51059,7 +51106,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = ((__pyx_v_num_gaps + 1) * 2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1368
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1370
  * 
  *         step = (num_gaps+1)*2
  *         i = 0             # <<<<<<<<<<<<<<
@@ -51068,7 +51115,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1370
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1372
  *         i = 0
  * 
  *         while i < len1:             # <<<<<<<<<<<<<<
@@ -51079,7 +51126,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (__pyx_v_i < __pyx_v_len1);
     if (!__pyx_t_2) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1371
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1373
  * 
  *         while i < len1:
  *             ephr_arr._clear()             # <<<<<<<<<<<<<<
@@ -51088,7 +51135,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_clear(__pyx_v_ephr_arr);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1372
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1374
  *         while i < len1:
  *             ephr_arr._clear()
  *             num_chunks = 0             # <<<<<<<<<<<<<<
@@ -51097,20 +51144,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_num_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1373
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1375
  *             ephr_arr._clear()
  *             num_chunks = 0
  *             indexes = []             # <<<<<<<<<<<<<<
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  */
-    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1373; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(((PyObject *)__pyx_v_indexes));
     __pyx_v_indexes = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1374
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1376
  *             num_chunks = 0
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:             # <<<<<<<<<<<<<<
@@ -51120,7 +51167,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_9 = (__pyx_v_num_gaps + 1);
     for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_9; __pyx_v_j++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1375
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1377
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -51130,7 +51177,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = ((__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]) < (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]));
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1376
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1378
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1             # <<<<<<<<<<<<<<
@@ -51142,7 +51189,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L42:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1377
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1379
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -51152,19 +51199,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_3 = (__pyx_v_e_gaps1[((__pyx_v_i + (2 * __pyx_v_j)) + 1)]);
       for (__pyx_v_k = (__pyx_v_e_gaps1[(__pyx_v_i + (2 * __pyx_v_j))]); __pyx_v_k < __pyx_t_3; __pyx_v_k++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1378
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1380
  *                     num_chunks = num_chunks + 1
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  */
-        __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_v_k); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1379
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1381
  *                 for k from e_gaps1[i+2*j] <= k < e_gaps1[i+(2*j)+1]:
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])             # <<<<<<<<<<<<<<
@@ -51172,14 +51219,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  */
         __pyx_t_4 = (__pyx_v_self->eda->data->arr[(__pyx_v_e_sent_start + __pyx_v_k)]);
-        __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->eid2symid), __pyx_t_4, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->eid2symid), __pyx_t_4, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_ephr_arr->__pyx_vtab)->_append(__pyx_v_ephr_arr, __pyx_t_4);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1380
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1382
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:             # <<<<<<<<<<<<<<
@@ -51189,19 +51236,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_t_2 = (__pyx_v_j < __pyx_v_num_gaps);
       if (__pyx_t_2) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1381
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1383
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  */
-        __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, ((__pyx_v_e_gap_order[__pyx_v_j]) + 1))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1381; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyList_Append(__pyx_v_indexes, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1383; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1382
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1384
  *                 if j < num_gaps:
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))             # <<<<<<<<<<<<<<
@@ -51214,7 +51261,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_L45:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1383
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1385
  *                     indexes.append(sym_setindex(self.category, e_gap_order[j]+1))
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step             # <<<<<<<<<<<<<<
@@ -51223,7 +51270,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_i = (__pyx_v_i + __pyx_v_step);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1384
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1386
  *                     ephr_arr._append(sym_setindex(self.category, e_gap_order[j]+1))
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:             # <<<<<<<<<<<<<<
@@ -51239,22 +51286,22 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1385
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1387
  *             i = i + step
  *             if ephr_arr.len <= self.max_target_length and num_chunks <= self.max_target_chunks:
  *                 result.append((Phrase(ephr_arr),indexes))             # <<<<<<<<<<<<<<
  * 
  *         free(e_gaps1)
  */
-      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(((PyObject *)__pyx_v_ephr_arr));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_ephr_arr));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_ephr_arr));
-      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_11);
       __Pyx_GIVEREF(__pyx_t_11);
@@ -51262,7 +51309,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_indexes));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_indexes));
       __pyx_t_11 = 0;
-      __pyx_t_11 = __Pyx_PyObject_Append(__pyx_v_result, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = __Pyx_PyObject_Append(__pyx_v_result, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
@@ -51271,7 +51318,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_L46:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1387
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1389
  *                 result.append((Phrase(ephr_arr),indexes))
  * 
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -51280,7 +51327,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1388
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1390
  * 
  *         free(e_gaps1)
  *         free(e_gap_order)             # <<<<<<<<<<<<<<
@@ -51289,7 +51336,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gap_order);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1389
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1391
  *         free(e_gaps1)
  *         free(e_gap_order)
  *         return result             # <<<<<<<<<<<<<<
@@ -51317,7 +51364,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1391
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1393
  *         return result
  * 
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):             # <<<<<<<<<<<<<<
@@ -51345,55 +51392,55 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("create_alignments", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1393
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1395
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):
  *         cdef unsigned i
  *         cdef IntList ret = IntList()             # <<<<<<<<<<<<<<
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1394
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1396
  *         cdef unsigned i
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):             # <<<<<<<<<<<<<<
  *             s = findexes[i]
  *             if (s<0):
  */
-  __pyx_t_2 = PyObject_Length(__pyx_v_findexes); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_v_findexes); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
     __pyx_v_i = __pyx_t_3;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1395
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1397
  *         cdef IntList ret = IntList()
  *         for i in range(len(findexes)):
  *             s = findexes[i]             # <<<<<<<<<<<<<<
  *             if (s<0):
  *                 continue
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_findexes, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_findexes, __pyx_v_i, sizeof(unsigned int)+1, PyLong_FromUnsignedLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_XDECREF(__pyx_v_s);
     __pyx_v_s = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1396
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1398
  *         for i in range(len(findexes)):
  *             s = findexes[i]
  *             if (s<0):             # <<<<<<<<<<<<<<
  *                 continue
  *             idx = 0
  */
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_s, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_4) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1397
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1399
  *             s = findexes[i]
  *             if (s<0):
  *                 continue             # <<<<<<<<<<<<<<
@@ -51405,7 +51452,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     }
     __pyx_L5:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1398
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1400
  *             if (s<0):
  *                 continue
  *             idx = 0             # <<<<<<<<<<<<<<
@@ -51416,7 +51463,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __Pyx_XDECREF(__pyx_v_idx);
     __pyx_v_idx = __pyx_int_0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1399
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1401
  *                 continue
  *             idx = 0
  *             while (idx < num_links*2):             # <<<<<<<<<<<<<<
@@ -51424,51 +51471,51 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
  *                     j = eindexes.index(sent_links[idx+1])
  */
     while (1) {
-      __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong((__pyx_v_num_links * 2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_idx, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (!__pyx_t_4) break;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1400
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1402
  *             idx = 0
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):             # <<<<<<<<<<<<<<
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  */
-      __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_s, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_4) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1401
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1403
  *             while (idx < num_links*2):
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])             # <<<<<<<<<<<<<<
  *                     ret.append(i*65536+j)
  *                 idx += 2
  */
-        __pyx_t_1 = PyObject_GetAttr(__pyx_v_eindexes, __pyx_n_s__index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(__pyx_v_eindexes, __pyx_n_s__index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_5 = PyNumber_Add(__pyx_v_idx, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyNumber_Add(__pyx_v_idx, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyInt_FromLong((__pyx_v_sent_links[__pyx_t_6])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5);
         __Pyx_GIVEREF(__pyx_t_5);
         __pyx_t_5 = 0;
-        __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
@@ -51476,19 +51523,19 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
         __pyx_v_j = __pyx_t_5;
         __pyx_t_5 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1402
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1404
  *                 if (sent_links[idx] == s):
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)             # <<<<<<<<<<<<<<
  *                 idx += 2
  *         return ret
  */
-        __pyx_t_5 = PyInt_FromLong((__pyx_v_i * 65536)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyInt_FromLong((__pyx_v_i * 65536)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_v_j); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_v_j); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_7);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __pyx_t_5 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_ret), __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_ret), __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
@@ -51496,14 +51543,14 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       }
       __pyx_L8:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1403
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1405
  *                     j = eindexes.index(sent_links[idx+1])
  *                     ret.append(i*65536+j)
  *                 idx += 2             # <<<<<<<<<<<<<<
  *         return ret
  * 
  */
-      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_idx, __pyx_int_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_idx, __pyx_int_2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_v_idx);
       __pyx_v_idx = __pyx_t_5;
@@ -51512,7 +51559,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __pyx_L3_continue:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1404
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1406
  *                     ret.append(i*65536+j)
  *                 idx += 2
  *         return ret             # <<<<<<<<<<<<<<
@@ -51542,7 +51589,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1406
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1408
  *         return ret
  * 
  *     cdef extract(self, Phrase phrase, Matching* matching, int* chunklen, int num_chunks):             # <<<<<<<<<<<<<<
@@ -51636,19 +51683,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("extract", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1419
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1421
  *         cdef reason_for_failure
  * 
  *         fphr_arr = IntList()             # <<<<<<<<<<<<<<
  *         phrase_len = phrase.n
  *         extracts = []
  */
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_fphr_arr = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1420
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1422
  * 
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n             # <<<<<<<<<<<<<<
@@ -51657,19 +51704,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_phrase_len = __pyx_v_phrase->n;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1421
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1423
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n
  *         extracts = []             # <<<<<<<<<<<<<<
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_extracts = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1422
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1424
  *         phrase_len = phrase.n
  *         extracts = []
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -51678,7 +51725,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_sent_links = ((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_v_self->alignment->__pyx_vtab)->_get_sent_links(__pyx_v_self->alignment, __pyx_v_matching->sent_id, (&__pyx_v_num_links));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1424
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1426
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -51687,7 +51734,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_start = (__pyx_v_self->eda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1425
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1427
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -51696,7 +51743,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_end = (__pyx_v_self->eda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1426
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1428
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1             # <<<<<<<<<<<<<<
@@ -51705,7 +51752,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_sent_len = ((__pyx_v_e_sent_end - __pyx_v_e_sent_start) - 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1427
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1429
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -51714,7 +51761,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_start = (__pyx_v_self->fda->sent_index->arr[__pyx_v_matching->sent_id]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1428
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1430
  *         e_sent_len = e_sent_end - e_sent_start - 1
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -51723,7 +51770,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_end = (__pyx_v_self->fda->sent_index->arr[(__pyx_v_matching->sent_id + 1)]);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1429
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1431
  *         f_sent_start = self.fda.sent_index.arr[matching.sent_id]
  *         f_sent_end = self.fda.sent_index.arr[matching.sent_id+1]
  *         f_sent_len = f_sent_end - f_sent_start - 1             # <<<<<<<<<<<<<<
@@ -51732,21 +51779,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_sent_len = ((__pyx_v_f_sent_end - __pyx_v_f_sent_start) - 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1431
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1433
  *         f_sent_len = f_sent_end - f_sent_start - 1
  * 
  *         self.findexes1.reset()             # <<<<<<<<<<<<<<
  *         sofar = 0
  *         for i in range(num_chunks):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes1), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes1), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1432
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1434
  * 
  *         self.findexes1.reset()
  *         sofar = 0             # <<<<<<<<<<<<<<
@@ -51756,7 +51803,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_sofar = __pyx_int_0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1433
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1435
  *         self.findexes1.reset()
  *         sofar = 0
  *         for i in range(num_chunks):             # <<<<<<<<<<<<<<
@@ -51767,7 +51814,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1434
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1436
  *         sofar = 0
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):             # <<<<<<<<<<<<<<
@@ -51778,35 +51825,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
       __pyx_v_j = __pyx_t_6;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1435
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1437
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);             # <<<<<<<<<<<<<<
  *                 sofar += 1
  *             if (i+1<num_chunks):
  */
-      __pyx_t_2 = PyInt_FromLong((((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong((((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1436
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1438
  *             for j in range(chunklen[i]):
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1             # <<<<<<<<<<<<<<
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  */
-      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_1;
       __pyx_t_1 = 0;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1437
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1439
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1
  *             if (i+1<num_chunks):             # <<<<<<<<<<<<<<
@@ -51816,28 +51863,28 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = ((__pyx_v_i + 1) < __pyx_v_num_chunks);
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1438
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1440
  *                 sofar += 1
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])             # <<<<<<<<<<<<<<
  *                 sofar += 1
  * 
  */
-      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_phrase), __pyx_v_sofar); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_phrase), __pyx_v_sofar); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes1), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1439
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1441
  *             if (i+1<num_chunks):
  *                 self.findexes1.append(phrase[sofar])
  *                 sofar += 1             # <<<<<<<<<<<<<<
  * 
  * 
  */
-      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_sofar, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_2;
@@ -51847,7 +51894,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_L7:;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1442
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1444
  * 
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51856,7 +51903,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_low = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1443
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1445
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51865,7 +51912,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_links_high = ((int *)malloc((__pyx_v_e_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1444
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1446
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51874,7 +51921,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_low = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1445
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1447
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51883,7 +51930,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_links_high = ((int *)malloc((__pyx_v_f_sent_len * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1446
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1448
  *         f_links_low = <int*> malloc(f_sent_len*sizeof(int))
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51892,7 +51939,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1447
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1449
  *         f_links_high = <int*> malloc(f_sent_len*sizeof(int))
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51901,7 +51948,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1448
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1450
  *         f_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51910,7 +51957,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_low = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1449
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1451
  *         f_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51919,7 +51966,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_e_gap_high = ((int *)malloc(((__pyx_v_num_chunks + 1) * (sizeof(int)))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1450
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1452
  *         e_gap_low = <int*> malloc((num_chunks+1)*sizeof(int))
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51928,7 +51975,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1451
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1453
  *         e_gap_high = <int*> malloc((num_chunks+1)*sizeof(int))
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51937,7 +51984,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_f_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1452
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1454
  *         memset(f_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51946,7 +51993,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_low, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1453
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1455
  *         memset(f_gap_high, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_low, 0, (num_chunks+1)*sizeof(int))
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))             # <<<<<<<<<<<<<<
@@ -51955,7 +52002,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   memset(__pyx_v_e_gap_high, 0, ((__pyx_v_num_chunks + 1) * (sizeof(int))));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1455
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1457
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))
  * 
  *         reason_for_failure = ""             # <<<<<<<<<<<<<<
@@ -51965,7 +52012,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_45));
   __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_45);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1457
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1459
  *         reason_for_failure = ""
  * 
  *         for i from 0 <= i < e_sent_len:             # <<<<<<<<<<<<<<
@@ -51975,7 +52022,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_e_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1458
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1460
  * 
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -51984,7 +52031,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_e_links_low[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1459
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1461
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -51994,7 +52041,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_e_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1460
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1462
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:             # <<<<<<<<<<<<<<
@@ -52004,7 +52051,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __pyx_t_3 = __pyx_v_f_sent_len;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1461
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1463
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -52013,7 +52060,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_f_links_low[__pyx_v_i]) = -1;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1462
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1464
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1
  *             f_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -52023,7 +52070,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_f_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1468
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1470
  *         # links that we care about (but then how to look up
  *         # when we want to check something on the e side?)
  *         i = 0             # <<<<<<<<<<<<<<
@@ -52032,7 +52079,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1469
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1471
  *         # when we want to check something on the e side?)
  *         i = 0
  *         while i < num_links*2:             # <<<<<<<<<<<<<<
@@ -52043,7 +52090,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_7 = (__pyx_v_i < (__pyx_v_num_links * 2));
     if (!__pyx_t_7) break;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1470
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1472
  *         i = 0
  *         while i < num_links*2:
  *             f_i = sent_links[i]             # <<<<<<<<<<<<<<
@@ -52052,7 +52099,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_f_i = (__pyx_v_sent_links[__pyx_v_i]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1471
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1473
  *         while i < num_links*2:
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]             # <<<<<<<<<<<<<<
@@ -52061,7 +52108,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_e_i = (__pyx_v_sent_links[(__pyx_v_i + 1)]);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1472
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1474
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:             # <<<<<<<<<<<<<<
@@ -52077,7 +52124,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1473
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1475
  *             e_i = sent_links[i+1]
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i             # <<<<<<<<<<<<<<
@@ -52089,7 +52136,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1474
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1476
  *             if f_links_low[f_i] == -1 or f_links_low[f_i] > e_i:
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:             # <<<<<<<<<<<<<<
@@ -52105,7 +52152,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_8) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1475
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1477
  *                 f_links_low[f_i] = e_i
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1             # <<<<<<<<<<<<<<
@@ -52117,7 +52164,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1476
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1478
  *             if f_links_high[f_i] == -1 or f_links_high[f_i] < e_i + 1:
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:             # <<<<<<<<<<<<<<
@@ -52133,7 +52180,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1477
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1479
  *                 f_links_high[f_i] = e_i + 1
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i             # <<<<<<<<<<<<<<
@@ -52145,7 +52192,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1478
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1480
  *             if e_links_low[e_i] == -1 or e_links_low[e_i] > f_i:
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:             # <<<<<<<<<<<<<<
@@ -52161,7 +52208,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1479
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1481
  *                 e_links_low[e_i] = f_i
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1             # <<<<<<<<<<<<<<
@@ -52173,7 +52220,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1480
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1482
  *             if e_links_high[e_i] == -1 or e_links_high[e_i] < f_i + 1:
  *                 e_links_high[e_i] = f_i + 1
  *             i = i + 2             # <<<<<<<<<<<<<<
@@ -52183,19 +52230,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + 2);
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1482
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1484
  *             i = i + 2
  * 
  *         als = []             # <<<<<<<<<<<<<<
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  */
-  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_als = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1483
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1485
  * 
  *         als = []
  *         for x in range(matching.start,matching.end):             # <<<<<<<<<<<<<<
@@ -52206,18 +52253,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   for (__pyx_t_4 = __pyx_v_matching->start; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_x = __pyx_t_4;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1484
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1486
  *         als = []
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])             # <<<<<<<<<<<<<<
  *             als.append(al)
  *         # check all source-side alignment constraints
  */
-    __pyx_t_2 = PyInt_FromLong(((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyInt_FromLong(((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong((__pyx_v_f_links_low[((__pyx_v_matching->arr[__pyx_v_x]) - __pyx_v_f_sent_start)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
     PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
@@ -52229,17 +52276,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_al = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1485
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1487
  *         for x in range(matching.start,matching.end):
  *             al = (matching.arr[x]-f_sent_start,f_links_low[matching.arr[x]-f_sent_start])
  *             als.append(al)             # <<<<<<<<<<<<<<
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  */
-    __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyList_Append(__pyx_v_als, ((PyObject *)__pyx_v_al)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1487
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1489
  *             als.append(al)
  *         # check all source-side alignment constraints
  *         met_constraints = 1             # <<<<<<<<<<<<<<
@@ -52248,7 +52295,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_met_constraints = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1488
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1490
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  *         if self.require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -52257,7 +52304,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_self->require_aligned_terminal) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1489
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1491
  *         met_constraints = 1
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -52266,7 +52313,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_num_aligned_chunks = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1490
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1492
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:             # <<<<<<<<<<<<<<
@@ -52276,7 +52323,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_3 = __pyx_v_num_chunks;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1491
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1493
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:             # <<<<<<<<<<<<<<
@@ -52286,7 +52333,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_4 = (__pyx_v_chunklen[__pyx_v_i]);
       for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_4; __pyx_v_j++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1492
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1494
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:             # <<<<<<<<<<<<<<
@@ -52296,7 +52343,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_9 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + __pyx_v_j) - __pyx_v_f_sent_start)]) > -1);
         if (__pyx_t_9) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1493
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1495
  *                 for j from 0 <= j < chunklen[i]:
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1             # <<<<<<<<<<<<<<
@@ -52305,7 +52352,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_num_aligned_chunks = (__pyx_v_num_aligned_chunks + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1494
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1496
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break             # <<<<<<<<<<<<<<
@@ -52320,7 +52367,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_L24_break:;
     }
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1495
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1497
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break
  *             if num_aligned_chunks == 0:             # <<<<<<<<<<<<<<
@@ -52330,7 +52377,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_9 = (__pyx_v_num_aligned_chunks == 0);
     if (__pyx_t_9) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1496
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1498
  *                         break
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"             # <<<<<<<<<<<<<<
@@ -52341,7 +52388,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_126);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1497
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1499
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52353,7 +52400,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L26:;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1498
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1500
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:             # <<<<<<<<<<<<<<
@@ -52368,7 +52415,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1499
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1501
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"             # <<<<<<<<<<<<<<
@@ -52379,7 +52426,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __Pyx_DECREF(__pyx_v_reason_for_failure);
       __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_127);
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1500
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1502
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52394,7 +52441,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L20:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1502
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1504
  *                 met_constraints = 0
  * 
  *         if met_constraints and self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52408,7 +52455,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   if (__pyx_t_7) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1504
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1506
  *         if met_constraints and self.tight_phrases:
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:             # <<<<<<<<<<<<<<
@@ -52418,7 +52465,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_t_12 = (__pyx_v_num_chunks - 1);
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1505
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1507
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -52428,7 +52475,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1506
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1508
  *             for i from 0 <= i < num_chunks-1:
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -52439,7 +52486,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1507
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1509
  *                 if f_links_low[matching.arr[matching.start+i]+chunklen[i]-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52448,7 +52495,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1508
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1510
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -52460,7 +52507,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L31:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1509
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1511
  *                     met_constraints = 0
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -52470,7 +52517,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = ((__pyx_v_f_links_low[(((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - 1) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1510
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1512
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"             # <<<<<<<<<<<<<<
@@ -52481,7 +52528,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __Pyx_DECREF(__pyx_v_reason_for_failure);
         __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_128);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1511
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1513
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52490,7 +52537,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1512
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1514
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -52507,7 +52554,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L28:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1514
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1516
  *                     break
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52516,7 +52563,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_low = ((__pyx_v_matching->arr[__pyx_v_matching->start]) - __pyx_v_f_sent_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1515
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1517
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52525,7 +52572,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_f_high = (((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_matching->size) - 1)]) + (__pyx_v_chunklen[(__pyx_v_num_chunks - 1)])) - __pyx_v_f_sent_start);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1516
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1518
  *         f_low = matching.arr[matching.start] - f_sent_start
  *         f_high = matching.arr[matching.start + matching.size - 1] + chunklen[num_chunks-1] - f_sent_start
  *         if met_constraints:             # <<<<<<<<<<<<<<
@@ -52534,17 +52581,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_met_constraints) {
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1518
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1520
  *         if met_constraints:
  * 
  *             if self.find_fixpoint(f_low, f_high, f_links_low, f_links_high, e_links_low, e_links_high,             # <<<<<<<<<<<<<<
  *                                 -1, -1, &e_low, &e_high, &f_back_low, &f_back_high, f_sent_len, e_sent_len,
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  */
-    __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyInt_FromLong(__pyx_v_f_high); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1520; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1522
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1524
  *                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):             # <<<<<<<<<<<<<<
@@ -52555,7 +52602,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
     if (__pyx_t_3) {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1523
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1525
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0             # <<<<<<<<<<<<<<
@@ -52564,7 +52611,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_gap_error = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1524
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1526
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0
  *                 num_gaps = 0             # <<<<<<<<<<<<<<
@@ -52573,7 +52620,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_num_gaps = 0;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1526
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1528
  *                 num_gaps = 0
  * 
  *                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -52583,7 +52630,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1527
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1529
  * 
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low             # <<<<<<<<<<<<<<
@@ -52592,7 +52639,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[0]) = __pyx_v_f_back_low;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1528
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1530
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low             # <<<<<<<<<<<<<<
@@ -52601,7 +52648,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[0]) = __pyx_v_f_low;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1529
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1531
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1             # <<<<<<<<<<<<<<
@@ -52610,7 +52657,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1530
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1532
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1
  *                     gap_start = 0             # <<<<<<<<<<<<<<
@@ -52619,7 +52666,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1531
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1533
  *                     num_gaps = 1
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -52628,7 +52675,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1532
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1534
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -52638,7 +52685,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1533
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1535
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -52650,7 +52697,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L36:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1534
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1536
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52659,7 +52706,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1535
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1537
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -52675,7 +52722,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_8) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1536
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1538
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -52684,7 +52731,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1537
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1539
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -52704,7 +52751,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1539
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1541
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"
  *                 else:
  *                     gap_start = 1             # <<<<<<<<<<<<<<
@@ -52713,7 +52760,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1540
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1542
  *                 else:
  *                     gap_start = 1
  *                     if self.tight_phrases and f_links_low[f_low] == -1:             # <<<<<<<<<<<<<<
@@ -52728,7 +52775,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1543
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1545
  *                         # this is not a hard error.    we can't extract this phrase
  *                         # but we still might be able to extract a superphrase
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52742,7 +52789,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L35:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1545
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1547
  *                         met_constraints = 0
  * 
  *                 for i from 0 <= i < matching.size - 1:             # <<<<<<<<<<<<<<
@@ -52752,7 +52799,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_12 = (__pyx_v_matching->size - 1);
       for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1546
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1548
  * 
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52761,7 +52808,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(1 + __pyx_v_i)]) = (((__pyx_v_matching->arr[(__pyx_v_matching->start + __pyx_v_i)]) + (__pyx_v_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1547
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1549
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start             # <<<<<<<<<<<<<<
@@ -52770,7 +52817,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(1 + __pyx_v_i)]) = ((__pyx_v_matching->arr[((__pyx_v_matching->start + __pyx_v_i) + 1)]) - __pyx_v_f_sent_start);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1548
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1550
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start
  *                     f_gap_high[1+i] = matching.arr[matching.start+i+1] - f_sent_start
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -52780,7 +52827,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
       }
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1550
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1552
  *                     num_gaps = num_gaps + 1
  * 
  *                 if f_high < f_back_high:             # <<<<<<<<<<<<<<
@@ -52790,7 +52837,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_f_high < __pyx_v_f_back_high);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1551
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1553
  * 
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high             # <<<<<<<<<<<<<<
@@ -52799,7 +52846,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_high;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1552
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1554
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high             # <<<<<<<<<<<<<<
@@ -52808,7 +52855,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_num_gaps)]) = __pyx_v_f_back_high;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1553
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1555
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -52817,7 +52864,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1554
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1556
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -52826,7 +52873,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1555
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1557
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -52836,7 +52883,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_phrase_len > __pyx_v_self->max_length);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1556
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1558
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -52848,7 +52895,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L43:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1557
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1559
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52857,7 +52904,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1558
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1560
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:             # <<<<<<<<<<<<<<
@@ -52873,7 +52920,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1559
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1561
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -52882,7 +52929,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1560
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1562
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"             # <<<<<<<<<<<<<<
@@ -52902,7 +52949,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1562
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1564
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -52917,7 +52964,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1563
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1565
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -52931,7 +52978,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L42:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1565
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1567
  *                         met_constraints = 0
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -52941,7 +52988,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1566
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1568
  * 
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low             # <<<<<<<<<<<<<<
@@ -52950,7 +52997,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_e_word_count = (__pyx_v_e_high - __pyx_v_e_low);
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1567
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1569
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases             # <<<<<<<<<<<<<<
@@ -52960,17 +53007,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_num_gaps;
         for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_3; __pyx_v_i++) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1568
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1570
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases
  *                         if self.find_fixpoint(f_gap_low[gap_start+i], f_gap_high[gap_start+i],             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low+gap_start+i, e_gap_high+gap_start+i,
  */
-          __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1573
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1575
  *                                             f_gap_low+gap_start+i, f_gap_high+gap_start+i,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -52981,7 +53028,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1575
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1577
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -52990,18 +53037,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1576
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1578
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])             # <<<<<<<<<<<<<<
  *                             break
  * 
  */
-            __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong((__pyx_v_f_gap_low[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromLong((__pyx_v_f_gap_high[(__pyx_v_gap_start + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
@@ -53009,14 +53056,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_10 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_131), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_131), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_1));
             __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
             __pyx_v_reason_for_failure = ((PyObject *)__pyx_t_1);
             __pyx_t_1 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1577
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1579
  *                             gap_error = 1
  *                             reason_for_failure = "Subphrase [%d, %d] failed integrity check" % (f_gap_low[gap_start+i], f_gap_high[gap_start+i])
  *                             break             # <<<<<<<<<<<<<<
@@ -53033,7 +53080,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L47:;
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1579
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1581
  *                             break
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -53043,7 +53090,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_7 = (__pyx_v_gap_error == 0);
       if (__pyx_t_7) {
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1580
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1582
  * 
  *                 if gap_error == 0:
  *                     i = 1             # <<<<<<<<<<<<<<
@@ -53052,21 +53099,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_i = 1;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1581
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1583
  *                 if gap_error == 0:
  *                     i = 1
  *                     self.findexes.reset()             # <<<<<<<<<<<<<<
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  */
-        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1581; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1582
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1584
  *                     i = 1
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -53076,7 +53123,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_low < __pyx_v_f_low);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1583
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1585
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53085,7 +53132,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1584
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1586
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1             # <<<<<<<<<<<<<<
@@ -53094,16 +53141,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_i = (__pyx_v_i + 1);
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1585
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1587
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  */
-          __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1587; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1585; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1587; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -53111,27 +53158,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L52:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1586
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1588
  *                         i = i+1
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  */
-        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1588; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1588; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self->findexes1));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-        __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1588; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1587
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1589
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -53141,7 +53188,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_3 = __pyx_v_phrase->n;
         for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1588
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1590
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -53151,7 +53198,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
           if (__pyx_t_4) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1589
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1591
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53160,7 +53207,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1590
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1592
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))
  *                             i = i + 1             # <<<<<<<<<<<<<<
@@ -53172,7 +53219,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1592
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1594
  *                             i = i + 1
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -53184,7 +53231,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_L55:;
         }
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1593
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1595
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -53194,7 +53241,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_f_back_high > __pyx_v_f_high);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1594
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1596
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53203,16 +53250,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1595
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1597
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  * 
  *                     fphr = Phrase(fphr_arr)
  */
-          __pyx_t_10 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1595; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_2 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_2);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -53220,25 +53267,25 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L56:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1597
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1599
  *                         self.findexes.append(sym_setindex(self.category, i))
  * 
  *                     fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                     if met_constraints:
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  */
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
         PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_fphr_arr));
         __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-        __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
         __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_10);
         __pyx_t_10 = 0;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1598
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1600
  * 
  *                     fphr = Phrase(fphr_arr)
  *                     if met_constraints:             # <<<<<<<<<<<<<<
@@ -53247,47 +53294,47 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_met_constraints) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1601
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1603
  *                         phrase_list = self.extract_phrases(e_low, e_high, e_gap_low + gap_start, e_gap_high + gap_start, e_links_low, num_gaps,
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)
  */
-          __pyx_t_10 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_low, __pyx_v_e_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, __pyx_v_num_gaps, __pyx_v_f_back_low, __pyx_v_f_back_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_low, __pyx_v_e_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, __pyx_v_num_gaps, __pyx_v_f_back_low, __pyx_v_f_back_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_v_phrase_list = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1602
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1604
  *                                             f_back_low, f_back_high, f_gap_low + gap_start, f_gap_high + gap_start, f_links_low,
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  */
-          __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1604; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_7 = (__pyx_t_13 > 0);
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1603
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1605
  *                                             matching.sent_id, e_sent_len, e_sent_start)
  *                         if len(phrase_list) > 0:
  *                             pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                         else:
  *                             pair_count = 0
  */
-            __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (unlikely(__pyx_t_13 == 0)) {
               PyErr_Format(PyExc_ZeroDivisionError, "float division");
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1605; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             __pyx_v_pair_count = (1.0 / __pyx_t_13);
             goto __pyx_L58;
           }
           /*else*/ {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1605
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1607
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  *                             pair_count = 0             # <<<<<<<<<<<<<<
@@ -53296,22 +53343,22 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_pair_count = 0.0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1606
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1608
  *                         else:
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)             # <<<<<<<<<<<<<<
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  */
-            __pyx_t_10 = PyInt_FromLong(__pyx_v_f_back_low); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyInt_FromLong(__pyx_v_f_back_low); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_2 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_1 = PyInt_FromLong(__pyx_v_e_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromLong(__pyx_v_e_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyInt_FromLong(__pyx_v_e_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
-            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
@@ -53325,7 +53372,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
             __pyx_t_14 = 0;
-            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1606; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_14 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_132), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(((PyObject *)__pyx_t_14));
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_v_reason_for_failure);
@@ -53334,7 +53381,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L58:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1607
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1609
  *                             pair_count = 0
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:             # <<<<<<<<<<<<<<
@@ -53345,7 +53392,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_14 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_14); __pyx_t_13 = 0;
             __pyx_t_16 = NULL;
           } else {
-            __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
             __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
           }
@@ -53353,23 +53400,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
               if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
               #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #else
-              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
             } else {
               __pyx_t_15 = __pyx_t_16(__pyx_t_14);
               if (unlikely(!__pyx_t_15)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -53385,7 +53432,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (unlikely(size != 2)) {
                 if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                 else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               #if CYTHON_COMPILING_IN_CPYTHON
               if (likely(PyTuple_CheckExact(sequence))) {
@@ -53398,14 +53445,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_INCREF(__pyx_t_1);
               __Pyx_INCREF(__pyx_t_2);
               #else
-              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               #endif
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             } else
             {
               Py_ssize_t index = -1;
-              __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -53413,7 +53460,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_GOTREF(__pyx_t_1);
               index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L61_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_2);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_17 = NULL;
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               goto __pyx_L62_unpacking_done;
@@ -53421,7 +53468,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
               __pyx_t_17 = NULL;
               if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1607; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L62_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_phrase2);
@@ -53431,7 +53478,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_eindexes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1608
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1610
  *                             reason_for_failure = "Didn't extract anything from [%d, %d] -> [%d, %d]" % (f_back_low, f_back_high, e_low, e_high)
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -53440,31 +53487,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_t_15 = ((PyObject *)__pyx_v_self->findexes);
             __Pyx_INCREF(__pyx_t_15);
-            __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
             __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
             __Pyx_XDECREF(((PyObject *)__pyx_v_als1));
             __pyx_v_als1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
             __pyx_t_2 = 0;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1609
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1611
  *                         for (phrase2,eindexes) in phrase_list:
  *                             als1 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))             # <<<<<<<<<<<<<<
  * 
  *                     if (num_gaps < self.max_nonterminals and
  */
-            __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_2);
-            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_als1));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als1));
             __Pyx_GIVEREF(((PyObject *)__pyx_v_als1));
-            __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
             PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
@@ -53478,7 +53525,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __Pyx_GIVEREF(__pyx_t_1);
             __pyx_t_2 = 0;
             __pyx_t_1 = 0;
-            __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -53488,7 +53535,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L57:;
 
-        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1611
+        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1613
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))
  * 
  *                     if (num_gaps < self.max_nonterminals and             # <<<<<<<<<<<<<<
@@ -53498,7 +53545,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_7 = (__pyx_v_num_gaps < __pyx_v_self->max_nonterminals);
         if (__pyx_t_7) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1612
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1614
  * 
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and             # <<<<<<<<<<<<<<
@@ -53508,7 +53555,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_phrase_len < __pyx_v_self->max_length);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1613
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1615
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):             # <<<<<<<<<<<<<<
@@ -53526,7 +53573,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_9) {
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1614
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1616
  *                         phrase_len < self.max_length and
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -53536,7 +53583,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_low == __pyx_v_f_low);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1615
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1617
  *                         f_back_high - f_back_low + self.train_min_gap_size <= self.train_max_initial_size):
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -53546,7 +53593,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1616
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1618
  *                         if (f_back_low == f_low and
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):             # <<<<<<<<<<<<<<
@@ -53576,7 +53623,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1617
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1619
  *                                 f_low >= self.train_min_gap_size and
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -53585,7 +53632,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1618
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1620
  *                                 ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_back_high-1] != -1))):
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -53594,7 +53641,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1619
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1621
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -53603,7 +53650,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1620
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1622
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -53620,7 +53667,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1621
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1623
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -53633,7 +53680,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L65:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1622
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1624
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -53649,7 +53696,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1623
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1625
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0 or f_back_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -53661,7 +53708,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L68:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1625
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1627
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -53670,17 +53717,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1626
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1628
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_back_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1626; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyInt_FromLong(__pyx_v_f_back_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1628; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1630
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1632
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -53690,7 +53737,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_14, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 1, 0, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1632
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1634
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and             # <<<<<<<<<<<<<<
@@ -53706,17 +53753,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1633
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1635
  *                                             1, 1, 1, 1, 0, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and
  *                                 self.find_fixpoint(f_x_low, f_low,    # check integrity of new subphrase             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  */
-                  __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1633; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1635; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_1);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1637
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1639
  *                                             -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -53739,7 +53786,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1639
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1641
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -53748,7 +53795,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1640
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1642
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -53757,35 +53804,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1641
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1643
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_1 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1642
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1644
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1642; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1643
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1645
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53794,7 +53841,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1644
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1646
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -53803,27 +53850,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1645
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1647
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1647; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1647; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1647; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1646
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1648
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -53833,7 +53880,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1647
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1649
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -53843,7 +53890,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1648
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1650
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53852,7 +53899,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1649
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1651
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -53864,7 +53911,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1651
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1653
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -53876,7 +53923,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L72:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1652
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1654
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -53886,7 +53933,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_high > __pyx_v_f_high);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1653
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1655
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -53895,16 +53942,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1654
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1656
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  */
-                __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1654; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -53912,67 +53959,67 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L73:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1655
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1657
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  */
-              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1657; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1657; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_15);
               __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1658
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1660
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_15 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1658; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_15;
               __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1659
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1661
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low, matching.sent_id,
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1659; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1661; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1660
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1662
  *                                                     e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1660; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1662; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L74;
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1662
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1664
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -53983,7 +54030,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L74:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1663
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1665
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -53994,7 +54041,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_15 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_15); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __pyx_t_16 = Py_TYPE(__pyx_t_15)->tp_iternext;
               }
@@ -54002,23 +54049,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_15)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_15)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PySequence_ITEM(__pyx_t_15, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else {
                   __pyx_t_1 = __pyx_t_16(__pyx_t_15);
                   if (unlikely(!__pyx_t_1)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -54034,7 +54081,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
@@ -54047,14 +54094,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_INCREF(__pyx_t_14);
                   __Pyx_INCREF(__pyx_t_2);
                   #else
-                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -54062,7 +54109,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_14);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L77_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L78_unpacking_done;
@@ -54070,7 +54117,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   __pyx_t_17 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1663; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L78_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -54080,7 +54127,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1664
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1666
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -54089,31 +54136,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_1 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_1);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_1, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1664; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_1, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1666; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als2));
                 __pyx_v_als2 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1665
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1667
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))             # <<<<<<<<<<<<<<
  * 
  *                         if (f_back_high == f_high and
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als2));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_als2));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als2));
-                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-                __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_fphr));
@@ -54127,7 +54174,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_14);
                 __pyx_t_2 = 0;
                 __pyx_t_14 = 0;
-                __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1665; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1667; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
@@ -54140,7 +54187,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L64:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1667
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1669
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))
  * 
  *                         if (f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -54150,7 +54197,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_f_back_high == __pyx_v_f_high);
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1668
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1670
  * 
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -54160,7 +54207,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_f_sent_len - __pyx_v_f_high) >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1669
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1671
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):             # <<<<<<<<<<<<<<
@@ -54190,7 +54237,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1670
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1672
  *                             f_sent_len - f_high >= self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -54199,7 +54246,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1671
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1673
  *                             ((not self.tight_phrases) or (f_links_low[f_high] != -1 and f_links_low[f_back_low] != -1))):
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -54208,7 +54255,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1672
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1674
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -54217,7 +54264,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1673
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1675
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -54234,7 +54281,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1674
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1676
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -54247,7 +54294,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L80:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1675
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1677
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -54263,7 +54310,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1676
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1678
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_back_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -54275,7 +54322,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L83:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1678
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1680
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -54284,17 +54331,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1679
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1681
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_back_low, f_x_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1679; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1681; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1683
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1685
  *                                             e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -54304,7 +54351,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_back_low, __pyx_t_15, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 1, 0, 1, 1, 0)) {
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1685
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1687
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and             # <<<<<<<<<<<<<<
@@ -54320,17 +54367,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_7) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1686
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1688
  *                                             1, 1, 1, 0, 1, 1, 0) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_high-1] != -1) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
  *                                             f_links_low, f_links_high, e_links_low, e_links_high,
  *                                             -1, -1, e_gap_low+gap_start+num_gaps, e_gap_high+gap_start+num_gaps,
  */
-                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1688; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_14);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1691
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1693
  *                                             f_gap_low+gap_start+num_gaps, f_gap_high+gap_start+num_gaps,
  *                                             f_sent_len, e_sent_len,
  *                                             self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -54353,7 +54400,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_9) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1693
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1695
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -54362,7 +54409,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1694
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1696
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -54371,21 +54418,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1695
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1697
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1695; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1695; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1697; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1696
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1698
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -54395,7 +54442,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_9 = (__pyx_v_f_back_low < __pyx_v_f_low);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1697
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1699
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54404,7 +54451,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1698
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1700
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1             # <<<<<<<<<<<<<<
@@ -54413,16 +54460,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_v_i = (__pyx_v_i + 1);
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1699
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1701
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  */
-                __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
-                __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1699; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -54430,27 +54477,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L85:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1700
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1702
  *                                     i = i+1
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1702; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1702; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1702; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1701
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1703
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -54460,7 +54507,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1702
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1704
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -54470,7 +54517,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1703
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1705
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54479,7 +54526,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1704
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1706
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -54491,7 +54538,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1706
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1708
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -54503,7 +54550,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L88:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1707
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1709
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -54512,81 +54559,81 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1708
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1710
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1709
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1711
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  */
-              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1709; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
               __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1712
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1714
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low+gap_start, e_gap_high+gap_start, e_links_low, num_gaps+1,
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, (__pyx_v_e_gap_low + __pyx_v_gap_start), (__pyx_v_e_gap_high + __pyx_v_gap_start), __pyx_v_e_links_low, (__pyx_v_num_gaps + 1), __pyx_v_f_x_low, __pyx_v_f_x_high, (__pyx_v_f_gap_low + __pyx_v_gap_start), (__pyx_v_f_gap_high + __pyx_v_gap_start), __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1712; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_1;
               __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1713
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1715
  *                                                     f_x_low, f_x_high, f_gap_low+gap_start, f_gap_high+gap_start, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1715; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_9 = (__pyx_t_13 > 0);
               if (__pyx_t_9) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1714
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1716
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1714; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L89;
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1716
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1718
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -54597,7 +54644,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L89:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1717
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1719
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -54608,7 +54655,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_1 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_1); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __pyx_t_16 = Py_TYPE(__pyx_t_1)->tp_iternext;
               }
@@ -54616,23 +54663,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_1)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_1)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PySequence_ITEM(__pyx_t_1, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else {
                   __pyx_t_14 = __pyx_t_16(__pyx_t_1);
                   if (unlikely(!__pyx_t_14)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -54648,7 +54695,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
@@ -54661,14 +54708,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_INCREF(__pyx_t_15);
                   __Pyx_INCREF(__pyx_t_2);
                   #else
-                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_14); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -54676,7 +54723,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_15);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L92_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L93_unpacking_done;
@@ -54684,7 +54731,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   __pyx_t_17 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1717; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L93_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -54694,7 +54741,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1718
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1720
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -54703,31 +54750,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_14 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_14);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_14, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_14, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1720; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als3));
                 __pyx_v_als3 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1719
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1721
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))             # <<<<<<<<<<<<<<
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1721; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1721; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als3));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_als3));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als3));
-                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1721; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-                __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_14 = PyTuple_New(4); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1721; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_14, 0, ((PyObject *)__pyx_v_fphr));
@@ -54741,7 +54788,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_15);
                 __pyx_t_2 = 0;
                 __pyx_t_15 = 0;
-                __pyx_t_15 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_14)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1721; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
@@ -54754,7 +54801,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L79:;
 
-          /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1720
+          /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1722
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and             # <<<<<<<<<<<<<<
@@ -54764,7 +54811,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_9 = (__pyx_v_num_gaps < (__pyx_v_self->max_nonterminals - 1));
           if (__pyx_t_9) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1721
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1723
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and             # <<<<<<<<<<<<<<
@@ -54774,7 +54821,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_7 = ((__pyx_v_phrase_len + 1) < __pyx_v_self->max_length);
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1722
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1724
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -54784,7 +54831,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_18 = (__pyx_v_f_back_high == __pyx_v_f_high);
               if (__pyx_t_18) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1723
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1725
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -54794,7 +54841,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_8 = (__pyx_v_f_back_low == __pyx_v_f_low);
                 if (__pyx_t_8) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1724
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1726
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and             # <<<<<<<<<<<<<<
@@ -54804,7 +54851,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __pyx_t_19 = (((__pyx_v_f_back_high - __pyx_v_f_back_low) + (2 * __pyx_v_self->train_min_gap_size)) <= __pyx_v_self->train_max_initial_size);
                   if (__pyx_t_19) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1725
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1727
  *                             f_back_low == f_low and
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -54814,7 +54861,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                     __pyx_t_20 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
                     if (__pyx_t_20) {
 
-                      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1726
+                      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1728
  *                             f_back_high - f_back_low + (2*self.train_min_gap_size) <= self.train_max_initial_size and
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -54824,7 +54871,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                       __pyx_t_21 = (__pyx_v_f_high <= (__pyx_v_f_sent_len - __pyx_v_self->train_min_gap_size));
                       if (__pyx_t_21) {
 
-                        /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1727
+                        /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1729
  *                             f_low >= self.train_min_gap_size and
  *                             f_high <= f_sent_len - self.train_min_gap_size and
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):             # <<<<<<<<<<<<<<
@@ -54874,7 +54921,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1729
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1731
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):
  * 
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -54883,7 +54930,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1730
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1732
  * 
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -54892,7 +54939,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_low = (__pyx_v_f_low - __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1731
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1733
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -54901,7 +54948,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1732
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1734
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -54918,7 +54965,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1733
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1735
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -54931,7 +54978,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L95:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1734
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1736
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:             # <<<<<<<<<<<<<<
@@ -54941,7 +54988,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_18 = (__pyx_v_f_x_low < 0);
             if (__pyx_t_18) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1735
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1737
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -54953,7 +55000,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L98:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1737
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1739
  *                                 met_constraints = 0
  * 
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -54962,7 +55009,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_f_x_high = (__pyx_v_f_high + __pyx_v_self->train_min_gap_size);
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1738
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1740
  * 
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -54971,7 +55018,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1739
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1741
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -54988,7 +55035,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_9) break;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1740
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1742
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1             # <<<<<<<<<<<<<<
@@ -55001,7 +55048,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L99:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1741
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1743
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -55017,7 +55064,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1742
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1744
  *                                     f_x_high = f_x_high + 1
  *                             if f_x_high > f_sent_len or f_x_high - f_x_low > self.train_max_initial_size:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -55029,7 +55076,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L102:;
 
-            /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1744
+            /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1746
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -55038,17 +55085,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1745
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1747
  * 
  *                             if (met_constraints and
  *                                 self.find_fixpoint(f_x_low, f_x_high,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  */
-              __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1747; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1749
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1751
  *                                                 e_low, e_high, &e_x_low, &e_x_high, &f_x_low, &f_x_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -55058,7 +55105,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               if (((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->find_fixpoint(__pyx_v_self, __pyx_v_f_x_low, __pyx_t_1, __pyx_v_f_links_low, __pyx_v_f_links_high, __pyx_v_e_links_low, __pyx_v_e_links_high, __pyx_v_e_low, __pyx_v_e_high, (&__pyx_v_e_x_low), (&__pyx_v_e_x_high), (&__pyx_v_f_x_low), (&__pyx_v_f_x_high), __pyx_v_f_sent_len, __pyx_v_e_sent_len, __pyx_v_self->train_max_initial_size, __pyx_v_self->train_max_initial_size, 1, 1, 2, 1, 1, 1, 1)) {
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1751
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1753
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and             # <<<<<<<<<<<<<<
@@ -55080,17 +55127,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_9) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1752
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1754
  *                                                 1, 1, 2, 1, 1, 1, 1) and
  *                                 ((not self.tight_phrases) or (f_links_low[f_x_low] != -1 and f_links_low[f_x_high-1] != -1)) and
  *                                 self.find_fixpoint(f_x_low, f_low,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  */
-                  __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1754; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_15);
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1756
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1758
  *                                                 -1, -1, e_gap_low, e_gap_high, f_gap_low, f_gap_high,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -55101,17 +55148,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   if (__pyx_t_3) {
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1758
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1760
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0) and
  *                                 self.find_fixpoint(f_high, f_x_high,             # <<<<<<<<<<<<<<
  *                                                 f_links_low, f_links_high, e_links_low, e_links_high,
  *                                                 -1, -1, e_gap_low+1+num_gaps, e_gap_high+1+num_gaps,
  */
-                    __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1758; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    __pyx_t_15 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     __Pyx_GOTREF(__pyx_t_15);
 
-                    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1763
+                    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1765
  *                                                 f_gap_low+1+num_gaps, f_gap_high+1+num_gaps,
  *                                                 f_sent_len, e_sent_len,
  *                                                 self.train_max_initial_size, self.train_max_initial_size,             # <<<<<<<<<<<<<<
@@ -55139,7 +55186,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_8) {
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1765
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1767
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -55148,7 +55195,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_clear(__pyx_v_fphr_arr);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1766
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1768
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -55157,35 +55204,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1767
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1769
  *                                 fphr_arr._clear()
  *                                 i = 1
  *                                 self.findexes.reset()             # <<<<<<<<<<<<<<
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  */
-              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1768
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1770
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  */
-              __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
-              __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1770; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1769
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1771
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -55194,7 +55241,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1770
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1772
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -55203,27 +55250,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1771
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1773
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)             # <<<<<<<<<<<<<<
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  */
-              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->findexes), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1773; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1773; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_self->findexes1));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_self->findexes1));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_self->findexes1));
-              __pyx_t_14 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1771; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1773; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1772
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1774
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -55233,7 +55280,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __pyx_t_3 = __pyx_v_phrase->n;
               for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1773
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1775
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -55243,7 +55290,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_4 = __pyx_f_3_sa_sym_isvar((__pyx_v_phrase->syms[__pyx_v_j]));
                 if (__pyx_t_4) {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1774
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1776
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -55252,7 +55299,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                   ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1775
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1777
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -55264,7 +55311,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1777
+                  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1779
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -55276,7 +55323,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L106:;
               }
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1778
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1780
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -55285,81 +55332,81 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               ((struct __pyx_vtabstruct_3_sa_IntList *)__pyx_v_fphr_arr->__pyx_vtab)->_append(__pyx_v_fphr_arr, __pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i));
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1779
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1781
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
  *                                 fphr = Phrase(fphr_arr)
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  */
-              __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_v_self->category, __pyx_v_i)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
-              __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1779; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = __Pyx_PyObject_Append(((PyObject *)__pyx_v_self->findexes), __pyx_t_14); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1780
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1782
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr = Phrase(fphr_arr)             # <<<<<<<<<<<<<<
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  */
-              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
               __Pyx_INCREF(((PyObject *)__pyx_v_fphr_arr));
               PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr_arr));
               __Pyx_GIVEREF(((PyObject *)__pyx_v_fphr_arr));
-              __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
               __Pyx_DECREF(((PyObject *)__pyx_v_fphr));
               __pyx_v_fphr = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_14);
               __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1783
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1785
  *                                 phrase_list = self.extract_phrases(e_x_low, e_x_high, e_gap_low, e_gap_high, e_links_low, num_gaps+2,
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)             # <<<<<<<<<<<<<<
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)
  */
-              __pyx_t_14 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 2), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_14 = ((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->extract_phrases(__pyx_v_self, __pyx_v_e_x_low, __pyx_v_e_x_high, __pyx_v_e_gap_low, __pyx_v_e_gap_high, __pyx_v_e_links_low, (__pyx_v_num_gaps + 2), __pyx_v_f_x_low, __pyx_v_f_x_high, __pyx_v_f_gap_low, __pyx_v_f_gap_high, __pyx_v_f_links_low, __pyx_v_matching->sent_id, __pyx_v_e_sent_len, __pyx_v_e_sent_start); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
               __Pyx_XDECREF(__pyx_v_phrase_list);
               __pyx_v_phrase_list = __pyx_t_14;
               __pyx_t_14 = 0;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1784
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1786
  *                                                     f_x_low, f_x_high, f_gap_low, f_gap_high, f_links_low,
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:             # <<<<<<<<<<<<<<
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  */
-              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_8 = (__pyx_t_13 > 0);
               if (__pyx_t_8) {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1785
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1787
  *                                                     matching.sent_id, e_sent_len, e_sent_start)
  *                                 if len(phrase_list) > 0:
  *                                     pair_count = 1.0 / len(phrase_list)             # <<<<<<<<<<<<<<
  *                                 else:
  *                                     pair_count = 0
  */
-                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = PyObject_Length(__pyx_v_phrase_list); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L107;
               }
               /*else*/ {
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1787
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1789
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -55370,7 +55417,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L107:;
 
-              /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1788
+              /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1790
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -55381,7 +55428,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_t_14 = __pyx_v_phrase_list; __Pyx_INCREF(__pyx_t_14); __pyx_t_13 = 0;
                 __pyx_t_16 = NULL;
               } else {
-                __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_13 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_v_phrase_list); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
               }
@@ -55389,23 +55436,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_14)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_14)) {
                   if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
                   #if CYTHON_COMPILING_IN_CPYTHON
-                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #else
-                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_15 = PySequence_ITEM(__pyx_t_14, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                 } else {
                   __pyx_t_15 = __pyx_t_16(__pyx_t_14);
                   if (unlikely(!__pyx_t_15)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -55421,7 +55468,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   if (unlikely(size != 2)) {
                     if (size > 2) __Pyx_RaiseTooManyValuesError(2);
                     else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   #if CYTHON_COMPILING_IN_CPYTHON
                   if (likely(PyTuple_CheckExact(sequence))) {
@@ -55434,14 +55481,14 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_INCREF(__pyx_t_1);
                   __Pyx_INCREF(__pyx_t_2);
                   #else
-                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   #endif
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 } else
                 {
                   Py_ssize_t index = -1;
-                  __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_10 = PyObject_GetIter(__pyx_t_15); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_10);
                   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                   __pyx_t_17 = Py_TYPE(__pyx_t_10)->tp_iternext;
@@ -55449,7 +55496,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_GOTREF(__pyx_t_1);
                   index = 1; __pyx_t_2 = __pyx_t_17(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L110_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_2);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_t_17 = NULL;
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   goto __pyx_L111_unpacking_done;
@@ -55457,7 +55504,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
                   __pyx_t_17 = NULL;
                   if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1788; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L111_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -55467,7 +55514,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1789
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1791
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -55476,31 +55523,31 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_t_15 = ((PyObject *)__pyx_v_self->findexes);
                 __Pyx_INCREF(__pyx_t_15);
-                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *)__pyx_v_self->__pyx_vtab)->create_alignments(__pyx_v_self, __pyx_v_sent_links, __pyx_v_num_links, __pyx_t_15, __pyx_v_eindexes)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_XDECREF(((PyObject *)__pyx_v_als4));
                 __pyx_v_als4 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
                 __pyx_t_2 = 0;
 
-                /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1790
+                /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1792
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))             # <<<<<<<<<<<<<<
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"
  */
-                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_2 = PyFloat_FromDouble(__pyx_v_pair_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1792; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_2);
-                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1792; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_als4));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_als4));
                 __Pyx_GIVEREF(((PyObject *)__pyx_v_als4));
-                __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1792; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-                __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyTuple_New(4); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1792; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_INCREF(((PyObject *)__pyx_v_fphr));
                 PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_fphr));
@@ -55514,7 +55561,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __Pyx_GIVEREF(__pyx_t_1);
                 __pyx_t_2 = 0;
                 __pyx_t_1 = 0;
-                __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_extracts, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1792; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -55536,7 +55583,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     /*else*/ {
 
-      /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1792
+      /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1794
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als4)))
  *             else:
  *                 reason_for_failure = "Unable to extract basic phrase"             # <<<<<<<<<<<<<<
@@ -55552,7 +55599,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L33:;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1794
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1796
  *                 reason_for_failure = "Unable to extract basic phrase"
  * 
  *         free(sent_links)             # <<<<<<<<<<<<<<
@@ -55561,7 +55608,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_sent_links);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1795
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1797
  * 
  *         free(sent_links)
  *         free(f_links_low)             # <<<<<<<<<<<<<<
@@ -55570,7 +55617,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1796
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1798
  *         free(sent_links)
  *         free(f_links_low)
  *         free(f_links_high)             # <<<<<<<<<<<<<<
@@ -55579,7 +55626,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1797
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1799
  *         free(f_links_low)
  *         free(f_links_high)
  *         free(e_links_low)             # <<<<<<<<<<<<<<
@@ -55588,7 +55635,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1798
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1800
  *         free(f_links_high)
  *         free(e_links_low)
  *         free(e_links_high)             # <<<<<<<<<<<<<<
@@ -55597,7 +55644,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1799
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1801
  *         free(e_links_low)
  *         free(e_links_high)
  *         free(f_gap_low)             # <<<<<<<<<<<<<<
@@ -55606,7 +55653,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1800
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1802
  *         free(e_links_high)
  *         free(f_gap_low)
  *         free(f_gap_high)             # <<<<<<<<<<<<<<
@@ -55615,7 +55662,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1801
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1803
  *         free(f_gap_low)
  *         free(f_gap_high)
  *         free(e_gap_low)             # <<<<<<<<<<<<<<
@@ -55624,7 +55671,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_low);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1802
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1804
  *         free(f_gap_high)
  *         free(e_gap_low)
  *         free(e_gap_high)             # <<<<<<<<<<<<<<
@@ -55633,7 +55680,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_high);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1804
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1806
  *         free(e_gap_high)
  * 
  *         return extracts             # <<<<<<<<<<<<<<
@@ -55687,7 +55734,7 @@ static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":7
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":7
  * 
  * cdef class FeatureVector:
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -55706,7 +55753,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":8
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":8
  * cdef class FeatureVector:
  *     def __cinit__(self):
  *         self.names = IntList(INITIAL_CAPACITY, INCREMENT)             # <<<<<<<<<<<<<<
@@ -55734,7 +55781,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   __pyx_v_self->names = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":9
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":9
  *     def __cinit__(self):
  *         self.names = IntList(INITIAL_CAPACITY, INCREMENT)
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)             # <<<<<<<<<<<<<<
@@ -55831,7 +55878,7 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":11
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":11
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
  * 
  *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
@@ -55849,7 +55896,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_Featur
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("set", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":12
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":12
  * 
  *     def set(self, unsigned name, float value):
  *         self.names.append(name)             # <<<<<<<<<<<<<<
@@ -55863,7 +55910,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_Featur
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":13
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":13
  *     def set(self, unsigned name, float value):
  *         self.names.append(name)
  *         self.values.append(value)             # <<<<<<<<<<<<<<
@@ -55902,7 +55949,7 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":15
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -55968,7 +56015,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
   __pyx_L3_first_run:;
   if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":17
  *     def __iter__(self):
  *         cdef unsigned i
  *         for i in range(self.names.len):             # <<<<<<<<<<<<<<
@@ -55979,7 +56026,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_2;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":18
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":18
  *         cdef unsigned i
  *         for i in range(self.names.len):
  *             yield (FD.word(self.names[i]), self.values[i])             # <<<<<<<<<<<<<<
@@ -56043,7 +56090,7 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self)
 }
 static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator12(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -56182,7 +56229,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator12(__pyx_Gener
   return NULL;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":20
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":20
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -56211,7 +56258,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_7__str__(struct __pyx_obj_3_sa_Fe
   __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -56267,7 +56314,7 @@ static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__p
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":25
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":25
  * cdef class Scorer:
  *     cdef models
  *     def __init__(self, *models):             # <<<<<<<<<<<<<<
@@ -56290,7 +56337,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__init__", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":26
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":26
  *     cdef models
  *     def __init__(self, *models):
  *         names = [FD.index(<char *>model.__name__) for model in models]             # <<<<<<<<<<<<<<
@@ -56324,7 +56371,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   __pyx_v_names = __pyx_t_1;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":27
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":27
  *     def __init__(self, *models):
  *         names = [FD.index(<char *>model.__name__) for model in models]
  *         self.models = zip(names, models)             # <<<<<<<<<<<<<<
@@ -56363,7 +56410,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   return __pyx_r;
 }
 
-/* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":29
+/* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":29
  *         self.models = zip(names, models)
  * 
  *     cdef FeatureVector score(self, ctx):             # <<<<<<<<<<<<<<
@@ -56390,7 +56437,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("score", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":30
  * 
  *     cdef FeatureVector score(self, ctx):
  *         cdef FeatureVector scores = FeatureVector()             # <<<<<<<<<<<<<<
@@ -56402,7 +56449,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   __pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":31
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":31
  *     cdef FeatureVector score(self, ctx):
  *         cdef FeatureVector scores = FeatureVector()
  *         for name, model in self.models:             # <<<<<<<<<<<<<<
@@ -56499,7 +56546,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
     __pyx_v_model = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":32
+    /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":32
  *         cdef FeatureVector scores = FeatureVector()
  *         for name, model in self.models:
  *             scores.set(name, model(ctx))             # <<<<<<<<<<<<<<
@@ -56531,7 +56578,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":33
  *         for name, model in self.models:
  *             scores.set(name, model(ctx))
  *         return scores             # <<<<<<<<<<<<<<
@@ -65093,6 +65140,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_15_input(PyTypeObject *t,
   p->__pyx_v_frontier_nodes = 0;
   p->__pyx_v_fwords = 0;
   p->__pyx_v_hiero_phrase = 0;
+  p->__pyx_v_input_match = 0;
   p->__pyx_v_is_shadow_path = 0;
   p->__pyx_v_key = 0;
   p->__pyx_v_loc = 0;
@@ -65147,6 +65195,7 @@ static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_15_input(PyObject *o) {
   Py_CLEAR(p->__pyx_v_frontier_nodes);
   Py_CLEAR(p->__pyx_v_fwords);
   Py_CLEAR(p->__pyx_v_hiero_phrase);
+  Py_CLEAR(p->__pyx_v_input_match);
   Py_CLEAR(p->__pyx_v_is_shadow_path);
   Py_CLEAR(p->__pyx_v_key);
   Py_CLEAR(p->__pyx_v_loc);
@@ -65238,6 +65287,9 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_15_input(PyObject *o, visit
   if (p->__pyx_v_hiero_phrase) {
     e = (*v)(((PyObject*)p->__pyx_v_hiero_phrase), a); if (e) return e;
   }
+  if (p->__pyx_v_input_match) {
+    e = (*v)(p->__pyx_v_input_match, a); if (e) return e;
+  }
   if (p->__pyx_v_is_shadow_path) {
     e = (*v)(p->__pyx_v_is_shadow_path, a); if (e) return e;
   }
@@ -65391,6 +65443,9 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_15_input(PyObject *o) {
   tmp = ((PyObject*)p->__pyx_v_hiero_phrase);
   p->__pyx_v_hiero_phrase = ((struct __pyx_obj_3_sa_Phrase *)Py_None); Py_INCREF(Py_None);
   Py_XDECREF(tmp);
+  tmp = ((PyObject*)p->__pyx_v_input_match);
+  p->__pyx_v_input_match = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(tmp);
   tmp = ((PyObject*)p->__pyx_v_is_shadow_path);
   p->__pyx_v_is_shadow_path = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -66429,6 +66484,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__index, __pyx_k__index, sizeof(__pyx_k__index), 0, 0, 1, 1},
   {&__pyx_n_s__info, __pyx_k__info, sizeof(__pyx_k__info), 0, 0, 1, 1},
   {&__pyx_n_s__initial_len, __pyx_k__initial_len, sizeof(__pyx_k__initial_len), 0, 0, 1, 1},
+  {&__pyx_n_s__input_match, __pyx_k__input_match, sizeof(__pyx_k__input_match), 0, 0, 1, 1},
   {&__pyx_n_s__input_span, __pyx_k__input_span, sizeof(__pyx_k__input_span), 0, 0, 1, 1},
   {&__pyx_n_s__insert, __pyx_k__insert, sizeof(__pyx_k__insert), 0, 0, 1, 1},
   {&__pyx_n_s__isa, __pyx_k__isa, sizeof(__pyx_k__isa), 0, 0, 1, 1},
@@ -66545,8 +66601,8 @@ static int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_zip = __Pyx_GetName(__pyx_b, __pyx_n_s__zip); if (!__pyx_builtin_zip) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_StopIteration = __Pyx_GetName(__pyx_b, __pyx_n_s__StopIteration); if (!__pyx_builtin_StopIteration) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_cmp = __Pyx_GetName(__pyx_b, __pyx_n_s__cmp); if (!__pyx_builtin_cmp) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_sorted = __Pyx_GetName(__pyx_b, __pyx_n_s__sorted); if (!__pyx_builtin_sorted) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_max = __Pyx_GetName(__pyx_b, __pyx_n_s__max); if (!__pyx_builtin_max) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_sorted = __Pyx_GetName(__pyx_b, __pyx_n_s__sorted); if (!__pyx_builtin_sorted) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_max = __Pyx_GetName(__pyx_b, __pyx_n_s__max); if (!__pyx_builtin_max) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -66556,7 +66612,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":20
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":20
  *         self.word2id = {"END_OF_FILE":0, "END_OF_LINE":1}
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -66573,7 +66629,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":21
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":21
  *         self.id2word = ["END_OF_FILE", "END_OF_LINE"]
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -66590,7 +66646,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_11));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":22
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":22
  *         self.data = IntList(1000,1000)
  *         self.sent_id = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -66607,7 +66663,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":66
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":66
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -66621,7 +66677,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":61
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":61
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -66641,7 +66697,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":69
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":69
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -66661,7 +66717,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":74
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":74
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:
  *             data = (line.split(' ||| ')[side] for line in fp)             # <<<<<<<<<<<<<<
@@ -66675,7 +66731,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_19));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":73
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":73
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -66695,7 +66751,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_20));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":144
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":144
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -66709,7 +66765,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_22));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":147
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":147
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -66723,7 +66779,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_23));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":150
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":150
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -66737,7 +66793,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_24));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":153
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":153
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -66751,7 +66807,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_26));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/data_array.pxi":156
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/data_array.pxi":156
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -66770,7 +66826,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_28));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":46
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":46
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -66787,7 +66843,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_29));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":47
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":47
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -66804,7 +66860,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_30));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":59
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))             # <<<<<<<<<<<<<<
@@ -66818,7 +66874,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_31));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_32));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -66838,7 +66894,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_33));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":75
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":75
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -66852,7 +66908,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_34));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":78
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -66866,7 +66922,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_36));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":71
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -66886,7 +66942,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_37));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":92
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
  *                 f.write("%d " % link)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -66900,7 +66956,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_38));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":95
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -66914,7 +66970,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_39));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/alignment.pxi":88
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -66934,7 +66990,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_40));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":297
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":297
  * 
  *             # Re-read file, placing words into buckets
  *             f.seek(0)             # <<<<<<<<<<<<<<
@@ -66948,7 +67004,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_0);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_43));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":273
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -66968,7 +67024,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_44));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":339
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":339
  * 
  *         if i > j:
  *             raise Exception("Sort error in CLex")             # <<<<<<<<<<<<<<
@@ -66982,7 +67038,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_46));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_47));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":362
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -66996,7 +67052,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_49));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":365
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":365
  *             for i, s1, s2 in zip(self.e_index, self.col1, self.col2):
  *                 f.write("%d %f %f " % (i, s1, s2))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -67010,7 +67066,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_51));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":368
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -67024,7 +67080,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_53));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":371
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -67038,7 +67094,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_54));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":359
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -67058,7 +67114,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_55));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":404
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -67078,7 +67134,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_57));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":13
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
  * 
  *         logger.info("Constructing LCP array")             # <<<<<<<<<<<<<<
@@ -67092,7 +67148,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_60));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_61));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/lcp.pxi":34
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/lcp.pxi":34
  *             if h > 0:
  *                 h = h-1
  *         logger.info("LCP array completed")             # <<<<<<<<<<<<<<
@@ -67106,7 +67162,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_62));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_63));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":297
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":297
  *         pattern_rank = {}
  * 
  *         logger.info("Precomputing frequent intersections")             # <<<<<<<<<<<<<<
@@ -67120,7 +67176,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_72));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_73));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":314
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":314
  *         queue = IntList(increment=1000)
  * 
  *         logger.info("    Computing inverted indexes...")             # <<<<<<<<<<<<<<
@@ -67134,7 +67190,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_74));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_75));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":329
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":329
  *                     trie_node_data_append(node, i)
  * 
  *         logger.info("    Computing collocations...")             # <<<<<<<<<<<<<<
@@ -67148,7 +67204,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_76));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_77));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":393
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":393
  *             for pattern2 in J_set:
  *                 if len(pattern1) + len(pattern2) + 1 < self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -67162,7 +67218,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_79));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":400
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":400
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -67176,7 +67232,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_80));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":407
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":407
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -67190,7 +67246,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_81));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/precomputation.pxi":409
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/precomputation.pxi":409
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1             # <<<<<<<<<<<<<<
@@ -67204,7 +67260,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_82));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":94
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":94
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
@@ -67218,7 +67274,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_92));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_93));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":193
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":193
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -67232,7 +67288,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_96));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":196
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":196
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -67246,7 +67302,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_97));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/suffix_array.pxi":189
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/suffix_array.pxi":189
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -67266,42 +67322,42 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_98));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":108
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":109
  *             logger.info("Sampling strategy: uniform, max sample size = %d", sample_size)
  *         else:
  *             logger.info("Sampling strategy: no sampling")             # <<<<<<<<<<<<<<
  * 
  *     def sample(self, PhraseLocation phrase_location):
  */
-  __pyx_k_tuple_102 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_102)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_102 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_102)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_102);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_101));
   PyTuple_SET_ITEM(__pyx_k_tuple_102, 0, ((PyObject *)__pyx_kp_s_101));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_101));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_102));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":317
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":318
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")             # <<<<<<<<<<<<<<
  *         self.alignment = alignment
  * 
  */
-  __pyx_k_tuple_107 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_107)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_107 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_107)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_107);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_106));
   PyTuple_SET_ITEM(__pyx_k_tuple_107, 0, ((PyObject *)__pyx_kp_s_106));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_106));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_107));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":1023
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":1024
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-  __pyx_k_tuple_122 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_122)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_tuple_122 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_122)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_k_tuple_122);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_121));
   PyTuple_SET_ITEM(__pyx_k_tuple_122, 0, ((PyObject *)__pyx_kp_s_121));
@@ -67340,7 +67396,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_138));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_139));
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":107
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":107
  *     return ALPHABET.fromstring(string, terminal)
  * 
  * def make_lattice(words):             # <<<<<<<<<<<<<<
@@ -67367,7 +67423,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_140));
   __pyx_k_codeobj_141 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_140, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_142, __pyx_n_s__make_lattice, 107, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_141)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":111
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":111
  *     return tuple(((word, None, 1), ) for word in word_ids)
  * 
  * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
@@ -67388,7 +67444,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_143));
   __pyx_k_codeobj_144 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_143, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_142, __pyx_n_s__decode_lattice, 111, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_144)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":115
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":115
  *             for arc in node for node in lattice)
  * 
  * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
@@ -67627,24 +67683,24 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (__Pyx_SetVtable(__pyx_type_3_sa_SuffixArray.tp_dict, __pyx_vtabptr_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__Pyx_SetAttrString(__pyx_m, "SuffixArray", (PyObject *)&__pyx_type_3_sa_SuffixArray) < 0) {__pyx_filename = __pyx_f[12]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_SuffixArray = &__pyx_type_3_sa_SuffixArray;
-  if (PyType_Ready(&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "TrieNode", (PyObject *)&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "TrieNode", (PyObject *)&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_TrieNode = &__pyx_type_3_sa_TrieNode;
   __pyx_type_3_sa_ExtendedTrieNode.tp_base = __pyx_ptype_3_sa_TrieNode;
-  if (PyType_Ready(&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "ExtendedTrieNode", (PyObject *)&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "ExtendedTrieNode", (PyObject *)&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_ExtendedTrieNode = &__pyx_type_3_sa_ExtendedTrieNode;
-  if (PyType_Ready(&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "TrieTable", (PyObject *)&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "TrieTable", (PyObject *)&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_TrieTable = &__pyx_type_3_sa_TrieTable;
   __pyx_vtabptr_3_sa_PhraseLocation = &__pyx_vtable_3_sa_PhraseLocation;
   __pyx_vtable_3_sa_PhraseLocation.contains = (int (*)(struct __pyx_obj_3_sa_PhraseLocation *, int))__pyx_f_3_sa_14PhraseLocation_contains;
-  if (PyType_Ready(&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_3_sa_PhraseLocation.tp_dict, __pyx_vtabptr_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "PhraseLocation", (PyObject *)&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_3_sa_PhraseLocation.tp_dict, __pyx_vtabptr_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "PhraseLocation", (PyObject *)&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_PhraseLocation = &__pyx_type_3_sa_PhraseLocation;
-  if (PyType_Ready(&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Sampler", (PyObject *)&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Sampler", (PyObject *)&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_Sampler = &__pyx_type_3_sa_Sampler;
   __pyx_vtabptr_3_sa_HieroCachingRuleFactory = &__pyx_vtable_3_sa_HieroCachingRuleFactory;
   __pyx_vtable_3_sa_HieroCachingRuleFactory.set_idmap = (PyObject *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, struct __pyx_obj_3_sa_DataArray *))__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap;
@@ -67662,9 +67718,9 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_vtable_3_sa_HieroCachingRuleFactory.extract_phrases = (PyObject *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, int, int, int *, int *, int *, int, int, int, int *, int *, int *, int, int, int))__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases;
   __pyx_vtable_3_sa_HieroCachingRuleFactory.create_alignments = (struct __pyx_obj_3_sa_IntList *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, int *, int, PyObject *, PyObject *))__pyx_f_3_sa_23HieroCachingRuleFactory_create_alignments;
   __pyx_vtable_3_sa_HieroCachingRuleFactory.extract = (PyObject *(*)(struct __pyx_obj_3_sa_HieroCachingRuleFactory *, struct __pyx_obj_3_sa_Phrase *, struct __pyx_t_3_sa_Matching *, int *, int))__pyx_f_3_sa_23HieroCachingRuleFactory_extract;
-  if (PyType_Ready(&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_3_sa_HieroCachingRuleFactory.tp_dict, __pyx_vtabptr_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "HieroCachingRuleFactory", (PyObject *)&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_3_sa_HieroCachingRuleFactory.tp_dict, __pyx_vtabptr_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "HieroCachingRuleFactory", (PyObject *)&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa_HieroCachingRuleFactory = &__pyx_type_3_sa_HieroCachingRuleFactory;
   __pyx_vtabptr_3_sa_Scorer = &__pyx_vtable_3_sa_Scorer;
   __pyx_vtable_3_sa_Scorer.score = (struct __pyx_obj_3_sa_FeatureVector *(*)(struct __pyx_obj_3_sa_Scorer *, PyObject *))__pyx_f_3_sa_6Scorer_score;
@@ -67702,7 +67758,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_ptype_3_sa___pyx_scope_struct_13_genexpr = &__pyx_type_3_sa___pyx_scope_struct_13_genexpr;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_14_alignments) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_14_alignments = &__pyx_type_3_sa___pyx_scope_struct_14_alignments;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_15_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_15_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_15_input = &__pyx_type_3_sa___pyx_scope_struct_15_input;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_16___iter__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_16___iter__ = &__pyx_type_3_sa___pyx_scope_struct_16___iter__;
@@ -67778,7 +67834,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__logger, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/bilex.pxi":54
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/bilex.pxi":54
  *     cdef id2eword, id2fword, eword2id, fword2id
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
@@ -67791,7 +67847,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":17
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":17
  * from libc.string cimport memset
  * 
  * cdef int MIN_BOTTOM_SIZE = 32             # <<<<<<<<<<<<<<
@@ -67800,7 +67856,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MIN_BOTTOM_SIZE = 32;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":18
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":18
  * 
  * cdef int MIN_BOTTOM_SIZE = 32
  * cdef int MIN_BOTTOM_BITS = 5             # <<<<<<<<<<<<<<
@@ -67809,7 +67865,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MIN_BOTTOM_BITS = 5;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/veb.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/veb.pxi":28
  *         LOWER_MASK[i] = mask
  * 
  * _init_lower_mask()             # <<<<<<<<<<<<<<
@@ -67818,7 +67874,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_f_3_sa__init_lower_mask();
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":4
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":4
  * from libc.stdlib cimport malloc, realloc, strtol
  * 
  * cdef int INDEX_SHIFT = 3             # <<<<<<<<<<<<<<
@@ -67827,7 +67883,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_INDEX_SHIFT = 3;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":5
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":5
  * 
  * cdef int INDEX_SHIFT = 3
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1             # <<<<<<<<<<<<<<
@@ -67836,7 +67892,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_INDEX_MASK = ((1 << __pyx_v_3_sa_INDEX_SHIFT) - 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":87
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":87
  *             return self.terminals.index(s)
  * 
  * cdef Alphabet ALPHABET = Alphabet()             # <<<<<<<<<<<<<<
@@ -67851,7 +67907,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_v_3_sa_ALPHABET = ((struct __pyx_obj_3_sa_Alphabet *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":107
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":107
  *     return ALPHABET.fromstring(string, terminal)
  * 
  * def make_lattice(words):             # <<<<<<<<<<<<<<
@@ -67863,7 +67919,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__make_lattice, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":111
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":111
  *     return tuple(((word, None, 1), ) for word in word_ids)
  * 
  * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
@@ -67875,7 +67931,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__decode_lattice, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/sym.pxi":115
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/sym.pxi":115
  *             for arc in node for node in lattice)
  * 
  * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
@@ -67886,7 +67942,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__decode_sentence, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":5
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":5
  * # Much faster than the Python numbers reported there.
  * # Note to reader: this code is closer to C than Python
  * import gc             # <<<<<<<<<<<<<<
@@ -67898,7 +67954,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__gc, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":6
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":6
  * # Note to reader: this code is closer to C than Python
  * import gc
  * import itertools             # <<<<<<<<<<<<<<
@@ -67910,7 +67966,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__itertools, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":12
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":12
  * from libc.math cimport fmod, ceil, floor, log
  * 
  * from collections import defaultdict, Counter, namedtuple             # <<<<<<<<<<<<<<
@@ -67957,7 +68013,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":14
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":14
  * from collections import defaultdict, Counter, namedtuple
  * 
  * FeatureContext = namedtuple('FeatureContext',             # <<<<<<<<<<<<<<
@@ -67967,14 +68023,14 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":15
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":15
  * 
  * FeatureContext = namedtuple('FeatureContext',
  *     ['fphrase',             # <<<<<<<<<<<<<<
  *      'ephrase',
  *      'paircount',
  */
-  __pyx_t_1 = PyList_New(11); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(12); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__fphrase));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__fphrase));
@@ -67997,17 +68053,20 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_INCREF(((PyObject *)__pyx_n_s__matches));
   PyList_SET_ITEM(__pyx_t_1, 6, ((PyObject *)__pyx_n_s__matches));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__matches));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s__input_match));
+  PyList_SET_ITEM(__pyx_t_1, 7, ((PyObject *)__pyx_n_s__input_match));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__input_match));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__test_sentence));
-  PyList_SET_ITEM(__pyx_t_1, 7, ((PyObject *)__pyx_n_s__test_sentence));
+  PyList_SET_ITEM(__pyx_t_1, 8, ((PyObject *)__pyx_n_s__test_sentence));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__test_sentence));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__f_text));
-  PyList_SET_ITEM(__pyx_t_1, 8, ((PyObject *)__pyx_n_s__f_text));
+  PyList_SET_ITEM(__pyx_t_1, 9, ((PyObject *)__pyx_n_s__f_text));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__f_text));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__e_text));
-  PyList_SET_ITEM(__pyx_t_1, 9, ((PyObject *)__pyx_n_s__e_text));
+  PyList_SET_ITEM(__pyx_t_1, 10, ((PyObject *)__pyx_n_s__e_text));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__e_text));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__meta));
-  PyList_SET_ITEM(__pyx_t_1, 10, ((PyObject *)__pyx_n_s__meta));
+  PyList_SET_ITEM(__pyx_t_1, 11, ((PyObject *)__pyx_n_s__meta));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__meta));
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
@@ -68024,7 +68083,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FeatureContext, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":28
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":29
  *     ])
  * 
  * cdef int PRECOMPUTE = 0             # <<<<<<<<<<<<<<
@@ -68033,7 +68092,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_PRECOMPUTE = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":29
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":30
  * 
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1             # <<<<<<<<<<<<<<
@@ -68042,7 +68101,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MERGE = 1;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":30
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":31
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1
  * cdef int BAEZA_YATES = 2             # <<<<<<<<<<<<<<
@@ -68051,7 +68110,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_BAEZA_YATES = 2;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":33
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":34
  * 
  * # NOTE: was encoded as a non-terminal in the previous version
  * cdef int EPSILON = sym_fromstring('*EPS*', True)             # <<<<<<<<<<<<<<
@@ -68060,20 +68119,20 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_EPSILON = __pyx_f_3_sa_sym_fromstring(__pyx_k_147, 1);
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/rulefactory.pxi":56
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/rulefactory.pxi":57
  *     cdef public int count
  *     cdef public root
  *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
  *         self.count = 0
  *         self.extended = extended
  */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_k_99 = __pyx_t_1;
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":1
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":1
  * cdef StringMap FD = StringMap() # Feature name dictionary             # <<<<<<<<<<<<<<
  * 
  * INITIAL_CAPACITY = 7 # default number of features
@@ -68086,7 +68145,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_v_3_sa_FD = ((struct __pyx_obj_3_sa_StringMap *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":3
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":3
  * cdef StringMap FD = StringMap() # Feature name dictionary
  * 
  * INITIAL_CAPACITY = 7 # default number of features             # <<<<<<<<<<<<<<
@@ -68095,7 +68154,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__INITIAL_CAPACITY, __pyx_int_7) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 3; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/Users/vchahun/Sandbox/cdec/python/src/sa/features.pxi":4
+  /* "/home/hltcoe/alopez/dev/cdec/python/src/sa/features.pxi":4
  * 
  * INITIAL_CAPACITY = 7 # default number of features
  * INCREMENT = INITIAL_CAPACITY # double size             # <<<<<<<<<<<<<<
diff --git a/python/src/sa/rulefactory.pxi b/python/src/sa/rulefactory.pxi
index 248105d3..5f6558b3 100644
--- a/python/src/sa/rulefactory.pxi
+++ b/python/src/sa/rulefactory.pxi
@@ -19,6 +19,7 @@ FeatureContext = namedtuple('FeatureContext',
      'fsample_count',
      'input_span',
      'matches',
+     'input_match',
      'test_sentence',
      'f_text',
      'e_text',
@@ -960,7 +961,7 @@ cdef class HieroCachingRuleFactory:
         for i in range(len(fwords)):
             for alt in range(0, len(fwords[i])):
                 if fwords[i][alt][0] != EPSILON:
-                    frontier.append((i, i, alt, 0, self.rules.root, (), False))
+                    frontier.append((i, i, (i,), alt, 0, self.rules.root, (), False))
 
         xroot = None
         x1 = sym_setindex(self.category, 1)
@@ -973,7 +974,7 @@ cdef class HieroCachingRuleFactory:
         for i in range(self.min_gap_size, len(fwords)):
             for alt in range(0, len(fwords[i])):
                 if fwords[i][alt][0] != EPSILON:
-                    frontier.append((i-self.min_gap_size, i, alt, self.min_gap_size, xroot, (x1,), True))
+                    frontier.append((i-self.min_gap_size, i, (i,), alt, self.min_gap_size, xroot, (x1,), True))
 
         next_states = []
         for i in range(len(fwords)):
@@ -981,7 +982,7 @@ cdef class HieroCachingRuleFactory:
 
         while len(frontier) > 0:
             new_frontier = []
-            for k, i, alt, pathlen, node, prefix, is_shadow_path in frontier:
+            for k, i, input_match, alt, pathlen, node, prefix, is_shadow_path in frontier:
                 word_id = fwords[i][alt][0]
                 spanlen = fwords[i][alt][2]
                 # TODO get rid of k -- pathlen is replacing it
@@ -990,7 +991,7 @@ cdef class HieroCachingRuleFactory:
                     if i+spanlen >= len(fwords):
                         continue
                     for nualt in range(0,len(fwords[i+spanlen])):
-                        frontier.append((k, i+spanlen, nualt, pathlen, node, prefix, is_shadow_path))
+                        frontier.append((k, i+spanlen, input_match, nualt, pathlen, node, prefix, is_shadow_path))
                     continue
                 
                 phrase = prefix + (word_id,)
@@ -1106,13 +1107,14 @@ cdef class HieroCachingRuleFactory:
                                     count = len(locs)
                                     scores = self.scorer.score(FeatureContext(
                                                f, e, count, fcount[f], num_samples,
-                                               (k,i+spanlen), locs, fwords, self.fda, self.eda,
+                                               (k,i+spanlen), locs, input_match, 
+                                               fwords, self.fda, self.eda,
                                                meta))
                                     yield Rule(self.category, f, e, scores, alignment)
 
                 if len(phrase) < self.max_length and i+spanlen < len(fwords) and pathlen+1 <= self.max_initial_size:
                     for alt_id in range(len(fwords[i+spanlen])):
-                        new_frontier.append((k, i+spanlen, alt_id, pathlen + 1, node, phrase, is_shadow_path))
+                        new_frontier.append((k, i+spanlen, input_match, alt_id, pathlen + 1, node, phrase, is_shadow_path))
                     num_subpatterns = arity
                     if not is_shadow_path:
                         num_subpatterns = num_subpatterns + 1
@@ -1129,7 +1131,7 @@ cdef class HieroCachingRuleFactory:
                             nodes_isteps_away_buffer[key] = frontier_nodes
                         
                         for (i, alt, pathlen) in frontier_nodes:
-                            new_frontier.append((k, i, alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
+                            new_frontier.append((k, i, input_match + (i,), alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
             frontier = new_frontier
                 
         stop_time = monitor_cpu()
-- 
cgit v1.2.3